aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--COPYING.MIT17
-rw-r--r--README37
-rw-r--r--classes/klibc.bbclass9
-rw-r--r--conf/layer.conf13
-rw-r--r--conf/machine/a1200.conf5
-rw-r--r--conf/machine/a780.conf5
-rw-r--r--conf/machine/a910.conf5
-rw-r--r--conf/machine/akita.conf23
-rw-r--r--conf/machine/borzoi.conf2
-rw-r--r--conf/machine/boxer.conf2
-rw-r--r--conf/machine/c7x0.conf26
-rw-r--r--conf/machine/collie.conf16
-rw-r--r--conf/machine/corgi.conf3
-rw-r--r--conf/machine/e680.conf5
-rw-r--r--conf/machine/h1910.conf31
-rw-r--r--conf/machine/h1940.conf30
-rw-r--r--conf/machine/h2200.conf48
-rw-r--r--conf/machine/h3600.conf38
-rw-r--r--conf/machine/h3800.conf8
-rw-r--r--conf/machine/h3900.conf37
-rw-r--r--conf/machine/h4000.conf47
-rw-r--r--conf/machine/h5000.conf45
-rw-r--r--conf/machine/husky.conf2
-rw-r--r--conf/machine/hx4700.conf77
-rw-r--r--conf/machine/include/LAB-settings.inc8
-rw-r--r--conf/machine/include/motorola-ezx-base.inc74
-rw-r--r--conf/machine/include/palm.inc85
-rw-r--r--conf/machine/include/tune-arm920t.inc4
-rw-r--r--conf/machine/include/tune-arm926ejs.inc7
-rw-r--r--conf/machine/include/tune-sh3.inc3
-rw-r--r--conf/machine/include/tune-strongarm.inc11
-rw-r--r--conf/machine/include/tune-xscale.inc9
-rw-r--r--conf/machine/include/zaurus.inc131
-rw-r--r--conf/machine/jornada56x.conf15
-rw-r--r--conf/machine/jornada6xx.conf22
-rw-r--r--conf/machine/jornada7xx.conf23
-rw-r--r--conf/machine/palmld.conf37
-rw-r--r--conf/machine/palmt650.conf20
-rw-r--r--conf/machine/palmt680.conf14
-rw-r--r--conf/machine/palmtc.conf14
-rw-r--r--conf/machine/palmtt.conf17
-rw-r--r--conf/machine/palmtt2.conf2
-rw-r--r--conf/machine/palmtt3.conf9
-rw-r--r--conf/machine/palmtt5.conf15
-rw-r--r--conf/machine/palmtx.conf29
-rw-r--r--conf/machine/palmz31.conf20
-rw-r--r--conf/machine/palmz71.conf14
-rw-r--r--conf/machine/palmz72.conf21
-rw-r--r--conf/machine/poodle.conf14
-rw-r--r--conf/machine/rokre2.conf10
-rw-r--r--conf/machine/rokre6.conf6
-rw-r--r--conf/machine/rx1950.conf28
-rw-r--r--conf/machine/rx3000.conf40
-rw-r--r--conf/machine/shepherd.conf3
-rw-r--r--conf/machine/simpad.conf23
-rw-r--r--conf/machine/spitz.conf29
-rw-r--r--conf/machine/terrier.conf2
-rw-r--r--conf/machine/tosa.conf14
-rw-r--r--recipes-bsp/ezx/ezx-gen-blob_git.bb41
-rw-r--r--recipes-bsp/ezx/ezx-gpiotool_svn.bb24
-rw-r--r--recipes-bsp/ezx/ezxd/ezxd.init83
-rw-r--r--recipes-bsp/ezx/ezxd_svn.bb48
-rw-r--r--recipes-bsp/ezx/files/remove-bogus-sed.patch15
-rw-r--r--recipes-bsp/ezx/moto-boot-usb-native_git.bb27
-rw-r--r--recipes-bsp/h2200-bootloader/h2200-bootloader.bb14
-rw-r--r--recipes-bsp/ipaq-boot-params/files/h5000/params1
-rw-r--r--recipes-bsp/ipaq-boot-params/files/params1
-rw-r--r--recipes-bsp/ipaq-boot-params/ipaq-boot-params.bb16
-rw-r--r--recipes-bsp/palmt650/palmt650-keyboard-modmap.bb23
-rw-r--r--recipes-bsp/palmt650/palmt650-keyboard-modmap/60xXmodmap8
-rw-r--r--recipes-bsp/palmt650/palmt650-keyboard-modmap/Xmodmap118
-rw-r--r--recipes-bsp/zaurus-utils/encdec-updater.bb19
-rw-r--r--recipes-bsp/zaurus-utils/files/encdec-updater.c80
-rw-r--r--recipes-bsp/zaurus-utils/nandlogical-klibc_1.0.0.bb9
-rw-r--r--recipes-bsp/zaurus-utils/nandlogical/nandlogical.c386
-rw-r--r--recipes-bsp/zaurus-utils/nandlogical_1.0.0.bb17
-rw-r--r--recipes-bsp/zaurus-utils/zaurus-installer.bb34
-rw-r--r--recipes-bsp/zaurus-utils/zaurus-legacy-tar.bb23
-rw-r--r--recipes-bsp/zaurus-utils/zaurus-updater.bb31
-rw-r--r--recipes-bsp/zaurus-utils/zaurus-updater/updater.sh526
-rw-r--r--recipes-bsp/zaurusd/files/01-check-toggle-landscape9
-rw-r--r--recipes-bsp/zaurusd/files/01-check-toggle-portait9
-rw-r--r--recipes-bsp/zaurusd/files/add-poodle.patch15
-rw-r--r--recipes-bsp/zaurusd/files/alsa-6000x-default.state.patch769
-rw-r--r--recipes-bsp/zaurusd/files/alsa-cxx00-default.state.patch240
-rw-r--r--recipes-bsp/zaurusd/files/avoid-rotated-server.patch123
-rw-r--r--recipes-bsp/zaurusd/files/disable-alsa-handling.patch16
-rw-r--r--recipes-bsp/zaurusd/files/new-make.patch11
-rw-r--r--recipes-bsp/zaurusd/files/use-ts-symlink-instead-of-hardcoding.diff88
-rw-r--r--recipes-bsp/zaurusd/files/zaurus-hinge.bl-off19
-rw-r--r--recipes-bsp/zaurusd/files/zaurus-hinge.bl-on63
-rw-r--r--recipes-bsp/zaurusd/files/zaurus-hinge.in66
-rw-r--r--recipes-bsp/zaurusd/files/zaurus-hinge.matchbox-landscape25
-rw-r--r--recipes-bsp/zaurusd/files/zaurus-hinge.matchbox-portrait29
-rw-r--r--recipes-bsp/zaurusd/zaurusd_svn.bb56
-rw-r--r--recipes-kernel/linux/linux-2.6.39/akita/defconfig381
-rw-r--r--recipes-kernel/linux/linux-2.6.39/c7x0/defconfig378
-rw-r--r--recipes-kernel/linux/linux-2.6.39/collie/defconfig324
-rw-r--r--recipes-kernel/linux/linux-2.6.39/h1940/defconfig1704
-rw-r--r--recipes-kernel/linux/linux-2.6.39/om-gta01/defconfig481
-rw-r--r--recipes-kernel/linux/linux-2.6.39/om-gta02/defconfig490
-rw-r--r--recipes-kernel/linux/linux-2.6.39/openmoko.patch46285
-rw-r--r--recipes-kernel/linux/linux-2.6.39/poodle/defconfig379
-rw-r--r--recipes-kernel/linux/linux-2.6.39/shr.patch2021
-rw-r--r--recipes-kernel/linux/linux-2.6.39/spitz/defconfig381
-rw-r--r--recipes-kernel/linux/linux-2.6.39/tosa/defconfig381
-rw-r--r--recipes-kernel/linux/linux-hackndev-2.6/palmld/defconfig1346
-rw-r--r--recipes-kernel/linux/linux-hackndev-2.6/palmt650/defconfig1295
-rw-r--r--recipes-kernel/linux/linux-hackndev-2.6/palmtc/defconfig1208
-rw-r--r--recipes-kernel/linux/linux-hackndev-2.6/palmtt3/defconfig1383
-rw-r--r--recipes-kernel/linux/linux-hackndev-2.6/palmtt5/defconfig1314
-rw-r--r--recipes-kernel/linux/linux-hackndev-2.6/palmtx/busybox-config571
-rw-r--r--recipes-kernel/linux/linux-hackndev-2.6/palmtx/defconfig1347
-rwxr-xr-xrecipes-kernel/linux/linux-hackndev-2.6/palmtx/init195
-rw-r--r--recipes-kernel/linux/linux-hackndev-2.6/palmtx/initramfs_list243
-rw-r--r--recipes-kernel/linux/linux-hackndev-2.6/palmz72/defconfig1422
-rw-r--r--recipes-kernel/linux/linux-hackndev-2.6_git.bb72
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/0001-time-prevent-the-loop-in-timespec_add_ns-from-bei.patch34
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/asus620/defconfig1354
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/asus730/defconfig1475
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/aximx50/defconfig1337
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/eteng500/defconfig1326
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/gcc4x-limits.patch10
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h1910/defconfig1407
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h2200/defconfig1803
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h3600/defconfig1324
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h3800/defconfig1322
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h3900/defconfig1443
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h4000/defconfig1569
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h5000/defconfig1701
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcalpine/defconfig1347
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcapache/defconfig1437
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcbeetles/defconfig1354
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcblueangel/defconfig1590
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htchimalaya/defconfig1350
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcsable/defconfig1465
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcuniversal/defconfig1471
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcwallaby/defconfig1322
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/hx4700/defconfig1823
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/linux-2.6.git-9d20fdd58e74d4d26dc5216efaaa0f800c23dd3a.patch144
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/looxc550/defconfig1351
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/magician/defconfig1679
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/rx1950/defconfig1383
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6-2.6.21/rx3000/defconfig1507
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6.inc125
-rw-r--r--recipes-kernel/linux/linux-handhelds-2.6_2.6.21-hh20.bb23
-rw-r--r--recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/LinuxSH-2.6.17.patch56290
-rw-r--r--recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/alsa_hp6xx_2.6.17.patch636
-rw-r--r--recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/defconfig_jlime1187
-rw-r--r--recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/io.h-fix.patch31
-rw-r--r--recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/keyboard-fix-deadkeys.patch204
-rw-r--r--recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/keymap-fix.patch408
-rw-r--r--recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/rtc-2.6.17.patch987
-rw-r--r--recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/unexpected-int-fix.patch17
-rw-r--r--recipes-kernel/linux/linux-jlime-jornada6xx_2.6.17.bb31
-rw-r--r--recipes-kernel/linux/linux-jlime-jornada7xx_2.6.37+git.bb23
-rw-r--r--recipes-kernel/linux/linux-palm-omap1-2.6.22-omap1/palmtt/defconfig882
-rw-r--r--recipes-kernel/linux/linux-palm-omap1-2.6.22-omap1/palmtt2/defconfig882
-rw-r--r--recipes-kernel/linux/linux-palm-omap1-2.6.22-omap1/palmz71/defconfig875
-rw-r--r--recipes-kernel/linux/linux-palm-omap1_2.6.22-omap1.bb42
-rw-r--r--recipes-kernel/linux/linux.inc270
-rw-r--r--recipes-kernel/linux/linux_2.6.39.bb35
-rw-r--r--recipes-kernel/linux/openezx-kernel_git.bb47
163 files changed, 166310 insertions, 0 deletions
diff --git a/COPYING.MIT b/COPYING.MIT
new file mode 100644
index 0000000..fb950dc
--- /dev/null
+++ b/COPYING.MIT
@@ -0,0 +1,17 @@
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/README b/README
new file mode 100644
index 0000000..8aa32d6
--- /dev/null
+++ b/README
@@ -0,0 +1,37 @@
+meta-handheld
+=============
+
+This layer is for maintenance of support for old (and some not so old)
+handheld devices, including Sharp Zaurus, HP iPAQ etc, initially based upon
+recipes from OpenEmbedded master. Note that some machines may have suffered
+from bitrot and need work, your help would be appreciated!
+
+
+Dependencies
+------------
+
+This layer depends on:
+
+URI: git://git.openembedded.org/openembedded-core
+branch: master
+revision: HEAD
+
+
+Maintenance
+-----------
+
+Send patches / pull requests to openembedded-devel@lists.openembedded.org
+with '[meta-handheld]' in the subject.
+
+Main layer maintainer: Paul Eggleton <paul.eggleton@linux.intel.com>
+
+
+License
+-------
+
+All metadata is MIT licensed unless otherwise stated. Source code included
+in tree for individual recipes is under the LICENSE stated in each recipe
+(.bb file) unless otherwise stated.
+
+This README document is Copyright (C) 2011 Intel Corporation.
+
diff --git a/classes/klibc.bbclass b/classes/klibc.bbclass
new file mode 100644
index 0000000..d684367
--- /dev/null
+++ b/classes/klibc.bbclass
@@ -0,0 +1,9 @@
+# klcc-cross depends on klibc
+DEPENDS =+ "klcc-cross"
+
+export CC=${TARGET_PREFIX}klcc
+
+# reset inherited OE flags to avoid e.g. ggdb3 and keep size small
+export CFLAGS=""
+export CPPFLAGS=""
+export LDFLAGS=""
diff --git a/conf/layer.conf b/conf/layer.conf
new file mode 100644
index 0000000..7a2441b
--- /dev/null
+++ b/conf/layer.conf
@@ -0,0 +1,13 @@
+# Layer configuration for meta-handheld layer
+# Copyright 2011 Intel Corporation
+
+# We have a conf and classes directory, prepend to BBPATH to prefer our versions
+BBPATH := "${LAYERDIR}:${BBPATH}"
+
+# We have a recipes directory, add to BBFILES
+BBFILES := "${BBFILES} ${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes-*/*/*.bbappend"
+
+BBFILE_COLLECTIONS += "meta-handheld"
+BBFILE_PATTERN_meta-handheld := "^${LAYERDIR}/"
+BBFILE_PRIORITY_meta-handheld = "7"
+
diff --git a/conf/machine/a1200.conf b/conf/machine/a1200.conf
new file mode 100644
index 0000000..1e736be
--- /dev/null
+++ b/conf/machine/a1200.conf
@@ -0,0 +1,5 @@
+#@TYPE: Machine
+#@NAME: Motorola EZX A1200
+#@DESCRIPTION: Machine configuration for the Motorola GSM phone A1200
+
+require conf/machine/include/motorola-ezx-base.inc
diff --git a/conf/machine/a780.conf b/conf/machine/a780.conf
new file mode 100644
index 0000000..9530de8
--- /dev/null
+++ b/conf/machine/a780.conf
@@ -0,0 +1,5 @@
+#@TYPE: Machine
+#@NAME: Motorola EZX A780
+#@DESCRIPTION: Machine configuration for the Motorola GSM phone A780
+
+require conf/machine/include/motorola-ezx-base.inc
diff --git a/conf/machine/a910.conf b/conf/machine/a910.conf
new file mode 100644
index 0000000..863c176
--- /dev/null
+++ b/conf/machine/a910.conf
@@ -0,0 +1,5 @@
+#@TYPE: Machine
+#@NAME: Motorola EZX A910
+#@DESCRIPTION: Machine configuration for the Motorola GSM phone A910
+
+require conf/machine/include/motorola-ezx-base.inc
diff --git a/conf/machine/akita.conf b/conf/machine/akita.conf
new file mode 100644
index 0000000..ae089a1
--- /dev/null
+++ b/conf/machine/akita.conf
@@ -0,0 +1,23 @@
+#@TYPE: Machine
+#@NAME: Sharp Zaurus SL-C1000
+#@DESCRIPTION: Machine configuration for the Sharp Zaurus SL-C1000 device
+
+require conf/machine/include/zaurus.inc
+require conf/machine/include/tune-xscale.inc
+
+PACKAGE_EXTRA_ARCHS += "iwmmxt"
+MACHINE_FEATURES += "iwmmxt"
+
+# NAND factory-default
+# mtdparts=sharpsl-nand:7168k@0k(smf),59392k@7168k(root),-(home)
+ROOT_FLASH_SIZE = "58"
+
+MACHINE_GUI_CLASS = "bigscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "640"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "480"
+MACHINE_DISPLAY_ORIENTATION = "270"
+MACHINE_DISPLAY_PPI = "216"
+
+UBOOT_MACHINE = "akita_config"
+UBOOT_ENTRYPOINT = "0xA1000000"
+UBOOT_LOADADDRESS = "${UBOOT_ENTRYPOINT}"
diff --git a/conf/machine/borzoi.conf b/conf/machine/borzoi.conf
new file mode 100644
index 0000000..d037a1f
--- /dev/null
+++ b/conf/machine/borzoi.conf
@@ -0,0 +1,2 @@
+WARNING:="${@bb.fatal('\n*\n*\n* Sorry, There is no dedicated configuration for the Sharp SL-C3100,\n* because \
+its very similar to the SL-C3000. Use MACHINE = \"spitz\".\n*\n*\n')}"
diff --git a/conf/machine/boxer.conf b/conf/machine/boxer.conf
new file mode 100644
index 0000000..f5afc14
--- /dev/null
+++ b/conf/machine/boxer.conf
@@ -0,0 +1,2 @@
+WARNING:="${@bb.fatal('\n*\n*\n* Sorry, There is no dedicated configuration for the Sharp SL-C860,\n* because \
+it really is just a Sharp SL-C760 with a different case color. Use MACHINE = \"c7x0\".\n*\n*\n')}"
diff --git a/conf/machine/c7x0.conf b/conf/machine/c7x0.conf
new file mode 100644
index 0000000..f5ec132
--- /dev/null
+++ b/conf/machine/c7x0.conf
@@ -0,0 +1,26 @@
+#@TYPE: Machine
+#@NAME: Sharp Zaurus SL-C7x0
+#@DESCRIPTION: Machine configuration for the Sharp Zaurus SL-C700, Sharp Zaurus SL-C750, Sharp Zaurus SL-C760, Sharp Zaurus SL-C860 devices
+
+require conf/machine/include/zaurus.inc
+require conf/machine/include/tune-xscale.inc
+
+# NAND factory-default
+# SL-C700 (corgi) mtdparts=sharpsl-nand:7168k@0k(smf),25600k@7168k(root),-(home)
+# SL-C750 (Shepherd) mtdparts=sharpsl-nand:7168k@0k(smf),25600k@7168k(root),-(home)
+# SL-C760 (Husky) mtdparts=sharpsl-nand:7168k@0k(smf),54272k@7168k(root),-(home)
+# SL-C860 (Boxer) mtdparts=sharpsl-nand:7168k@0k(smf),54272k@7168k(root),-(home)
+
+# There isn't an unique size valid for all models,
+# please set the right value in your local.conf
+ROOT_FLASH_SIZE = "25"
+
+MACHINE_GUI_CLASS = "bigscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "640"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "480"
+MACHINE_DISPLAY_ORIENTATION = "0"
+MACHINE_DISPLAY_PPI = "216"
+
+UBOOT_MACHINE = "corgi_config"
+UBOOT_ENTRYPOINT = "0xA0008000"
+UBOOT_LOADADDRESS = "${UBOOT_ENTRYPOINT}"
diff --git a/conf/machine/collie.conf b/conf/machine/collie.conf
new file mode 100644
index 0000000..a0d710c
--- /dev/null
+++ b/conf/machine/collie.conf
@@ -0,0 +1,16 @@
+#@TYPE: Machine
+#@NAME: Sharp Zaurus SL-5000, Sharp Zaurus SL-5500
+#@DESCRIPTION: Machine configuration for the SA1100 based Sharp Zaurus SL-5000 and SL-5500 devices
+
+require conf/machine/include/zaurus.inc
+require conf/machine/include/tune-strongarm.inc
+
+ROOT_FLASH_SIZE = "14"
+# actually 14680064
+EXTRA_IMAGECMD_jffs2 = "--pad=14680064 --little-endian --eraseblock=0x20000 -n"
+
+MACHINE_GUI_CLASS = "smallscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "240"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "320"
+MACHINE_DISPLAY_ORIENTATION = "270"
+MACHINE_DISPLAY_PPI = "114"
diff --git a/conf/machine/corgi.conf b/conf/machine/corgi.conf
new file mode 100644
index 0000000..8055af0
--- /dev/null
+++ b/conf/machine/corgi.conf
@@ -0,0 +1,3 @@
+WARNING:="${@bb.fatal('\n*\n*\n* Sorry, There is no dedicated configuration for the Sharp SL-C700,\n* because \
+of the similarities of the clamshell series. Use MACHINE = \"c7x0\".\n*\n*\n')}"
+
diff --git a/conf/machine/e680.conf b/conf/machine/e680.conf
new file mode 100644
index 0000000..749f022
--- /dev/null
+++ b/conf/machine/e680.conf
@@ -0,0 +1,5 @@
+#@TYPE: Machine
+#@NAME: Motorola Motorola EZX E680, Motorola EZX E680i
+#@DESCRIPTION: Machine configuration for the Motorola GSM phones E680, and E680i
+
+require conf/machine/include/motorola-ezx-base.inc
diff --git a/conf/machine/h1910.conf b/conf/machine/h1910.conf
new file mode 100644
index 0000000..43d23d8
--- /dev/null
+++ b/conf/machine/h1910.conf
@@ -0,0 +1,31 @@
+#@TYPE: Machine
+#@NAME: HP iPAQ H1910/H1915
+#@DESCRIPTION: Machine configuration for the HP iPAQ H1910/H1915
+
+#
+# Hardware-based properties
+#
+TARGET_ARCH = "arm"
+
+require conf/machine/include/tune-xscale.inc
+
+VOLATILE_STORAGE_SIZE = "64"
+ROOT_FLASH_SIZE = "16"
+MACHINE_GUI_CLASS = "smallscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "240"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "320"
+MACHINE_FEATURES = "kernel26 touchscreen apm alsa irda usbgadget screen vfat"
+
+#
+# Software/packages selection
+#
+PREFERRED_PROVIDER_virtual/kernel = "linux-handhelds-2.6"
+PCMCIA_MANAGER = "pcmciautils"
+PREFERRED_PROVIDER_xserver = "xserver-kdrive"
+
+EXTRA_IMAGECMD_h1910_jffs2 = "-e 0x4000 -p -n"
+
+#
+# Modules autoload and other boot properties
+#
+SERIAL_CONSOLE = "115200 ttyS0 vt100"
diff --git a/conf/machine/h1940.conf b/conf/machine/h1940.conf
new file mode 100644
index 0000000..19e7662
--- /dev/null
+++ b/conf/machine/h1940.conf
@@ -0,0 +1,30 @@
+#@TYPE: Machine
+#@NAME: h1940
+#@DESCRIPTION: Machine configuration for the HP iPAQ h1930 and h1940
+
+TARGET_ARCH = "arm"
+
+# Set preferred providers
+PREFERRED_PROVIDER_xserver = "xserver-kdrive"
+PREFERRED_PROVIDER_virtual/kernel = "linux"
+
+KERNEL_IMAGETYPE = "uImage"
+UBOOT_LOADADDRESS = "0x30108000"
+UBOOT_ENTRYPOINT = "0x30108000"
+
+# Set features for task-base
+MACHINE_GUI_CLASS = "smallscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "240"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "320"
+MACHINE_FEATURES = "kernel26 touchscreen apm bluetooth irda usbgadget screen vfat"
+
+
+# Some extra configuration
+VOLATILE_STORAGE_SIZE = "64"
+ROOT_FLASH_SIZE = "32"
+SERIAL_CONSOLE = "115200 ttySAC2 vt100"
+USE_VT = "0"
+
+# tune for armv4t
+require conf/machine/include/tune-arm920t.inc
+
diff --git a/conf/machine/h2200.conf b/conf/machine/h2200.conf
new file mode 100644
index 0000000..abc1772
--- /dev/null
+++ b/conf/machine/h2200.conf
@@ -0,0 +1,48 @@
+#@TYPE: Machine
+#@NAME: HP iPAQ h22xx
+#@DESCRIPTION: Machine configuration for the HP iPAQ h22xx
+
+#
+# Hardware-based properties
+#
+TARGET_ARCH = "arm"
+
+#Compile with armv5te optimizations, incompatible with armv4(t) cpus
+require conf/machine/include/tune-xscale.inc
+
+#Set some hints for metadata
+VOLATILE_STORAGE_SIZE = "64"
+ROOT_FLASH_SIZE = "32"
+MACHINE_GUI_CLASS = "smallscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "240"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "320"
+MACHINE_FEATURES = "kernel26 touchscreen apm alsa pcmcia bluetooth irda usbgadget screen vfat"
+
+#
+# Software/packages selection
+#
+PCMCIA_MANAGER = "pcmciautils"
+PREFERRED_PROVIDER_xserver = "xserver-kdrive"
+PREFERRED_PROVIDER_virtual/kernel = "linux-handhelds-2.6"
+
+MACHINE_ESSENTIAL_EXTRA_RDEPENDS = " h2200-bootloader "
+MACHINE_EXTRA_RDEPENDS = " udev-hostap-cs-vcc-workaround "
+MACHINE_EXTRA_RRECOMMENDS = "\
+ kernel-module-snd-h2200-audio \
+ kernel-module-i2c-pxa \
+ "
+
+EXTRA_IMAGECMD_jffs2 = "--pad --eraseblock=0x4000"
+
+#
+# Modules autoload and other boot properties
+#
+module_autoload_snd-pcm-oss = "snd-pcm-oss"
+module_autoload_snd-mixer-oss = "snd-mixer-oss"
+module_autoload_snd-h2200-audio = "snd-h2200-audio"
+module_autoload_g_ether = "g_ether"
+
+SERIAL_CONSOLE = "115200 ttyS0 vt100"
+USE_VT = "0"
+
+require conf/machine/include/LAB-settings.inc
diff --git a/conf/machine/h3600.conf b/conf/machine/h3600.conf
new file mode 100644
index 0000000..7bbb223
--- /dev/null
+++ b/conf/machine/h3600.conf
@@ -0,0 +1,38 @@
+#@TYPE: Machine
+#@NAME: Compaq iPAQ 36xx,Compaq iPAQ 37xx,Compaq iPAQ 38xx
+#@DESCRIPTION: Machine configuration for the Compaq iPAQ 36xx, Compaq iPAQ 37xx and Compaq iPAQ 38xx devices
+
+#
+# Hardware-based properties
+#
+TARGET_ARCH = "arm"
+
+require conf/machine/include/tune-strongarm.inc
+
+# h3700, h3800 have 32, but let that be the bonus
+ROOT_FLASH_SIZE = "16"
+# h3630 have 32Mb only
+VOLATILE_STORAGE_SIZE = "64"
+MACHINE_GUI_CLASS = "smallscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "240"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "320"
+MACHINE_FEATURES = "kernel26 touchscreen apm alsa irda usbgadget screen vfat"
+
+#
+# Software/packages selection
+#
+PREFERRED_PROVIDER_virtual/kernel = "linux-handhelds-2.6"
+PCMCIA_MANAGER = "pcmciautils"
+PREFERRED_PROVIDER_xserver = "xserver-kdrive"
+
+MACHINE_EXTRA_RDEPENDS = "ipaq-boot-params"
+MACHINE_EXTRA_RRECOMMENDS = "\
+ kernel-module-micro"
+
+EXTRA_IMAGECMD_jffs2 = "-e 0x40000 -p ; echo '${IMAGE_NAME} ${IMAGE_NAME}.rootfs.jffs2 - root' >> ${DEPLOY_DIR_IMAGE}/reflash.ctl"
+
+#
+# Modules autoload and other boot properties
+#
+SERIAL_CONSOLE = "115200 ttySA0 vt100"
+USE_VT = "0"
diff --git a/conf/machine/h3800.conf b/conf/machine/h3800.conf
new file mode 100644
index 0000000..a13ed48
--- /dev/null
+++ b/conf/machine/h3800.conf
@@ -0,0 +1,8 @@
+#@TYPE: Machine
+#@NAME: Compaq iPAQ 38xx
+#@DESCRIPTION: Machine configuration for the Compaq iPAQ 38xx devices
+
+#this machine will be primarily focussed on the 2.6 port
+MACHINE_FEATURES = "kernel26 touchscreen apm alsa pcmcia bluetooth irda usbgadget screen vfat"
+
+require conf/machine/h3600.conf
diff --git a/conf/machine/h3900.conf b/conf/machine/h3900.conf
new file mode 100644
index 0000000..a403008
--- /dev/null
+++ b/conf/machine/h3900.conf
@@ -0,0 +1,37 @@
+#@TYPE: Machine
+#@NAME: HP iPAQ h39xx
+#@DESCRIPTION: Machine configuration for the HP iPAQ h39xx
+
+#
+# Hardware-based properties
+#
+TARGET_ARCH = "arm"
+
+require conf/machine/include/tune-xscale.inc
+
+ROOT_FLASH_SIZE = "32"
+VOLATILE_STORAGE_SIZE = "64"
+MACHINE_GUI_CLASS = "smallscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "240"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "320"
+MACHINE_FEATURES = "kernel26 touchscreen apm alsa irda bluetooth usbgadget screen vfat"
+
+#
+# Software/packages selection
+#
+PREFERRED_PROVIDER_virtual/kernel = "linux-handhelds-2.6"
+PCMCIA_MANAGER = "pcmciautils"
+PREFERRED_PROVIDER_xserver = "xserver-kdrive"
+
+MACHINE_EXTRA_RDEPENDS = "kernel ipaq-boot-params"
+
+#
+# Modules autoload and other boot properties
+#
+module_autoload_snd-pcm-oss = "snd-pcm-oss"
+module_autoload_g_ether = "g_ether"
+
+SERIAL_CONSOLE = "115200 ttyS0 vt100"
+USE_VT = "0"
+
+require conf/machine/include/LAB-settings.inc
diff --git a/conf/machine/h4000.conf b/conf/machine/h4000.conf
new file mode 100644
index 0000000..6c84a13
--- /dev/null
+++ b/conf/machine/h4000.conf
@@ -0,0 +1,47 @@
+#@TYPE: Machine
+#@NAME: HP iPAQ h4xxx
+#@DESCRIPTION: Machine configuration for the HP iPAQ h4xxx
+
+#
+# Hardware-based properties
+#
+TARGET_ARCH = "arm"
+
+require conf/machine/include/tune-xscale.inc
+
+ROOT_FLASH_SIZE = "32"
+VOLATILE_STORAGE_SIZE = "64"
+MACHINE_GUI_CLASS = "smallscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "240"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "320"
+MACHINE_FEATURES = "kernel26 touchscreen apm alsa irda bluetooth wifi usbgadget screen vfat"
+
+#
+# Software/packages selection
+#
+PREFERRED_PROVIDER_virtual/kernel = "linux-handhelds-2.6"
+PCMCIA_MANAGER = "pcmciautils"
+PREFERRED_PROVIDER_xserver = "xserver-kdrive"
+
+MACHINE_EXTRA_RDEPENDS = "tiinit acx-firmware ${PCMCIA_MANAGER}"
+MACHINE_EXTRA_RRECOMMENDS = "kernel-module-snd-h4000-audio \
+ kernel-module-i2c-pxa \
+ kernel-module-h4000-bt \
+ kernel-module-h4000-pcmcia \
+ kernel-module-acx \
+ keymaps \
+ "
+
+#
+# Modules autoload and other boot properties
+#
+module_autoload_snd-pcm-oss = "snd-pcm-oss"
+module_autoload_snd-mixer-oss = "snd-mixer-oss"
+module_autoload_snd-h4000-audio = "snd-h4000-audio"
+module_autoload_g_ether = "g_ether"
+module_conf_acx = "blacklist acx"
+
+SERIAL_CONSOLE = "115200 ttyS0 vt100"
+USE_VT = "0"
+
+require conf/machine/include/LAB-settings.inc
diff --git a/conf/machine/h5000.conf b/conf/machine/h5000.conf
new file mode 100644
index 0000000..73fbf17
--- /dev/null
+++ b/conf/machine/h5000.conf
@@ -0,0 +1,45 @@
+#@TYPE: Machine
+#@NAME: Compaq iPAQ 51xx, Compaq iPAQ 54xx, Compaq iPAQ 55xx
+#@DESCRIPTION: Machine configuration for the Compaq iPAQ 51xx, Compaq iPAQ 54xx, and Compaq iPAQ 55xx devices
+
+#
+# Hardware-based properties
+#
+TARGET_ARCH = "arm"
+
+require conf/machine/include/tune-xscale.inc
+
+ROOT_FLASH_SIZE = "32"
+VOLATILE_STORAGE_SIZE = "64"
+MACHINE_GUI_CLASS = "smallscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "240"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "320"
+MACHINE_FEATURES = "kernel26 touchscreen apm alsa pcmcia bluetooth irda wifi usbgadget usbhost screen vfat"
+
+#
+# Software/packages selection
+#
+PREFERRED_PROVIDER_virtual/kernel = "linux-handhelds-2.6"
+PREFERRED_PROVIDER_xserver = "xserver-kdrive"
+EXTRA_IMAGECMD_jffs2 = "-e 0x40000 -p ; echo '${IMAGE_NAME} ${IMAGE_NAME}.rootfs.jffs2 - root' >> ${DEPLOY_DIR_IMAGE}/reflash.ctl"
+
+# Ship complete set of modules ('kernel-modules') for easier debug purposes
+MACHINE_EXTRA_RDEPENDS = "kernel ipaq-boot-params"
+MACHINE_EXTRA_RRECOMMENDS = " kernel-modules \
+ kernel-module-h5400-lcd \
+ kernel-module-h5400-battery \
+ kernel-module-h5400-bt \
+ kernel-module-snd-soc-h5000 \
+ kernel-module-i2c-pxa \
+ at76c503a-modules"
+
+#
+# Modules autoload and other boot properties
+#
+module_autoload_snd-pcm-oss = "snd-pcm-oss"
+module_autoload_snd-mixer-oss = "snd-mixer-oss"
+module_autoload_snd-soc-h5000 = "snd-soc-h5000"
+module_autoload_g_ether = "g_ether"
+
+SERIAL_CONSOLE = "115200 ttyS0 vt100"
+USE_VT = "0"
diff --git a/conf/machine/husky.conf b/conf/machine/husky.conf
new file mode 100644
index 0000000..fae9540
--- /dev/null
+++ b/conf/machine/husky.conf
@@ -0,0 +1,2 @@
+WARNING:="${@bb.fatal('\n*\n*\n* Sorry, There is no dedicated configuration for the Sharp SL-C760,\n* because \
+of the similarities of the clamshell series. Use MACHINE = \"c7x0\".\n*\n*\n')}"
diff --git a/conf/machine/hx4700.conf b/conf/machine/hx4700.conf
new file mode 100644
index 0000000..474454a
--- /dev/null
+++ b/conf/machine/hx4700.conf
@@ -0,0 +1,77 @@
+#@TYPE: Machine
+#@NAME: HP iPAQ hx47xx
+#@DESCRIPTION: Machine configuration for the hx4700 iPAQ with a pxa27x CPU
+
+#
+# Hardware-based properties
+#
+TARGET_ARCH = "arm"
+PACKAGE_EXTRA_ARCHS = " iwmmxt "
+
+IMAGE_FSTYPES += "jffs2"
+
+# Use tune-xscale per default. Machine independent feeds should be built with tune-strongarm.
+require conf/machine/include/tune-xscale.inc
+
+# Uncomment this to use iwmmxt optimizations. Remove the above xscale stuff first
+#require conf/machine/include/tune-iwmmxt.inc
+
+ROOT_FLASH_SIZE = "80"
+VOLATILE_STORAGE_SIZE = "64"
+MACHINE_GUI_CLASS = "bigscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "480"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "640"
+MACHINE_DISPLAY_ORIENTATION = "0"
+MACHINE_DISPLAY_PPI = "200"
+MACHINE_FEATURES = "alsa apm bluetooth irda kernel26 pcmcia screen touchscreen usbgadget wifi vfat"
+MACHINE_FEATURES += "iwmmxt"
+
+#
+# Software/packages selection
+#
+PREFERRED_PROVIDER_virtual/kernel = "linux-handhelds-2.6"
+PCMCIA_MANAGER = "pcmciautils"
+MODUTILS = "26"
+
+XSERVER = "xserver-kdrive-w100"
+
+PREFERRED_VERSION_orinoco-modules = "0.15rc1"
+
+MACHINE_EXTRA_RDEPENDS = "tiinit acx-firmware"
+MACHINE_EXTRA_RRECOMMENDS = "\
+ kernel-module-i2c-pxa \
+ kernel-module-pxa27x-voltage \
+ kernel-module-pxa27x-voltage-max158xx \
+ kernel-module-acx \
+ kernel-module-hx4700-acx \
+ kernel-module-hx4700-bt \
+ kernel-module-snd-hx4700-audio \
+ keymaps"
+
+#write out a reflash.ctl with the appriate entries for the rootfs, the ones for the kernel should already be there
+EXTRA_IMAGECMD_jffs2 = "; sumtool -i ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.jffs2 \
+ -o ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs-summary.jffs2 \
+ -e 256KiB -p ; echo '${IMAGE_NAME} ${IMAGE_NAME}.rootfs.jffs2 - root' >> ${DEPLOY_DIR_IMAGE}/reflash.ctl"
+
+
+#
+# Modules autoload and other boot properties
+#
+module_autoload_evdev = "evdev"
+module_autoload_hx4700_power = "hx4700_power"
+module_autoload_pcmcia = "pcmcia"
+module_autoload_hx4700_pcmcia = "hx4700_pcmcia"
+module_autoload_asic3_mmc = "asic3_mmc"
+module_autoload_mmc_block = "mmc_block"
+module_autoload_hx4700_ts = "hx4700_ts"
+module_autoload_hx4700_navpt = "hx4700_navpt"
+module_autoload_hx4700_bt = "hx4700_bt"
+module_autoload_snd-hx4700_audio = "snd-hx4700_audio"
+module_autoload_snd-pcm-oss = "snd-pcm-oss"
+module_autoload_snd-mixer-oss = "snd-mixer-oss"
+module_autoload_pxa27x_udc = "pxa27x_udc"
+
+#FIXME: this should be controlled by a userspace utility later.
+module_autoload_g_ether = "g_ether"
+
+SERIAL_CONSOLE = "115200 ttyS0"
diff --git a/conf/machine/include/LAB-settings.inc b/conf/machine/include/LAB-settings.inc
new file mode 100644
index 0000000..d0100c9
--- /dev/null
+++ b/conf/machine/include/LAB-settings.inc
@@ -0,0 +1,8 @@
+#
+# Settings for LAB (Linux As Bootloader) support.
+# Machines which support (or want to support) LAB,
+# include this.
+#
+
+# LAB can only resolve relative symlinks
+#ROOTFS_POSTPROCESS_COMMAND += "make_zimage_symlink_relative; "
diff --git a/conf/machine/include/motorola-ezx-base.inc b/conf/machine/include/motorola-ezx-base.inc
new file mode 100644
index 0000000..ea1b0eb
--- /dev/null
+++ b/conf/machine/include/motorola-ezx-base.inc
@@ -0,0 +1,74 @@
+# use this for overrides
+MACHINE_CLASS = "motorola-ezx"
+
+#
+# Hardware-based properties
+#
+TARGET_ARCH = "arm"
+
+# Use tune-xscale per default. Machine independent feeds should be built with tune-strongarm.
+require conf/machine/include/tune-xscale.inc
+
+# Uncomment this to use iwmmxt optimizations. Remove the above xscale stuff first
+#require conf/machine/include/tune-iwmmxt.inc
+
+#cat /proc/mtd
+#dev: size erasesize name
+#mtd0: 00020000 00008000 "Bootloader"
+#mtd1: 000e0000 00020000 "Kernel"
+#mtd2: 00580000 00020000 "VFM_Filesystem"
+#mtd3: 00020000 00020000 "Logo"
+
+ROOT_FLASH_SIZE = "24"
+MACHINE_GUI_CLASS = "smallscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "240"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "320"
+MACHINE_DISPLAY_ORIENTATION = "0"
+MACHINE_DISPLAY_PPI = "180"
+MACHINE_FEATURES = "alsa apm bluetooth kernel26 keyboard phone screen touchscreen usbgadget usbhost vfat"
+MACHINE_FEATURES += " iwmmxt"
+
+# Comment this out if you change to tune-iwmmxt.inc above
+PACKAGE_EXTRA_ARCHS += "iwmmxt"
+
+#
+# Software/packages selection
+#
+PREFERRED_PROVIDER_virtual/kernel ?= "openezx-kernel"
+MODUTILS = "26"
+XSERVER = "xserver-kdrive-fbdev"
+PREFERRED_PROVIDER_virtual/xserver = "xserver-kdrive"
+
+IMAGE_FSTYPES ?= "jffs2"
+EXTRA_IMAGECMD_jffs2 = "--pad=14680064 --little-endian --eraseblock=0x20000 -n"
+
+# In order to enable UIBIFS add "uibi and ubifs"
+#IMAGE_FSTYPES += "ubi ubifs"
+
+# From dmesg:
+# UBI: smallest flash I/O unit: 1
+# UBI: logical eraseblock size: 131072 bytes
+# from ubiattach stdout:
+# UBI device number 0, total 1996 LEBs
+MKUBIFS_ARGS = "-m 1 -e 130944 -c 487"
+
+# from dmesg:
+# UBI: smallest flash I/O unit: 1
+# UBI: physical eraseblock size: 131072 bytes (128 KiB)
+# UBI: sub-page size: 512
+UBINIZE_ARGS = "-m 1 -p 128KiB "
+
+
+EXTRA_IMAGEDEPENDS += "moto-boot-usb-native ezx-gen-blob"
+
+IMAGE_INSTALL_append += "\
+ kernel-module-ohci-hcd \
+ kernel-module-moto-usb-ipc \
+ kernel-module-ts27010mux \
+"
+
+# Ezxd needs to be started very early so we need the mux devices in static /dev
+IMAGE_DEVICE_TABLES = "files/device_table-minimal.txt \
+ files/device_table-ezx.txt"
+
+SERIAL_CONSOLE = "115200 ttyS0"
diff --git a/conf/machine/include/palm.inc b/conf/machine/include/palm.inc
new file mode 100644
index 0000000..5394855
--- /dev/null
+++ b/conf/machine/include/palm.inc
@@ -0,0 +1,85 @@
+#
+# Hardware-based properties
+#
+
+TARGET_ARCH = "arm"
+
+SERIAL_CONSOLE = "115200 ttyS0"
+
+# Use tune-xscale per default. Machine independent feeds should be built with tune-strongarm.
+require conf/machine/include/tune-xscale.inc
+
+MACHINE_FEATURES = "kernel26 touchscreen apm alsa bluetooth irda usbgadget screen ext2 vfat"
+
+#
+# Software/packages selection
+#
+
+PREFERRED_PROVIDER_virtual/kernel = "linux-hackndev-2.6"
+
+PREFERRED_PROVIDER_virtual/xserver = "xserver-kdrive"
+
+module_autoload_sa1100-rtc = "sa1100-rtc"
+module_autoload_snd-ac97-bus = "snd-ac97-bus"
+module_autoload_apm_power = "apm_power"
+module_autoload_backlight = "backlight"
+module_autoload_battery = "battery"
+module_autoload_bcm2035_uart = "bcm2035_uart"
+module_autoload_gpioed = "gpioed"
+module_autoload_gpioed-ng = "gpioed-ng"
+module_autoload_lcd = "lcd"
+module_autoload_led-class = "led-class"
+module_autoload_leds-palmld = "leds-palmld"
+module_autoload_ledtrig-heartbeat = "ledtrig-heartbeat"
+module_autoload_ledtrig-hwtimer = "ledtrig-hwtimer"
+module_autoload_ledtrig-timer = "ledtrig-timer"
+module_autoload_palmld_battery = "palmld-battery"
+module_autoload_palmld_ide = "palmld-ide"
+module_autoload_palmld_pcmcia = "palmld-pcmcia"
+module_autoload_pcmcia = "pcmcia"
+module_autoload_pcmcia_core = "pcmcia-core"
+module_autoload_pda_power = "pda_power"
+module_autoload_pxa2xx_core = "pxa2xx-core"
+module_autoload_snd = "snd"
+module_autoload_snd-ac97-codec = "snd-ac97-codec"
+module_autoload_snd-mixer-oss = "snd-mixer-oss"
+module_autoload_snd-page-alloc = "snd-page-alloc"
+module_autoload_snd-pcm = "snd-pcm"
+module_autoload_snd-pcm-oss = "snd-pcm-oss"
+module_autoload_snd-pxa2xx-pcm = "snd-pxa2xx-pcm"
+module_autoload_snd-pxa2xx-ac97 = "snd-pxa2xx-ac97"
+module_autoload_snd-seq = "snd-seq"
+module_autoload_snd-seq-device = "snd-seq-device"
+module_autoload_seq-midi-event = "seq-midi-event"
+module_autoload_snd-seq-oss = "snd-seq-oss"
+module_autoload_snd-timer = "snd-timer"
+module_autoload_soundcore = "soundcore"
+module_autoload_wm97xx-ts = "wm97xx-ts"
+module_autoload_pxa27x-keyboard = "pxa27x-keyboard"
+module_autoload_palmtx_battery = "palmtx_battery"
+module_autoload_palmz72_battery = "palmz72_battery"
+module_autoload_i2c-dev = "i2c-dev"
+module_autoload_i2c-pxa = "i2c-pxa"
+
+
+MACHINE_EXTRA_RRECOMMENDS = "\
+ kernel-module-ac97-bus \
+ kernel-module-apm-power \
+ kernel-module-backlight \
+ kernel-module-battery \
+ kernel-module-led-class \
+ kernel-module-lcd \
+ kernel-module-gpioed \
+ kernel-module-gpioed-ng \
+ kernel-module-external-power \
+ kernel-module-snd \
+ kernel-module-snd-ac97-codec \
+ kernel-module-snd-page-alloc \
+ kernel-module-snd-pcm \
+ kernel-module-snd-seq \
+ kernel-module-snd-seq-device \
+ kernel-module-snd-seq-midi-event \
+ kernel-module-snd-seq-oss \
+ kernel-module-snd-timer \
+ kernel-module-soundcore \
+ "
diff --git a/conf/machine/include/tune-arm920t.inc b/conf/machine/include/tune-arm920t.inc
new file mode 100644
index 0000000..fee5c58
--- /dev/null
+++ b/conf/machine/include/tune-arm920t.inc
@@ -0,0 +1,4 @@
+FEED_ARCH = "armv4t"
+BASE_PACKAGE_ARCH = "armv4t"
+TARGET_CC_ARCH = "-march=armv4t -mtune=arm920t"
+PACKAGE_EXTRA_ARCHS += "armv4 armv4t"
diff --git a/conf/machine/include/tune-arm926ejs.inc b/conf/machine/include/tune-arm926ejs.inc
new file mode 100644
index 0000000..f41e460
--- /dev/null
+++ b/conf/machine/include/tune-arm926ejs.inc
@@ -0,0 +1,7 @@
+FEED_ARCH = "armv5te"
+PACKAGE_EXTRA_ARCHS += "armv4 armv4t armv5te"
+# For gcc 3.x you need:
+#TARGET_CC_ARCH = "-march=armv5te -mtune=arm926ejs"
+# For gcc 4.x you need:
+TARGET_CC_ARCH = "-march=armv5te -mtune=arm926ej-s"
+BASE_PACKAGE_ARCH = "armv5te"
diff --git a/conf/machine/include/tune-sh3.inc b/conf/machine/include/tune-sh3.inc
new file mode 100644
index 0000000..32801a6
--- /dev/null
+++ b/conf/machine/include/tune-sh3.inc
@@ -0,0 +1,3 @@
+TARGET_CC_ARCH = "-ml -m3"
+FEED_ARCH = "sh3"
+BASE_PACKAGE_ARCH = "sh3"
diff --git a/conf/machine/include/tune-strongarm.inc b/conf/machine/include/tune-strongarm.inc
new file mode 100644
index 0000000..ac584e3
--- /dev/null
+++ b/conf/machine/include/tune-strongarm.inc
@@ -0,0 +1,11 @@
+# This machine lists common configuration options for Strongarm devices
+# gcc does not differentiate between the different Strongarm versions, so neither do we
+# http://lists.linuxtogo.org/pipermail/openembedded-devel/2008-January/004031.html
+
+TARGET_CC_ARCH = "-march=armv4 -mtune=strongarm"
+FEED_ARCH = "armv4"
+BASE_PACKAGE_ARCH = "armv4"
+PACKAGE_EXTRA_ARCHS += "armv4"
+
+ARM_INSTRUCTION_SET = "arm"
+THUMB_INTERWORK = "no"
diff --git a/conf/machine/include/tune-xscale.inc b/conf/machine/include/tune-xscale.inc
new file mode 100644
index 0000000..f0f58bc
--- /dev/null
+++ b/conf/machine/include/tune-xscale.inc
@@ -0,0 +1,9 @@
+# this depends on fact that for ARM the TARGET_ARCH is 'arm' for little endian and 'armeb' for bigendian
+# this is the case as of now for all arm machines in OE.
+
+FEED_ARCH = "${@['armv5teb', 'armv5te'][bb.data.getVar('TARGET_ARCH', d, 1) == 'arm']}"
+
+TARGET_CC_ARCH = "-march=armv5te -mtune=xscale"
+TARGET_CC_KERNEL_ARCH = "-march=armv5te -mtune=xscale"
+PACKAGE_EXTRA_ARCHS += "${@['armv4b armv4tb armv5teb', 'armv4 armv4t armv5te'][ bb.data.getVar('TARGET_ARCH', d, 1) == 'arm']}"
+BASE_PACKAGE_ARCH = "${@['armv5teb', 'armv5te'][bb.data.getVar('TARGET_ARCH', d, 1) == 'arm']}"
diff --git a/conf/machine/include/zaurus.inc b/conf/machine/include/zaurus.inc
new file mode 100644
index 0000000..0bbed6e
--- /dev/null
+++ b/conf/machine/include/zaurus.inc
@@ -0,0 +1,131 @@
+########################
+# Zaurus common settings
+########################
+
+ERASEBLOCKSIZE = "0x4000"
+ERASEBLOCKSIZE_akita = "0x20000"
+
+# Warning! SL-C3000 has "0x4000" (16MiB NAND)
+# C3100 and C3200 have same 128MiB NAND device as akita
+ERASEBLOCKSIZE_spitz = "0x20000"
+
+IMAGE_FSTYPES += "jffs2 tar.gz"
+
+# kernel now supports favourlzo
+IMAGE_CMD_jffs2 = "mkfs.jffs2 --root=${IMAGE_ROOTFS} --faketime -m favourlzo \
+ --output=${T}/${IMAGE_NAME}.rootfs.jffs2 --pad --little-endian --eraseblock=${ERASEBLOCKSIZE} -n \
+ && sumtool -i ${T}/${IMAGE_NAME}.rootfs.jffs2 \
+ -o ${T}/${IMAGE_NAME}.rootfs.jffs2.summary \
+ --eraseblock=${ERASEBLOCKSIZE} -l -p; \
+ cat ${T}/${IMAGE_NAME}.rootfs.jffs2 > ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.jffs2; \
+ rm ${T}/${IMAGE_NAME}.rootfs.jffs2; \
+ cat ${T}/${IMAGE_NAME}.rootfs.jffs2.summary > ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.summary.jffs2; \
+ rm ${T}/${IMAGE_NAME}.rootfs.jffs2.summary;"
+
+EXTRA_IMAGEDEPENDS += "zaurus-installer"
+
+IMAGE_DEVICE_TABLES = "files/device_table-minimal.txt \
+ files/device_table_add-scsi.txt \
+ files/device_table_add-loop.txt \
+ "
+
+#########
+# xserver (FIXME: xserver-xorg is in testing on spitz)
+#########
+
+PREFERRED_PROVIDER_virtual/xserver = "xserver-kdrive"
+XSERVER = "xserver-kdrive-fbdev"
+
+# c7x0 uses kdrive-imageon_1.2.0
+PREFERRED_PROVIDER_virtual/xserver_c7x0 = "xserver-kdrive-imageon"
+XSERVER_c7x0 = "xserver-kdrive-imageon"
+
+# collie uses kdrive-fbdev
+PREFERRED_PROVIDER_virtual/xserver_collie = "xserver-kdrive"
+XSERVER_collie = "xserver-kdrive-fbdev"
+
+# FIXME xserver-kdrive 1.3.0.0 is still the only working version ?
+PREFERRED_PROVIDER_virtual/xserver_akita = "xserver-kdrive-1300"
+XSERVER_akita = "xserver-kdrive-1300-fbdev"
+
+# spitz uses xserver-xorg
+PREFERRED_PROVIDER_virtual/xserver_spitz = "xserver-xorg"
+XSERVER_spitz = "xserver-xorg xf86-video-fbdev xf86-input-keyboard xf86-input-mouse xf86-input-evdev"
+PREFERRED_PROVIDER_virtual/libgl_spitz = "mesa-dri"
+
+
+########
+# kernel
+########
+
+PREFERRED_PROVIDER_virtual/kernel = "linux"
+
+# Default bootloader expects "zImage", use "uImage" for u-boot
+# Note: kexecboot can boot both kind of images
+ZAURUS_KERNEL_IMAGETYPE ?= "zImage"
+KERNEL_IMAGETYPE = "${ZAURUS_KERNEL_IMAGETYPE}"
+
+# sane defaults for devices with only 32Mb RAM
+XZ_COMPRESSION_LEVEL = "-7"
+LZMA_COMPRESSION_LEVEL = "-8"
+
+# kernel bootlogo
+LOGO_SIZE = '${@base_conditional("GUI_MACHINE_CLASS", "bigscreen", "vga", "qvga", d)}'
+
+################
+# machine tuning
+################
+
+TARGET_ARCH = "arm"
+
+SERIAL_CONSOLE = "115200 ttyS0"
+SERIAL_CONSOLE_collie = "115200 ttySA0"
+
+PCMCIA_MANAGER ?= "pcmciautils"
+
+CMDLINE_akita = "console=ttyS0,115200n8 console=tty1 fbcon=rotate:1"
+CMDLINE_c7x0 = "console=ttyS0,115200n8 console=tty1"
+CMDLINE_collie = "console=ttySA0,115200n8 console=tty1 mem=64M fbcon=rotate:1"
+CMDLINE_poodle = "console=ttyS0,115200n8 console=tty1 fbcon=rotate:1"
+CMDLINE_spitz = "console=ttyS0,115200n8 console=tty1 fbcon=rotate:1"
+CMDLINE_tosa = "console=ttyS0,115200n8 console=tty1"
+
+MACHINE_FEATURES = "kernel26 apm alsa pcmcia irda usbgadget keyboard touchscreen screen vfat ext2"
+MACHINE_FEATURES_append_akita = " usbhost"
+MACHINE_FEATURES_append_spitz = " usbhost"
+MACHINE_FEATURES_append_tosa = " usbhost wifi "
+
+MACHINE_EXTRA_RDEPENDS = "zaurusd mtd-utils nandlogical"
+MACHINE_EXTRA_RDEPENDS_collie = "zaurusd"
+
+# Still actual? OHCI suspend/resume fixup
+# MACHINE_EXTRA_RRECOMMENDS_tosa = "apm-tosa-suspendfix"
+
+##################################
+# build kexecboot kernel while
+# making sure rootfs is compatible
+##################################
+
+require conf/machine/include/initramfs-kexecboot.inc
+
+# FIXME
+# blindly import from linux-rp.inc (2.6.2x)
+#
+module_autoload_pxaficp_ir = "pxaficp_ir"
+module_autoload_snd-pcm-oss = "snd-pcm-oss"
+module_autoload_pcmcia_core = "pcmcia_core"
+module_autoload_pxa2xx_cs = "pxa2xx_cs"
+module_autoload_ohci-hcd_tosa = "ohci-hcd"
+module_autoload_snd-soc-corgi_c7x0 = "snd-soc-corgi"
+module_autoload_snd-soc-spitz_akita = "snd-soc-spitz"
+module_autoload_snd-soc-spitz_spitz = "snd-soc-spitz"
+module_autoload_snd-soc-poodle_poodle = "snd-soc-poodle"
+module_autoload_locomo-spi_collie = "locomo-spi"
+module_autoload_mmc_block_collie = "mmc_block"
+module_autoload_mmc_spi = "mmc-spi"
+module_autoload_locomokbd_collie = "locomokbd"
+module_autoload_sa1100-cs_collie = "sa1100_cs"
+module_autoload_collie-ts_collie = "collie-ts"
+module_autoload_leds-locomo_collie = "leds-locomo"
+module_autoload_power_collie = "power"
+# Fixme ? module-snd for tosa
diff --git a/conf/machine/jornada56x.conf b/conf/machine/jornada56x.conf
new file mode 100644
index 0000000..72fff1e
--- /dev/null
+++ b/conf/machine/jornada56x.conf
@@ -0,0 +1,15 @@
+#@TYPE: Machine
+#@NAME: HP Jornada 56x
+#@DESCRIPTION: Machine configuration for the SA1100 based HP Jornada 56x palmtop computer
+
+TARGET_ARCH = "arm"
+PREFERRED_PROVIDER_xserver = "xserver-kdrive"
+PREFERRED_PROVIDER_virtual/kernel = "linux-handhelds-2.6"
+PREFERRED_PROVIDERS += "virtual/${TARGET_PREFIX}depmod:module-init-tools-cross"
+BOOTSTRAP_EXTRA_RDEPENDS = "kernel kernel-modules module-init-tools"
+
+EXTRA_IMAGECMD_jornada56x_jffs2 = "-e 0x40000 -p"
+
+SERIAL_CONSOLE = "115200 ttySA0"
+
+require conf/machine/include/tune-strongarm.inc
diff --git a/conf/machine/jornada6xx.conf b/conf/machine/jornada6xx.conf
new file mode 100644
index 0000000..0b32184
--- /dev/null
+++ b/conf/machine/jornada6xx.conf
@@ -0,0 +1,22 @@
+#@TYPE: Machine
+#@NAME: HP Jornada 680
+#@DESCRIPTION: Machine configuration for the HITACHI SH3 based HP Jornada 6xx palmtop computer
+
+TARGET_ARCH = "sh3"
+
+require conf/machine/include/tune-sh3.inc
+
+MACHINE_FEATURES = "kernel26 alsa pcmcia irda keyboard touchscreen screen vfat"
+MACHINE_EXTRA_RRECOMMENDS = " kernel-modules"
+
+PREFERRED_PROVIDER_virtual/kernel = "linux-jlime-jornada6xx"
+PREFERRED_VERSION_linux-jlime-jornada6xx = "2.6.17"
+
+PREFERRED_PROVIDER_virtual/xserver = "xserver-kdrive"
+PREFERRED_VERSION_xserver-kdrive = "1.3.0.0"
+
+XSERVER = "xserver-kdrive-fbdev"
+
+PCMCIA_MANAGER = "pcmciautils"
+
+SYSVINIT_ENABLED_GETTYS = "1 2"
diff --git a/conf/machine/jornada7xx.conf b/conf/machine/jornada7xx.conf
new file mode 100644
index 0000000..d444cb9
--- /dev/null
+++ b/conf/machine/jornada7xx.conf
@@ -0,0 +1,23 @@
+#@TYPE: Machine
+#@NAME: HP Jornada 7xx
+#@DESCRIPTION: Machine configuration for the SA1110 based HP Jornada 7xx palmtop computer
+
+TARGET_ARCH = "arm"
+
+require conf/machine/include/tune-strongarm.inc
+
+PREFERRED_PROVIDER_virtual/kernel = "linux-jlime-jornada7xx"
+PCMCIA_MANAGER = "pcmciautils"
+MACHINE_FEATURES = "kernel26 apm alsa pcmcia irda keyboard touchscreen screen vfat"
+MACHINE_EXTRA_RDEPENDS = "kernel-modules bluez-dtl1-workaround"
+
+PREFERRED_PROVIDER_virtual/xserver = "xserver-kdrive"
+PREFERRED_VERSION_xserver-kdrive = "1.3.0.0"
+XSERVER = "xserver-kdrive-fbdev"
+
+#screeninfo
+MACHINE_GUI_CLASS = "smallscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "640"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "240"
+
+SYSVINIT_ENABLED_GETTYS = "1 2 3 4 5 6"
diff --git a/conf/machine/palmld.conf b/conf/machine/palmld.conf
new file mode 100644
index 0000000..bbeaf3a
--- /dev/null
+++ b/conf/machine/palmld.conf
@@ -0,0 +1,37 @@
+#@TYPE: Machine
+#@NAME: Palm LifeDrive
+#@DESCRIPTION: Machine configuration for the Palm LifeDrive
+
+require conf/machine/include/palm.inc
+
+ROOT_FLASH_SIZE = "100"
+
+MACHINE_GUI_CLASS = "bigscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "320"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "480"
+MACHINE_FEATURES += "pcmcia wifi"
+MACHINE_FEATURES += "iwmmxt"
+
+
+MACHINE_EXTRA_RRECOMMENDS += "\
+ kernel-module-bcm2035-uart \
+ kernel-module-leds-palmld \
+ kernel-module-ledtrig-heartbeat \
+ kernel-module-ledtrig-hwtimer \
+ kernel-module-ledtrig-timer \
+ kernel-module-palmld-battery \
+ kernel-module-palmld-ide \
+ kernel-module-palmld-pcmcia \
+ kernel-module-pcmcia-core \
+ kernel-module-pda-power \
+ kernel-module-pxa2xx-core \
+ kernel-module-snd-pxa2xx-ac97 \
+ kernel-module-snd-pxa2xx-pcm \
+ "
+
+#
+# Modules autoload and other boot properties
+#
+
+module_conf_wm97xx-ts = "options wm97xx-ts pil=2"
+
diff --git a/conf/machine/palmt650.conf b/conf/machine/palmt650.conf
new file mode 100644
index 0000000..f81ade3
--- /dev/null
+++ b/conf/machine/palmt650.conf
@@ -0,0 +1,20 @@
+#@TYPE: Machine
+#@NAME: Palm Treo 650
+#@DESCRIPTION: Machine configuration for the Palm Treo 650
+
+require conf/machine/include/palm.inc
+
+ROOT_FLASH_SIZE = "100"
+
+SERIAL_CONSOLE = "115200 ttyS1"
+
+GUI_MACHINE_CLASS = "bigscreen"
+
+MACHINE_EXTRA_RRECOMMENDS += "kernel-module-snd-pxa2xx-ac97 \
+ kernel-module-pxa27x-keyboard \
+ kernel-module-wm97xx-ts \
+ "
+
+MACHINE_EXTRA_RDEPENDS += "palmt650-keyboard-modmap"
+
+module_autoload_g_ether = "g_ether"
diff --git a/conf/machine/palmt680.conf b/conf/machine/palmt680.conf
new file mode 100644
index 0000000..b984667
--- /dev/null
+++ b/conf/machine/palmt680.conf
@@ -0,0 +1,14 @@
+#@TYPE: Machine
+#@NAME: Palm Treo 680
+#@DESCRIPTION: Machine configuration for the Palm Treo 680
+
+require conf/machine/include/palm.inc
+
+ROOT_FLASH_SIZE = "100"
+
+SERIAL_CONSOLE = "115200 ttyS0"
+
+GUI_MACHINE_CLASS = "bigscreen"
+
+MACHINE_EXTRA_RRECOMMENDS += "kernel-module-pxa27x-keyboard \
+ kernel-module-wm97xx-ts"
diff --git a/conf/machine/palmtc.conf b/conf/machine/palmtc.conf
new file mode 100644
index 0000000..28db830
--- /dev/null
+++ b/conf/machine/palmtc.conf
@@ -0,0 +1,14 @@
+#@TYPE: Machine
+#@NAME: Palm TC
+#@DESCRIPTION: Machine configuration for the Palm Tungsten C
+
+require conf/machine/include/palm.inc
+
+MACHINE_FEATURES += "wifi"
+
+ROOT_FLASH_SIZE = "100"
+
+SERIAL_CONSOLE = "115200 ttyS0"
+
+GUI_MACHINE_CLASS = "bigscreen"
+
diff --git a/conf/machine/palmtt.conf b/conf/machine/palmtt.conf
new file mode 100644
index 0000000..4326af9
--- /dev/null
+++ b/conf/machine/palmtt.conf
@@ -0,0 +1,17 @@
+#@TYPE: Machine
+#@NAME: Palm Tungsten T
+#@DESCRIPTION: Machine configuration for Palm Tungsten T/T2
+
+TARGET_ARCH = "arm"
+
+MACHINE_GUI_CLASS = "bigscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "320"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "320"
+
+PREFERRED_PROVIDER_xserver = "xserver-kdrive"
+PREFERRED_PROVIDER_virtual/kernel = "linux-palm-omap1"
+
+SERIAL_CONSOLE ?= "115200 ttyS0"
+EXTRA_IMAGECMD_jffs2 = "--pad --little-endian --eraseblock=0x40000"
+
+require conf/machine/include/tune-arm926ejs.inc
diff --git a/conf/machine/palmtt2.conf b/conf/machine/palmtt2.conf
new file mode 100644
index 0000000..2c62a04
--- /dev/null
+++ b/conf/machine/palmtt2.conf
@@ -0,0 +1,2 @@
+WARNING:="${@bb.fatal('\n*\n*\n* Sorry, There is no dedicated configuration for the Palm Tungsten T2,\n* because \
+its very similar to the Palm Tungsten T. Use MACHINE = \"palmtt\".\n*\n*\n')}"
diff --git a/conf/machine/palmtt3.conf b/conf/machine/palmtt3.conf
new file mode 100644
index 0000000..3834feb
--- /dev/null
+++ b/conf/machine/palmtt3.conf
@@ -0,0 +1,9 @@
+#@TYPE: Machine
+#@NAME: Palm Tungsten|T3
+#@DESCRIPTION: Machine configuration for the Palm Tungsten|T3
+
+require conf/machine/include/palm.inc
+
+ROOT_FLASH_SIZE = "100"
+
+SERIAL_CONSOLE = "115200 ttyS3"
diff --git a/conf/machine/palmtt5.conf b/conf/machine/palmtt5.conf
new file mode 100644
index 0000000..997c157
--- /dev/null
+++ b/conf/machine/palmtt5.conf
@@ -0,0 +1,15 @@
+#@TYPE: Machine
+#@NAME: Palm Tungsten T5
+#@DESCRIPTION: Machine configuration for the Palm Tungsten T5
+
+require conf/machine/include/palm.inc
+
+ROOT_FLASH_SIZE = "100"
+
+SERIAL_CONSOLE = "115200 ttyS0"
+
+GUI_MACHINE_CLASS = "bigscreen"
+
+MACHINE_EXTRA_RRECOMMENDS += "kernel-module-pxa27x-keyboard \
+ kernel-module-wm97xx-ts \
+ kernel-module-palmt5-battery"
diff --git a/conf/machine/palmtx.conf b/conf/machine/palmtx.conf
new file mode 100644
index 0000000..e1991c8
--- /dev/null
+++ b/conf/machine/palmtx.conf
@@ -0,0 +1,29 @@
+#@TYPE: Machine
+#@NAME: Palm TX
+#@DESCRIPTION: Machine configuration for the Palm TX
+
+require conf/machine/include/palm.inc
+
+MACHINE_GUI_CLASS = "bigscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "320"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "480"
+MACHINE_FEATURES += "pcmcia wifi"
+
+ROOT_FLASH_SIZE = "100"
+
+SERIAL_CONSOLE = "115200 ttyS0"
+
+MACHINE_EXTRA_RRECOMMENDS += "kernel-module-pxa27x-keyboard \
+ kernel-module-wm97xx-ts \
+ kernel-module-palmtx-battery \
+ kernel-module-palmtx-border \
+ kernel-module-bcm2035-uart \
+ kernel-module-palmtx-pcmcia \
+ kernel-module-pcmcia-core \
+ kernel-module-pda-power \
+ kernel-module-pxa2xx-core \
+ kernel-module-snd-pxa2xx-ac97 \
+ kernel-module-snd-pxa2xx-pcm"
+
+
+module_autoload_g_ether = "g_ether"
diff --git a/conf/machine/palmz31.conf b/conf/machine/palmz31.conf
new file mode 100644
index 0000000..9fb5f7e
--- /dev/null
+++ b/conf/machine/palmz31.conf
@@ -0,0 +1,20 @@
+#@TYPE: Machine
+#@NAME: Palm Zire 31
+#@DESCRIPTION: Machine configuration for the Palm Zire 31
+
+require conf/machine/include/palm.inc
+
+ROOT_FLASH_SIZE = "16"
+MACHINE_GUI_CLASS = "smallscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "160"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "160"
+
+SERIAL_CONSOLE = "115200 ttyS0"
+
+MACHINE_EXTRA_RRECOMMENDS += "kernel-module-i2c-pxa \
+ kernel-module-i2c-algo-pxa \
+ kernel-module-i2c-dev \
+ kernel-module-wm97xx-ts \
+ kernel-module-palmz31-battery"
+
+module_autoload_g_ether = "g_ether"
diff --git a/conf/machine/palmz71.conf b/conf/machine/palmz71.conf
new file mode 100644
index 0000000..0a7f274
--- /dev/null
+++ b/conf/machine/palmz71.conf
@@ -0,0 +1,14 @@
+#@TYPE: Machine
+#@NAME: Palm Zire 71
+#@DESCRIPTION: Machine configuration for Palm Zire 71
+
+TARGET_ARCH = "arm"
+
+PREFERRED_PROVIDER_xserver = "xserver-kdrive"
+PREFERRED_PROVIDER_virtual/kernel = "linux-palm-omap1"
+PREFERRED_PROVIDERS += "virtual/${TARGET_PREFIX}depmod:module-init-tools-cross"
+
+SERIAL_CONSOLE ?= "115200 ttyS0"
+EXTRA_IMAGECMD_jffs2 = "--pad --little-endian --eraseblock=0x40000"
+
+require conf/machine/include/tune-arm926ejs.inc
diff --git a/conf/machine/palmz72.conf b/conf/machine/palmz72.conf
new file mode 100644
index 0000000..9766434
--- /dev/null
+++ b/conf/machine/palmz72.conf
@@ -0,0 +1,21 @@
+#@TYPE: Machine
+#@NAME: Palm Zire 72
+#@DESCRIPTION: Machine configuration for the Palm Zire 72
+
+require conf/machine/include/palm.inc
+
+ROOT_FLASH_SIZE = "100"
+MACHINE_GUI_CLASS = "bigscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "320"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "320"
+
+SERIAL_CONSOLE = "115200 ttyS0"
+
+MACHINE_EXTRA_RRECOMMENDS += "kernel-module-i2c-pxa \
+ kernel-module-i2c-algo-pxa \
+ kernel-module-i2c-dev \
+ kernel-module-wm97xx-ts \
+ kernel-module-palmz72-battery"
+
+module_autoload_g_ether = "g_ether"
+
diff --git a/conf/machine/poodle.conf b/conf/machine/poodle.conf
new file mode 100644
index 0000000..d1bcb15
--- /dev/null
+++ b/conf/machine/poodle.conf
@@ -0,0 +1,14 @@
+#@TYPE: Machine
+#@NAME: Sharp Zaurus SL-B500, Sharp Zaurus SL-5600
+#@DESCRIPTION: Machine configuration for the PXA250 based Sharp Zaurus SL-B500 and SHarp Zaurus SL-5600 devices
+
+require conf/machine/include/zaurus.inc
+require conf/machine/include/tune-xscale.inc
+
+ROOT_FLASH_SIZE = "22"
+
+MACHINE_GUI_CLASS = "smallscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "240"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "320"
+MACHINE_DISPLAY_ORIENTATION = "270"
+MACHINE_DISPLAY_PPI = "114"
diff --git a/conf/machine/rokre2.conf b/conf/machine/rokre2.conf
new file mode 100644
index 0000000..1a99c87
--- /dev/null
+++ b/conf/machine/rokre2.conf
@@ -0,0 +1,10 @@
+#@TYPE: Machine
+#@NAME: Motorola EZX ROKR E2
+#@DESCRIPTION: Machine configuration for the Motorola GSM Phone ROKR E2
+
+require conf/machine/include/motorola-ezx-base.inc
+
+# there is no touchscreen
+MACHINE_FEATURES = "kernel26 apm alsa bluetooth usbgadget usbhost keyboard screen"
+MACHINE_FEATURES += "iwmmxt"
+
diff --git a/conf/machine/rokre6.conf b/conf/machine/rokre6.conf
new file mode 100644
index 0000000..044a65c
--- /dev/null
+++ b/conf/machine/rokre6.conf
@@ -0,0 +1,6 @@
+#@TYPE: Machine
+#@NAME: Motorola EZX ROKR E6
+#@DESCRIPTION: Machine configuration for the Motorola GSM Phone ROKR E6
+
+require conf/machine/include/motorola-ezx-base.inc
+
diff --git a/conf/machine/rx1950.conf b/conf/machine/rx1950.conf
new file mode 100644
index 0000000..d43a2dc
--- /dev/null
+++ b/conf/machine/rx1950.conf
@@ -0,0 +1,28 @@
+#@TYPE: Machine
+#@NAME: HP iPAQ rx1950
+#@DESCRIPTION: Machine configuration for the HP iPAQ rx1950
+
+#
+# Hardware-based properties
+#
+TARGET_ARCH = "arm"
+
+# Samsung S3C2xxx CPU
+require conf/machine/include/tune-arm920t.inc
+
+ROOT_FLASH_SIZE = "64"
+VOLATILE_STORAGE_SIZE = "64"
+MACHINE_GUI_CLASS = "smallscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "240"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "320"
+MACHINE_FEATURES = "kernel26 touchscreen apm alsa irda wifi usbgadget screen vfat"
+
+#
+# Software/packages selection
+#
+PREFERRED_PROVIDER_virtual/kernel = "linux"
+PREFERRED_VERSION_linux = "2.6.35"
+PCMCIA_MANAGER = "pcmciautils"
+
+SERIAL_CONSOLE = "115200 ttyS0 vt100"
+USE_VT = "0"
diff --git a/conf/machine/rx3000.conf b/conf/machine/rx3000.conf
new file mode 100644
index 0000000..83c8820
--- /dev/null
+++ b/conf/machine/rx3000.conf
@@ -0,0 +1,40 @@
+#@TYPE: Machine
+#@NAME: HP iPAQ rx3xxx
+#@DESCRIPTION: Machine configuration for the HP iPAQ rx3xxx
+
+#
+# Hardware-based properties
+#
+TARGET_ARCH = "arm"
+
+# Samsung S3C2xxx CPU
+require conf/machine/include/tune-arm920t.inc
+
+ROOT_FLASH_SIZE = "32"
+VOLATILE_STORAGE_SIZE = "64"
+MACHINE_GUI_CLASS = "smallscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "240"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "320"
+MACHINE_FEATURES = "kernel26 touchscreen apm alsa irda bluetooth wifi usbgadget screen vfat"
+
+#
+# Software/packages selection
+#
+PREFERRED_PROVIDER_virtual/kernel = "linux-handhelds-2.6"
+PCMCIA_MANAGER = "pcmciautils"
+PREFERRED_PROVIDER_xserver = "xserver-kdrive"
+
+MACHINE_EXTRA_RDEPENDS = "tiinit acx-firmware"
+MACHINE_EXTRA_RRECOMMENDS = "kernel-module-acx \
+ "
+
+#
+# Modules autoload and other boot properties
+#
+module_autoload_snd-pcm-oss = "snd-pcm-oss"
+module_autoload_g_ether = "g_ether"
+
+SERIAL_CONSOLE = "115200 ttyS0 vt100"
+USE_VT = "0"
+
+require conf/machine/include/LAB-settings.inc
diff --git a/conf/machine/shepherd.conf b/conf/machine/shepherd.conf
new file mode 100644
index 0000000..1541712
--- /dev/null
+++ b/conf/machine/shepherd.conf
@@ -0,0 +1,3 @@
+WARNING:="${@bb.fatal('\n*\n*\n* Sorry, There is no dedicated configuration for the Sharp SL-C750,\n* because \
+of the similarities of the clamshell series. Use MACHINE = \"c7x0\".\n*\n*\n')}"
+
diff --git a/conf/machine/simpad.conf b/conf/machine/simpad.conf
new file mode 100644
index 0000000..c1fc402
--- /dev/null
+++ b/conf/machine/simpad.conf
@@ -0,0 +1,23 @@
+#@TYPE: Machine
+#@NAME: SIEMENS SIMpad SL4, SIEMENS SIMpad CL4, SIEMENS SIMpad SLC, Telekom T-Sinus PAD
+#@DESCRIPTION: Machine configuration for the SA1100 based SIEMENS SIMpad and Telekom T-Sinus PAD devices
+
+TARGET_ARCH = "arm"
+
+MACHINE_FEATURES = "apm pcmcia irda screen touchscreen vfat kernel26"
+
+PREFERRED_PROVIDER_virtual/kernel = "linux"
+PCMCIA_MANAGER ?= "pcmciautils"
+
+require conf/machine/include/tune-strongarm.inc
+
+ROOT_FLASH_SIZE = "16"
+EXTRA_IMAGECMD_jffs2 = "--little-endian --eraseblock=0x20000"
+
+GUI_MACHINE_CLASS = "bigscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "800"
+MACHINE_DISPLAY_HEIGHT_PIXELS= "600"
+SERIAL_CONSOLE = "ttySA0 115200 vt100"
+USE_VT = "0"
+
+PREFERRED_PROVIDER_xserver = "xserver-kdrive"
diff --git a/conf/machine/spitz.conf b/conf/machine/spitz.conf
new file mode 100644
index 0000000..4019bca
--- /dev/null
+++ b/conf/machine/spitz.conf
@@ -0,0 +1,29 @@
+#@TYPE: Machine
+#@NAME: Sharp Zaurus SL-C3000
+#@DESCRIPTION: Machine configuration for the Sharp Zaurus SL-C3000 device
+
+require conf/machine/include/zaurus.inc
+require conf/machine/include/tune-xscale.inc
+
+MACHINE_FEATURES += "iwmmxt"
+PACKAGE_EXTRA_ARCHS += "iwmmxt"
+
+# NAND factory-default
+# SL-C3000 (spitz) mtdparts=sharpsl-nand:7168k@0k(smf),5120k@7168k(root),-(home)
+# SL-C3100 (borzoi) mtdparts=sharpsl-nand:7168k@0k(smf),32768k@7168k(root),-(home)
+# SL-C3200 (terrier) mtdparts=sharpsl-nand:7168k@0k(smf),44032k@7168k(root),-(home)
+
+# There isn't an unique size valid for all models,
+# please set the right value in your local.conf
+ROOT_FLASH_SIZE ?= "5"
+
+MACHINE_GUI_CLASS = "bigscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "640"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "480"
+MACHINE_DISPLAY_ORIENTATION = "270"
+MACHINE_DISPLAY_PPI = "216"
+
+# spitz and akita share same u-boot machine
+UBOOT_MACHINE = "akita_config"
+UBOOT_ENTRYPOINT = "0xA1000000"
+UBOOT_LOADADDRESS = "${UBOOT_ENTRYPOINT}"
diff --git a/conf/machine/terrier.conf b/conf/machine/terrier.conf
new file mode 100644
index 0000000..ca6a20d
--- /dev/null
+++ b/conf/machine/terrier.conf
@@ -0,0 +1,2 @@
+WARNING:="${@bb.fatal('\n*\n*\n* Sorry, There is no dedicated configuration for the Sharp SL-C3200,\n* because \
+its very similar to the SL-C3000/SL-C3100. Use MACHINE = \"spitz\".\n*\n*\n')}"
diff --git a/conf/machine/tosa.conf b/conf/machine/tosa.conf
new file mode 100644
index 0000000..ab12b8b
--- /dev/null
+++ b/conf/machine/tosa.conf
@@ -0,0 +1,14 @@
+#@TYPE: Machine
+#@NAME: Sharp Zaurus SL-6000
+#@DESCRIPTION: Machine configuration for the PXA255 based Sharp Zaurus SL-6000 device
+
+require conf/machine/include/zaurus.inc
+require conf/machine/include/tune-xscale.inc
+
+ROOT_FLASH_SIZE = "28"
+
+MACHINE_GUI_CLASS = "bigscreen"
+MACHINE_DISPLAY_WIDTH_PIXELS = "480"
+MACHINE_DISPLAY_HEIGHT_PIXELS = "640"
+MACHINE_DISPLAY_ORIENTATION = "0"
+MACHINE_DISPLAY_PPI = "200"
diff --git a/recipes-bsp/ezx/ezx-gen-blob_git.bb b/recipes-bsp/ezx/ezx-gen-blob_git.bb
new file mode 100644
index 0000000..1b7647d
--- /dev/null
+++ b/recipes-bsp/ezx/ezx-gen-blob_git.bb
@@ -0,0 +1,41 @@
+DESCRIPTION = "Generic Blob [Bootloader] for the Motorola EZX platform"
+SECTION = "bootloaders"
+AUTHOR = "OpenEZX Team"
+HOMEPAGE = "http://people.openezx.org/wyrm/gen-blob"
+LICENSE = "GPL"
+PROVIDES = "virtual/bootloader"
+DEPENDS = "virtual/kernel"
+SRCREV = "33d6abb6ae51cda8c8298ba63033cd11ea4b045c"
+PV = "1.0.0+gitr${SRCPV}"
+PR = "r0"
+PE = "1"
+
+SRC_URI = "\
+ git://git.openezx.org/gen-blob.git;protocol=git;branch=master \
+ file://remove-bogus-sed.patch \
+"
+S = "${WORKDIR}/git"
+
+inherit autotools
+
+EXTRA_OECONF = "\
+ --with-board=lubbock \
+ --with-cpu=pxa262 \
+ --with-linux-prefix=${STAGING_KERNEL_DIR} \
+ --enable-usb \
+"
+
+do_configure() {
+ gnu-configize
+ oe_runconf
+}
+
+do_deploy() {
+ install -d ${DEPLOY_DIR_IMAGE}
+ install -m 0644 src/blob/blob-a780 ${DEPLOY_DIR_IMAGE}/gen-blob-for-1stgen.${SRCDATE}
+ install -m 0644 src/blob/blob-a1200 ${DEPLOY_DIR_IMAGE}/gen-blob-for-2ndgen.${SRCDATE}
+}
+
+addtask deploy before do_build after do_compile
+
+PACKAGE_ARCH = "${MACHINE_ARCH}"
diff --git a/recipes-bsp/ezx/ezx-gpiotool_svn.bb b/recipes-bsp/ezx/ezx-gpiotool_svn.bb
new file mode 100644
index 0000000..2d403de
--- /dev/null
+++ b/recipes-bsp/ezx/ezx-gpiotool_svn.bb
@@ -0,0 +1,24 @@
+DESCRIPTION = "Gpiotool can read/write gpio configuration from userspace."
+SECTION = "devel"
+LICENSE = "GPL"
+HOMEPAGE = "http://www.openezx.org"
+AUTHOR = "Harald Welte"
+SRCREV = "1877"
+PV = "${SRCPV}"
+PR = "r1"
+
+SRC_URI = "svn://svn.openezx.org/trunk/src/userspace;module=gpiotool;proto=http"
+S = "${WORKDIR}/gpiotool"
+
+do_compile() {
+ for i in mmio.c gpiotool.c gpio.c
+ do
+ ${CC} ${CFLAGS} -c $i
+ done
+ ${CC} ${CFLAGS} ${LDFLAGS} -o ezx-gpiotool mmio.o gpiotool.o gpio.o
+}
+
+do_install() {
+ install -d ${D}${sbindir}
+ install -m 0755 ezx-gpiotool ${D}${sbindir}
+}
diff --git a/recipes-bsp/ezx/ezxd/ezxd.init b/recipes-bsp/ezx/ezxd/ezxd.init
new file mode 100644
index 0000000..ba44942
--- /dev/null
+++ b/recipes-bsp/ezx/ezxd/ezxd.init
@@ -0,0 +1,83 @@
+#! /bin/sh
+# -*- coding: utf-8 -*-
+# init.d script for ezxd
+
+set -e
+
+DAEMON=/usr/bin/ezxd
+NAME=ezxd
+PIDDIR=/var/run/ezxd
+PIDFILE=$PIDDIR/pid
+DESC="ezxd server"
+
+test -x $DAEMON || exit 0
+
+# Source defaults file; edit that file to configure this script.
+ENABLED=1
+PARAMS=""
+if [ -e /etc/default/ezxd ]; then
+ . /etc/default/ezxd
+fi
+
+test "$ENABLED" != "0" || exit 0
+
+start_it_up()
+{
+ if [ ! -d $PIDDIR ]; then
+ mkdir -p $PIDDIR
+ fi
+ if [ -e $PIDFILE ]; then
+ PIDDIR=/proc/$(cat $PIDFILE)
+ if [ -d ${PIDDIR} -a "$(readlink -f ${PIDDIR}/exe)" = "${DAEMON}" ]; then
+ echo "$DESC already started; not starting."
+ else
+ echo "Removing stale PID file $PIDFILE."
+ rm -f $PIDFILE
+ fi
+ fi
+
+ echo -n "Starting $DESC: "
+ modprobe ohci-hcd
+ sleep 2
+ modprobe moto-usb-ipc
+ modprobe ts27010mux
+
+ start-stop-daemon --start --background --quiet --pidfile $PIDFILE \
+ --exec $DAEMON -- --system $PARAMS
+ # We need to sleep here because opening the mux devices takes some time
+ sleep 15
+ echo "$NAME."
+}
+
+shut_it_down()
+{
+ echo -n "Stopping $DESC: "
+ start-stop-daemon --stop --quiet --pidfile $PIDFILE
+
+ # We no longer include these arguments so that start-stop-daemon
+ # can do its job even given that we may have been upgraded.
+ # We rely on the pidfile being sanely managed
+ # --exec $DAEMON -- --system $PARAMS
+ echo "$NAME."
+ rm -f $PIDFILE
+}
+
+case "$1" in
+ start)
+ start_it_up
+ ;;
+ stop)
+ shut_it_down
+ ;;
+ restart|force-reload)
+ shut_it_down
+ sleep 1
+ start_it_up
+ ;;
+ *)
+ echo "Usage: /etc/init.d/$NAME {start|stop|restart|force-reload}" >&2
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/recipes-bsp/ezx/ezxd_svn.bb b/recipes-bsp/ezx/ezxd_svn.bb
new file mode 100644
index 0000000..f738b5f
--- /dev/null
+++ b/recipes-bsp/ezx/ezxd_svn.bb
@@ -0,0 +1,48 @@
+DESCRIPTION = "Open implementation of motorola's tapisrv, replaces opentapi"
+LICENSE = "GPLv2"
+SECTION = "devel"
+AUTHOR = "Daniel Ribeiro"
+
+SRCREV = "2513"
+PV = "0.0+svnr${SRCPV}"
+PR = "r4"
+
+SRC_URI = "svn://svn.openezx.org/trunk/src/userspace/;module=ezxd;proto=http \
+ file://ezxd.init \
+ "
+
+inherit update-rc.d
+
+INITSCRIPT_NAME = "ezxd"
+INITSCRIPT_PARAMS = "start 00 S ."
+
+S = "${WORKDIR}/${PN}"
+
+CFLAGS_append = " -DDEBUG "
+
+TARGET_CC_ARCH += "${LDFLAGS}"
+
+do_configure() {
+ # Comment out both CC and CROSS definitions
+ sed -i -e 's:^CC.*$:#\0:g' Makefile
+ sed -i -e 's:^CROSS.*$:#\0:g' Makefile
+}
+
+fakeroot do_install() {
+ install -d ${D}/dev/input
+ mknod ${D}/dev/input/uinput c 10 223
+
+ install -d ${D}${bindir}
+ install -m 755 ezxd ${D}${bindir}
+
+ install -d ${D}${libdir}/ezxd
+ install -m 755 *.so ${D}${libdir}/ezxd
+
+ install -d ${D}${sysconfdir}/init.d
+ install -m 0600 ezxd.conf ${D}${sysconfdir}/
+ install -m 0755 ${WORKDIR}/ezxd.init ${D}${sysconfdir}/init.d/ezxd
+}
+
+FILES_${PN} += "/dev"
+CONFFILES_${PN} += "${sysconfdir}/ezxd.conf"
+
diff --git a/recipes-bsp/ezx/files/remove-bogus-sed.patch b/recipes-bsp/ezx/files/remove-bogus-sed.patch
new file mode 100644
index 0000000..8597ed9
--- /dev/null
+++ b/recipes-bsp/ezx/files/remove-bogus-sed.patch
@@ -0,0 +1,15 @@
+Index: gen-blob/configure
+===================================================================
+--- gen-blob.orig/configure
++++ gen-blob/configure
+@@ -1970,8 +1970,8 @@
+ fi
+
+
+-CFLAGS=`echo $CFLAGS | sed 's/\ *-g\ */\ /'`
+-LDFLAGS=`echo $LDFLAGS | sed 's/\ *-g\ */\ /'`
++CFLAGS=`echo $CFLAGS`
++LDFLAGS=`echo $LDFLAGS`
+ CCAS=`echo $CC`
+ CCASFLAGS=`echo $CFLAGS -D__ASSEMBLY__ `
+
diff --git a/recipes-bsp/ezx/moto-boot-usb-native_git.bb b/recipes-bsp/ezx/moto-boot-usb-native_git.bb
new file mode 100644
index 0000000..5147d72
--- /dev/null
+++ b/recipes-bsp/ezx/moto-boot-usb-native_git.bb
@@ -0,0 +1,27 @@
+DESCRIPTION = "Boot a Motorola EZX device with a user supplied kernel"
+DEPENDS = "virtual/libusb0-native virtual/kernel"
+SECTION = "devel"
+AUTHOR = "Team OpenEZX <openezx-devel@lists.openezx.org>"
+LICENSE = "GPL"
+SRCREV = "aeef3f44a1358fee15da193876e8ebc716dcd550"
+PV = "0.3.0+gitr${SRCPV}"
+PR = "r0"
+PE = "1"
+
+SRC_URI = "git://git.openezx.org/moto-boot-usb.git;protocol=git;branch=master"
+S = "${WORKDIR}/git"
+
+EXTRA_OECONF := '--with-kernel-dir="${STAGING_DIR}/${MACHINE_ARCH}${TARGET_VENDOR}-${TARGET_OS}/kernel"'
+
+inherit autotools native
+
+do_deploy() {
+ install -d ${DEPLOY_DIR_TOOLS}
+ install -m 0755 src/moto-boot-usb ${DEPLOY_DIR_TOOLS}/moto-boot-usb-${PV}
+}
+
+do_install() {
+ :
+}
+
+addtask deploy before do_build after do_compile
diff --git a/recipes-bsp/h2200-bootloader/h2200-bootloader.bb b/recipes-bsp/h2200-bootloader/h2200-bootloader.bb
new file mode 100644
index 0000000..92194e5
--- /dev/null
+++ b/recipes-bsp/h2200-bootloader/h2200-bootloader.bb
@@ -0,0 +1,14 @@
+DESCRIPTION = "Bootloader firmware extractor for the h2200 iPAQ"
+LICENSE = "MIT"
+ALLOW_EMPTY = "1"
+PR = "r4"
+
+COMPATIBLE_MACHINE = "h2200"
+#it is a shell script, but lets protect the innocent some more
+PACKAGE_ARCH = "h2200"
+
+pkg_postinst() {
+#!/bin/sh
+mkdir -p /lib/firmware
+dd if=/dev/mtdblock0 of=/lib/firmware/h2200_bootloader.bin 2>/dev/null
+}
diff --git a/recipes-bsp/ipaq-boot-params/files/h5000/params b/recipes-bsp/ipaq-boot-params/files/h5000/params
new file mode 100644
index 0000000..fb42935
--- /dev/null
+++ b/recipes-bsp/ipaq-boot-params/files/h5000/params
@@ -0,0 +1 @@
+set linuxargs "root=mtd1 noinitrd console=ttyS0,115200 console=tty0"
diff --git a/recipes-bsp/ipaq-boot-params/files/params b/recipes-bsp/ipaq-boot-params/files/params
new file mode 100644
index 0000000..fb42935
--- /dev/null
+++ b/recipes-bsp/ipaq-boot-params/files/params
@@ -0,0 +1 @@
+set linuxargs "root=mtd1 noinitrd console=ttyS0,115200 console=tty0"
diff --git a/recipes-bsp/ipaq-boot-params/ipaq-boot-params.bb b/recipes-bsp/ipaq-boot-params/ipaq-boot-params.bb
new file mode 100644
index 0000000..216811a
--- /dev/null
+++ b/recipes-bsp/ipaq-boot-params/ipaq-boot-params.bb
@@ -0,0 +1,16 @@
+DESCRIPTION = "Kernel boot parameters for HH.org bootldr"
+LICENSE = "MIT"
+PR = "r5"
+
+COMPATIBLE_MACHINE = "(h3600|h3800|h3900|h5000|simpad)"
+
+SRC_URI = "file://params"
+
+do_install() {
+ install -d ${D}/boot
+ install -m 0644 ${WORKDIR}/params ${D}/boot/
+}
+
+FILES_${PN} = "/boot/params"
+PACKAGE_ARCH = "${MACHINE_ARCH}"
+
diff --git a/recipes-bsp/palmt650/palmt650-keyboard-modmap.bb b/recipes-bsp/palmt650/palmt650-keyboard-modmap.bb
new file mode 100644
index 0000000..c005136
--- /dev/null
+++ b/recipes-bsp/palmt650/palmt650-keyboard-modmap.bb
@@ -0,0 +1,23 @@
+DESCRIPTION = "A X keyboard modifier mapping for the Treo650"
+LICENSE = "GPL"
+PV = "0.0.3"
+PR = "r0.02"
+
+SRC_URI = "\
+ file://60xXmodmap \
+ file://Xmodmap \
+"
+
+S = "${WORKDIR}"
+
+do_install() {
+ install -d ${D}/etc/X11/
+ install ${WORKDIR}/Xmodmap ${D}/etc/X11/Xmodmap
+ install -d ${D}/etc/X11/Xsession.d
+ install ${WORKDIR}/60xXmodmap ${D}/etc/X11/Xsession.d/60xXmodmap
+}
+
+PACKAGE_ARCH = "all"
+
+FILES_${PN} += "/etc/X11/Xmodmap"
+FILES_${PN} += "/etc/X11/Xsession.d/60xXmodmap"
diff --git a/recipes-bsp/palmt650/palmt650-keyboard-modmap/60xXmodmap b/recipes-bsp/palmt650/palmt650-keyboard-modmap/60xXmodmap
new file mode 100644
index 0000000..db814a0
--- /dev/null
+++ b/recipes-bsp/palmt650/palmt650-keyboard-modmap/60xXmodmap
@@ -0,0 +1,8 @@
+# -*- sh -*-
+# Xsession.d script for Xmodmap
+#
+#
+# This file is sourced by Xsession(5), not executed.
+
+xmodmap /etc/X11/Xmodmap
+xmodmap -e 'remove Control = Mode_switch'
diff --git a/recipes-bsp/palmt650/palmt650-keyboard-modmap/Xmodmap b/recipes-bsp/palmt650/palmt650-keyboard-modmap/Xmodmap
new file mode 100644
index 0000000..9086cd1
--- /dev/null
+++ b/recipes-bsp/palmt650/palmt650-keyboard-modmap/Xmodmap
@@ -0,0 +1,118 @@
+!!!!! get modifiers right
+remove Control = Mode_switch
+remove Control = Shift_R
+remove Shift = Menu
+remove Shift = Control_R
+! Alt key -> Alt_R
+keycode 108 = Alt_R
+! Shift(R) key -> Shift_R
+!keycode 105 = Shift_R
+!add Shift = Shift_R
+! hack - should be Control_R for terminal
+keycode 105 = Control_R
+add Control = Control_R
+! blue key -> Mode_switch
+keycode 37 = Mode_switch
+add mod5 = Mode_switch
+
+!!!!! top mute/unmute
+! keycode mute = has no keycode
+
+!!!!! side buttons
+keycode 123 = Prior
+keycode 122 = Next
+keycode 71 = End
+
+!!!!! top 2 buttons left/right and up from arrow key nav
+!! below - added hacked symbols: percent asciicircum
+keycode 69 = Home percent asciicircum
+!! below - added hacked symbols: percent asciicircum
+keycode 9 = Menu Delete Insert
+
+!!!!! arrowkeys
+keycode 111 = Up
+keycode 116 = Down
+keycode 113 = Left
+keycode 114 = Right
+keycode 104 = KP_Enter
+
+!!!!! answer, calendar, mail, hangup/power
+!!!! CHECKME
+!! below - added hacked symbols: Escape Print
+keycode 72 = F1 Escape Print
+!! below - added hacked symbols: equal semicolon
+keycode 67 = F2 equal semicolon
+!! below - added hacked symbols: bracketleft braceleft
+keycode 68 = F3 bracketleft braceleft
+!! below - added hacked symbols: bracketright braceright
+keycode 70 = F4 bracketright braceright
+
+!!!!! 1st row
+keycode 24 = q Q slash
+keycode 25 = w W plus
+keycode 26 = e E 1
+keycode 27 = r R 2
+keycode 28 = t T 3
+keycode 29 = y Y parenleft
+keycode 30 = u U parenright
+keycode 31 = i I at
+keycode 32 = o O quotedbl
+!! below - added hacked symbols: underscore
+keycode 33 = p P underscore
+!!!!! 2nd row
+keycode 38 = a A ampersand
+keycode 39 = s S minus
+keycode 40 = d D 4
+keycode 41 = f F 5
+keycode 42 = g G 6
+keycode 43 = h H dollar
+keycode 44 = j J exclam
+keycode 45 = k K colon
+keycode 46 = l L apostrophe
+!! below - added hacked symbols: backslash asciitilde
+keycode 22 = BackSpace backslash asciitilde
+!!!!! 3rd row
+keycode 37 = Mode_switch
+keycode 52 = z S asterisk
+keycode 53 = x D 7
+keycode 54 = c F 8
+keycode 55 = v G 9
+keycode 56 = b H numbersign
+keycode 57 = n J question
+keycode 58 = m K comma
+!! below - added hacked symbols: bar grave
+keycode 60 = period bar grave
+keycode 36 = Return
+!!!!! bottom row
+keycode 50 = Shift_L
+!! below - added hacked symbols: less greater
+keycode 19 = 0 less greater
+keycode 65 = space
+keycode 108 = Alt_R
+!! below - hacked to be Control_R instead of Shift_R
+keycode 105 = Control_R
+
+!!!!! missing standard key symbols:
+! % hacked
+! ^ hacked
+! _ hacked
+! = hacked
+! [ hacked
+! ] hacked
+! { hacked
+! } hacked
+! ; hacked
+! < hacked
+! > hacked
+! \ hacked
+! | hacked
+! ` hacked
+! ~ hacked
+! Escape hacked
+! Delete hacked
+! Insert hacked
+! Print hacked
+! Pause
+! Caps_Lock
+! Num_Lock
+! Sroll_Lock
diff --git a/recipes-bsp/zaurus-utils/encdec-updater.bb b/recipes-bsp/zaurus-utils/encdec-updater.bb
new file mode 100644
index 0000000..1fa7693
--- /dev/null
+++ b/recipes-bsp/zaurus-utils/encdec-updater.bb
@@ -0,0 +1,19 @@
+DESCRIPTION = "A tool to encode and decode the Sharp Zaurus updater.sh script"
+SECTION = "console/utils"
+LICENSE = "GPL"
+
+SRC_URI = "file://encdec-updater.c"
+
+do_compile() {
+ ${CC} ${LDFLAGS} -o encdec-updater ${WORKDIR}/encdec-updater.c
+}
+do_install() {
+ install -d ${D}${bindir}
+ install -m 0755 encdec-updater ${D}${bindir}/
+}
+
+BBCLASSEXTEND = "native"
+
+COMPATIBLE_MACHINE = "(poodle|c7x0|spitz|akita|tosa)"
+
+NATIVE_INSTALL_WORKS = "1"
diff --git a/recipes-bsp/zaurus-utils/files/encdec-updater.c b/recipes-bsp/zaurus-utils/files/encdec-updater.c
new file mode 100644
index 0000000..b894623
--- /dev/null
+++ b/recipes-bsp/zaurus-utils/files/encdec-updater.c
@@ -0,0 +1,80 @@
+//
+//
+// Sharp Zaurus SL-C7x0 updater.sh script encoder/decoder
+//
+// mailto:sash@cacko.biz
+//
+//
+
+#include <stdio.h>
+
+unsigned char enctab[] = {
+ 0x4a,0xf7,0x77,0x62,0xb0,0xe3,0xd8,0xf6,0xd1,0x98,0x09,0x2e,0x19,0x0c,0x0d,0x7c,
+ 0x04,0xe0,0x6b,0x22,0x10,0x08,0x15,0x16,0xb9,0x28,0x83,0x1f,0x91,0x06,0xfa,0xe8,
+ 0xbd,0xc6,0x21,0x32,0x23,0x6f,0x01,0x26,0x5f,0x03,0x33,0xb6,0x35,0xac,0x2d,0x0a,
+ 0x6e,0x6c,0xfc,0xc4,0x29,0x34,0x2b,0x42,0x25,0x66,0xc9,0x3e,0x87,0xb4,0x74,0xf2,
+ 0x11,0x20,0x41,0xb3,0x27,0x14,0xc1,0xcd,0x3d,0x80,0xd5,0x7f,0xcf,0x4c,0x4d,0xca,
+ 0x75,0x51,0xc8,0xa6,0x17,0xf0,0x55,0x82,0x79,0xdc,0x59,0x5a,0x5b,0xb8,0x5d,0x40,
+ 0x64,0x58,0xff,0xc5,0xab,0xc0,0xae,0xeb,0xa3,0xad,0xea,0x6a,0x37,0x3b,0x73,0x9a,
+ 0x88,0x3a,0xe1,0x68,0x0b,0xec,0xc7,0x76,0xf9,0x38,0x57,0xdd,0x49,0x96,0x95,0x7a,
+ 0x50,0x2a,0x4e,0xdb,0x00,0x48,0xd7,0x86,0x47,0x94,0xa0,0x1c,0x8b,0x8c,0x8d,0x92,
+ 0x45,0x90,0x7e,0x56,0x93,0xef,0x1a,0x52,0x97,0xbc,0x99,0xb5,0x7d,0x72,0x9d,0x9c,
+ 0xfb,0x24,0xa1,0xa2,0x07,0x46,0xa5,0x02,0x69,0xe6,0xa9,0xd3,0x30,0xba,0xd6,0x84,
+ 0x63,0x13,0x1b,0xb2,0x1d,0xaf,0x36,0x8e,0xb7,0x53,0x05,0xbb,0x12,0x78,0x8f,0xbe,
+ 0x71,0xbf,0xe4,0x1e,0x9e,0xa4,0xe5,0x2f,0x9b,0x31,0x67,0x4b,0xcb,0x43,0xc3,0xce,
+ 0x44,0x3c,0x0f,0xd2,0xaa,0xd4,0xed,0xa7,0x7b,0x18,0xd0,0xda,0x0e,0x54,0xf1,0xde,
+ 0xdf,0xa8,0x3f,0xe2,0x6d,0xcc,0xf8,0x70,0xe7,0x61,0xe9,0x85,0x65,0x2c,0x39,0xee,
+ 0x60,0x81,0x89,0xc2,0xf3,0xf4,0xf5,0x8a,0x5c,0x5e,0xd9,0x4f,0x9f,0xb1,0xfd,0xfe,
+};
+
+unsigned char decode_c(unsigned char c)
+{
+ int i;
+ for (i = 0; i < 256; i++) {
+ if (c == enctab[i]) return i;
+ }
+ printf("Internal bug: encode_c()\n");
+ exit(1);
+ return 0;
+}
+
+unsigned char encode_c(unsigned char c)
+{
+ int i;
+ return enctab[c];
+}
+
+int main(int argc, char *argv[])
+{
+ int i, decode;
+ int c;
+ FILE *inf, *outf;
+ char name[256];
+
+ if (argc < 3) {
+ printf("Decode file:\n\tencsh -d file.sh\nEncode file:\n\tencsh -c file.sh\n");
+ exit(1);
+ }
+
+ if (strcmp(argv[1], "-d")) decode = 1;
+ else decode = 0;
+
+ strcpy(name, argv[2]);
+ strcat(name, ".$$$$");
+
+ inf = fopen(argv[2], "rb");
+ outf = fopen(name, "wb");
+
+ while ((c = fgetc(inf)) >= 0) {
+ if (decode) c = decode_c(c);
+ else c = encode_c(c);
+ fputc(c, outf);
+ }
+
+ fclose(inf);
+ fclose(outf);
+
+ rename(name, argv[2]);
+
+ return 0;
+}
diff --git a/recipes-bsp/zaurus-utils/nandlogical-klibc_1.0.0.bb b/recipes-bsp/zaurus-utils/nandlogical-klibc_1.0.0.bb
new file mode 100644
index 0000000..3f28589
--- /dev/null
+++ b/recipes-bsp/zaurus-utils/nandlogical-klibc_1.0.0.bb
@@ -0,0 +1,9 @@
+require nandlogical_${PV}.bb
+
+inherit klibc
+
+do_compile() {
+ ${CC} ${CFLAGS} ${LDFLAGS} -static -I${STAGING_INCDIR} nandlogical.c -o nandlogical
+}
+
+FILESPATHPKG =. "nandlogical:"
diff --git a/recipes-bsp/zaurus-utils/nandlogical/nandlogical.c b/recipes-bsp/zaurus-utils/nandlogical/nandlogical.c
new file mode 100644
index 0000000..d88d1c2
--- /dev/null
+++ b/recipes-bsp/zaurus-utils/nandlogical/nandlogical.c
@@ -0,0 +1,386 @@
+/*
+ NAND logical utility for Sharp Zaurus SL-C7x0/860/7500/Cxx00
+ version 1.0
+ Copyright 2006 Alexander Chukov <sash@pdaXrom.org>
+
+ 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, 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.
+ */
+
+#define _GNU_SOURCE
+#include <ctype.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <asm/types.h>
+#include <mtd/mtd-user.h>
+
+int fd;
+
+unsigned char *readbuf;
+unsigned char *oobbuf;
+unsigned long *log2phy;
+
+struct mtd_oob_buf oob = {0, 16, NULL};
+
+struct nand_oobinfo none_oobinfo = {
+ .useecc = MTD_NANDECC_OFF,
+};
+
+#define NAND_LOGICAL_SIZE (7 * 1024 * 1024)
+
+/////////////////////////////////////////////////////////////////////
+// oob structure
+/////////////////////////////////////////////////////////////////////
+
+#define NAND_NOOB_LOGADDR_00 8
+#define NAND_NOOB_LOGADDR_01 9
+#define NAND_NOOB_LOGADDR_10 10
+#define NAND_NOOB_LOGADDR_11 11
+#define NAND_NOOB_LOGADDR_20 12
+#define NAND_NOOB_LOGADDR_21 13
+
+static uint nand_get_logical_no(unsigned char *oob)
+{
+ unsigned short us,bit;
+ int par;
+ int good0, good1;
+
+ if(oob[NAND_NOOB_LOGADDR_00] == oob[NAND_NOOB_LOGADDR_10] &&
+ oob[NAND_NOOB_LOGADDR_01] == oob[NAND_NOOB_LOGADDR_11]){
+ good0 = NAND_NOOB_LOGADDR_00;
+ good1 = NAND_NOOB_LOGADDR_01;
+ }else
+ if(oob[NAND_NOOB_LOGADDR_10] == oob[NAND_NOOB_LOGADDR_20] &&
+ oob[NAND_NOOB_LOGADDR_11] == oob[NAND_NOOB_LOGADDR_21]){
+ good0 = NAND_NOOB_LOGADDR_10;
+ good1 = NAND_NOOB_LOGADDR_11;
+ }else
+ if(oob[NAND_NOOB_LOGADDR_20] == oob[NAND_NOOB_LOGADDR_00] &&
+ oob[NAND_NOOB_LOGADDR_21] == oob[NAND_NOOB_LOGADDR_01]){
+ good0 = NAND_NOOB_LOGADDR_20;
+ good1 = NAND_NOOB_LOGADDR_21;
+ }else{
+ return (uint)-1;
+ }
+
+ us = (((unsigned short)(oob[good0]) & 0x00ff) << 0) |
+ (((unsigned short)(oob[good1]) & 0x00ff) << 8);
+
+ par = 0;
+ for(bit = 0x0001; bit != 0; bit <<= 1){
+ if(us & bit){
+ par++;
+ }
+ }
+ if(par & 1){
+ return (uint)-2;
+ }
+
+ if(us == 0xffff){
+ return 0xffff;
+ }else{
+ return ((us & 0x07fe) >> 1);
+ }
+}
+
+static void nand_set_logical_no(uint log_no, unsigned char *oob)
+{
+ unsigned short us,bit;
+ int par;
+
+ us = (((log_no & 0x03ff) << 1) | 0x1000);
+
+ par = 0;
+ for(bit = 0x0001; bit != 0; bit <<= 1){
+ if(us & bit){
+ par++;
+ }
+ }
+ if(par & 1){
+ us |= 0x0001;
+ }
+
+ oob[NAND_NOOB_LOGADDR_00] = (unsigned char)((us & 0x00ff) >> 0);
+ oob[NAND_NOOB_LOGADDR_01] = (unsigned char)((us & 0xff00) >> 8);
+ oob[NAND_NOOB_LOGADDR_10] = oob[NAND_NOOB_LOGADDR_00];
+ oob[NAND_NOOB_LOGADDR_11] = oob[NAND_NOOB_LOGADDR_01];
+ oob[NAND_NOOB_LOGADDR_20] = oob[NAND_NOOB_LOGADDR_00];
+ oob[NAND_NOOB_LOGADDR_21] = oob[NAND_NOOB_LOGADDR_01];
+}
+
+void scan_logical(int blocks, int erasesize)
+{
+ int i;
+ unsigned long offset;
+ int ret = 1;
+ for (i = 0; i < blocks; i++)
+ log2phy[i] = (uint) -1;
+ offset = 0;
+ for (i = 0; i < blocks; i++) {
+ oob.start = offset;
+ ret = ioctl(fd, MEMREADOOB, &oob);
+
+ //ret = nand_read_raw(nand, oobuf, offset, nand->writesize, nand->oobsize);
+ if (!ret) {
+ int log_no = nand_get_logical_no(oobbuf);
+ if (((int)log_no >= 0) && (log_no < blocks)) {
+ log2phy[log_no] = offset;
+ //printf("NAND logical - %08X -> %04X\n", offset, log_no * erasesize);
+ } else {
+ //printf("NAND logical - %08X - skip (%x)\n", offset, log_no);
+ }
+ } else {
+ //printf("NAND logical - offset %x read OOB problem\n", offset);
+ }
+ offset += erasesize;
+ }
+}
+
+unsigned long add_logical(unsigned long ofs, int blocks, int erasesize, int bs)
+{
+ erase_info_t erase;
+ unsigned long offset = 0;
+ int i;
+ int ret;
+
+ erase.length = erasesize;
+
+ for (i = 0; i < blocks; i++) {
+ oob.start = offset;
+ ret = ioctl(fd, MEMREADOOB, &oob);
+
+ if (!ret) {
+ int log_no = nand_get_logical_no(oobbuf);
+
+//printf("-- %x\n", log_no);
+
+ if ((short)log_no == -1) {
+ int j = 0;
+ {
+ loff_t offs = offset;
+ erase.start = offset;
+ int ret = ioctl(fd, MEMGETBADBLOCK, &offs);
+ if (ret > 0) {
+ printf ("\nSkipping bad block at 0x%08x\n", erase.start);
+ goto nextblock;
+ } else if (ret < 0) {
+ perror("ioctl(MEMGETBADBLOCK)");
+ exit(1);
+ } else {
+ printf("%x - no bad block\n", offset);
+ }
+
+ if (ioctl(fd, MEMERASE, &erase) != 0) {
+ perror("ioctl(MEMERASE)");
+ goto nextblock;
+ }
+
+ //printf("%x - erased\n", offset);
+
+ }
+
+ //printf("NAND logical - found free block %x, mapped as %x\n", offset, ofs);
+
+ log2phy[ofs / erasesize] = offset;
+
+ return offset;
+ } else {
+ //fprintf(stderr, "found: %x\n", log_no);
+ }
+ } else {
+ perror ("ioctl(MEMREADOOB)");
+ }
+
+ nextblock:
+ offset += erasesize;
+ }
+
+ return (unsigned long)-1;
+}
+
+void usage(void)
+{
+ fprintf(stderr, "Usage:\nnandlogical <mtd char device> READ|WRITE <start> <length> <file>\n");
+ exit(1);
+}
+
+int main(int argc, char *argv[])
+{
+ mtd_info_t meminfo;
+ char *mtddev;
+ int blocks;
+ unsigned long start_addr;
+ unsigned long end_addr;
+ unsigned long length;
+ unsigned long ofs;
+ int bs;
+ int ofd;
+ int func_write = 0;
+ int oobinfochanged = 0;
+ struct nand_oobinfo old_oobinfo;
+
+ if (argc < 6)
+ usage();
+
+ if (strcmp(argv[2], "WRITE") == 0)
+ func_write = 1;
+ else if (strcmp(argv[2], "READ") != 0)
+ usage();
+
+ mtddev = argv[1];
+ start_addr = strtoul(argv[3], NULL, 0);
+ length = strtoul(argv[4], NULL, 0);
+
+ if (func_write) {
+ if ((ofd = open(argv[5], O_RDONLY)) == -1) {
+ perror("open input file");
+ exit(1);
+ }
+ /* Open MTD device */
+ if ((fd = open(mtddev, O_RDWR)) == -1) {
+ perror("open flash");
+ exit (1);
+ }
+ } else {
+ if ((ofd = open(argv[5], O_WRONLY | O_TRUNC | O_CREAT, 0644)) == -1) {
+ perror ("open outfile");
+ exit(1);
+ }
+ /* Open MTD device */
+ if ((fd = open(mtddev, O_RDONLY)) == -1) {
+ perror("open flash");
+ exit (1);
+ }
+ }
+
+ /* Fill in MTD device capability structure */
+ if (ioctl(fd, MEMGETINFO, &meminfo) != 0) {
+ perror("MEMGETINFO");
+ close(fd);
+ exit (1);
+ }
+
+ /* Make sure device page sizes are valid */
+ if (!(meminfo.oobsize == 64 && meminfo.writesize == 2048) &&
+ !(meminfo.oobsize == 16 && meminfo.writesize == 512) &&
+ !(meminfo.oobsize == 8 && meminfo.writesize == 256)) {
+ fprintf(stderr, "Unknown flash (not normal NAND)\n");
+ close(fd);
+ exit(1);
+ }
+
+ //printf("erasesize %x\nwritesize %x\noobsize %x\nsize %x\n", meminfo.erasesize, meminfo.writesize, meminfo.oobsize, meminfo.size);
+
+ blocks = NAND_LOGICAL_SIZE / meminfo.erasesize;
+ log2phy = (unsigned long *) malloc(blocks * sizeof(unsigned long));
+ readbuf = (char *)malloc(meminfo.erasesize);
+ oobbuf = (char *)malloc(meminfo.writesize);
+ oob.ptr = oobbuf;
+
+ scan_logical(blocks, meminfo.erasesize);
+
+ //printf("Start: %x\nEnd: %x\n", start_addr, length);
+
+ end_addr = start_addr + length;
+ bs = meminfo.writesize;
+
+ for (ofs = start_addr; ofs < end_addr ; ofs+=bs) {
+ int new_logical_added = 0;
+ int offset = log2phy[ofs / meminfo.erasesize];
+
+ if ((int)offset < 0 && func_write) {
+ //printf("add logical block...\n");
+ offset = add_logical(ofs, blocks, meminfo.erasesize, bs);
+ new_logical_added = 1;
+ }
+
+ if ((int)offset < 0) {
+ printf("NAND logical - offset %08X not found\n", ofs);
+ goto closeall;
+ }
+
+ offset += ofs % meminfo.erasesize;
+
+ //printf(":%x\n", offset);
+
+ if (func_write) {
+ int len;
+ memset(readbuf, 0xff, bs);
+ len = read(ofd, readbuf, bs);
+ if (len > 0) {
+#if 1
+ if (ofs % meminfo.erasesize == 0) {
+ int j;
+ erase_info_t erase;
+ erase.start = offset;
+ erase.length = meminfo.erasesize;
+ if (ioctl(fd, MEMERASE, &erase) != 0) {
+ printf("ioctl(MEMERASE) %x\n", offset);
+ //goto nextblock;
+ }
+ //printf("Erased\n");
+
+ for (j = 0; j < meminfo.erasesize; j+=bs) {
+ int log_no;
+ oob.start = offset + j;
+ oob.length = 16;
+
+ memset(oobbuf, 0xff, 16);
+ nand_set_logical_no(ofs / meminfo.erasesize, oobbuf);
+ if (ioctl(fd, MEMWRITEOOB, &oob) != 0) {
+ //perror ("ioctl(MEMWRITEOOB)");
+ printf("NAND logical add - MEMWRITEOOB error %x\n", offset + j);
+ exit(1);
+ }
+ memset(oobbuf, 0xff, 16);
+ if (ioctl(fd, MEMREADOOB, &oob) != 0) {
+ perror ("ioctl(MEMREADOOB)");
+ exit(1);
+ }
+ log_no = nand_get_logical_no(oobbuf);
+ //printf("%x:1 write %x, read %x\n", offset + j, ofs / meminfo.erasesize, log_no);
+ }
+
+ }
+#endif
+ if (pwrite(fd, readbuf, bs, offset) != bs) {
+ perror ("pwrite");
+ goto closeall;
+ }
+
+ } else
+ break;
+ } else {
+ if (pread(fd, readbuf, bs, offset) != bs) {
+ perror("pread");
+ goto closeall;
+ }
+ write(ofd, readbuf, ((end_addr - ofs) < bs)?(end_addr - ofs):bs);
+ }
+ }
+
+ closeall:
+
+ free(log2phy);
+ free(readbuf);
+ free(oobbuf);
+ close(fd);
+ close(ofd);
+
+ return 0;
+}
diff --git a/recipes-bsp/zaurus-utils/nandlogical_1.0.0.bb b/recipes-bsp/zaurus-utils/nandlogical_1.0.0.bb
new file mode 100644
index 0000000..0da2d23
--- /dev/null
+++ b/recipes-bsp/zaurus-utils/nandlogical_1.0.0.bb
@@ -0,0 +1,17 @@
+DESCRIPTION = "Nandlogical for Sharp mtd1"
+LICENSE = "GPL"
+PR = "r4"
+
+SRC_URI = "file://nandlogical.c"
+
+S = "${WORKDIR}"
+
+do_compile () {
+ ${CC} ${CFLAGS} ${LDFLAGS} nandlogical.c -o nandlogical
+}
+do_install () {
+ install -d ${D}${bindir}/
+ install -m 0755 nandlogical ${D}${bindir}/
+}
+
+COMPATIBLE_MACHINE = "(poodle|c7x0|akita|spitz|tosa)"
diff --git a/recipes-bsp/zaurus-utils/zaurus-installer.bb b/recipes-bsp/zaurus-utils/zaurus-installer.bb
new file mode 100644
index 0000000..bc345c2
--- /dev/null
+++ b/recipes-bsp/zaurus-utils/zaurus-installer.bb
@@ -0,0 +1,34 @@
+DESCRIPTION = "Installkit for kexecboot-kernel"
+LICENSE = "zaurus-installer"
+DEPENDS = "${@base_conditional('MACHINE', 'collie', 'linux-kexecboot', 'zaurus-updater linux-kexecboot', d)}"
+DEPENDS += "${@base_conditional('MACHINE', 'spitz', 'zaurus-legacy-tar', '', d)}"
+PR = "r4"
+
+do_compile() {
+}
+
+PACKAGE_ARCH = "${MACHINE_ARCH}"
+PACKAGES = ""
+
+# package_stagefile_shell need to run before populate_sysroot for packaged-staging
+addtask deploy before do_populate_sysroot after do_compile
+
+COMPATIBLE_MACHINE = "(collie|poodle|c7x0|spitz|akita|tosa)"
+
+do_deploy() {
+ cd ${DEPLOY_DIR_IMAGE}
+ rm -rf ${DEPLOY_DIR_IMAGE}/installkit-${MACHINE}/
+ mkdir installkit-${MACHINE}/
+ [ -f "${KERNEL_IMAGETYPE}-kexecboot-${MACHINE}.bin" ] && cp ${KERNEL_IMAGETYPE}-kexecboot-${MACHINE}.bin installkit-${MACHINE}/${KERNEL_IMAGETYPE}
+ if [ ! "${MACHINE}" = "collie" ]; then
+ cp updater.sh installkit-${MACHINE}/updater.sh
+ fi
+ if [ "${MACHINE}" = "spitz" ]; then
+ cp ${DEPLOY_DIR_IMAGE}/gnu-tar installkit-${MACHINE}/gnu-tar
+ fi
+ tar czf ${DEPLOY_DIR_IMAGE}/installkit-${MACHINE}.tar.gz installkit-${MACHINE}/
+ md5sum ${DEPLOY_DIR_IMAGE}/installkit-${MACHINE}.tar.gz > ${DEPLOY_DIR_IMAGE}/installkit-${MACHINE}.tar.gz.md5
+ rm -rf ${DEPLOY_DIR_IMAGE}/installkit-${MACHINE}/
+ package_stagefile_shell ${DEPLOY_DIR_IMAGE}/installkit-${MACHINE}.tar.gz
+ package_stagefile_shell ${DEPLOY_DIR_IMAGE}/installkit-${MACHINE}.tar.gz.md5
+}
diff --git a/recipes-bsp/zaurus-utils/zaurus-legacy-tar.bb b/recipes-bsp/zaurus-utils/zaurus-legacy-tar.bb
new file mode 100644
index 0000000..fae0520
--- /dev/null
+++ b/recipes-bsp/zaurus-utils/zaurus-legacy-tar.bb
@@ -0,0 +1,23 @@
+DESCRIPTION = "Legacy GNU-tar to unpack hd images on install for Zaurus spitz"
+LICENSE = "GPL"
+PR = "r0"
+
+SRC_URI = "file://gnu-tar.gz;subdir=${BPN}-${PV}"
+
+do_compile() {
+ :
+}
+
+PACKAGE_ARCH = "${MACHINE_ARCH}"
+PACKAGES = ""
+
+# package_stagefile_shell needs to run before populate_staging for packaged-staging
+addtask deploy before do_populate_sysroot after do_compile
+
+COMPATIBLE_MACHINE = "spitz"
+
+do_deploy() {
+ install -d ${DEPLOY_DIR_IMAGE}
+ install -m 0755 gnu-tar ${DEPLOY_DIR_IMAGE}/gnu-tar
+ package_stagefile_shell ${DEPLOY_DIR_IMAGE}/gnu-tar
+}
diff --git a/recipes-bsp/zaurus-utils/zaurus-updater.bb b/recipes-bsp/zaurus-utils/zaurus-updater.bb
new file mode 100644
index 0000000..b13e2a3
--- /dev/null
+++ b/recipes-bsp/zaurus-utils/zaurus-updater.bb
@@ -0,0 +1,31 @@
+DESCRIPTION = "Encrypted shellscript for the Zaurus ROM update"
+LICENSE = "zaurus-updater"
+DEPENDS = "encdec-updater-native"
+PR = "r25"
+
+SRC_URI = "file://updater.sh"
+
+S = "${WORKDIR}"
+
+do_configure() {
+ sed -i "s/ZAURUS_UPDATER_VERSION/${PR}/" "${S}/updater.sh"
+}
+do_compile() {
+ encdec-updater -e updater.sh
+}
+
+# even though the package is not machine-specific
+# we have to force it there to allow multimachine builds
+PACKAGE_ARCH = "${MACHINE_ARCH}"
+PACKAGES = ""
+
+# package_stagefile_shell need to run before populate_sysroot for packaged-staging
+addtask deploy before do_populate_sysroot after do_compile
+
+COMPATIBLE_MACHINE = "(poodle|c7x0|spitz|akita|tosa)"
+
+do_deploy() {
+ install -d ${DEPLOY_DIR_IMAGE}
+ install -m 0755 updater.sh ${DEPLOY_DIR_IMAGE}/updater.sh
+ package_stagefile_shell ${DEPLOY_DIR_IMAGE}/updater.sh
+}
diff --git a/recipes-bsp/zaurus-utils/zaurus-updater/updater.sh b/recipes-bsp/zaurus-utils/zaurus-updater/updater.sh
new file mode 100644
index 0000000..e9857af
--- /dev/null
+++ b/recipes-bsp/zaurus-utils/zaurus-updater/updater.sh
@@ -0,0 +1,526 @@
+#!/bin/sh
+#
+# One updater.sh to rule them all
+#
+# 2006.10.24 Marcin 'Hrw' Juszkiewicz
+# - started work on common updater.sh
+# - works on poodle, c760, spitz
+# - breaks on tosa
+#
+# 2007.10.08 Marcin 'Hrw' Juszkiewicz
+# - do not allow to flash files bigger then partition size
+# - created functions for common stuff
+#
+# 2007.11.18 Dmitry 'Lumag' Baryshkov
+# - fixes
+# - tosa unbreak
+#
+# 2007.11.19 Marcin 'Hrw' Juszkiewicz
+# - size check unbreak
+# - c760/c860 has bigger rootfs - use it
+#
+# 2007.11.23 Koen Kooi
+# - consistent error messages
+# - fix flashing from case sensitive filesystem (e.g. ext2)
+#
+# 2007.11.23 Matthias 'CoreDump' Hentges
+# - Always treat MTD_PART_SIZE as HEX when comparing sizes
+# - Thanks to ZeroChaos for debugging
+#
+# 2007.12.04 Matthias 'CoreDump' Hentges
+# - Unb0rk flashing of Akita kernels
+#
+# 2007.12.10 Marcin 'Hrw' Juszkiewicz
+# - Reformatted file - please use spaces not tabs
+# - "version check" is only on Tosa and Poodle - breaks other machines
+#
+# 2007.12.23 Matthias 'CoreDump' Hentges
+# - Fix kernel install on spitz machines
+# - Unify format of do_flashing()...
+# - Display ${PR} of zaurus-updater.bb to the user
+# - Polish HDD installer messages
+#
+# 2007.12.25 Matthias 'CoreDump' Hentges
+# - Add support for installing / updating u-boot
+#
+# 2008.11.23 Dmitry 'lumag' Baryshkov
+# - Add support for reflashing home partitions
+#
+# 2010.02.02 Andrea 'ant' Adami
+# - Fix nandlogical writing of kernel
+# Bug in Sharp original line...
+# /sbin/nandlogical $LOGOCAL_MTD WRITE $ADDR $DATASIZE $TMPDATA > /dev/null 2>&1
+# didn't use correctly determined block size
+#
+# 2010.04.18 Andrea 'ant' Adami
+# - Add support for flashing pure jffs2 rootfs, without Sharp headers
+
+# Set to "yes" to enable
+ENABLE_UBOOT_UPDATER="no"
+
+DATAPATH=$1
+TMPPATH=/tmp/update
+TMPDATA=$TMPPATH/tmpdata.bin
+TMPHEAD=$TMPPATH/tmphead.bin
+
+FLASHED_KERNEL=0
+FLASHED_ROOTFS=0
+FLASHED_HOMEFS=0
+UNPACKED_ROOTFS=0 # spitz only
+
+RO_MTD_LINE=`cat /proc/mtd | grep "root" | tail -n 1`
+if [ "$RO_MTD_LINE" = "" ]; then
+ RO_MTD_LINE=`cat /proc/mtd | grep "\<NAND\>.*\<2\>" | tail -n 1`
+fi
+RO_MTD_NO=`echo $RO_MTD_LINE | cut -d: -f1 | cut -dd -f2`
+RO_MTD=/dev/mtd$RO_MTD_NO
+ROOTFS_SIZE=`echo $RO_MTD_LINE | cut -d" " -f2`
+
+RW_MTD_LINE=`cat /proc/mtd | grep "home" | tail -n 1`
+if [ "$RW_MTD_LINE" = "" ]; then
+ RW_MTD_LINE=`cat /proc/mtd | grep "\<NAND\>.*\<2\>" | tail -n 1`
+fi
+RW_MTD_NO=`echo $RW_MTD_LINE | cut -d: -f1 | cut -dd -f2`
+RW_MTD=/dev/mtd$RW_MTD_NO
+HOMEFS_SIZE=`echo $RO_MTD_LINE | cut -d" " -f2`
+
+LOGOCAL_MTD=/dev/mtd1
+
+VERBLOCK=0x48000
+MVRBLOCK=0x70000
+
+RESULT=0
+
+Cleanup()
+{
+ rm -f $VTMPNAME > /dev/null 2>&1
+ rm -f $MTMPNAME > /dev/null 2>&1
+ exit $1
+}
+
+trap 'Cleanup 1' 1 15
+trap '' 2 3
+
+get_dev_pcmcia()
+{
+ while read SOCKET CLASS DRIVER INSTANCE DEVS MAJOR MINOR;
+ do
+ echo $DEVS
+ done
+}
+
+get_dev_pcmcia_slot()
+{
+ grep "^$1" /var/lib/pcmcia/stab | get_dev_pcmcia
+}
+
+check_for_hdd()
+{
+ IDE1=`get_dev_pcmcia_slot 1`
+ if [ "$IDE1" = "" ]; then
+ echo 'Error: There is no microdrive. Retrying...'
+ while [ "$IDE1" = "" ]; do
+ IDE1=`get_dev_pcmcia_slot 1`
+ done
+ echo 'Microdrive found.'
+ fi
+
+ LINUXFMT=ext3
+ MKE2FSOPT=-j
+}
+
+check_for_tar()
+{
+ ### Check that we have a valid tar
+ for TARNAME in gnu-tar GNU-TAR
+ do
+ if [ -e $DATAPATH/$TARNAME ]
+ then
+ TARBIN=$DATAPATH/$TARNAME
+ fi
+ done
+
+ if [ ! -e $TARBIN ]; then
+ echo 'Error: Please place a valid copy of tar as "gnu-tar" on your card.'
+ echo 'Please reset'
+ while true
+ do
+ done
+ fi
+}
+
+do_rootfs_extraction()
+{
+ UNPACKED_ROOTFS=1
+ echo 'Installing HDD root file system'
+ if [ ! -f /hdd1/NotAvailable ]; then
+ umount /hdd1
+ fi
+ echo -n '* Now formatting...'
+ mke2fs $MKE2FSOPT /dev/${IDE1}1 > /dev/null 2>&1
+ e2fsck -p /dev/${IDE1}1 > /dev/null
+ if [ "$?" != "0" ]; then
+ echo 'FAILED'
+ echo 'Error: Unable to create filesystem on microdrive!'
+ exit "$?"
+ else
+ echo 'done'
+ fi
+
+ mount -t $LINUXFMT -o noatime /dev/${IDE1}1 /hdd1
+ if [ "$?" != "0" ]; then
+ echo 'Error: Unable to mount microdrive!'
+ exit "$?"
+ fi
+
+ cd /hdd1
+ echo -n '* Now extracting (this can take over 5m)...'
+ gzip -dc $DATAPATH/$TARGETFILE | $TARBIN xf -
+ if [ "$?" != "0" ]; then
+ echo 'FAILED'
+ echo 'Error: Unable to extract root filesystem archive!'
+ exit "$?"
+ else
+ echo 'done'
+ fi
+
+ echo 'HDD Installation Finished.'
+
+ # remount as RO
+ cd /
+ umount /hdd1
+ mount -t $LINUXFMT -o ro,noatime /dev/${IDE1}1 /hdd1
+}
+
+do_flashing()
+{
+ if [ $DATASIZE -gt `printf "%d" $MTD_PART_SIZE` ]
+ then
+ echo 'Error: File is too big to flash!'
+ echo "$FLASH_TYPE: [$DATASIZE] > [`printf "%d" ${MTD_PART_SIZE}`]"
+ return
+ fi
+
+ #check version (common to all models)
+ /sbin/bcut -s 6 -o $TMPDATA $TMPHEAD
+ if [ `cat $TMPDATA` != "SHARP!" ] > /dev/null 2>&1
+ then
+ #check for known fake headers
+ if [ `cat $TMPDATA` != "OZ!3.1" ] > /dev/null 2>&1
+ then
+ #no version info...
+ rm -f $TMPHEAD > /dev/null 2>&1
+ DATAPOS=0
+ fi
+ fi
+
+ if [ $ISFORMATTED = 0 ]
+ then
+ echo -n 'Flash erasing...'
+ /sbin/eraseall $TARGET_MTD > /dev/null 2>&1
+ echo 'done'
+ ISFORMATTED=1
+ fi
+
+ if [ -e $TMPHEAD ]
+ then
+ VTMPNAME=$TMPPATH'/vtmp'`date '+%s'`'.tmp'
+ MTMPNAME=$TMPPATH'/mtmp'`date '+%s'`'.tmp'
+ /sbin/nandlogical $LOGOCAL_MTD READ $VERBLOCK 0x4000 $VTMPNAME > /dev/null 2>&1
+ /sbin/nandlogical $LOGOCAL_MTD READ $MVRBLOCK 0x4000 $MTMPNAME > /dev/null 2>&1
+
+ /sbin/verchg -v $VTMPNAME $TMPHEAD $MODULEID $MTD_PART_SIZE > /dev/null 2>&1
+ /sbin/verchg -m $MTMPNAME $TMPHEAD $MODULEID $MTD_PART_SIZE > /dev/null 2>&1
+ fi
+
+ # Looks like Akita and Spitz are unique when it comes to kernel flashing
+ if [ "$ZAURUS" = "akita" -o "$ZAURUS" = "c3x00" ] && [ "$FLASH_TYPE" = "kernel" ]
+ then
+ echo ''
+ echo -n 'Installing SL-Cxx00 kernel...'
+ echo ' ' > /tmp/data
+ test "$ZAURUS" = "akita" && /sbin/nandlogical $LOGOCAL_MTD WRITE 0x60100 16 /tmp/data > /dev/null 2>&1
+ /sbin/nandlogical $LOGOCAL_MTD WRITE 0xe0000 $DATASIZE $TARGETFILE > /dev/null 2>&1
+ test "$ZAURUS" = "akita" && /sbin/nandlogical $LOGOCAL_MTD WRITE 0x21bff0 16 /tmp/data > /dev/null 2>&1
+ echo 'done'
+ else
+ echo ''
+ echo '0% 100%'
+ PROGSTEP=`expr $DATASIZE / $ONESIZE + 1`
+ PROGSTEP=`expr 25 / $PROGSTEP`
+
+ if [ $PROGSTEP = 0 ]
+ then
+ PROGSTEP=1
+ fi
+
+ #loop
+ while [ $DATAPOS -lt $DATASIZE ]
+ do
+ #data create
+ bcut -a $DATAPOS -s $ONESIZE -o $TMPDATA $TARGETFILE
+ TMPSIZE=`wc -c $TMPDATA`
+ TMPSIZE=`echo $TMPSIZE | cut -d' ' -f1`
+ DATAPOS=`expr $DATAPOS + $TMPSIZE`
+
+ #handle data file
+ if [ $ISLOGICAL = 0 ]
+ then
+ next_addr=`/sbin/nandcp -a $ADDR $TMPDATA $TARGET_MTD 2>/dev/null | fgrep "mtd address" | cut -d- -f2 | cut -d\( -f1`
+ if [ "$next_addr" = "" ]; then
+ echo 'Error: flash write'
+ rm $TMPDATA > /dev/null 2>&1
+ RESULT=3
+ break;
+ fi
+ ADDR=$next_addr
+ else
+ /sbin/nandlogical $LOGOCAL_MTD WRITE $ADDR $TMPSIZE $TMPDATA > /dev/null 2>&1
+ ADDR=`expr $ADDR + $TMPSIZE`
+ fi
+
+ rm $TMPDATA > /dev/null 2>&1
+
+ #progress
+ SPNUM=0
+ while [ $SPNUM -lt $PROGSTEP ]
+ do
+ echo -n '.'
+ SPNUM=`expr $SPNUM + 1`
+ done
+ done
+ fi
+ echo ''
+
+ #finish
+ rm -f $TMPPATH/*.bin > /dev/null 2>&1
+
+ if [ $RESULT = 0 ]
+ then
+ if [ -e $VTMPNAME ]
+ then
+ /sbin/nandlogical $LOGOCAL_MTD WRITE $VERBLOCK 0x4000 $VTMPNAME > /dev/null 2>&1
+ rm -f $VTMPNAME > /dev/null 2>&1
+ fi
+
+ if [ -e $MTMPNAME ]
+ then
+ /sbin/nandlogical $LOGOCAL_MTD WRITE $MVRBLOCK 0x4000 $MTMPNAME > /dev/null 2>&1
+ rm -f $MTMPNAME > /dev/null 2>&1
+ fi
+
+ [ "$FLASH_TYPE" != "kernel" ] && echo 'done.'
+ else
+ echo 'Error!'
+ fi
+}
+
+update_uboot() {
+ # The flashing part of this function is based on pdaXrom's
+ # updater.sh
+
+ if test "$ENABLE_UBOOT_UPDATER" != "yes" -o -z "$1"
+ then
+ echo 'u-boot updates not allowed.'
+ return
+ fi
+
+ echo ''
+ echo 'Installing u-boot bootloader:'
+
+ DATASIZE=`wc -c $TARGETFILE`
+ FSIZE=`echo $DATASIZE | cut -d' ' -f1`
+
+ echo -n '* Creating backup ('$FSIZE' Bytes)...'
+ if ( nandlogical /dev/mtd1 READ 0 $FSIZE /tmp/sharploader.bin ) > /dev/null 2>&1
+ then
+ echo 'Ok'
+
+ echo -n '* Flashing u-boot...'
+ if ( nandlogical /dev/mtd1 WRITE 0 $FSIZE $1 ) > /dev/null 2>&1
+ then
+ echo 'Success'
+ else
+ echo 'FAILED'
+ echo 'Error: Installation of u-boot failed!'
+
+ echo -n '* Trying to restore backup...'
+ if ( nandlogical /dev/mtd1 WRITE 0 $FSIZE /tmp/sharploader.bin ) > /dev/null 2>&1
+ then
+ echo 'Success'
+ echo 'Your old bootloader has been restored'
+ else
+ echo 'FAILED'
+ echo "Sorry, it's NAND-Restore time for you =("
+ fi
+ fi
+ else
+ echo 'FAILED'
+ echo 'Could not create backup, aborting!'
+ echo 'Your bootloader has not been altered in any way.'
+ exit 1
+ fi
+}
+
+### Check model ###
+/sbin/writerominfo
+MODEL=`cat /proc/deviceinfo/product`
+case "$MODEL" in
+ SL-B500|SL-5600)
+ ZAURUS='poodle'
+ ;;
+ SL-6000)
+ ZAURUS='tosa'
+ ;;
+ SL-C1000)
+ ZAURUS='akita'
+ ;;
+ SL-C700|SL-C750|SL-7500|SL-C760|SL-C860)
+ ZAURUS='c7x0'
+ ;;
+ SL-C3000|SL-C3100|SL-C3200)
+ ZAURUS='c3x00'
+ check_for_hdd
+ check_for_tar
+ ;;
+ *)
+ echo 'MODEL: '$MODEL 'is unsupported'
+ echo ''
+ echo 'Please reset'
+ while true
+ do
+ done
+ ;;
+esac
+
+clear
+echo '---- Universal Zaurus Updater ZAURUS_UPDATER_VERSION ----'
+echo 'MODEL: '$MODEL' ('$ZAURUS')'
+echo ''
+
+mkdir -p $TMPPATH > /dev/null 2>&1
+
+cd $DATAPATH/
+
+for TARGETFILE in u-boot.bin U-BOOT.BIN zimage zImage zImage.bin zimage.bin ZIMAGE ZIMAGE.BIN \
+ initrd.bin INITRD.BIN hdimage1.tgz HDIMAGE1.TGZ home.bin HOME.BIN
+do
+ if [ ! -e $TARGETFILE ]
+ then
+ continue
+ fi
+
+ rm -f $TMPPATH/*.bin > /dev/null 2>&1
+ DATASIZE=`wc -c $TARGETFILE`
+ DATASIZE=`echo $DATASIZE | cut -d' ' -f1`
+
+ # make TARGETFILE lowercase
+ TARGETFILE_LC=`echo $TARGETFILE|tr A-Z a-z`
+
+ case "$TARGETFILE_LC" in
+
+ zimage|zimage.bin)
+ if [ $FLASHED_KERNEL != 0 ]
+ then
+ continue
+ fi
+ echo 'kernel'
+ FLASHED_KERNEL=1
+ ISLOGICAL=1
+ MODULEID=5
+ MTD_PART_SIZE=0x13C000
+ ADDR=`dc 0xE0000`
+ ISFORMATTED=1
+ DATAPOS=0
+ ONESIZE=524288
+ HDTOP=`expr $DATASIZE - 16`
+ /sbin/bcut -a $HDTOP -s 16 -o $TMPHEAD $TARGETFILE
+ FLASH_TYPE="kernel"
+ do_flashing
+ FLASH_TYPE=""
+ ;;
+
+ initrd.bin)
+ if [ $FLASHED_ROOTFS != 0 ]
+ then
+ continue
+ fi
+ echo 'root file system'
+ FLASHED_ROOTFS=1
+ ISLOGICAL=0
+ MODULEID=6
+ MTD_PART_SIZE="0x$ROOTFS_SIZE"
+ ADDR=0
+ ISFORMATTED=0
+ TARGET_MTD=$RO_MTD
+ DATAPOS=16
+ ONESIZE=1048576
+ /sbin/bcut -s 16 -o $TMPHEAD $TARGETFILE
+ FLASH_TYPE="rootfs"
+ do_flashing
+ FLASH_TYPE=""
+ ;;
+
+ home.bin)
+ if [ $FLASHED_HOMEFS != 0 ]
+ then
+ continue
+ fi
+ echo 'home file system'
+ FLASHED_HOMEFS=1
+ ISLOGICAL=0
+ ADDR=0
+ ISFORMATTED=0
+ MTD_PART_SIZE="0x$HOMEFS_SIZE"
+ ADDR=0
+ TARGET_MTD=$RW_MTD
+ #home should not have headers but one could flash a second rootfs here
+ DATAPOS=16
+ ONESIZE=1048576
+ FLASH_TYPE="home"
+ /sbin/bcut -s 16 -o $TMPHEAD $TARGETFILE
+ do_flashing
+ FLASH_TYPE=""
+ ;;
+
+ hdimage1.tgz)
+ if [ $UNPACKED_ROOTFS = 0 ]
+ then
+ do_rootfs_extraction
+ fi
+ ;;
+
+ u-boot.bin)
+ if [ $FLASHED_UBOOT != 1 ]
+ then
+ update_uboot "$TARGETFILE"
+ FLASHED_UBOOT="1"
+ fi
+ ;;
+
+ *)
+ ;;
+ esac
+done
+
+# reboot
+exit 0
+
+# bcut usage: bcut [OPTION] <input file>
+
+# -a: start position
+# -s: cut size
+# -o: output file
+
+# ModuleId informations used by verchg Sharp binary:
+#
+# 0 - master
+# 1 - Maintaince
+# 2 - Diagnostics
+# 3 - rescue kernel
+# 4 - rescue rootfs
+# 5 - normal kernel
+# 6 - normal rootfs
+# 7 - /home/
+# 8 - parameter (whatever it means)
+#
diff --git a/recipes-bsp/zaurusd/files/01-check-toggle-landscape b/recipes-bsp/zaurusd/files/01-check-toggle-landscape
new file mode 100644
index 0000000..13ae9a4
--- /dev/null
+++ b/recipes-bsp/zaurusd/files/01-check-toggle-landscape
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+# Try to determine and ignore false rotation signals caused by
+# headphones removal or remote removal remembering the old state.
+# OE#3390
+if test "`cat /var/run/last-screen-rotation`" = landscape ; then
+ exit
+fi
+echo landscape > /var/run/last-screen-rotation
diff --git a/recipes-bsp/zaurusd/files/01-check-toggle-portait b/recipes-bsp/zaurusd/files/01-check-toggle-portait
new file mode 100644
index 0000000..4c3b7f1
--- /dev/null
+++ b/recipes-bsp/zaurusd/files/01-check-toggle-portait
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+# Try to determine and ignore false rotation signals caused by
+# headphones removal or remote removal remembering the old state.
+# OE#3390
+if test "`cat /var/run/last-screen-rotation`" = portait ; then
+ exit
+fi
+echo portait > /var/run/last-screen-rotation
diff --git a/recipes-bsp/zaurusd/files/add-poodle.patch b/recipes-bsp/zaurusd/files/add-poodle.patch
new file mode 100644
index 0000000..3793faf
--- /dev/null
+++ b/recipes-bsp/zaurusd/files/add-poodle.patch
@@ -0,0 +1,15 @@
+--- zaurusd/config/mach-config/mach-poodle-vars.in (revision 418)
++++ zaurusd/config/mach-config/mach-poodle-vars.in (working copy)
+@@ -1,3 +1,9 @@
+ MACHINE=poodle
+
+-ALSA_MIXER_INIT=@appconfdir@/alsa/5600-default.state
+\ No newline at end of file
++export SWITCH_EVENT_ZMIXER=1
++SWITCH_EVENT_DEVICE=/dev/input/event0
++
++#TSKEYS_CONF=@appconfdir@/tskeys/zaurus-clamshell.conf
++#TSKEYS_DEVICE=/dev/input/event1
++
++ALSA_MIXER_INIT=@appconfdir@/alsa/poodle-default.state
+\ No newline at end of file
diff --git a/recipes-bsp/zaurusd/files/alsa-6000x-default.state.patch b/recipes-bsp/zaurusd/files/alsa-6000x-default.state.patch
new file mode 100644
index 0000000..29c98f7
--- /dev/null
+++ b/recipes-bsp/zaurusd/files/alsa-6000x-default.state.patch
@@ -0,0 +1,769 @@
+--- zaurusd/config/alsa/6000x-default.state 2009-04-25 22:57:30.000000000 +0100
++++ zaurusd/config/alsa/6000x-default.state 2009-05-14 10:41:29.000000000 +0100
+@@ -6,8 +6,8 @@
+ comment.range '0 - 31'
+ iface MIXER
+ name 'Speaker Playback Volume'
+- value.0 27
+- value.1 27
++ value.0 25
++ value.1 25
+ }
+ control.2 {
+ comment.access 'read write'
+@@ -24,8 +24,8 @@
+ comment.range '0 - 31'
+ iface MIXER
+ name 'Headphone Playback Volume'
+- value.0 26
+- value.1 26
++ value.0 20
++ value.1 20
+ }
+ control.4 {
+ comment.access 'read write'
+@@ -37,13 +37,23 @@
+ }
+ control.5 {
+ comment.access 'read write'
++ comment.type INTEGER
++ comment.count 2
++ comment.range '0 - 31'
++ iface MIXER
++ name 'PCM Playback Volume'
++ value.0 23
++ value.1 23
++ }
++ control.6 {
++ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+ iface MIXER
+ name 'Speaker Playback ZC Switch'
+ value true
+ }
+- control.6 {
++ control.7 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -51,7 +61,7 @@
+ name 'Speaker Playback Invert Switch'
+ value true
+ }
+- control.7 {
++ control.8 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -59,7 +69,7 @@
+ name 'Headphone Playback ZC Switch'
+ value true
+ }
+- control.8 {
++ control.9 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -67,7 +77,7 @@
+ name 'Mono Playback ZC Switch'
+ value false
+ }
+- control.9 {
++ control.10 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+@@ -76,7 +86,7 @@
+ name 'Mono Playback Volume'
+ value 0
+ }
+- control.10 {
++ control.11 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+@@ -85,16 +95,16 @@
+ name 'ALC Target Volume'
+ value 11
+ }
+- control.11 {
++ control.12 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+ comment.range '0 - 15'
+ iface MIXER
+ name 'ALC Hold Time'
+- value 0
++ value 2
+ }
+- control.12 {
++ control.13 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+@@ -103,7 +113,7 @@
+ name 'ALC Decay Time'
+ value 3
+ }
+- control.13 {
++ control.14 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+@@ -112,7 +122,7 @@
+ name 'ALC Attack Time'
+ value 2
+ }
+- control.14 {
++ control.15 {
+ comment.access 'read write'
+ comment.type ENUMERATED
+ comment.count 1
+@@ -124,7 +134,7 @@
+ name 'ALC Function'
+ value None
+ }
+- control.15 {
++ control.16 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+@@ -133,16 +143,16 @@
+ name 'ALC Max Volume'
+ value 7
+ }
+- control.16 {
++ control.17 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+ comment.range '0 - 3'
+ iface MIXER
+ name 'ALC ZC Timeout'
+- value 1
++ value 0
+ }
+- control.17 {
++ control.18 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -150,7 +160,7 @@
+ name 'ALC ZC Switch'
+ value false
+ }
+- control.18 {
++ control.19 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -158,7 +168,7 @@
+ name 'ALC NG Switch'
+ value false
+ }
+- control.19 {
++ control.20 {
+ comment.access 'read write'
+ comment.type ENUMERATED
+ comment.count 1
+@@ -168,7 +178,7 @@
+ name 'ALC NG Type'
+ value 'Constant Gain'
+ }
+- control.20 {
++ control.21 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+@@ -177,16 +187,16 @@
+ name 'ALC NG Threshold'
+ value 31
+ }
+- control.21 {
++ control.22 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+ comment.range '0 - 7'
+ iface MIXER
+ name 'Mic Headphone Volume'
+- value 3
++ value 7
+ }
+- control.22 {
++ control.23 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+@@ -195,7 +205,7 @@
+ name 'ALC Headphone Volume'
+ value 5
+ }
+- control.23 {
++ control.24 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -203,7 +213,7 @@
+ name 'Out3 Switch'
+ value false
+ }
+- control.24 {
++ control.25 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -211,7 +221,7 @@
+ name 'Out3 ZC Switch'
+ value true
+ }
+- control.25 {
++ control.26 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+@@ -220,7 +230,7 @@
+ name 'Out3 Volume'
+ value 0
+ }
+- control.26 {
++ control.27 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+@@ -229,7 +239,7 @@
+ name 'PCBeep Bypass Headphone Volume'
+ value 0
+ }
+- control.27 {
++ control.28 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+@@ -238,7 +248,7 @@
+ name 'PCBeep Bypass Speaker Volume'
+ value 0
+ }
+- control.28 {
++ control.29 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+@@ -247,16 +257,16 @@
+ name 'PCBeep Bypass Phone Volume'
+ value 0
+ }
+- control.29 {
++ control.30 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+ comment.range '0 - 7'
+ iface MIXER
+ name 'Aux Playback Headphone Volume'
+- value 6
++ value 5
+ }
+- control.30 {
++ control.31 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+@@ -265,7 +275,7 @@
+ name 'Aux Playback Speaker Volume'
+ value 0
+ }
+- control.31 {
++ control.32 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+@@ -274,7 +284,7 @@
+ name 'Aux Playback Phone Volume'
+ value 0
+ }
+- control.32 {
++ control.33 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+@@ -283,7 +293,7 @@
+ name 'Phone Volume'
+ value 0
+ }
+- control.33 {
++ control.34 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 2
+@@ -293,7 +303,7 @@
+ value.0 23
+ value.1 23
+ }
+- control.34 {
++ control.35 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -301,7 +311,7 @@
+ name 'Capture 20dB Boost Switch'
+ value true
+ }
+- control.35 {
++ control.36 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -309,7 +319,7 @@
+ name 'Capture to Phone 20dB Boost Switch'
+ value true
+ }
+- control.36 {
++ control.37 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -317,7 +327,7 @@
+ name '3D Upper Cut-off Switch'
+ value false
+ }
+- control.37 {
++ control.38 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -325,7 +335,7 @@
+ name '3D Lower Cut-off Switch'
+ value false
+ }
+- control.38 {
++ control.39 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+@@ -334,7 +344,7 @@
+ name '3D Playback Volume'
+ value 0
+ }
+- control.39 {
++ control.40 {
+ comment.access 'read write'
+ comment.type ENUMERATED
+ comment.count 1
+@@ -344,7 +354,7 @@
+ name 'Bass Control'
+ value 'Adaptive Boost'
+ }
+- control.40 {
++ control.41 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -352,7 +362,7 @@
+ name 'Bass Cut-off Switch'
+ value true
+ }
+- control.41 {
++ control.42 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -360,7 +370,7 @@
+ name 'Tone Cut-off Switch'
+ value false
+ }
+- control.42 {
++ control.43 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -368,7 +378,7 @@
+ name 'Playback Attenuate (-6dB) Switch'
+ value false
+ }
+- control.43 {
++ control.44 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+@@ -377,7 +387,7 @@
+ name 'Bass Volume'
+ value 8
+ }
+- control.44 {
++ control.45 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+@@ -386,7 +396,7 @@
+ name 'Treble Volume'
+ value 5
+ }
+- control.45 {
++ control.46 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -394,7 +404,7 @@
+ name 'Capture ADC Switch'
+ value false
+ }
+- control.46 {
++ control.47 {
+ comment.access 'read write'
+ comment.type ENUMERATED
+ comment.count 2
+@@ -405,17 +415,17 @@
+ value.0 '+0.75dB Steps'
+ value.1 '+0.75dB Steps'
+ }
+- control.47 {
++ control.48 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 2
+ comment.range '0 - 63'
+ iface MIXER
+ name 'Capture Volume'
+- value.0 63
+- value.1 63
++ value.0 0
++ value.1 0
+ }
+- control.48 {
++ control.49 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -423,7 +433,7 @@
+ name 'Capture ZC Switch'
+ value false
+ }
+- control.49 {
++ control.50 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+@@ -432,7 +442,7 @@
+ name 'Mic 1 Volume'
+ value 23
+ }
+- control.50 {
++ control.51 {
+ comment.access 'read write'
+ comment.type INTEGER
+ comment.count 1
+@@ -441,7 +451,7 @@
+ name 'Mic 2 Volume'
+ value 23
+ }
+- control.51 {
++ control.52 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -449,7 +459,7 @@
+ name 'Mic 20dB Boost Switch'
+ value false
+ }
+- control.52 {
++ control.53 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -457,7 +467,7 @@
+ name 'Speaker Mixer PCBeep Bypass Swi'
+ value false
+ }
+- control.53 {
++ control.54 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -465,7 +475,7 @@
+ name 'Speaker Mixer Aux Playback Swit'
+ value false
+ }
+- control.54 {
++ control.55 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -473,7 +483,7 @@
+ name 'Speaker Mixer Phone Bypass Swit'
+ value false
+ }
+- control.55 {
++ control.56 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -481,7 +491,7 @@
+ name 'Speaker Mixer Line Bypass Switc'
+ value false
+ }
+- control.56 {
++ control.57 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -489,7 +499,7 @@
+ name 'Speaker Mixer PCM Playback Swit'
+ value true
+ }
+- control.57 {
++ control.58 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -497,7 +507,7 @@
+ name 'Phone Mixer PCBeep Bypass Switc'
+ value false
+ }
+- control.58 {
++ control.59 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -505,7 +515,7 @@
+ name 'Phone Mixer Aux Playback Switch'
+ value false
+ }
+- control.59 {
++ control.60 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -513,7 +523,7 @@
+ name 'Phone Mixer Line Bypass Switch'
+ value false
+ }
+- control.60 {
++ control.61 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -521,7 +531,7 @@
+ name 'Phone Mixer PCM Playback Switch'
+ value false
+ }
+- control.61 {
++ control.62 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -529,7 +539,7 @@
+ name 'Phone Mixer Mic 1 Sidetone Swit'
+ value false
+ }
+- control.62 {
++ control.63 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -537,7 +547,7 @@
+ name 'Phone Mixer Mic 2 Sidetone Swit'
+ value false
+ }
+- control.63 {
++ control.64 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -545,7 +555,7 @@
+ name 'Right HP Mixer PCBeep Bypass Sw'
+ value false
+ }
+- control.64 {
++ control.65 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -553,7 +563,7 @@
+ name 'Right HP Mixer Aux Playback Swi'
+ value false
+ }
+- control.65 {
++ control.66 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -561,7 +571,7 @@
+ name 'Right HP Mixer Phone Bypass Swi'
+ value false
+ }
+- control.66 {
++ control.67 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -569,7 +579,7 @@
+ name 'Right HP Mixer Line Bypass Swit'
+ value false
+ }
+- control.67 {
++ control.68 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -577,7 +587,7 @@
+ name 'Right HP Mixer PCM Playback Swi'
+ value true
+ }
+- control.68 {
++ control.69 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -585,7 +595,7 @@
+ name 'Right HP Mixer Mic Sidetone Swi'
+ value false
+ }
+- control.69 {
++ control.70 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -593,7 +603,7 @@
+ name 'Left HP Mixer PCBeep Bypass Swi'
+ value false
+ }
+- control.70 {
++ control.71 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -601,7 +611,7 @@
+ name 'Left HP Mixer Aux Playback Swit'
+ value false
+ }
+- control.71 {
++ control.72 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -609,7 +619,7 @@
+ name 'Left HP Mixer Phone Bypass Swit'
+ value false
+ }
+- control.72 {
++ control.73 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -617,7 +627,7 @@
+ name 'Left HP Mixer Line Bypass Switc'
+ value false
+ }
+- control.73 {
++ control.74 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -625,7 +635,7 @@
+ name 'Left HP Mixer PCM Playback Swit'
+ value true
+ }
+- control.74 {
++ control.75 {
+ comment.access 'read write'
+ comment.type BOOLEAN
+ comment.count 1
+@@ -633,7 +643,7 @@
+ name 'Left HP Mixer Mic Sidetone Swit'
+ value false
+ }
+- control.75 {
++ control.76 {
+ comment.access 'read write'
+ comment.type ENUMERATED
+ comment.count 1
+@@ -641,9 +651,9 @@
+ comment.item.1 Line
+ iface MIXER
+ name 'Differential Source'
+- value Line
++ value Mic
+ }
+- control.76 {
++ control.77 {
+ comment.access 'read write'
+ comment.type ENUMERATED
+ comment.count 1
+@@ -653,9 +663,9 @@
+ comment.item.3 Stereo
+ iface MIXER
+ name 'Mic Select Source'
+- value 'Mic 1'
++ value Differential
+ }
+- control.77 {
++ control.78 {
+ comment.access 'read write'
+ comment.type ENUMERATED
+ comment.count 1
+@@ -671,7 +681,7 @@
+ name 'Right Capture Select'
+ value Mic
+ }
+- control.78 {
++ control.79 {
+ comment.access 'read write'
+ comment.type ENUMERATED
+ comment.count 1
+@@ -687,7 +697,7 @@
+ name 'Left Capture Select'
+ value Mic
+ }
+- control.79 {
++ control.80 {
+ comment.access 'read write'
+ comment.type ENUMERATED
+ comment.count 1
+@@ -699,7 +709,7 @@
+ name 'Capture Phone Mux'
+ value Mute
+ }
+- control.80 {
++ control.81 {
+ comment.access 'read write'
+ comment.type ENUMERATED
+ comment.count 1
+@@ -709,7 +719,7 @@
+ name 'Speaker Mux'
+ value 'Speaker Mix'
+ }
+- control.81 {
++ control.82 {
+ comment.access 'read write'
+ comment.type ENUMERATED
+ comment.count 1
+@@ -721,7 +731,7 @@
+ name 'Out3 Mux'
+ value Left
+ }
+- control.82 {
++ control.83 {
+ comment.access 'read write'
+ comment.type ENUMERATED
+ comment.count 1
+@@ -733,7 +743,7 @@
+ name 'ALC Sidetone Mux'
+ value Stereo
+ }
+- control.83 {
++ control.84 {
+ comment.access 'read write'
+ comment.type ENUMERATED
+ comment.count 1
+@@ -746,7 +756,7 @@
+ name 'Jack Function'
+ value Off
+ }
+- control.84 {
++ control.85 {
+ comment.access 'read write'
+ comment.type ENUMERATED
+ comment.count 1
diff --git a/recipes-bsp/zaurusd/files/alsa-cxx00-default.state.patch b/recipes-bsp/zaurusd/files/alsa-cxx00-default.state.patch
new file mode 100644
index 0000000..d65ed4a
--- /dev/null
+++ b/recipes-bsp/zaurusd/files/alsa-cxx00-default.state.patch
@@ -0,0 +1,240 @@
+NOTE: Patch slightly modified from original; unmodified comments from
+original patch copied below.
+=============================================================================
+http://bugs.openembedded.net/show_bug.cgi?id=2617
+- Fixes default ALSA state for SL-Cxx00.
+ * Treble level reflects kernel fix alsa-wm8750-treble.patch (>2.6.24).
+ * Increased Mic Levels and Boost.
+ * Enabled Capture Switch.
+ * Improved Headphones / Speaker volume balance.
+ * 3D Mode changed to "Playback" (still Off by default).
+ * Disabled all bypasses.
+ * All Mono signals decreased to 0 (not connected).
+ * Line Mux changed to differential, keeping PGA unused.
+ * Using Digital mono for recording (jack supports ony mono).
+ * Enabled Automatic Level Control, optimized for voice recording.
+ * Enabled Zero Cross volume changes.
+- Do not alter incorrect mixer levels by zaurus-mixer-callback.
+
+--- zaurusd/config/alsa/cxx00-default.state 2009-04-25 22:57:30.000000000 +0100
++++ zaurusd/config/alsa/cxx00-default.state 2009-05-14 10:41:29.000000000 +0100
+@@ -6,8 +6,8 @@
+ comment.range '0 - 63'
+ iface MIXER
+ name 'Capture Volume'
+- value.0 23
+- value.1 23
++ value.0 48
++ value.1 48
+ }
+ control.2 {
+ comment.access 'read write'
+@@ -15,8 +15,8 @@
+ comment.count 2
+ iface MIXER
+ name 'Capture ZC Switch'
+- value.0 false
+- value.1 false
++ value.0 true
++ value.1 true
+ }
+ control.3 {
+ comment.access 'read write'
+@@ -24,8 +24,8 @@
+ comment.count 2
+ iface MIXER
+ name 'Capture Switch'
+- value.0 false
+- value.1 false
++ value.0 true
++ value.1 true
+ }
+ control.4 {
+ comment.access 'read write'
+@@ -33,8 +33,8 @@
+ comment.count 2
+ iface MIXER
+ name 'Headphone Playback ZC Switch'
+- value.0 false
+- value.1 false
++ value.0 true
++ value.1 true
+ }
+ control.5 {
+ comment.access 'read write'
+@@ -42,8 +42,8 @@
+ comment.count 2
+ iface MIXER
+ name 'Speaker Playback ZC Switch'
+- value.0 false
+- value.1 false
++ value.0 true
++ value.1 true
+ }
+ control.6 {
+ comment.access 'read write'
+@@ -92,8 +92,8 @@
+ comment.range '0 - 255'
+ iface MIXER
+ name 'PCM Volume'
+- value.0 255
+- value.1 255
++ value.0 220
++ value.1 220
+ }
+ control.11 {
+ comment.access 'read write'
+@@ -131,7 +131,7 @@
+ comment.range '0 - 15'
+ iface MIXER
+ name 'Treble Volume'
+- value 15
++ value 0
+ }
+ control.15 {
+ comment.access 'read write'
+@@ -188,7 +188,7 @@
+ comment.item.1 Playback
+ iface MIXER
+ name '3D Mode'
+- value Capture
++ value Playback
+ }
+ control.21 {
+ comment.access 'read write'
+@@ -226,7 +226,7 @@
+ comment.count 1
+ iface MIXER
+ name 'ALC Capture ZC Switch'
+- value false
++ value true
+ }
+ control.25 {
+ comment.access 'read write'
+@@ -235,7 +235,7 @@
+ comment.range '0 - 15'
+ iface MIXER
+ name 'ALC Capture Hold Time'
+- value 0
++ value 9
+ }
+ control.26 {
+ comment.access 'read write'
+@@ -244,7 +244,7 @@
+ comment.range '0 - 15'
+ iface MIXER
+ name 'ALC Capture Decay Time'
+- value 3
++ value 9
+ }
+ control.27 {
+ comment.access 'read write'
+@@ -253,7 +253,7 @@
+ comment.range '0 - 15'
+ iface MIXER
+ name 'ALC Capture Attack Time'
+- value 2
++ value 3
+ }
+ control.28 {
+ comment.access 'read write'
+@@ -306,7 +306,7 @@
+ comment.count 1
+ iface MIXER
+ name 'ZC Timeout Switch'
+- value false
++ value true
+ }
+ control.34 {
+ comment.access 'read write'
+@@ -331,8 +331,8 @@
+ comment.range '0 - 3'
+ iface MIXER
+ name 'Mic Boost'
+- value.0 2
+- value.1 2
++ value.0 3
++ value.1 3
+ }
+ control.37 {
+ comment.access 'read write'
+@@ -341,8 +341,8 @@
+ comment.range '0 - 7'
+ iface MIXER
+ name 'Bypass Left Playback Volume'
+- value.0 2
+- value.1 2
++ value.0 0
++ value.1 0
+ }
+ control.38 {
+ comment.access 'read write'
+@@ -361,8 +361,8 @@
+ comment.range '0 - 7'
+ iface MIXER
+ name 'Bypass Mono Playback Volume'
+- value.0 2
+- value.1 2
++ value.0 0
++ value.1 0
+ }
+ control.40 {
+ comment.access 'read write'
+@@ -379,8 +379,8 @@
+ comment.range '0 - 127'
+ iface MIXER
+ name 'Headphone Playback Volume'
+- value.0 70
+- value.1 70
++ value.0 105
++ value.1 105
+ }
+ control.42 {
+ comment.access 'read write'
+@@ -389,8 +389,8 @@
+ comment.range '0 - 127'
+ iface MIXER
+ name 'Speaker Playback Volume'
+- value.0 70
+- value.1 70
++ value.0 127
++ value.1 127
+ }
+ control.43 {
+ comment.access 'read write'
+@@ -399,7 +399,7 @@
+ comment.range '0 - 127'
+ iface MIXER
+ name 'Mono Playback Volume'
+- value 121
++ value 0
+ }
+ control.44 {
+ comment.access 'read write'
+@@ -411,7 +411,7 @@
+ comment.item.3 'Digital Mono'
+ iface MIXER
+ name 'Right ADC Mux'
+- value 'Mono (Left)'
++ value 'Digital Mono'
+ }
+ control.45 {
+ comment.access 'read write'
+@@ -423,7 +423,7 @@
+ comment.item.3 'Digital Mono'
+ iface MIXER
+ name 'Left ADC Mux'
+- value 'Mono (Left)'
++ value 'Digital Mono'
+ }
+ control.46 {
+ comment.access 'read write'
+@@ -471,7 +471,7 @@
+ comment.item.4 Differential
+ iface MIXER
+ name 'Left Line Mux'
+- value PGA
++ value Differential
+ }
+ control.50 {
+ comment.access 'read write'
diff --git a/recipes-bsp/zaurusd/files/avoid-rotated-server.patch b/recipes-bsp/zaurusd/files/avoid-rotated-server.patch
new file mode 100644
index 0000000..8d72401
--- /dev/null
+++ b/recipes-bsp/zaurusd/files/avoid-rotated-server.patch
@@ -0,0 +1,123 @@
+Index: zaurusd/config/mach-config/mach-akita-vars.in
+===================================================================
+--- zaurusd.orig/config/mach-config/mach-akita-vars.in 2009-03-07 11:04:43.000000000 +0000
++++ zaurusd/config/mach-config/mach-akita-vars.in 2009-06-22 20:51:47.000000000 +0000
+@@ -7,4 +7,7 @@
+ TSKEYS_CONF=@appconfdir@/tskeys/zaurus-cxx00.conf
+ TSKEYS_DEVICE=/dev/input/event1
+
+-ALSA_MIXER_INIT=@appconfdir@/alsa/cxx00-default.state
+\ No newline at end of file
++ALSA_MIXER_INIT=@appconfdir@/alsa/cxx00-default.state
++
++export XRANDR_LANDSCAPE=right
++export XRANDR_PORTRAIT=normal
+Index: zaurusd/config/mach-config/mach-borzoi-vars.in
+===================================================================
+--- zaurusd.orig/config/mach-config/mach-borzoi-vars.in 2009-03-07 11:04:43.000000000 +0000
++++ zaurusd/config/mach-config/mach-borzoi-vars.in 2009-06-22 20:51:00.000000000 +0000
+@@ -7,4 +7,7 @@
+ TSKEYS_CONF=@appconfdir@/tskeys/zaurus-cxx00.conf
+ TSKEYS_DEVICE=/dev/input/event1
+
+-ALSA_MIXER_INIT=@appconfdir@/alsa/cxx00-default.state
+\ No newline at end of file
++ALSA_MIXER_INIT=@appconfdir@/alsa/cxx00-default.state
++
++export XRANDR_LANDSCAPE=right
++export XRANDR_PORTRAIT=normal
+Index: zaurusd/config/mach-config/mach-corgi-vars.in
+===================================================================
+--- zaurusd.orig/config/mach-config/mach-corgi-vars.in 2009-03-07 11:04:43.000000000 +0000
++++ zaurusd/config/mach-config/mach-corgi-vars.in 2009-06-22 20:51:47.000000000 +0000
+@@ -7,4 +7,7 @@
+ TSKEYS_CONF=@appconfdir@/tskeys/zaurus-c7x0.conf
+ TSKEYS_DEVICE=/dev/input/event1
+
+-ALSA_MIXER_INIT=@appconfdir@/alsa/c7x0-default.state
+\ No newline at end of file
++ALSA_MIXER_INIT=@appconfdir@/alsa/c7x0-default.state
++
++export XRANDR_LANDSCAPE=normal
++export XRANDR_PORTRAIT=left
+Index: zaurusd/config/mach-config/mach-htcuniversal-vars
+===================================================================
+--- zaurusd.orig/config/mach-config/mach-htcuniversal-vars 2009-03-07 11:04:43.000000000 +0000
++++ zaurusd/config/mach-config/mach-htcuniversal-vars 2009-06-22 20:49:01.000000000 +0000
+@@ -2,3 +2,6 @@
+
+ export SWITCH_EVENT_ZHINGE=1
+ SWITCH_EVENT_DEVICE=/dev/input/event3
++
++export XRANDR_LANDSCAPE=normal
++export XRANDR_PORTRAIT=left
+Index: zaurusd/config/mach-config/mach-husky-vars.in
+===================================================================
+--- zaurusd.orig/config/mach-config/mach-husky-vars.in 2009-03-07 11:04:43.000000000 +0000
++++ zaurusd/config/mach-config/mach-husky-vars.in 2009-06-22 20:51:47.000000000 +0000
+@@ -7,4 +7,7 @@
+ TSKEYS_CONF=@appconfdir@/tskeys/zaurus-c7x0.conf
+ TSKEYS_DEVICE=/dev/input/event1
+
+-ALSA_MIXER_INIT=@appconfdir@/alsa/c7x0-default.state
+\ No newline at end of file
++ALSA_MIXER_INIT=@appconfdir@/alsa/c7x0-default.state
++
++export XRANDR_LANDSCAPE=normal
++export XRANDR_PORTRAIT=left
+Index: zaurusd/config/mach-config/mach-poodle-vars.in
+===================================================================
+--- zaurusd.orig/config/mach-config/mach-poodle-vars.in 2009-06-22 20:49:01.000000000 +0000
++++ zaurusd/config/mach-config/mach-poodle-vars.in 2009-06-22 20:51:47.000000000 +0000
+@@ -6,4 +6,7 @@
+ #TSKEYS_CONF=@appconfdir@/tskeys/zaurus-clamshell.conf
+ #TSKEYS_DEVICE=/dev/input/event1
+
+-ALSA_MIXER_INIT=@appconfdir@/alsa/poodle-default.state
+\ No newline at end of file
++ALSA_MIXER_INIT=@appconfdir@/alsa/poodle-default.state
++
++export XRANDR_LANDSCAPE=normal
++export XRANDR_PORTRAIT=left
+Index: zaurusd/config/mach-config/mach-shepherd-vars.in
+===================================================================
+--- zaurusd.orig/config/mach-config/mach-shepherd-vars.in 2009-03-07 11:04:43.000000000 +0000
++++ zaurusd/config/mach-config/mach-shepherd-vars.in 2009-06-22 20:51:47.000000000 +0000
+@@ -7,4 +7,7 @@
+ TSKEYS_CONF=@appconfdir@/tskeys/zaurus-c7x0.conf
+ TSKEYS_DEVICE=/dev/input/event1
+
+-ALSA_MIXER_INIT=@appconfdir@/alsa/c7x0-default.state
+\ No newline at end of file
++ALSA_MIXER_INIT=@appconfdir@/alsa/c7x0-default.state
++
++export XRANDR_LANDSCAPE=normal
++export XRANDR_PORTRAIT=left
+Index: zaurusd/config/mach-config/mach-spitz-vars.in
+===================================================================
+--- zaurusd.orig/config/mach-config/mach-spitz-vars.in 2009-03-07 11:04:43.000000000 +0000
++++ zaurusd/config/mach-config/mach-spitz-vars.in 2009-06-22 20:51:47.000000000 +0000
+@@ -7,4 +7,7 @@
+ TSKEYS_CONF=@appconfdir@/tskeys/zaurus-cxx00.conf
+ TSKEYS_DEVICE=/dev/input/event1
+
+-ALSA_MIXER_INIT=@appconfdir@/alsa/cxx00-default.state
+\ No newline at end of file
++ALSA_MIXER_INIT=@appconfdir@/alsa/cxx00-default.state
++
++export XRANDR_LANDSCAPE=right
++export XRANDR_PORTRAIT=normal
+Index: zaurusd/config/mach-config/mach-tosa-vars.in
+===================================================================
+--- zaurusd.orig/config/mach-config/mach-tosa-vars.in 2009-03-07 11:04:43.000000000 +0000
++++ zaurusd/config/mach-config/mach-tosa-vars.in 2009-06-22 20:51:47.000000000 +0000
+@@ -6,4 +6,7 @@
+ #TSKEYS_CONF=@appconfdir@/tskeys/zaurus-clamshell.conf
+ #TSKEYS_DEVICE=/dev/input/event1
+
+-ALSA_MIXER_INIT=@appconfdir@/alsa/6000x-default.state
+\ No newline at end of file
++ALSA_MIXER_INIT=@appconfdir@/alsa/6000x-default.state
++
++export XRANDR_LANDSCAPE=normal
++export XRANDR_PORTRAIT=left
diff --git a/recipes-bsp/zaurusd/files/disable-alsa-handling.patch b/recipes-bsp/zaurusd/files/disable-alsa-handling.patch
new file mode 100644
index 0000000..8f1879d
--- /dev/null
+++ b/recipes-bsp/zaurusd/files/disable-alsa-handling.patch
@@ -0,0 +1,16 @@
+--- zaurusd/config/config.in.orig 2007-05-21 21:58:14.000000000 +0000
++++ zaurusd/config/config.in 2007-05-21 22:10:26.000000000 +0000
+@@ -11,11 +11,5 @@
+ . @appconfdir@/mach-config-vars
+ . @appconfdir@/mach-config-funcs
+
+-if [ "x$HAVE_ALSA_MIXER" != "x" -a "x$ALSA_MIXER_INIT" != "x" ]; then
+- if [ ! -e /etc/asound.state ]; then
+- cp $ALSA_MIXER_INIT /etc/asound.state
+- @sbindir@/alsactl restore
+- fi
+-fi
+
+-export SWITCHEVD_EVENT_SCRIPT=@appconfdir@/scripts/switch-event
+\ No newline at end of file
++export SWITCHEVD_EVENT_SCRIPT=@appconfdir@/scripts/switch-event
diff --git a/recipes-bsp/zaurusd/files/new-make.patch b/recipes-bsp/zaurusd/files/new-make.patch
new file mode 100644
index 0000000..dcc83fe
--- /dev/null
+++ b/recipes-bsp/zaurusd/files/new-make.patch
@@ -0,0 +1,11 @@
+Index: zaurusd/Makefile.am
+===================================================================
+--- zaurusd.orig/Makefile.am
++++ zaurusd/Makefile.am
+@@ -4,5 +4,4 @@ SUBDIRS = apps config scripts
+ MAINTAINERCLEANFILES = aclocal.m4 compile config.guess config.sub configure depcomp install-sh ltmain.sh Makefile.in missing
+
+ snapshot:
+- $(MAKE) dist distdir=$(PACKAGE)-snap`date +"%Y%m%d"`
+-
++ $(MAKE) dist distdir=$(PACKAGE)-snap`date +"%Y%m%d"`
diff --git a/recipes-bsp/zaurusd/files/use-ts-symlink-instead-of-hardcoding.diff b/recipes-bsp/zaurusd/files/use-ts-symlink-instead-of-hardcoding.diff
new file mode 100644
index 0000000..9c418ec
--- /dev/null
+++ b/recipes-bsp/zaurusd/files/use-ts-symlink-instead-of-hardcoding.diff
@@ -0,0 +1,88 @@
+--- /tmp/mach-akita-vars.in 2009-04-28 16:39:58.000000000 +0200
++++ zaurusd/config/mach-config/mach-akita-vars.in 2009-04-28 16:40:06.000000000 +0200
+@@ -5,6 +5,6 @@
+ SWITCH_EVENT_DEVICE=/dev/input/event0
+
+ TSKEYS_CONF=@appconfdir@/tskeys/zaurus-cxx00.conf
+-TSKEYS_DEVICE=/dev/input/event1
++TSKEYS_DEVICE=/dev/input/touchscreen0
+
+ ALSA_MIXER_INIT=@appconfdir@/alsa/cxx00-default.state
+\ No newline at end of file
+--- /tmp/mach-borzoi-vars.in 2009-04-28 16:39:58.000000000 +0200
++++ zaurusd/config/mach-config/mach-borzoi-vars.in 2009-04-28 16:40:06.000000000 +0200
+@@ -5,6 +5,6 @@
+ SWITCH_EVENT_DEVICE=/dev/input/event0
+
+ TSKEYS_CONF=@appconfdir@/tskeys/zaurus-cxx00.conf
+-TSKEYS_DEVICE=/dev/input/event1
++TSKEYS_DEVICE=/dev/input/touchscreen0
+
+ ALSA_MIXER_INIT=@appconfdir@/alsa/cxx00-default.state
+\ No newline at end of file
+--- /tmp/mach-corgi-vars.in 2009-04-28 16:39:58.000000000 +0200
++++ zaurusd/config/mach-config/mach-corgi-vars.in 2009-04-28 16:40:06.000000000 +0200
+@@ -5,6 +5,6 @@
+ SWITCH_EVENT_DEVICE=/dev/input/event0
+
+ TSKEYS_CONF=@appconfdir@/tskeys/zaurus-c7x0.conf
+-TSKEYS_DEVICE=/dev/input/event1
++TSKEYS_DEVICE=/dev/input/touchscreen0
+
+ ALSA_MIXER_INIT=@appconfdir@/alsa/c7x0-default.state
+\ No newline at end of file
+--- /tmp/mach-husky-vars.in 2009-04-28 16:39:58.000000000 +0200
++++ zaurusd/config/mach-config/mach-husky-vars.in 2009-04-28 16:40:06.000000000 +0200
+@@ -5,6 +5,6 @@
+ SWITCH_EVENT_DEVICE=/dev/input/event0
+
+ TSKEYS_CONF=@appconfdir@/tskeys/zaurus-c7x0.conf
+-TSKEYS_DEVICE=/dev/input/event1
++TSKEYS_DEVICE=/dev/input/touchscreen0
+
+ ALSA_MIXER_INIT=@appconfdir@/alsa/c7x0-default.state
+\ No newline at end of file
+--- /tmp/mach-poodle-vars.in 2009-04-28 16:39:58.000000000 +0200
++++ zaurusd/config/mach-config/mach-poodle-vars.in 2009-04-28 16:40:06.000000000 +0200
+@@ -4,6 +4,6 @@
+ SWITCH_EVENT_DEVICE=/dev/input/event0
+
+ #TSKEYS_CONF=@appconfdir@/tskeys/zaurus-clamshell.conf
+-#TSKEYS_DEVICE=/dev/input/event1
++#TSKEYS_DEVICE=/dev/input/touchscreen0
+
+ ALSA_MIXER_INIT=@appconfdir@/alsa/poodle-default.state
+\ No newline at end of file
+--- /tmp/mach-shepherd-vars.in 2009-04-28 16:39:58.000000000 +0200
++++ zaurusd/config/mach-config/mach-shepherd-vars.in 2009-04-28 16:40:06.000000000 +0200
+@@ -5,6 +5,6 @@
+ SWITCH_EVENT_DEVICE=/dev/input/event0
+
+ TSKEYS_CONF=@appconfdir@/tskeys/zaurus-c7x0.conf
+-TSKEYS_DEVICE=/dev/input/event1
++TSKEYS_DEVICE=/dev/input/touchscreen0
+
+ ALSA_MIXER_INIT=@appconfdir@/alsa/c7x0-default.state
+\ No newline at end of file
+--- /tmp/mach-spitz-vars.in 2009-04-28 16:39:58.000000000 +0200
++++ zaurusd/config/mach-config/mach-spitz-vars.in 2009-04-28 16:40:06.000000000 +0200
+@@ -5,6 +5,6 @@
+ SWITCH_EVENT_DEVICE=/dev/input/event0
+
+ TSKEYS_CONF=@appconfdir@/tskeys/zaurus-cxx00.conf
+-TSKEYS_DEVICE=/dev/input/event1
++TSKEYS_DEVICE=/dev/input/touchscreen0
+
+ ALSA_MIXER_INIT=@appconfdir@/alsa/cxx00-default.state
+\ No newline at end of file
+--- /tmp/mach-tosa-vars.in 2009-04-28 16:39:58.000000000 +0200
++++ zaurusd/config/mach-config/mach-tosa-vars.in 2009-04-28 16:40:06.000000000 +0200
+@@ -4,6 +4,6 @@
+ SWITCH_EVENT_DEVICE=/dev/input/event0
+
+ #TSKEYS_CONF=@appconfdir@/tskeys/zaurus-clamshell.conf
+-#TSKEYS_DEVICE=/dev/input/event1
++#TSKEYS_DEVICE=/dev/input/touchscreen0
+
+ ALSA_MIXER_INIT=@appconfdir@/alsa/6000x-default.state
+\ No newline at end of file
diff --git a/recipes-bsp/zaurusd/files/zaurus-hinge.bl-off b/recipes-bsp/zaurusd/files/zaurus-hinge.bl-off
new file mode 100644
index 0000000..ba6746c
--- /dev/null
+++ b/recipes-bsp/zaurusd/files/zaurus-hinge.bl-off
@@ -0,0 +1,19 @@
+#! /bin/sh
+#
+# Copyright Matthias Hentges <devel@hentges.net> (c) 2006
+# License: GPL (see http://www.gnu.org/licenses/gpl.txt for a copy of the license)
+#
+# Filename: zaurus-hinge.bl-off
+# Date: 04-Jun-06
+
+DRIVER="`ls /sys/class/backlight/|head -n 1`"
+BRIGHTNESS_FILE="/sys/class/backlight/$DRIVER/brightness"
+
+if mkdir /var/run/display_brightness.lock
+then
+ cat "$BRIGHTNESS_FILE" > /var/run/display_brightness.tmp
+ echo 0 > "$BRIGHTNESS_FILE"
+ rm -rf /var/run/display_brightness.lock
+else
+ echo "BRIGHTNESS IS LOCKED"
+fi
diff --git a/recipes-bsp/zaurusd/files/zaurus-hinge.bl-on b/recipes-bsp/zaurusd/files/zaurus-hinge.bl-on
new file mode 100644
index 0000000..58227e8
--- /dev/null
+++ b/recipes-bsp/zaurusd/files/zaurus-hinge.bl-on
@@ -0,0 +1,63 @@
+#! /bin/sh
+#
+# Copyright Matthias Hentges <devel@hentges.net> (c) 2006
+# License: GPL (see http://www.gnu.org/licenses/gpl.txt for a copy of the license)
+#
+# Filename: zaurus-hinge.bl-on
+# Date: 04-Jun-06
+
+test -z "${ZD_BINDIR}" && ZD_BINDIR="/usr/bin"
+test -x ${ZD_BINDIR}/bl && ${ZD_BINDIR}/bl on
+
+
+BL="fakeBl"
+
+fakeBl() {
+
+
+ case "$1" in
+ on) test -n "$2" && echo "$2" > "$BL_DRIVER" ;;
+ "") echo "on `cat "$BL_DRIVER"`";;
+ *) echo "$1" > "$BL_DRIVER" ;;
+ esac
+
+}
+
+for dir in `ls -1 /sys/class/backlight/`
+do
+ if test -e /sys/class/backlight/$dir/brightness
+ then
+ echo "Using [$dir] backlight driver"
+ BL_DRIVER="/sys/class/backlight/$dir/brightness"
+ break
+ fi
+done
+
+
+echo "### `$BL` ###"
+( if test "`$BL | awk '{print $2}'`" = "0"
+then
+
+ $BL 20
+
+ if mkdir /var/run/display_brightness.lock
+ then
+ if test -e /var/run/display_brightness.tmp
+ then
+ OLD_VALUE="`cat /var/run/display_brightness.tmp`"
+ echo "OLD BRIGHTNESS SETTING FOUND: $OLD_VALUE"
+
+ if test "$OLD_VALUE" -gt 1
+ then
+ echo "SETTING $OLD_VALUE!"
+ $BL "$OLD_VALUE"
+ rm /var/run/display_brightness.tmp
+ echo "FINISH!"
+ fi
+ fi
+ rm -rf /var/run/display_brightness.lock
+ else
+ echo "BRIGHTNESS IS LOCKED"
+ fi
+fi ) &
+
diff --git a/recipes-bsp/zaurusd/files/zaurus-hinge.in b/recipes-bsp/zaurusd/files/zaurus-hinge.in
new file mode 100644
index 0000000..0fcad38
--- /dev/null
+++ b/recipes-bsp/zaurusd/files/zaurus-hinge.in
@@ -0,0 +1,66 @@
+#!/bin/sh
+#
+# Quick handler for chkhinge26 and X.
+#
+
+killproc() { # kill the named process(es)
+ pid=`/bin/ps -e x |
+ /bin/grep $1 |
+ /bin/grep -v grep |
+ /bin/sed -e 's/^ *//' -e 's/ .*//'`
+ [ "$pid" != "" ] && kill $pid
+}
+
+ZD_BINDIR="@bindir@"
+export DISPLAY=:0
+
+if [ -z "$1" ]; then
+ echo "Usage: hinge-handler <state> ( 3 = closed, 0 = landscape, 2 = portrait )"
+ exit 1
+fi
+
+panel_user="`ps aux|grep matchbox-panel|grep -v grep | awk '{print $1}'`"
+
+STATE=$1
+
+# touch ~/.norot can disable rotation.
+if test -f /home/$panel_user/.norot ; then
+ if [ $STATE = "3" ]; then
+ . /etc/zaurusd/hinge-close.d/00-backlight-off
+ else
+ . /etc/zaurusd/hinge-landscape.d/00-backlight-on
+ fi
+ exit
+fi
+
+if [ $STATE = "3" ]; then
+
+ for script in `ls -1 /etc/zaurusd/hinge-close.d`
+ do
+ . /etc/zaurusd/hinge-close.d/$script
+ done
+
+ exit 0
+fi
+
+if [ $STATE = "0" ]; then
+ #echo "landscape"
+
+ for script in `ls -1 /etc/zaurusd/hinge-landscape.d`
+ do
+ . /etc/zaurusd/hinge-landscape.d/$script
+ done
+
+ exit 0
+fi
+
+if [ $STATE = "2" ]; then
+ #echo "portrait"
+
+ for script in `ls -1 /etc/zaurusd/hinge-portrait.d`
+ do
+ . /etc/zaurusd/hinge-portrait.d/$script
+ done
+
+ exit 0
+fi
diff --git a/recipes-bsp/zaurusd/files/zaurus-hinge.matchbox-landscape b/recipes-bsp/zaurusd/files/zaurus-hinge.matchbox-landscape
new file mode 100644
index 0000000..32710b2
--- /dev/null
+++ b/recipes-bsp/zaurusd/files/zaurus-hinge.matchbox-landscape
@@ -0,0 +1,25 @@
+ #!/bin/sh
+
+ # As matchbox-panel updates its written configuration right after an applet dies / is killed, we can not be sure
+ # whether the user had gpe-panel in his preferences after rotating to portrait. And since there is a slim chance
+ # that a user changes his preferences from time to time, we renew that dumped configuration every now and then ;)
+
+ if ! test -e "/tmp/gpe-panel.session-$panel_user"
+ then
+ test -e /home/$panel_user/.matchbox/mbdock.session && cp /home/$panel_user/.matchbox/mbdock.session "/tmp/gpe-panel.session-$panel_user"
+ test -e "/tmp/gpe-panel.session-$panel_user" && cat "/tmp/gpe-panel.session-$panel_user" | grep -q panel || killproc ${ZD_BINDIR}/mbinputmgr
+ else
+ cat "/tmp/gpe-panel.session-$panel_user" | grep -q panel || killproc ${ZD_BINDIR}/mbinputmgr
+ rm "/tmp/gpe-panel.session-$panel_user"
+ fi
+
+ # urg mbinputmgr should kill below
+ killproc ${ZD_BINDIR}/matchbox-keyboard
+ killproc ${ZD_BINDIR}/matchbox-stroke
+
+ if [ -x ${ZD_BINDIR}/xrandr ]; then
+ if ! ( xrandr | awk '{print $4}' | grep -q $XRANDR_LANDSCAPE )
+ then
+ ${ZD_BINDIR}/xrandr -o $XRANDR_LANDSCAPE
+ fi
+ fi
diff --git a/recipes-bsp/zaurusd/files/zaurus-hinge.matchbox-portrait b/recipes-bsp/zaurusd/files/zaurus-hinge.matchbox-portrait
new file mode 100644
index 0000000..e540e66
--- /dev/null
+++ b/recipes-bsp/zaurusd/files/zaurus-hinge.matchbox-portrait
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+ if [ -x ${ZD_BINDIR}/xrandr ]; then
+ if ! ( xrandr | awk '{print $4}' | grep -q $XRANDR_PORTRAIT )
+ then
+ ${ZD_BINDIR}/xrandr -o $XRANDR_PORTRAIT
+ fi
+ fi
+ # just to be extra safe
+ sleep 1
+
+ echo "panel_user = [$panel_user]"
+
+ if ! test -e "/tmp/gpe-panel.session-$panel_user"
+ then
+ cp /home/$panel_user/.matchbox/mbdock.session "/tmp/gpe-panel.session-$panel_user"
+ else
+ rm "/tmp/gpe-panel.session-$panel_user"
+ fi
+
+ if test -n "$panel_user"
+ then
+ echo "Running panel as user [$panel_user]"
+ ps aux | grep "$panel_user" | grep -q "mbinputmgr " || su $panel_user -c ${ZD_BINDIR}/mbinputmgr &
+ else
+ # A failsafe can't hurt
+ echo "Warning: Running mbinputmgr as root!"
+ ps aux | grep -q "mbinputmgr " || ${ZD_BINDIR}/mbinputmgr &
+ fi
diff --git a/recipes-bsp/zaurusd/zaurusd_svn.bb b/recipes-bsp/zaurusd/zaurusd_svn.bb
new file mode 100644
index 0000000..af58831
--- /dev/null
+++ b/recipes-bsp/zaurusd/zaurusd_svn.bb
@@ -0,0 +1,56 @@
+DESCRIPTION = "Daemon to handle device specific features."
+SECTION = "base"
+LICENSE = "GPL"
+DEPENDS = "tslib"
+RDEPENDS_${PN} = "procps"
+SRCDATE = "20090501"
+PV = "0.0+svn${SRCDATE}"
+PR = "r24"
+
+SRC_URI = "svn://svn.o-hand.com/repos/misc/trunk;module=zaurusd;proto=http \
+ file://zaurus-hinge.in \
+ file://add-poodle.patch \
+ file://alsa-cxx00-default.state.patch \
+ file://alsa-6000x-default.state.patch \
+ file://disable-alsa-handling.patch \
+ file://avoid-rotated-server.patch \
+ file://new-make.patch \
+ file://zaurus-hinge.matchbox-portrait \
+ file://zaurus-hinge.matchbox-landscape \
+ file://zaurus-hinge.bl-on \
+ file://zaurus-hinge.bl-off \
+ file://01-check-toggle-landscape \
+ file://01-check-toggle-portait \
+ file://use-ts-symlink-instead-of-hardcoding.diff "
+
+
+S = "${WORKDIR}/${PN}"
+
+PACKAGE_ARCH = "${MACHINE_ARCH}"
+
+do_configure_prepend () {
+ cp ${WORKDIR}/zaurus-hinge.in ${S}/scripts
+}
+
+do_install_append() {
+ install -d "${D}/etc/zaurusd/hinge-landscape.d"
+ install -d "${D}/etc/zaurusd/hinge-portrait.d"
+ install -d "${D}/etc/zaurusd/hinge-close.d"
+ install -d ${D}/etc/apm/resume.d
+
+ install -m 0755 "${WORKDIR}/zaurus-hinge.bl-on" "${D}/etc/apm/resume.d/00-backlight-on"
+ install -m 0755 "${WORKDIR}/zaurus-hinge.bl-on" "${D}/etc/zaurusd/hinge-landscape.d/00-backlight-on"
+ install -m 0755 "${WORKDIR}/zaurus-hinge.bl-on" "${D}/etc/zaurusd/hinge-portrait.d/00-backlight-on"
+ install -m 0755 "${WORKDIR}/zaurus-hinge.bl-off" "${D}/etc/zaurusd/hinge-close.d/00-backlight-off"
+
+ install -m 0755 "${WORKDIR}/01-check-toggle-landscape" "${D}/etc/zaurusd/hinge-landscape.d/01-check-toggle"
+ install -m 0755 "${WORKDIR}/01-check-toggle-portait" "${D}/etc/zaurusd/hinge-portrait.d/01-check-toggle"
+
+ install -m 0755 "${WORKDIR}/zaurus-hinge.matchbox-landscape" "${D}/etc/zaurusd/hinge-landscape.d/20-matchbox-landscape"
+ install -m 0755 "${WORKDIR}/zaurus-hinge.matchbox-portrait" "${D}/etc/zaurusd/hinge-portrait.d/20-matchbox-portrait"
+}
+
+inherit autotools pkgconfig update-rc.d
+
+INITSCRIPT_NAME = "zaurusd"
+INITSCRIPT_PARAMS = "start 99 5 2 . stop 20 0 1 6 ."
diff --git a/recipes-kernel/linux/linux-2.6.39/akita/defconfig b/recipes-kernel/linux/linux-2.6.39/akita/defconfig
new file mode 100644
index 0000000..43b22dc
--- /dev/null
+++ b/recipes-kernel/linux/linux-2.6.39/akita/defconfig
@@ -0,0 +1,381 @@
+CONFIG_EXPERIMENTAL=y
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_IKCONFIG=m
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_LZO=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_EMBEDDED=y
+CONFIG_SLOB=y
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_LBDAF is not set
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+CONFIG_ARCH_PXA=y
+CONFIG_PXA_SHARPSL=y
+CONFIG_MACH_AKITA=y
+CONFIG_MACH_BORZOI=y
+CONFIG_PCCARD=y
+CONFIG_PCMCIA_PXA2XX=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_AEABI=y
+# CONFIG_OABI_COMPAT is not set
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 fbcon=rotate:1 quiet"
+CONFIG_KEXEC=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_BINFMT_AOUT=m
+CONFIG_BINFMT_MISC=m
+CONFIG_PM_RUNTIME=y
+CONFIG_NET=y
+CONFIG_PACKET=m
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=m
+CONFIG_INET=y
+CONFIG_INET_XFRM_MODE_TRANSPORT=m
+CONFIG_INET_XFRM_MODE_TUNNEL=m
+CONFIG_INET_XFRM_MODE_BEET=m
+# CONFIG_INET_LRO is not set
+CONFIG_INET_DIAG=m
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_IPV6_TUNNEL=m
+CONFIG_NETFILTER=y
+CONFIG_NF_CONNTRACK=m
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_H323=m
+CONFIG_NF_CONNTRACK_IRC=m
+CONFIG_NF_CONNTRACK_SIP=m
+CONFIG_NF_CONNTRACK_IPV4=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_NF_NAT=m
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_TTL=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+CONFIG_IRDA=m
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
+CONFIG_IRCOMM=m
+CONFIG_PXA_FICP=m
+CONFIG_BT=m
+CONFIG_BT_L2CAP=y
+CONFIG_BT_SCO=y
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+CONFIG_BT_HCIBTUSB=m
+CONFIG_BT_HCIBTSDIO=m
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIUART_ATH3K=y
+CONFIG_BT_HCIUART_LL=y
+CONFIG_BT_HCIBCM203X=m
+CONFIG_BT_HCIBPA10X=m
+CONFIG_BT_HCIBFUSB=m
+CONFIG_BT_HCIDTL1=m
+CONFIG_BT_HCIBT3C=m
+CONFIG_BT_HCIBLUECARD=m
+CONFIG_BT_HCIBTUART=m
+CONFIG_BT_HCIVHCI=m
+CONFIG_BT_MRVL=m
+CONFIG_BT_MRVL_SDIO=m
+CONFIG_BT_ATH3K=m
+CONFIG_CFG80211=m
+# CONFIG_CFG80211_DEFAULT_PS is not set
+CONFIG_MAC80211=m
+# CONFIG_MAC80211_RC_MINSTREL is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_MTD=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_ROM=y
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_VERIFY_WRITE=y
+CONFIG_MTD_NAND_SHARPSL=y
+CONFIG_MTD_UBI=y
+CONFIG_MTD_UBI_GLUEBI=m
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_MISC_DEVICES=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_BLK_DEV_SR=m
+CONFIG_CHR_DEV_SG=m
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_ATA=y
+CONFIG_PATA_PXA=y
+CONFIG_PATA_PCMCIA=y
+CONFIG_NETDEVICES=y
+CONFIG_TUN=m
+CONFIG_NET_ETHERNET=y
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+CONFIG_AIRO_CS=m
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_FIRMWARE=y
+CONFIG_HOSTAP_CS=m
+CONFIG_USB_CATC=m
+CONFIG_USB_KAWETH=m
+CONFIG_USB_PEGASUS=m
+CONFIG_USB_RTL8150=m
+CONFIG_USB_USBNET=m
+CONFIG_USB_NET_DM9601=m
+# CONFIG_USB_NET_CDC_SUBSET is not set
+CONFIG_USB_SIERRA_NET=m
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PPP=m
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
+CONFIG_INPUT_EVDEV=y
+CONFIG_INPUT_APMPOWER=y
+# CONFIG_KEYBOARD_ATKBD is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_KEYBOARD_MATRIX=y
+# CONFIG_INPUT_MOUSE is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_ADS7846=y
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+# CONFIG_SERIO is not set
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_RAMOOPS=y
+CONFIG_SPI=y
+CONFIG_SPI_PXA2XX=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_POWER_SUPPLY=y
+CONFIG_POWER_SUPPLY_DEBUG=y
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+CONFIG_FB=y
+CONFIG_FB_PXA=y
+CONFIG_FB_PXA_OVERLAY=y
+CONFIG_FB_PXA_SMARTPANEL=y
+CONFIG_FB_PXA_PARAMETERS=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_LCD_CORGI=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_DISPLAY_SUPPORT=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x16=y
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+CONFIG_SOUND=m
+CONFIG_SND=m
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_PXA2XX_AC97=m
+CONFIG_SND_USB_AUDIO=m
+CONFIG_SND_SOC=m
+CONFIG_SND_PXA2XX_SOC=m
+CONFIG_SND_PXA2XX_SOC_SPITZ=m
+CONFIG_HID=m
+CONFIG_USB_KBD=m
+CONFIG_USB_MOUSE=m
+CONFIG_USB=m
+CONFIG_USB_DEBUG=y
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+CONFIG_USB_DEVICEFS=y
+CONFIG_USB_OTG_WHITELIST=y
+CONFIG_USB_MON=m
+CONFIG_USB_OHCI_HCD=m
+CONFIG_USB_SL811_HCD=m
+CONFIG_USB_SL811_CS=m
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
+CONFIG_USB_STORAGE=m
+CONFIG_USB_MDC800=m
+CONFIG_USB_MICROTEK=m
+CONFIG_USB_SERIAL=m
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_BELKIN=m
+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
+CONFIG_USB_SERIAL_CYPRESS_M8=m
+CONFIG_USB_SERIAL_EMPEG=m
+CONFIG_USB_SERIAL_FTDI_SIO=m
+CONFIG_USB_SERIAL_VISOR=m
+CONFIG_USB_SERIAL_IPAQ=m
+CONFIG_USB_SERIAL_IR=m
+CONFIG_USB_SERIAL_EDGEPORT=m
+CONFIG_USB_SERIAL_EDGEPORT_TI=m
+CONFIG_USB_SERIAL_GARMIN=m
+CONFIG_USB_SERIAL_IPW=m
+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
+CONFIG_USB_SERIAL_KEYSPAN=m
+CONFIG_USB_SERIAL_KLSI=m
+CONFIG_USB_SERIAL_KOBIL_SCT=m
+CONFIG_USB_SERIAL_MCT_U232=m
+CONFIG_USB_SERIAL_PL2303=m
+CONFIG_USB_SERIAL_SAFE=m
+CONFIG_USB_SERIAL_TI=m
+CONFIG_USB_SERIAL_CYBERJACK=m
+CONFIG_USB_SERIAL_XIRCOM=m
+CONFIG_USB_SERIAL_OMNINET=m
+CONFIG_USB_EMI62=m
+CONFIG_USB_EMI26=m
+CONFIG_USB_RIO500=m
+CONFIG_USB_LEGOTOWER=m
+CONFIG_USB_LCD=m
+CONFIG_USB_LED=m
+CONFIG_USB_CYTHERM=m
+CONFIG_USB_IDMOUSE=m
+CONFIG_USB_GADGET=m
+CONFIG_USB_GADGET_DEBUG_FILES=y
+CONFIG_USB_GADGET_DEBUG_FS=y
+CONFIG_USB_GADGET_PXA27X=y
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_EEM=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+CONFIG_USB_MASS_STORAGE=m
+CONFIG_USB_G_SERIAL=m
+CONFIG_USB_CDC_COMPOSITE=m
+CONFIG_USB_G_MULTI=m
+CONFIG_USB_G_MULTI_CDC=y
+CONFIG_USB_GPIO_VBUS=m
+CONFIG_USB_ULPI=y
+CONFIG_NOP_USB_XCEIV=m
+CONFIG_MMC=y
+CONFIG_MMC_UNSAFE_RESUME=y
+CONFIG_MMC_PXA=y
+CONFIG_MMC_SPI=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_RTC_CLASS=m
+CONFIG_RTC_DRV_SA1100=m
+CONFIG_RTC_DRV_PXA=m
+CONFIG_EXT2_FS=y
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+# CONFIG_EXT3_FS_XATTR is not set
+CONFIG_EXT4_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_SUMMARY=y
+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+CONFIG_JFFS2_LZO=y
+CONFIG_JFFS2_RUBIN=y
+CONFIG_UBIFS_FS=y
+CONFIG_UBIFS_FS_ADVANCED_COMPR=y
+CONFIG_CRAMFS=m
+CONFIG_NFS_FS=m
+CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V4=y
+CONFIG_CIFS=m
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_NLS_DEFAULT="cp437"
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=m
+CONFIG_NLS_CODEPAGE_775=m
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_852=m
+CONFIG_NLS_CODEPAGE_855=m
+CONFIG_NLS_CODEPAGE_857=m
+CONFIG_NLS_CODEPAGE_860=m
+CONFIG_NLS_CODEPAGE_861=m
+CONFIG_NLS_CODEPAGE_862=m
+CONFIG_NLS_CODEPAGE_863=m
+CONFIG_NLS_CODEPAGE_864=m
+CONFIG_NLS_CODEPAGE_865=m
+CONFIG_NLS_CODEPAGE_866=m
+CONFIG_NLS_CODEPAGE_869=m
+CONFIG_NLS_CODEPAGE_936=m
+CONFIG_NLS_CODEPAGE_950=m
+CONFIG_NLS_CODEPAGE_932=m
+CONFIG_NLS_CODEPAGE_949=m
+CONFIG_NLS_CODEPAGE_874=m
+CONFIG_NLS_ISO8859_8=m
+CONFIG_NLS_CODEPAGE_1250=m
+CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+CONFIG_NLS_KOI8_R=m
+CONFIG_NLS_KOI8_U=m
+CONFIG_NLS_UTF8=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_FS=y
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_TEST=m
+CONFIG_CRYPTO_PCBC=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_CAMELLIA=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_TWOFISH=m
+# CONFIG_CRYPTO_HW is not set
+CONFIG_CRC_CCITT=y
+CONFIG_LIBCRC32C=m
diff --git a/recipes-kernel/linux/linux-2.6.39/c7x0/defconfig b/recipes-kernel/linux/linux-2.6.39/c7x0/defconfig
new file mode 100644
index 0000000..4e00cd7
--- /dev/null
+++ b/recipes-kernel/linux/linux-2.6.39/c7x0/defconfig
@@ -0,0 +1,378 @@
+CONFIG_EXPERIMENTAL=y
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_IKCONFIG=m
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_LZO=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_EMBEDDED=y
+CONFIG_SLOB=y
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_LBDAF is not set
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+CONFIG_ARCH_PXA=y
+CONFIG_PXA_SHARPSL=y
+CONFIG_MACH_CORGI=y
+CONFIG_MACH_SHEPHERD=y
+CONFIG_MACH_HUSKY=y
+CONFIG_PCCARD=y
+CONFIG_PCMCIA_PXA2XX=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_AEABI=y
+# CONFIG_OABI_COMPAT is not set
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 quiet"
+CONFIG_KEXEC=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_BINFMT_AOUT=m
+CONFIG_BINFMT_MISC=m
+CONFIG_PM_RUNTIME=y
+CONFIG_NET=y
+CONFIG_PACKET=m
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=m
+CONFIG_INET=y
+CONFIG_INET_XFRM_MODE_TRANSPORT=m
+CONFIG_INET_XFRM_MODE_TUNNEL=m
+CONFIG_INET_XFRM_MODE_BEET=m
+# CONFIG_INET_LRO is not set
+CONFIG_INET_DIAG=m
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_IPV6_TUNNEL=m
+CONFIG_NETFILTER=y
+CONFIG_NF_CONNTRACK=m
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_H323=m
+CONFIG_NF_CONNTRACK_IRC=m
+CONFIG_NF_CONNTRACK_SIP=m
+CONFIG_NF_CONNTRACK_IPV4=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_NF_NAT=m
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_TTL=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+CONFIG_IRDA=m
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
+CONFIG_IRCOMM=m
+CONFIG_PXA_FICP=m
+CONFIG_BT=m
+CONFIG_BT_L2CAP=y
+CONFIG_BT_SCO=y
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+CONFIG_BT_HCIBTUSB=m
+CONFIG_BT_HCIBTSDIO=m
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIUART_ATH3K=y
+CONFIG_BT_HCIUART_LL=y
+CONFIG_BT_HCIBCM203X=m
+CONFIG_BT_HCIBPA10X=m
+CONFIG_BT_HCIBFUSB=m
+CONFIG_BT_HCIDTL1=m
+CONFIG_BT_HCIBT3C=m
+CONFIG_BT_HCIBLUECARD=m
+CONFIG_BT_HCIBTUART=m
+CONFIG_BT_HCIVHCI=m
+CONFIG_BT_MRVL=m
+CONFIG_BT_MRVL_SDIO=m
+CONFIG_BT_ATH3K=m
+CONFIG_CFG80211=m
+# CONFIG_CFG80211_DEFAULT_PS is not set
+CONFIG_MAC80211=m
+# CONFIG_MAC80211_RC_MINSTREL is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_MTD=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_ROM=y
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_VERIFY_WRITE=y
+CONFIG_MTD_NAND_SHARPSL=y
+CONFIG_MTD_UBI=y
+CONFIG_MTD_UBI_GLUEBI=m
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_MISC_DEVICES=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_BLK_DEV_SR=m
+CONFIG_CHR_DEV_SG=m
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_ATA=y
+CONFIG_PATA_PXA=y
+CONFIG_PATA_PCMCIA=y
+CONFIG_NETDEVICES=y
+CONFIG_TUN=m
+CONFIG_NET_ETHERNET=y
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+CONFIG_AIRO_CS=m
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_FIRMWARE=y
+CONFIG_HOSTAP_CS=m
+CONFIG_USB_CATC=m
+CONFIG_USB_KAWETH=m
+CONFIG_USB_PEGASUS=m
+CONFIG_USB_RTL8150=m
+CONFIG_USB_USBNET=m
+CONFIG_USB_NET_DM9601=m
+# CONFIG_USB_NET_CDC_SUBSET is not set
+CONFIG_USB_SIERRA_NET=m
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PPP=m
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
+CONFIG_INPUT_EVDEV=y
+CONFIG_INPUT_APMPOWER=y
+# CONFIG_KEYBOARD_ATKBD is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_KEYBOARD_MATRIX=y
+# CONFIG_INPUT_MOUSE is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_ADS7846=y
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+# CONFIG_SERIO is not set
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_RAMOOPS=y
+CONFIG_I2C=y
+CONFIG_I2C_PXA=y
+CONFIG_SPI=y
+CONFIG_SPI_PXA2XX=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_POWER_SUPPLY=y
+CONFIG_POWER_SUPPLY_DEBUG=y
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+CONFIG_FB=y
+CONFIG_FB_W100=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_LCD_CORGI=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_DISPLAY_SUPPORT=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x16=y
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+CONFIG_SOUND=m
+CONFIG_SND=m
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_PXA2XX_AC97=m
+CONFIG_SND_USB_AUDIO=m
+CONFIG_SND_SOC=m
+CONFIG_SND_PXA2XX_SOC=m
+CONFIG_SND_PXA2XX_SOC_CORGI=m
+CONFIG_HID=m
+CONFIG_USB_KBD=m
+CONFIG_USB_MOUSE=m
+CONFIG_USB=m
+CONFIG_USB_DEBUG=y
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+CONFIG_USB_DEVICEFS=y
+CONFIG_USB_OTG_WHITELIST=y
+CONFIG_USB_MON=m
+CONFIG_USB_SL811_HCD=m
+CONFIG_USB_SL811_CS=m
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
+CONFIG_USB_STORAGE=m
+CONFIG_USB_MDC800=m
+CONFIG_USB_MICROTEK=m
+CONFIG_USB_SERIAL=m
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_BELKIN=m
+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
+CONFIG_USB_SERIAL_CYPRESS_M8=m
+CONFIG_USB_SERIAL_EMPEG=m
+CONFIG_USB_SERIAL_FTDI_SIO=m
+CONFIG_USB_SERIAL_VISOR=m
+CONFIG_USB_SERIAL_IPAQ=m
+CONFIG_USB_SERIAL_IR=m
+CONFIG_USB_SERIAL_EDGEPORT=m
+CONFIG_USB_SERIAL_EDGEPORT_TI=m
+CONFIG_USB_SERIAL_GARMIN=m
+CONFIG_USB_SERIAL_IPW=m
+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
+CONFIG_USB_SERIAL_KEYSPAN=m
+CONFIG_USB_SERIAL_KLSI=m
+CONFIG_USB_SERIAL_KOBIL_SCT=m
+CONFIG_USB_SERIAL_MCT_U232=m
+CONFIG_USB_SERIAL_PL2303=m
+CONFIG_USB_SERIAL_SAFE=m
+CONFIG_USB_SERIAL_TI=m
+CONFIG_USB_SERIAL_CYBERJACK=m
+CONFIG_USB_SERIAL_XIRCOM=m
+CONFIG_USB_SERIAL_OMNINET=m
+CONFIG_USB_EMI62=m
+CONFIG_USB_EMI26=m
+CONFIG_USB_RIO500=m
+CONFIG_USB_LEGOTOWER=m
+CONFIG_USB_LCD=m
+CONFIG_USB_LED=m
+CONFIG_USB_CYTHERM=m
+CONFIG_USB_IDMOUSE=m
+CONFIG_USB_GADGET=m
+CONFIG_USB_GADGET_DEBUG_FILES=y
+CONFIG_USB_GADGET_DEBUG_FS=y
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_EEM=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+CONFIG_USB_MASS_STORAGE=m
+CONFIG_USB_G_SERIAL=m
+CONFIG_USB_CDC_COMPOSITE=m
+CONFIG_USB_G_MULTI=m
+CONFIG_USB_G_MULTI_CDC=y
+CONFIG_USB_GPIO_VBUS=m
+CONFIG_USB_ULPI=y
+CONFIG_NOP_USB_XCEIV=m
+CONFIG_MMC=y
+CONFIG_MMC_UNSAFE_RESUME=y
+CONFIG_MMC_PXA=y
+CONFIG_MMC_SPI=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_RTC_CLASS=m
+CONFIG_RTC_DRV_SA1100=m
+CONFIG_RTC_DRV_PXA=m
+CONFIG_EXT2_FS=y
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+# CONFIG_EXT3_FS_XATTR is not set
+CONFIG_EXT4_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_SUMMARY=y
+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+CONFIG_JFFS2_LZO=y
+CONFIG_JFFS2_RUBIN=y
+CONFIG_UBIFS_FS=y
+CONFIG_UBIFS_FS_ADVANCED_COMPR=y
+CONFIG_CRAMFS=m
+CONFIG_NFS_FS=m
+CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V4=y
+CONFIG_CIFS=m
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_NLS_DEFAULT="cp437"
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=m
+CONFIG_NLS_CODEPAGE_775=m
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_852=m
+CONFIG_NLS_CODEPAGE_855=m
+CONFIG_NLS_CODEPAGE_857=m
+CONFIG_NLS_CODEPAGE_860=m
+CONFIG_NLS_CODEPAGE_861=m
+CONFIG_NLS_CODEPAGE_862=m
+CONFIG_NLS_CODEPAGE_863=m
+CONFIG_NLS_CODEPAGE_864=m
+CONFIG_NLS_CODEPAGE_865=m
+CONFIG_NLS_CODEPAGE_866=m
+CONFIG_NLS_CODEPAGE_869=m
+CONFIG_NLS_CODEPAGE_936=m
+CONFIG_NLS_CODEPAGE_950=m
+CONFIG_NLS_CODEPAGE_932=m
+CONFIG_NLS_CODEPAGE_949=m
+CONFIG_NLS_CODEPAGE_874=m
+CONFIG_NLS_ISO8859_8=m
+CONFIG_NLS_CODEPAGE_1250=m
+CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+CONFIG_NLS_KOI8_R=m
+CONFIG_NLS_KOI8_U=m
+CONFIG_NLS_UTF8=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_FS=y
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_TEST=m
+CONFIG_CRYPTO_PCBC=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_CAMELLIA=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_TWOFISH=m
+# CONFIG_CRYPTO_HW is not set
+CONFIG_CRC_CCITT=y
+CONFIG_LIBCRC32C=m
diff --git a/recipes-kernel/linux/linux-2.6.39/collie/defconfig b/recipes-kernel/linux/linux-2.6.39/collie/defconfig
new file mode 100644
index 0000000..4711f09
--- /dev/null
+++ b/recipes-kernel/linux/linux-2.6.39/collie/defconfig
@@ -0,0 +1,324 @@
+CONFIG_EXPERIMENTAL=y
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_SPARSE_IRQ=y
+CONFIG_IKCONFIG=m
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_LZO=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_EMBEDDED=y
+CONFIG_SLOB=y
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_LBDAF is not set
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+CONFIG_ARCH_SA1100=y
+CONFIG_SA1100_COLLIE=y
+CONFIG_PCCARD=y
+CONFIG_PCMCIA_SA1100=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_AEABI=y
+# CONFIG_OABI_COMPAT is not set
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="console=ttySA0,115200n8 console=tty1 mem=64M fbcon=rotate:1 quiet"
+CONFIG_KEXEC=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_BINFMT_AOUT=m
+CONFIG_BINFMT_MISC=m
+CONFIG_PM_RUNTIME=y
+CONFIG_APM_EMULATION=y
+CONFIG_NET=y
+CONFIG_PACKET=m
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=m
+CONFIG_INET=y
+CONFIG_INET_XFRM_MODE_TRANSPORT=m
+CONFIG_INET_XFRM_MODE_TUNNEL=m
+CONFIG_INET_XFRM_MODE_BEET=m
+# CONFIG_INET_LRO is not set
+CONFIG_INET_DIAG=m
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_IPV6_TUNNEL=m
+CONFIG_NETFILTER=y
+CONFIG_NF_CONNTRACK=m
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_H323=m
+CONFIG_NF_CONNTRACK_IRC=m
+CONFIG_NF_CONNTRACK_SIP=m
+CONFIG_NF_CONNTRACK_IPV4=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_NF_NAT=m
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_TTL=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+CONFIG_IRDA=m
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
+CONFIG_IRCOMM=m
+CONFIG_BT=m
+CONFIG_BT_L2CAP=y
+CONFIG_BT_SCO=y
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+CONFIG_BT_HCIBTSDIO=m
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIUART_ATH3K=y
+CONFIG_BT_HCIUART_LL=y
+CONFIG_BT_HCIDTL1=m
+CONFIG_BT_HCIBT3C=m
+CONFIG_BT_HCIBLUECARD=m
+CONFIG_BT_HCIBTUART=m
+CONFIG_BT_HCIVHCI=m
+CONFIG_BT_MRVL=m
+CONFIG_BT_MRVL_SDIO=m
+CONFIG_CFG80211=m
+# CONFIG_CFG80211_DEFAULT_PS is not set
+CONFIG_MAC80211=m
+# CONFIG_MAC80211_RC_MINSTREL is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_MTD=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_CFI=y
+CONFIG_MTD_JEDECPROBE=y
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_CFI_GEOMETRY=y
+# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_2 is not set
+# CONFIG_MTD_CFI_I1 is not set
+# CONFIG_MTD_CFI_I2 is not set
+CONFIG_MTD_CFI_I4=y
+CONFIG_MTD_CFI_INTELEXT=y
+CONFIG_MTD_ROM=y
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_SA1100=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_VERIFY_WRITE=y
+CONFIG_MTD_UBI=y
+CONFIG_MTD_UBI_GLUEBI=m
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_MISC_DEVICES=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_BLK_DEV_SR=m
+CONFIG_CHR_DEV_SG=m
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_ATA=y
+CONFIG_PATA_PCMCIA=y
+CONFIG_NETDEVICES=y
+CONFIG_TUN=m
+CONFIG_MII=m
+CONFIG_NET_ETHERNET=y
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+CONFIG_AIRO_CS=m
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_FIRMWARE=y
+CONFIG_HOSTAP_CS=m
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PPP=m
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=240
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320
+CONFIG_INPUT_EVDEV=y
+CONFIG_INPUT_APMPOWER=y
+# CONFIG_KEYBOARD_ATKBD is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_KEYBOARD_LOCOMO=y
+# CONFIG_INPUT_MOUSE is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_ADS7846=y
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+# CONFIG_SERIO is not set
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_SA1100=y
+CONFIG_SERIAL_SA1100_CONSOLE=y
+CONFIG_RAMOOPS=y
+CONFIG_I2C=y
+CONFIG_SPI=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_POWER_SUPPLY=y
+CONFIG_POWER_SUPPLY_DEBUG=y
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+CONFIG_SENSORS_MAX1111=y
+CONFIG_MCP_SA11X0=y
+CONFIG_MCP_UCB1200=y
+CONFIG_MCP_UCB1200_TS=y
+CONFIG_FB=y
+CONFIG_FB_SA1100=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+# CONFIG_BACKLIGHT_GENERIC is not set
+CONFIG_DISPLAY_SUPPORT=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+CONFIG_SOUND=m
+CONFIG_SND=m
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_SOC=m
+CONFIG_HID=m
+CONFIG_USB_OTG_WHITELIST=y
+CONFIG_USB_GADGET=m
+CONFIG_USB_GADGET_DEBUG_FILES=y
+CONFIG_USB_GADGET_DEBUG_FS=y
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_EEM=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+CONFIG_USB_MASS_STORAGE=m
+CONFIG_USB_G_SERIAL=m
+CONFIG_USB_CDC_COMPOSITE=m
+CONFIG_USB_G_MULTI=m
+CONFIG_USB_G_MULTI_CDC=y
+CONFIG_USB_GPIO_VBUS=m
+CONFIG_USB_ULPI=y
+CONFIG_NOP_USB_XCEIV=m
+CONFIG_MMC=y
+CONFIG_MMC_UNSAFE_RESUME=y
+CONFIG_MMC_SPI=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_LOCOMO=y
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_RTC_CLASS=m
+CONFIG_RTC_DRV_SA1100=m
+CONFIG_EXT2_FS=y
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+# CONFIG_EXT3_FS_XATTR is not set
+CONFIG_EXT4_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_SUMMARY=y
+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+CONFIG_JFFS2_LZO=y
+CONFIG_JFFS2_RUBIN=y
+CONFIG_UBIFS_FS=y
+CONFIG_UBIFS_FS_ADVANCED_COMPR=y
+CONFIG_CRAMFS=m
+CONFIG_NFS_FS=m
+CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V4=y
+CONFIG_CIFS=m
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_NLS_DEFAULT="cp437"
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=m
+CONFIG_NLS_CODEPAGE_775=m
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_852=m
+CONFIG_NLS_CODEPAGE_855=m
+CONFIG_NLS_CODEPAGE_857=m
+CONFIG_NLS_CODEPAGE_860=m
+CONFIG_NLS_CODEPAGE_861=m
+CONFIG_NLS_CODEPAGE_862=m
+CONFIG_NLS_CODEPAGE_863=m
+CONFIG_NLS_CODEPAGE_864=m
+CONFIG_NLS_CODEPAGE_865=m
+CONFIG_NLS_CODEPAGE_866=m
+CONFIG_NLS_CODEPAGE_869=m
+CONFIG_NLS_CODEPAGE_936=m
+CONFIG_NLS_CODEPAGE_950=m
+CONFIG_NLS_CODEPAGE_932=m
+CONFIG_NLS_CODEPAGE_949=m
+CONFIG_NLS_CODEPAGE_874=m
+CONFIG_NLS_ISO8859_8=m
+CONFIG_NLS_CODEPAGE_1250=m
+CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+CONFIG_NLS_KOI8_R=m
+CONFIG_NLS_KOI8_U=m
+CONFIG_NLS_UTF8=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_FS=y
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_TEST=m
+CONFIG_CRYPTO_PCBC=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_CAMELLIA=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_TWOFISH=m
+# CONFIG_CRYPTO_HW is not set
+CONFIG_CRC_CCITT=y
+CONFIG_LIBCRC32C=m
diff --git a/recipes-kernel/linux/linux-2.6.39/h1940/defconfig b/recipes-kernel/linux/linux-2.6.39/h1940/defconfig
new file mode 100644
index 0000000..411b31d
--- /dev/null
+++ b/recipes-kernel/linux/linux-2.6.39/h1940/defconfig
@@ -0,0 +1,1704 @@
+#
+# Automatically generated make config: don't edit
+# Linux/arm 2.6.38 Kernel Configuration
+# Wed Mar 30 16:18:30 2011
+#
+CONFIG_ARM=y
+CONFIG_HAVE_PWM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_ARCH_USES_GETTIMEOFFSET=y
+CONFIG_KTIME_SCALAR=y
+CONFIG_HAVE_PROC_CPU=y
+CONFIG_NO_IOPORT=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_ARCH_HAS_CPUFREQ=y
+CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_NEED_DMA_MAP_STATE=y
+CONFIG_VECTORS_BASE=0xffff0000
+# CONFIG_ARM_PATCH_PHYS_VIRT is not set
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+CONFIG_CONSTRUCTORS=y
+CONFIG_HAVE_IRQ_WORK=y
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_CROSS_COMPILE=""
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_HAVE_KERNEL_GZIP=y
+CONFIG_HAVE_KERNEL_LZMA=y
+CONFIG_HAVE_KERNEL_LZO=y
+CONFIG_KERNEL_GZIP=y
+# CONFIG_KERNEL_LZMA is not set
+# CONFIG_KERNEL_LZO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_FHANDLE is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_AUDIT is not set
+CONFIG_HAVE_GENERIC_HARDIRQS=y
+
+#
+# IRQ subsystem
+#
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_HAVE_SPARSE_IRQ=y
+# CONFIG_SPARSE_IRQ is not set
+
+#
+# RCU Subsystem
+#
+CONFIG_TINY_RCU=y
+# CONFIG_PREEMPT_RCU is not set
+# CONFIG_RCU_TRACE is not set
+# CONFIG_TREE_RCU_TRACE is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=18
+# CONFIG_CGROUPS is not set
+CONFIG_NAMESPACES=y
+# CONFIG_UTS_NS is not set
+# CONFIG_IPC_NS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_PID_NS is not set
+# CONFIG_NET_NS is not set
+# CONFIG_SCHED_AUTOGROUP is not set
+# CONFIG_SYSFS_DEPRECATED is not set
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_RD_GZIP=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_XZ=y
+CONFIG_RD_LZO=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_ANON_INODES=y
+# CONFIG_EXPERT is not set
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# 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_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+CONFIG_HAVE_PERF_EVENTS=y
+CONFIG_PERF_USE_VMALLOC=y
+
+#
+# Kernel Performance Events And Counters
+#
+# CONFIG_PERF_EVENTS is not set
+# CONFIG_PERF_COUNTERS is not set
+CONFIG_VM_EVENT_COUNTERS=y
+# CONFIG_COMPAT_BRK is not set
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_PROFILING is not set
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_KPROBES is not set
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
+CONFIG_HAVE_CLK=y
+CONFIG_HAVE_DMA_API_DEBUG=y
+
+#
+# GCOV-based kernel profiling
+#
+# CONFIG_GCOV_KERNEL is not set
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+CONFIG_MODULE_FORCE_LOAD=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_BLOCK=y
+CONFIG_LBDAF=y
+# CONFIG_BLK_DEV_BSG is not set
+# CONFIG_BLK_DEV_INTEGRITY is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+# CONFIG_INLINE_SPIN_TRYLOCK is not set
+# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
+# CONFIG_INLINE_SPIN_LOCK is not set
+# CONFIG_INLINE_SPIN_LOCK_BH is not set
+# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
+# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
+CONFIG_INLINE_SPIN_UNLOCK=y
+# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
+CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
+# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
+# CONFIG_INLINE_READ_TRYLOCK is not set
+# CONFIG_INLINE_READ_LOCK is not set
+# CONFIG_INLINE_READ_LOCK_BH is not set
+# CONFIG_INLINE_READ_LOCK_IRQ is not set
+# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
+CONFIG_INLINE_READ_UNLOCK=y
+# CONFIG_INLINE_READ_UNLOCK_BH is not set
+CONFIG_INLINE_READ_UNLOCK_IRQ=y
+# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
+# CONFIG_INLINE_WRITE_TRYLOCK is not set
+# CONFIG_INLINE_WRITE_LOCK is not set
+# CONFIG_INLINE_WRITE_LOCK_BH is not set
+# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
+# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
+CONFIG_INLINE_WRITE_UNLOCK=y
+# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
+CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
+# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
+# CONFIG_MUTEX_SPIN_ON_OWNER is not set
+CONFIG_FREEZER=y
+
+#
+# System Type
+#
+CONFIG_MMU=y
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_REALVIEW is not set
+# CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_VEXPRESS is not set
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_BCMRING is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CNS3XXX is not set
+# CONFIG_ARCH_GEMINI is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_MXC is not set
+# CONFIG_ARCH_MXS is not set
+# CONFIG_ARCH_STMP3XXX is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_IOP13XX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_DOVE is not set
+# CONFIG_ARCH_KIRKWOOD is not set
+# CONFIG_ARCH_LOKI is not set
+# CONFIG_ARCH_LPC32XX is not set
+# CONFIG_ARCH_MV78XX0 is not set
+# CONFIG_ARCH_ORION5X is not set
+# CONFIG_ARCH_MMP is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_NS9XXX is not set
+# CONFIG_ARCH_W90X900 is not set
+# CONFIG_ARCH_NUC93X is not set
+# CONFIG_ARCH_TEGRA is not set
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_MSM is not set
+# CONFIG_ARCH_SHMOBILE is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+CONFIG_ARCH_S3C2410=y
+# CONFIG_ARCH_S3C64XX is not set
+# CONFIG_ARCH_S5P64X0 is not set
+# CONFIG_ARCH_S5P6442 is not set
+# CONFIG_ARCH_S5PC100 is not set
+# CONFIG_ARCH_S5PV210 is not set
+# CONFIG_ARCH_EXYNOS4 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_TCC_926 is not set
+# CONFIG_ARCH_U300 is not set
+# CONFIG_ARCH_U8500 is not set
+# CONFIG_ARCH_NOMADIK is not set
+# CONFIG_ARCH_DAVINCI is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_PLAT_SPEAR is not set
+# CONFIG_ARCH_VT8500 is not set
+# CONFIG_GPIO_PCA953X is not set
+# CONFIG_KEYBOARD_GPIO_POLLED is not set
+CONFIG_PLAT_SAMSUNG=y
+
+#
+# Boot options
+#
+# CONFIG_S3C_BOOT_WATCHDOG is not set
+# CONFIG_S3C_BOOT_ERROR_RESET is not set
+CONFIG_S3C_BOOT_UART_FORCE_FIFO=y
+CONFIG_S3C_LOWLEVEL_UART_PORT=0
+CONFIG_S3C_GPIO_CFG_S3C24XX=y
+CONFIG_S3C_GPIO_PULL_DOWN=y
+CONFIG_S3C_GPIO_PULL_UP=y
+CONFIG_SAMSUNG_GPIO_EXTRA=0
+CONFIG_S3C_GPIO_SPACE=0
+CONFIG_S3C_ADC=y
+CONFIG_S3C_DEV_USB_HOST=y
+CONFIG_S3C_DEV_WDT=y
+CONFIG_S3C_DEV_NAND=y
+CONFIG_SAMSUNG_DEV_PWM=y
+CONFIG_S3C24XX_PWM=y
+CONFIG_S3C_DMA=y
+
+#
+# Power management
+#
+# CONFIG_SAMSUNG_PM_DEBUG is not set
+# CONFIG_SAMSUNG_PM_CHECK is not set
+
+#
+# Power Domain
+#
+CONFIG_PLAT_S3C24XX=y
+CONFIG_CPU_LLSERIAL_S3C2410=y
+CONFIG_CPU_LLSERIAL_S3C2440=y
+CONFIG_S3C2410_CLOCK=y
+CONFIG_S3C24XX_DCLK=y
+CONFIG_S3C24XX_GPIO_EXTRA=16
+CONFIG_S3C2410_DMA=y
+# CONFIG_S3C2410_DMA_DEBUG is not set
+CONFIG_S3C2410_SETUP_TS=y
+
+#
+# System MMU
+#
+
+#
+# S3C2400 Machines
+#
+CONFIG_CPU_S3C2410=y
+CONFIG_CPU_S3C2410_DMA=y
+CONFIG_S3C2410_PM=y
+CONFIG_S3C2410_GPIO=y
+
+#
+# S3C2410 Machines
+#
+# CONFIG_ARCH_SMDK2410 is not set
+CONFIG_ARCH_H1940=y
+CONFIG_H1940BT=y
+CONFIG_PM_H1940=y
+# CONFIG_MACH_N30 is not set
+# CONFIG_ARCH_BAST is not set
+# CONFIG_MACH_OTOM is not set
+# CONFIG_MACH_AML_M5900 is not set
+# CONFIG_MACH_TCT_HAMMER is not set
+# CONFIG_MACH_VR1000 is not set
+# CONFIG_MACH_QT2410 is not set
+
+#
+# S3C2412 Machines
+#
+# CONFIG_MACH_JIVE is not set
+# CONFIG_MACH_SMDK2413 is not set
+# CONFIG_MACH_SMDK2412 is not set
+# CONFIG_MACH_VSTMS is not set
+
+#
+# S3C2416 Machines
+#
+# CONFIG_MACH_SMDK2416 is not set
+CONFIG_CPU_S3C2442=y
+CONFIG_CPU_S3C244X=y
+CONFIG_S3C2440_XTAL_16934400=y
+
+#
+# S3C2440 and S3C2442 Machines
+#
+# CONFIG_MACH_ANUBIS is not set
+# CONFIG_MACH_NEO1973_GTA02 is not set
+# CONFIG_MACH_OSIRIS is not set
+# CONFIG_MACH_RX3715 is not set
+# CONFIG_ARCH_S3C2440 is not set
+# CONFIG_MACH_NEXCODER_2440 is not set
+# CONFIG_SMDK2440_CPU2440 is not set
+# CONFIG_SMDK2440_CPU2442 is not set
+# CONFIG_MACH_AT2440EVB is not set
+# CONFIG_MACH_MINI2440 is not set
+CONFIG_MACH_RX1950=y
+
+#
+# S3C2443 Machines
+#
+# CONFIG_MACH_SMDK2443 is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_ARM920T=y
+CONFIG_CPU_32v4T=y
+CONFIG_CPU_ABRT_EV4T=y
+CONFIG_CPU_PABRT_LEGACY=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
+CONFIG_CPU_USE_DOMAINS=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+CONFIG_ARM_L1_CACHE_SHIFT=5
+
+#
+# Bus support
+#
+# CONFIG_PCI_SYSCALL is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_VMSPLIT_3G=y
+# CONFIG_VMSPLIT_2G is not set
+# CONFIG_VMSPLIT_1G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
+# CONFIG_PREEMPT_NONE is not set
+CONFIG_PREEMPT_VOLUNTARY=y
+# CONFIG_PREEMPT is not set
+CONFIG_HZ=200
+CONFIG_AEABI=y
+# CONFIG_OABI_COMPAT is not set
+# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
+# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
+# CONFIG_HIGHMEM is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_HAVE_MEMBLOCK=y
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_SPLIT_PTLOCK_CPUS=999999
+# CONFIG_COMPACTION is not set
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_VIRT_TO_BUS=y
+# CONFIG_KSM is not set
+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+CONFIG_NEED_PER_CPU_KM=y
+CONFIG_FORCE_MAX_ZONEORDER=11
+CONFIG_ALIGNMENT_TRAP=y
+# CONFIG_UACCESS_WITH_MEMCPY is not set
+# CONFIG_SECCOMP is not set
+# CONFIG_CC_STACKPROTECTOR is not set
+# CONFIG_DEPRECATED_PARAM_STRUCT is not set
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE=""
+# CONFIG_XIP_KERNEL is not set
+# CONFIG_KEXEC is not set
+# CONFIG_CRASH_DUMP is not set
+# CONFIG_AUTO_ZRELADDR is not set
+
+#
+# CPU Power Management
+#
+# CONFIG_CPU_FREQ is not set
+CONFIG_CPU_IDLE=y
+CONFIG_CPU_IDLE_GOV_LADDER=y
+
+#
+# Floating point emulation
+#
+
+#
+# At least one emulation must be selected
+#
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_HAVE_AOUT=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options
+#
+CONFIG_SUSPEND=y
+CONFIG_SUSPEND_FREEZER=y
+CONFIG_PM_SLEEP=y
+# CONFIG_PM_RUNTIME is not set
+CONFIG_PM=y
+# CONFIG_PM_DEBUG is not set
+CONFIG_APM_EMULATION=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE_DEMUX is not set
+# CONFIG_IP_MROUTE 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 is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_LRO is not set
+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_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# CONFIG_RDS is not set
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_L2TP is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_NET_DSA 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
+# CONFIG_PHONET is not set
+# CONFIG_IEEE802154 is not set
+# CONFIG_NET_SCHED is not set
+# CONFIG_DCB is not set
+CONFIG_DNS_RESOLVER=y
+# CONFIG_BATMAN_ADV is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
+CONFIG_IRDA=m
+
+#
+# IrDA protocols
+#
+# CONFIG_IRLAN is not set
+CONFIG_IRCOMM=m
+# CONFIG_IRDA_ULTRA is not set
+
+#
+# IrDA options
+#
+CONFIG_IRDA_CACHE_LAST_LSAP=y
+CONFIG_IRDA_FAST_RR=y
+# CONFIG_IRDA_DEBUG is not set
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+CONFIG_IRTTY_SIR=m
+
+#
+# Dongle support
+#
+# CONFIG_DONGLE is not set
+
+#
+# FIR device drivers
+#
+# CONFIG_BT is not set
+# CONFIG_AF_RXRPC is not set
+CONFIG_WIRELESS=y
+CONFIG_WEXT_CORE=y
+CONFIG_WEXT_PROC=y
+CONFIG_CFG80211=m
+# CONFIG_NL80211_TESTMODE is not set
+# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set
+# CONFIG_CFG80211_REG_DEBUG is not set
+CONFIG_CFG80211_DEFAULT_PS=y
+# CONFIG_CFG80211_DEBUGFS is not set
+# CONFIG_CFG80211_INTERNAL_REGDB is not set
+CONFIG_CFG80211_WEXT=y
+CONFIG_WIRELESS_EXT_SYSFS=y
+# CONFIG_LIB80211 is not set
+CONFIG_MAC80211=m
+CONFIG_MAC80211_HAS_RC=y
+CONFIG_MAC80211_RC_MINSTREL=y
+CONFIG_MAC80211_RC_MINSTREL_HT=y
+CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
+CONFIG_MAC80211_RC_DEFAULT="minstrel_ht"
+# CONFIG_MAC80211_MESH is not set
+# CONFIG_MAC80211_LEDS is not set
+# CONFIG_MAC80211_DEBUGFS is not set
+# CONFIG_MAC80211_DEBUG_MENU is not set
+# CONFIG_WIMAX is not set
+CONFIG_RFKILL=y
+CONFIG_RFKILL_LEDS=y
+CONFIG_RFKILL_INPUT=y
+# CONFIG_NET_9P is not set
+# CONFIG_CAIF is not set
+# CONFIG_CEPH_LIB is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+# CONFIG_DEVTMPFS is not set
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_FIRMWARE_IN_KERNEL is not set
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_CONNECTOR is not set
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_TESTS 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
+# CONFIG_MTD_AR7_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=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
+# CONFIG_SM_FTL is not set
+# CONFIG_MTD_OOPS 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 is not set
+# 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
+
+#
+# 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_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# 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
+CONFIG_MTD_NAND_ECC=y
+# CONFIG_MTD_NAND_ECC_SMC is not set
+CONFIG_MTD_NAND=y
+# CONFIG_MTD_NAND_VERIFY_WRITE is not set
+# CONFIG_MTD_SM_COMMON is not set
+# CONFIG_MTD_NAND_MUSEUM_IDS is not set
+# CONFIG_MTD_NAND_GPIO 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
+# CONFIG_MTD_NAND_PLATFORM is not set
+# CONFIG_MTD_ONENAND is not set
+
+#
+# LPDDR flash memory drivers
+#
+# CONFIG_MTD_LPDDR is not set
+# CONFIG_MTD_UBI is not set
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+
+#
+# DRBD disabled because PROC_FS, INET or CONNECTOR not selected
+#
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=1
+CONFIG_BLK_DEV_RAM_SIZE=8192
+# CONFIG_BLK_DEV_XIP is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_MG_DISK is not set
+# CONFIG_BLK_DEV_RBD is not set
+# CONFIG_MISC_DEVICES is not set
+CONFIG_HAVE_IDE=y
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+CONFIG_SCSI_MOD=y
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_DMA is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_ATA is not set
+# CONFIG_MD is not set
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_VETH is not set
+# CONFIG_MII is not set
+# CONFIG_PHYLIB is not set
+# CONFIG_NET_ETHERNET is not set
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+CONFIG_WLAN=y
+# CONFIG_LIBERTAS_THINFIRM is not set
+# CONFIG_MAC80211_HWSIM is not set
+# CONFIG_ATH_COMMON is not set
+# CONFIG_B43 is not set
+# CONFIG_B43LEGACY is not set
+# CONFIG_HOSTAP is not set
+# CONFIG_IWM is not set
+# CONFIG_LIBERTAS is not set
+# CONFIG_P54_COMMON is not set
+# CONFIG_RT2X00 is not set
+# CONFIG_WL1251 is not set
+# CONFIG_WL12XX_MENU is not set
+
+#
+# Enable WiMAX (Networking options) to see the WiMAX drivers
+#
+# CONFIG_WAN is not set
+
+#
+# CAIF transport drivers
+#
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_ISDN is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+# CONFIG_INPUT_POLLDEV is not set
+# CONFIG_INPUT_SPARSEKMAP is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=240
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320
+# CONFIG_INPUT_JOYDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ADP5588 is not set
+# CONFIG_KEYBOARD_ATKBD is not set
+# CONFIG_KEYBOARD_QT1070 is not set
+# CONFIG_KEYBOARD_QT2160 is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+CONFIG_KEYBOARD_GPIO=y
+# CONFIG_KEYBOARD_TCA6416 is not set
+# CONFIG_KEYBOARD_MATRIX is not set
+# CONFIG_KEYBOARD_LM8323 is not set
+# CONFIG_KEYBOARD_MAX7359 is not set
+# CONFIG_KEYBOARD_MCS is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_OPENCORES is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_AD7879 is not set
+# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set
+# CONFIG_TOUCHSCREEN_BU21013 is not set
+# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
+# CONFIG_TOUCHSCREEN_DYNAPRO is not set
+# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set
+# CONFIG_TOUCHSCREEN_EETI is not set
+# CONFIG_TOUCHSCREEN_FUJITSU is not set
+CONFIG_TOUCHSCREEN_S3C2410=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
+# CONFIG_TOUCHSCREEN_MCS5000 is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_INEXIO is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
+# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
+# CONFIG_TOUCHSCREEN_TSC2007 is not set
+# CONFIG_TOUCHSCREEN_W90X900 is not set
+# CONFIG_TOUCHSCREEN_ST1232 is not set
+# CONFIG_TOUCHSCREEN_TPS6507X is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_RAW is not set
+# CONFIG_SERIO_ALTERA_PS2 is not set
+# CONFIG_SERIO_PS2MULT is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+CONFIG_UNIX98_PTYS=y
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_N_GSM is not set
+CONFIG_DEVKMEM=y
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_SAMSUNG=y
+CONFIG_SERIAL_SAMSUNG_UARTS=3
+CONFIG_SERIAL_SAMSUNG_CONSOLE=y
+CONFIG_SERIAL_S3C2410=y
+CONFIG_SERIAL_S3C2440=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_TIMBERDALE is not set
+# CONFIG_SERIAL_ALTERA_JTAGUART is not set
+# CONFIG_SERIAL_ALTERA_UART is not set
+# CONFIG_HVC_DCC is not set
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_R3964 is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+# CONFIG_RAMOOPS is not set
+CONFIG_I2C=y
+CONFIG_I2C_BOARDINFO=y
+# CONFIG_I2C_COMPAT is not set
+CONFIG_I2C_CHARDEV=m
+# CONFIG_I2C_MUX is not set
+CONFIG_I2C_HELPER_AUTO=y
+
+#
+# I2C Hardware Bus support
+#
+
+#
+# I2C system bus drivers (mostly embedded / system-on-chip)
+#
+# CONFIG_I2C_DESIGNWARE is not set
+# CONFIG_I2C_GPIO is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PCA_PLATFORM is not set
+CONFIG_HAVE_S3C2410_I2C=y
+CONFIG_I2C_S3C2410=m
+# CONFIG_I2C_SIMTEC is not set
+# CONFIG_I2C_XILINX is not set
+
+#
+# External I2C/SMBus adapter drivers
+#
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_TAOS_EVM is not set
+
+#
+# Other I2C/SMBus bus drivers
+#
+# CONFIG_I2C_STUB 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_SPI is not set
+
+#
+# PPS support
+#
+# CONFIG_PPS is not set
+
+#
+# PPS generators support
+#
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+CONFIG_GPIOLIB=y
+CONFIG_GPIO_SYSFS=y
+
+#
+# Memory mapped GPIO expanders:
+#
+# CONFIG_GPIO_BASIC_MMIO is not set
+# CONFIG_GPIO_IT8761E is not set
+
+#
+# I2C GPIO expanders:
+#
+# CONFIG_GPIO_MAX7300 is not set
+# CONFIG_GPIO_MAX732X is not set
+# CONFIG_GPIO_PCF857X is not set
+# CONFIG_GPIO_SX150X is not set
+# CONFIG_GPIO_ADP5588 is not set
+
+#
+# PCI GPIO expanders:
+#
+
+#
+# SPI GPIO expanders:
+#
+
+#
+# AC97 GPIO expanders:
+#
+
+#
+# MODULbus GPIO expanders:
+#
+# CONFIG_W1 is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+# CONFIG_TEST_POWER is not set
+# CONFIG_BATTERY_DS2782 is not set
+# CONFIG_BATTERY_BQ20Z75 is not set
+# CONFIG_BATTERY_BQ27x00 is not set
+# CONFIG_BATTERY_MAX17040 is not set
+# CONFIG_BATTERY_MAX17042 is not set
+CONFIG_BATTERY_S3C_ADC=y
+# CONFIG_CHARGER_GPIO is not set
+# CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+CONFIG_WATCHDOG=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_WATCHDOG is not set
+CONFIG_S3C2410_WATCHDOG=y
+# CONFIG_MAX63XX_WATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+
+#
+# Sonics Silicon Backplane
+#
+# CONFIG_SSB is not set
+# CONFIG_MFD_SUPPORT is not set
+CONFIG_REGULATOR=y
+# CONFIG_REGULATOR_DEBUG is not set
+# CONFIG_REGULATOR_DUMMY is not set
+# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
+# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
+# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
+# CONFIG_REGULATOR_BQ24022 is not set
+# CONFIG_REGULATOR_MAX1586 is not set
+# CONFIG_REGULATOR_MAX8649 is not set
+# CONFIG_REGULATOR_MAX8660 is not set
+# CONFIG_REGULATOR_MAX8952 is not set
+# CONFIG_REGULATOR_LP3971 is not set
+# CONFIG_REGULATOR_LP3972 is not set
+# CONFIG_REGULATOR_TPS65023 is not set
+# CONFIG_REGULATOR_TPS6507X is not set
+# CONFIG_REGULATOR_ISL6271A is not set
+# CONFIG_REGULATOR_AD5398 is not set
+# CONFIG_MEDIA_SUPPORT is not set
+
+#
+# Graphics support
+#
+# CONFIG_DRM is not set
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_BOOT_VESA_SUPPORT is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
+# CONFIG_FB_SYS_FILLRECT is not set
+# CONFIG_FB_SYS_COPYAREA is not set
+# CONFIG_FB_SYS_IMAGEBLIT is not set
+# CONFIG_FB_FOREIGN_ENDIAN is not set
+# CONFIG_FB_SYS_FOPS is not set
+# CONFIG_FB_WMT_GE_ROPS is not set
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_S3C2410=y
+CONFIG_FB_S3C2410_DEBUG=y
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_METRONOME is not set
+# CONFIG_FB_MB862XX is not set
+# CONFIG_FB_BROADSHEET is not set
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_LCD_PLATFORM=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+# CONFIG_BACKLIGHT_GENERIC is not set
+CONFIG_BACKLIGHT_PWM=y
+# CONFIG_BACKLIGHT_ADP8860 is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+
+#
+# Console display driver support
+#
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+# CONFIG_LOGO is not set
+CONFIG_SOUND=m
+CONFIG_SOUND_OSS_CORE=y
+CONFIG_SOUND_OSS_CORE_PRECLAIM=y
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+CONFIG_SND_JACK=y
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+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
+# CONFIG_SND_RAWMIDI_SEQ is not set
+# CONFIG_SND_OPL3_LIB_SEQ is not set
+# CONFIG_SND_OPL4_LIB_SEQ is not set
+# CONFIG_SND_SBAWE_SEQ is not set
+# CONFIG_SND_EMU10K1_SEQ is not set
+CONFIG_SND_DRIVERS=y
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_ALOOP is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+# CONFIG_SND_ARM is not set
+CONFIG_SND_SOC=m
+# CONFIG_SND_SOC_CACHE_LZO is not set
+CONFIG_SND_SOC_SAMSUNG=m
+CONFIG_SND_S3C24XX_I2S=m
+# CONFIG_SND_SOC_SAMSUNG_LN2440SBC_ALC650 is not set
+# CONFIG_SND_SOC_SAMSUNG_S3C24XX_UDA134X is not set
+# CONFIG_SND_SOC_SAMSUNG_SIMTEC_TLV320AIC23 is not set
+# CONFIG_SND_SOC_SAMSUNG_SIMTEC_HERMES is not set
+CONFIG_SND_SOC_SAMSUNG_H1940_UDA1380=m
+CONFIG_SND_SOC_SAMSUNG_RX1950_UDA1380=m
+CONFIG_SND_SOC_I2C_AND_SPI=m
+# CONFIG_SND_SOC_ALL_CODECS is not set
+CONFIG_SND_SOC_UDA1380=m
+# CONFIG_SOUND_PRIME is not set
+# CONFIG_HID_SUPPORT is not set
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+# CONFIG_USB is not set
+# CONFIG_USB_MUSB_HDRC is not set
+
+#
+# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+# CONFIG_USB_GADGET_DEBUG_FS is not set
+CONFIG_USB_GADGET_VBUS_DRAW=100
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_FUSB300 is not set
+# CONFIG_USB_GADGET_R8A66597 is not set
+CONFIG_USB_GADGET_S3C2410=y
+CONFIG_USB_S3C2410=y
+# CONFIG_USB_S3C2410_DEBUG is not set
+# CONFIG_USB_GADGET_PXA_U2O is not set
+# CONFIG_USB_GADGET_M66592 is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+# CONFIG_USB_ZERO is not set
+# CONFIG_USB_AUDIO is not set
+CONFIG_USB_ETH=y
+# CONFIG_USB_ETH_RNDIS is not set
+# CONFIG_USB_ETH_EEM is not set
+# CONFIG_USB_G_NCM is not set
+# CONFIG_USB_GADGETFS is not set
+# CONFIG_USB_FUNCTIONFS is not set
+# CONFIG_USB_FILE_STORAGE is not set
+# CONFIG_USB_MASS_STORAGE is not set
+# CONFIG_USB_G_SERIAL is not set
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_PRINTER is not set
+# CONFIG_USB_CDC_COMPOSITE is not set
+# CONFIG_USB_G_MULTI is not set
+# CONFIG_USB_G_HID is not set
+# CONFIG_USB_G_DBGP is not set
+
+#
+# OTG and related infrastructure
+#
+# CONFIG_USB_GPIO_VBUS is not set
+# CONFIG_USB_ULPI is not set
+# CONFIG_NOP_USB_XCEIV is not set
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_UNSAFE_RESUME=y
+# CONFIG_MMC_CLKGATE is not set
+
+#
+# MMC/SD/SDIO Card Drivers
+#
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_BLOCK_MINORS=8
+CONFIG_MMC_BLOCK_BOUNCE=y
+# CONFIG_SDIO_UART is not set
+# CONFIG_MMC_TEST is not set
+
+#
+# MMC/SD/SDIO Host Controller Drivers
+#
+# CONFIG_MMC_SDHCI is not set
+CONFIG_MMC_S3C=y
+# CONFIG_MMC_S3C_HW_SDIO_IRQ is not set
+CONFIG_MMC_S3C_PIO=y
+# CONFIG_MMC_S3C_DMA is not set
+# CONFIG_MMC_S3C_PIODMA is not set
+# CONFIG_MMC_DW is not set
+# CONFIG_MEMSTICK is not set
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_S3C24XX is not set
+# CONFIG_LEDS_PCA9532 is not set
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_GPIO_PLATFORM=y
+# CONFIG_LEDS_LP3944 is not set
+# CONFIG_LEDS_LP5521 is not set
+# CONFIG_LEDS_LP5523 is not set
+# CONFIG_LEDS_PCA955X is not set
+# CONFIG_LEDS_PWM is not set
+# CONFIG_LEDS_REGULATOR is not set
+# CONFIG_LEDS_BD2802 is not set
+# CONFIG_LEDS_LT3593 is not set
+CONFIG_LEDS_TRIGGERS=y
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGER_TIMER=y
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_GPIO is not set
+# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
+
+#
+# iptables trigger is under Netfilter config (LED target)
+#
+# CONFIG_NFC_DEVICES is not set
+# CONFIG_ACCESSIBILITY is not set
+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 is not set
+CONFIG_RTC_INTF_DEV=y
+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+# CONFIG_RTC_DRV_TEST is not set
+
+#
+# I2C RTC drivers
+#
+# CONFIG_RTC_DRV_DS1307 is not set
+# CONFIG_RTC_DRV_DS1374 is not set
+# CONFIG_RTC_DRV_DS1672 is not set
+# CONFIG_RTC_DRV_DS3232 is not set
+# CONFIG_RTC_DRV_MAX6900 is not set
+# CONFIG_RTC_DRV_RS5C372 is not set
+# CONFIG_RTC_DRV_ISL1208 is not set
+# CONFIG_RTC_DRV_ISL12022 is not set
+# CONFIG_RTC_DRV_X1205 is not set
+# CONFIG_RTC_DRV_PCF8563 is not set
+# CONFIG_RTC_DRV_PCF8583 is not set
+# CONFIG_RTC_DRV_M41T80 is not set
+# CONFIG_RTC_DRV_BQ32K is not set
+# CONFIG_RTC_DRV_S35390A is not set
+# CONFIG_RTC_DRV_FM3130 is not set
+# CONFIG_RTC_DRV_RX8581 is not set
+# CONFIG_RTC_DRV_RX8025 is not set
+
+#
+# SPI RTC drivers
+#
+
+#
+# Platform RTC drivers
+#
+# CONFIG_RTC_DRV_CMOS is not set
+# CONFIG_RTC_DRV_DS1286 is not set
+# CONFIG_RTC_DRV_DS1511 is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_STK17TA8 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_M48T35 is not set
+# CONFIG_RTC_DRV_M48T59 is not set
+# CONFIG_RTC_DRV_MSM6242 is not set
+# CONFIG_RTC_DRV_BQ4802 is not set
+# CONFIG_RTC_DRV_RP5C01 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# on-CPU RTC drivers
+#
+CONFIG_RTC_DRV_S3C=y
+# CONFIG_DMADEVICES is not set
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_UIO is not set
+CONFIG_STAGING=y
+# CONFIG_STAGING_EXCLUDE_BUILD is not set
+# CONFIG_ECHO is not set
+# CONFIG_BRCM80211 is not set
+# CONFIG_COMEDI is not set
+# CONFIG_POHMELFS is not set
+# CONFIG_IIO is not set
+CONFIG_XVMALLOC=y
+CONFIG_ZRAM=m
+# CONFIG_ZRAM_DEBUG is not set
+# CONFIG_FB_SM7XX is not set
+CONFIG_MACH_NO_WESTBRIDGE=y
+# CONFIG_ATH6K_LEGACY is not set
+# CONFIG_FT1000 is not set
+
+#
+# Speakup console speech
+#
+# CONFIG_SPEAKUP is not set
+# CONFIG_TOUCHSCREEN_CLEARPAD_TM1217 is not set
+# CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4 is not set
+# CONFIG_HWSPINLOCK 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=m
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+# CONFIG_EXT3_FS_SECURITY is not set
+# CONFIG_EXT4_FS is not set
+CONFIG_JBD=m
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=m
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_BTRFS_FS is not set
+# CONFIG_NILFS2_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+CONFIG_FILE_LOCKING=y
+CONFIG_FSNOTIFY=y
+CONFIG_DNOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_FANOTIFY is not set
+# CONFIG_QUOTA is not set
+# CONFIG_QUOTACTL is not set
+# CONFIG_AUTOFS4_FS is not set
+CONFIG_FUSE_FS=m
+# CONFIG_CUSE is not set
+
+#
+# Caches
+#
+# CONFIG_FSCACHE 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 is not set
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=866
+CONFIG_FAT_DEFAULT_IOCHARSET="utf8"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+# CONFIG_CONFIGFS_FS is not set
+CONFIG_MISC_FILESYSTEMS=y
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_ECRYPT_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_JFFS2_FS is not set
+# CONFIG_LOGFS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_SQUASHFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_OMFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_PSTORE is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+CONFIG_NETWORK_FILESYSTEMS=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+CONFIG_NFS_V4=y
+# CONFIG_NFS_V4_1 is not set
+CONFIG_ROOT_NFS=y
+# CONFIG_NFS_USE_LEGACY_DNS is not set
+CONFIG_NFS_USE_KERNEL_DNS=y
+# CONFIG_NFS_USE_NEW_IDMAPPER is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+CONFIG_RPCSEC_GSS_KRB5=y
+# CONFIG_CEPH_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
+
+#
+# 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 is not set
+# 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
+# CONFIG_SYSV68_PARTITION is not set
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+# 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=y
+# 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=y
+# 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=y
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=1024
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_STRIP_ASM_SYMS is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_DEBUG_KERNEL is not set
+# CONFIG_HARDLOCKUP_DETECTOR is not set
+# CONFIG_SPARSE_RCU_POINTER is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_MEMORY_INIT=y
+# CONFIG_LKDTM is not set
+# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
+CONFIG_HAVE_DYNAMIC_FTRACE=y
+CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+CONFIG_HAVE_C_RECORDMCOUNT=y
+CONFIG_TRACING_SUPPORT=y
+# CONFIG_FTRACE is not set
+# CONFIG_DYNAMIC_DEBUG is not set
+# CONFIG_DMA_API_DEBUG is not set
+# CONFIG_ATOMIC64_SELFTEST is not set
+# CONFIG_SAMPLES is not set
+CONFIG_HAVE_ARCH_KGDB=y
+# CONFIG_STRICT_DEVMEM is not set
+CONFIG_ARM_UNWIND=y
+CONFIG_DEBUG_USER=y
+# CONFIG_OC_ETM is not set
+CONFIG_DEBUG_S3C_UART=0
+
+#
+# Security options
+#
+CONFIG_KEYS=y
+# CONFIG_KEYS_DEBUG_PROC_KEYS is not set
+# CONFIG_SECURITY_DMESG_RESTRICT is not set
+# CONFIG_SECURITY is not set
+# CONFIG_SECURITYFS is not set
+CONFIG_DEFAULT_SECURITY_DAC=y
+CONFIG_DEFAULT_SECURITY=""
+CONFIG_CRYPTO=y
+
+#
+# Crypto core or helper
+#
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_ALGAPI2=y
+CONFIG_CRYPTO_AEAD2=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_BLKCIPHER2=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_HASH2=y
+CONFIG_CRYPTO_RNG=y
+CONFIG_CRYPTO_RNG2=y
+CONFIG_CRYPTO_PCOMP2=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_MANAGER2=y
+CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
+# CONFIG_CRYPTO_GF128MUL is not set
+# CONFIG_CRYPTO_NULL is not set
+CONFIG_CRYPTO_WORKQUEUE=y
+# CONFIG_CRYPTO_CRYPTD is not set
+# CONFIG_CRYPTO_AUTHENC is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Authenticated Encryption with Associated Data
+#
+# CONFIG_CRYPTO_CCM is not set
+# CONFIG_CRYPTO_GCM is not set
+# CONFIG_CRYPTO_SEQIV is not set
+
+#
+# Block modes
+#
+CONFIG_CRYPTO_CBC=y
+# CONFIG_CRYPTO_CTR is not set
+# CONFIG_CRYPTO_CTS is not set
+CONFIG_CRYPTO_ECB=y
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_PCBC is not set
+# CONFIG_CRYPTO_XTS is not set
+
+#
+# Hash modes
+#
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_VMAC is not set
+
+#
+# Digest
+#
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_GHASH is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_MICHAEL_MIC=y
+# CONFIG_CRYPTO_RMD128 is not set
+# CONFIG_CRYPTO_RMD160 is not set
+# CONFIG_CRYPTO_RMD256 is not set
+# CONFIG_CRYPTO_RMD320 is not set
+# CONFIG_CRYPTO_SHA1 is not set
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_WP512 is not set
+
+#
+# Ciphers
+#
+CONFIG_CRYPTO_AES=y
+# CONFIG_CRYPTO_ANUBIS is not set
+CONFIG_CRYPTO_ARC4=y
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+CONFIG_CRYPTO_DES=y
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_SALSA20 is not set
+# CONFIG_CRYPTO_SEED is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+
+#
+# Compression
+#
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_ZLIB is not set
+# CONFIG_CRYPTO_LZO is not set
+
+#
+# Random Number Generation
+#
+CONFIG_CRYPTO_ANSI_CPRNG=y
+# CONFIG_CRYPTO_USER_API_HASH is not set
+# CONFIG_CRYPTO_USER_API_SKCIPHER is not set
+CONFIG_CRYPTO_HW=y
+# CONFIG_BINARY_PRINTF is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_GENERIC_FIND_LAST_BIT=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+# CONFIG_CRC_T10DIF is not set
+# CONFIG_CRC_ITU_T is not set
+CONFIG_CRC32=y
+# CONFIG_CRC7 is not set
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_LZO_COMPRESS=m
+CONFIG_LZO_DECOMPRESS=y
+CONFIG_XZ_DEC=y
+CONFIG_XZ_DEC_X86=y
+CONFIG_XZ_DEC_POWERPC=y
+CONFIG_XZ_DEC_IA64=y
+CONFIG_XZ_DEC_ARM=y
+CONFIG_XZ_DEC_ARMTHUMB=y
+CONFIG_XZ_DEC_SPARC=y
+CONFIG_XZ_DEC_BCJ=y
+# CONFIG_XZ_DEC_TEST is not set
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_DECOMPRESS_BZIP2=y
+CONFIG_DECOMPRESS_LZMA=y
+CONFIG_DECOMPRESS_XZ=y
+CONFIG_DECOMPRESS_LZO=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_DMA=y
+CONFIG_NLATTR=y
+CONFIG_GENERIC_ATOMIC64=y
+CONFIG_AVERAGE=y
diff --git a/recipes-kernel/linux/linux-2.6.39/om-gta01/defconfig b/recipes-kernel/linux/linux-2.6.39/om-gta01/defconfig
new file mode 100644
index 0000000..619104e
--- /dev/null
+++ b/recipes-kernel/linux/linux-2.6.39/om-gta01/defconfig
@@ -0,0 +1,481 @@
+CONFIG_EXPERIMENTAL=y
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_KERNEL_LZMA=y
+CONFIG_SYSVIPC=y
+CONFIG_IKCONFIG=m
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=18
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_LZO=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_EXPERT=y
+CONFIG_SLAB=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_LBDAF is not set
+# CONFIG_IOSCHED_CFQ is not set
+CONFIG_ARCH_S3C2410=y
+CONFIG_S3C_LOWLEVEL_UART_PORT=2
+CONFIG_SAMSUNG_GPIO_EXTRA=64
+CONFIG_S3C24XX_PWM=y
+CONFIG_AEABI=y
+# CONFIG_OABI_COMPAT is not set
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="unused -- bootloader passes ATAG list quiet"
+CONFIG_CPU_IDLE=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_PM_RUNTIME=y
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=m
+CONFIG_NET_KEY=m
+CONFIG_NET_KEY_MIGRATE=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_PNP=y
+CONFIG_NET_IPIP=m
+CONFIG_IP_MROUTE=y
+CONFIG_SYN_COOKIES=y
+CONFIG_INET_AH=m
+CONFIG_INET_ESP=m
+CONFIG_INET_IPCOMP=m
+CONFIG_INET_XFRM_MODE_TRANSPORT=m
+CONFIG_INET_XFRM_MODE_TUNNEL=m
+CONFIG_INET_XFRM_MODE_BEET=m
+# CONFIG_INET_LRO is not set
+CONFIG_INET_DIAG=m
+CONFIG_TCP_CONG_ADVANCED=y
+# CONFIG_TCP_CONG_BIC is not set
+# CONFIG_TCP_CONG_CUBIC is not set
+CONFIG_TCP_CONG_WESTWOOD=y
+# CONFIG_TCP_CONG_HTCP is not set
+CONFIG_TCP_MD5SIG=y
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_IPV6_TUNNEL=m
+CONFIG_NETFILTER=y
+CONFIG_NF_CONNTRACK=m
+CONFIG_NF_CT_PROTO_SCTP=m
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_H323=m
+CONFIG_NF_CONNTRACK_IRC=m
+CONFIG_NF_CONNTRACK_NETBIOS_NS=m
+CONFIG_NF_CONNTRACK_PPTP=m
+CONFIG_NF_CONNTRACK_SANE=m
+CONFIG_NF_CONNTRACK_SIP=m
+CONFIG_NF_CONNTRACK_TFTP=m
+CONFIG_NF_CT_NETLINK=m
+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
+CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
+CONFIG_NETFILTER_XT_TARGET_DSCP=m
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+CONFIG_NETFILTER_XT_TARGET_NFLOG=m
+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
+CONFIG_NETFILTER_XT_TARGET_NOTRACK=m
+CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
+CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
+CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
+CONFIG_NETFILTER_XT_MATCH_DCCP=m
+CONFIG_NETFILTER_XT_MATCH_DSCP=m
+CONFIG_NETFILTER_XT_MATCH_ESP=m
+CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
+CONFIG_NETFILTER_XT_MATCH_HELPER=m
+CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
+CONFIG_NETFILTER_XT_MATCH_POLICY=m
+CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
+CONFIG_NETFILTER_XT_MATCH_QUOTA=m
+CONFIG_NETFILTER_XT_MATCH_REALM=m
+CONFIG_NETFILTER_XT_MATCH_RECENT=m
+CONFIG_NETFILTER_XT_MATCH_SCTP=m
+CONFIG_NETFILTER_XT_MATCH_STATE=m
+CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
+CONFIG_NETFILTER_XT_MATCH_STRING=m
+CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
+CONFIG_NETFILTER_XT_MATCH_TIME=m
+CONFIG_NF_CONNTRACK_IPV4=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_NF_NAT=m
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_CLUSTERIP=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_TTL=m
+CONFIG_IP_NF_RAW=m
+CONFIG_NF_CONNTRACK_IPV6=m
+CONFIG_IP6_NF_IPTABLES=m
+CONFIG_IP6_NF_MATCH_AH=m
+CONFIG_IP6_NF_MATCH_EUI64=m
+CONFIG_IP6_NF_MATCH_FRAG=m
+CONFIG_IP6_NF_MATCH_OPTS=m
+CONFIG_IP6_NF_MATCH_HL=m
+CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+CONFIG_IP6_NF_MATCH_MH=m
+CONFIG_IP6_NF_MATCH_RT=m
+CONFIG_IP6_NF_TARGET_HL=m
+CONFIG_IP6_NF_TARGET_LOG=m
+CONFIG_IP6_NF_FILTER=m
+CONFIG_IP6_NF_TARGET_REJECT=m
+CONFIG_IP6_NF_MANGLE=m
+CONFIG_BRIDGE_NF_EBTABLES=m
+CONFIG_BRIDGE_EBT_BROUTE=m
+CONFIG_BRIDGE_EBT_T_FILTER=m
+CONFIG_BRIDGE_EBT_T_NAT=m
+CONFIG_BRIDGE_EBT_802_3=m
+CONFIG_BRIDGE_EBT_AMONG=m
+CONFIG_BRIDGE_EBT_ARP=m
+CONFIG_BRIDGE_EBT_IP=m
+CONFIG_BRIDGE_EBT_LIMIT=m
+CONFIG_BRIDGE_EBT_MARK=m
+CONFIG_BRIDGE_EBT_PKTTYPE=m
+CONFIG_BRIDGE_EBT_STP=m
+CONFIG_BRIDGE_EBT_VLAN=m
+CONFIG_BRIDGE_EBT_ARPREPLY=m
+CONFIG_BRIDGE_EBT_DNAT=m
+CONFIG_BRIDGE_EBT_MARK_T=m
+CONFIG_BRIDGE_EBT_REDIRECT=m
+CONFIG_BRIDGE_EBT_SNAT=m
+CONFIG_BRIDGE_EBT_LOG=m
+CONFIG_BRIDGE_EBT_ULOG=m
+CONFIG_BRIDGE=m
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_CBQ=m
+CONFIG_NET_SCH_HTB=m
+CONFIG_NET_SCH_HFSC=m
+CONFIG_NET_SCH_PRIO=m
+CONFIG_NET_SCH_RED=m
+CONFIG_NET_SCH_SFQ=m
+CONFIG_NET_SCH_TEQL=m
+CONFIG_NET_SCH_TBF=m
+CONFIG_NET_SCH_GRED=m
+CONFIG_NET_SCH_DSMARK=m
+CONFIG_NET_SCH_NETEM=m
+CONFIG_NET_CLS_BASIC=m
+CONFIG_NET_CLS_TCINDEX=m
+CONFIG_NET_CLS_ROUTE4=m
+CONFIG_NET_CLS_FW=m
+CONFIG_NET_CLS_U32=m
+CONFIG_CLS_U32_PERF=y
+CONFIG_CLS_U32_MARK=y
+CONFIG_NET_CLS_RSVP=m
+CONFIG_NET_CLS_RSVP6=m
+CONFIG_BT=m
+CONFIG_BT_HCIBTUSB=m
+CONFIG_RFKILL=y
+CONFIG_RFKILL_INPUT=y
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+# CONFIG_FIRMWARE_IN_KERNEL is not set
+CONFIG_CONNECTOR=m
+CONFIG_MTD=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_CFI=y
+CONFIG_MTD_CFI_INTELEXT=y
+CONFIG_MTD_ROM=y
+CONFIG_MTD_ABSENT=y
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_VERIFY_WRITE=y
+CONFIG_MTD_NAND_S3C2410=y
+CONFIG_MTD_NAND_S3C2410_HWECC=y
+CONFIG_MTD_UBI=y
+CONFIG_MTD_UBI_GLUEBI=y
+CONFIG_BLK_DEV_LOOP=m
+CONFIG_BLK_DEV_UB=m
+CONFIG_BLK_DEV_RAM=y
+CONFIG_MISC_DEVICES=y
+CONFIG_SCSI=m
+CONFIG_BLK_DEV_SD=m
+CONFIG_BLK_DEV_SR=m
+CONFIG_CHR_DEV_SG=m
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_SCSI_SCAN_ASYNC=y
+CONFIG_NETDEVICES=y
+CONFIG_TUN=m
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+CONFIG_USB_CATC=m
+CONFIG_USB_KAWETH=m
+CONFIG_USB_PEGASUS=m
+CONFIG_USB_RTL8150=m
+CONFIG_USB_USBNET=m
+# CONFIG_USB_NET_AX8817X is not set
+CONFIG_PPP=m
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPP_FILTER=y
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=480
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640
+CONFIG_INPUT_JOYDEV=m
+CONFIG_INPUT_EVDEV=y
+# CONFIG_KEYBOARD_ATKBD is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_KEYBOARD_STOWAWAY=m
+# CONFIG_INPUT_MOUSE is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_S3C2410=y
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+# CONFIG_SERIO_SERPORT is not set
+CONFIG_VT_HW_CONSOLE_BINDING=y
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_N_GSM=m
+# CONFIG_DEVKMEM is not set
+CONFIG_SERIAL_SAMSUNG=y
+CONFIG_SERIAL_SAMSUNG_CONSOLE=y
+# CONFIG_HW_RANDOM is not set
+CONFIG_I2C=y
+CONFIG_I2C_CHARDEV=y
+# CONFIG_I2C_HELPER_AUTO is not set
+CONFIG_I2C_ALGOBIT=y
+CONFIG_I2C_S3C2410=y
+CONFIG_SPI=y
+CONFIG_SPI_GPIO=y
+CONFIG_SPI_S3C24XX=y
+CONFIG_GPIO_SYSFS=y
+# CONFIG_HWMON is not set
+CONFIG_WATCHDOG=y
+CONFIG_S3C2410_WATCHDOG=y
+CONFIG_REGULATOR=y
+CONFIG_REGULATOR_FIXED_VOLTAGE=y
+CONFIG_FB=y
+CONFIG_FB_S3C2410=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_LCD_JBT6K74=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+# CONFIG_BACKLIGHT_GENERIC is not set
+CONFIG_BACKLIGHT_PWM=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_SOUND=m
+CONFIG_SND=m
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_SEQ_DUMMY=m
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_SEQUENCER_OSS=y
+# CONFIG_SND_SUPPORT_OLD_API is not set
+# CONFIG_SND_VERBOSE_PROCFS is not set
+# CONFIG_SND_DRIVERS is not set
+# CONFIG_SND_ARM is not set
+# CONFIG_SND_SPI is not set
+# CONFIG_SND_USB is not set
+CONFIG_SND_SOC=m
+CONFIG_HID_A4TECH=m
+CONFIG_HID_APPLE=m
+CONFIG_HID_BELKIN=m
+CONFIG_HID_CHERRY=m
+CONFIG_HID_CHICONY=m
+CONFIG_HID_CYPRESS=m
+CONFIG_HID_DRAGONRISE=m
+CONFIG_HID_EZKEY=m
+CONFIG_HID_KYE=m
+CONFIG_HID_GYRATION=m
+CONFIG_HID_TWINHAN=m
+CONFIG_HID_KENSINGTON=m
+CONFIG_HID_LOGITECH=m
+CONFIG_HID_MICROSOFT=m
+CONFIG_HID_MONTEREY=m
+CONFIG_HID_NTRIG=m
+CONFIG_HID_ORTEK=m
+CONFIG_HID_PANTHERLORD=m
+CONFIG_HID_PETALYNX=m
+CONFIG_HID_SAMSUNG=m
+CONFIG_HID_SONY=m
+CONFIG_HID_SUNPLUS=m
+CONFIG_HID_GREENASIA=m
+CONFIG_HID_SMARTJOYPLUS=m
+CONFIG_HID_TOPSEED=m
+CONFIG_HID_THRUSTMASTER=m
+CONFIG_HID_ZEROPLUS=m
+CONFIG_USB=m
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+# CONFIG_USB_DEVICE_CLASS is not set
+CONFIG_USB_OHCI_HCD=m
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
+CONFIG_USB_TMC=m
+CONFIG_USB_STORAGE=m
+CONFIG_USB_STORAGE_DATAFAB=m
+CONFIG_USB_STORAGE_FREECOM=m
+CONFIG_USB_STORAGE_USBAT=m
+CONFIG_USB_STORAGE_SDDR09=m
+CONFIG_USB_STORAGE_SDDR55=m
+CONFIG_USB_STORAGE_JUMPSHOT=m
+CONFIG_USB_STORAGE_ALAUDA=m
+CONFIG_USB_STORAGE_KARMA=m
+CONFIG_USB_SERIAL=m
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_AIRCABLE=m
+CONFIG_USB_SERIAL_ARK3116=m
+CONFIG_USB_SERIAL_BELKIN=m
+CONFIG_USB_SERIAL_WHITEHEAT=m
+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
+CONFIG_USB_SERIAL_CYPRESS_M8=m
+CONFIG_USB_SERIAL_EMPEG=m
+CONFIG_USB_SERIAL_FTDI_SIO=m
+CONFIG_USB_SERIAL_FUNSOFT=m
+CONFIG_USB_SERIAL_VISOR=m
+CONFIG_USB_SERIAL_IPAQ=m
+CONFIG_USB_SERIAL_IR=m
+CONFIG_USB_SERIAL_EDGEPORT=m
+CONFIG_USB_SERIAL_EDGEPORT_TI=m
+CONFIG_USB_SERIAL_GARMIN=m
+CONFIG_USB_SERIAL_IPW=m
+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
+CONFIG_USB_SERIAL_KEYSPAN=m
+CONFIG_USB_SERIAL_KLSI=m
+CONFIG_USB_SERIAL_KOBIL_SCT=m
+CONFIG_USB_SERIAL_MCT_U232=m
+CONFIG_USB_SERIAL_MOS7720=m
+CONFIG_USB_SERIAL_MOS7840=m
+CONFIG_USB_SERIAL_NAVMAN=m
+CONFIG_USB_SERIAL_PL2303=m
+CONFIG_USB_SERIAL_HP4X=m
+CONFIG_USB_SERIAL_SAFE=m
+CONFIG_USB_SERIAL_SAFE_PADDED=y
+CONFIG_USB_SERIAL_SIERRAWIRELESS=m
+CONFIG_USB_SERIAL_TI=m
+CONFIG_USB_SERIAL_CYBERJACK=m
+CONFIG_USB_SERIAL_XIRCOM=m
+CONFIG_USB_SERIAL_OPTION=m
+CONFIG_USB_SERIAL_OMNINET=m
+CONFIG_USB_TRANCEVIBRATOR=m
+CONFIG_USB_IOWARRIOR=m
+CONFIG_USB_GADGET=m
+CONFIG_USB_GADGET_VBUS_DRAW=500
+CONFIG_USB_GADGET_S3C2410=y
+CONFIG_USB_ETH=m
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+CONFIG_USB_MASS_STORAGE=m
+CONFIG_USB_G_SERIAL=m
+CONFIG_USB_CDC_COMPOSITE=m
+CONFIG_MMC=y
+CONFIG_MMC_UNSAFE_RESUME=y
+CONFIG_MMC_S3C=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_S3C24XX=y
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_PWM=y
+CONFIG_LEDS_REGULATOR=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_LEDS_TRIGGER_BACKLIGHT=y
+CONFIG_LEDS_TRIGGER_GPIO=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_DRV_S3C=y
+# CONFIG_AR6000_WLAN is not set
+CONFIG_EXT2_FS=y
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+# CONFIG_EXT3_FS_XATTR is not set
+CONFIG_REISERFS_FS=y
+CONFIG_XFS_FS=m
+CONFIG_BTRFS_FS=m
+# CONFIG_DNOTIFY is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+CONFIG_CUSE=m
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+CONFIG_UDF_FS=m
+CONFIG_VFAT_FS=m
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_CONFIGFS_FS=m
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_SUMMARY=y
+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+CONFIG_UBIFS_FS=y
+CONFIG_UBIFS_FS_XATTR=y
+CONFIG_UBIFS_FS_ADVANCED_COMPR=y
+CONFIG_SQUASHFS=m
+CONFIG_NFS_FS=m
+CONFIG_NFS_V3=y
+CONFIG_NFS_V3_ACL=y
+CONFIG_NFS_V4=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V3_ACL=y
+CONFIG_NFSD_V4=y
+CONFIG_CIFS=m
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_EFI_PARTITION=y
+CONFIG_NLS=y
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_866=m
+CONFIG_NLS_CODEPAGE_936=m
+CONFIG_NLS_CODEPAGE_950=m
+CONFIG_NLS_CODEPAGE_1250=m
+CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=m
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_UTF8=m
+CONFIG_PRINTK_TIME=y
+# CONFIG_ENABLE_WARN_DEPRECATED is not set
+# CONFIG_ENABLE_MUST_CHECK is not set
+CONFIG_STRIP_ASM_SYMS=y
+CONFIG_DEBUG_S3C_UART=2
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_TEST=m
+CONFIG_CRYPTO_LRW=m
+CONFIG_CRYPTO_PCBC=m
+CONFIG_CRYPTO_XCBC=m
+CONFIG_CRYPTO_MICHAEL_MIC=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_TGR192=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_CAMELLIA=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_FCRYPT=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_TWOFISH=m
+CONFIG_CRYPTO_ZLIB=y
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
+# CONFIG_CRYPTO_HW is not set
+CONFIG_CRC_CCITT=y
+CONFIG_CRC_T10DIF=y
+CONFIG_CRC_ITU_T=y
+CONFIG_CRC7=y
+CONFIG_LIBCRC32C=y
diff --git a/recipes-kernel/linux/linux-2.6.39/om-gta02/defconfig b/recipes-kernel/linux/linux-2.6.39/om-gta02/defconfig
new file mode 100644
index 0000000..94e3b40
--- /dev/null
+++ b/recipes-kernel/linux/linux-2.6.39/om-gta02/defconfig
@@ -0,0 +1,490 @@
+CONFIG_EXPERIMENTAL=y
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_KERNEL_LZMA=y
+CONFIG_SYSVIPC=y
+CONFIG_IKCONFIG=m
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=18
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_LZO=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_EXPERT=y
+CONFIG_SLAB=y
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_LBDAF is not set
+# CONFIG_IOSCHED_CFQ is not set
+CONFIG_ARCH_S3C2410=y
+CONFIG_S3C_LOWLEVEL_UART_PORT=2
+CONFIG_SAMSUNG_GPIO_EXTRA=64
+CONFIG_S3C24XX_PWM=y
+CONFIG_MACH_NEO1973_GTA02=y
+CONFIG_AEABI=y
+# CONFIG_OABI_COMPAT is not set
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="unused -- bootloader passes ATAG list quiet"
+CONFIG_CPU_IDLE=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_PM_RUNTIME=y
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=m
+CONFIG_NET_KEY=m
+CONFIG_NET_KEY_MIGRATE=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_PNP=y
+CONFIG_NET_IPIP=m
+CONFIG_IP_MROUTE=y
+CONFIG_SYN_COOKIES=y
+CONFIG_INET_AH=m
+CONFIG_INET_ESP=m
+CONFIG_INET_IPCOMP=m
+CONFIG_INET_XFRM_MODE_TRANSPORT=m
+CONFIG_INET_XFRM_MODE_TUNNEL=m
+CONFIG_INET_XFRM_MODE_BEET=m
+# CONFIG_INET_LRO is not set
+CONFIG_INET_DIAG=m
+CONFIG_TCP_CONG_ADVANCED=y
+# CONFIG_TCP_CONG_BIC is not set
+# CONFIG_TCP_CONG_CUBIC is not set
+CONFIG_TCP_CONG_WESTWOOD=y
+# CONFIG_TCP_CONG_HTCP is not set
+CONFIG_TCP_MD5SIG=y
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_IPV6_TUNNEL=m
+CONFIG_NETFILTER=y
+CONFIG_NF_CONNTRACK=m
+CONFIG_NF_CT_PROTO_SCTP=m
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_H323=m
+CONFIG_NF_CONNTRACK_IRC=m
+CONFIG_NF_CONNTRACK_NETBIOS_NS=m
+CONFIG_NF_CONNTRACK_PPTP=m
+CONFIG_NF_CONNTRACK_SANE=m
+CONFIG_NF_CONNTRACK_SIP=m
+CONFIG_NF_CONNTRACK_TFTP=m
+CONFIG_NF_CT_NETLINK=m
+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
+CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
+CONFIG_NETFILTER_XT_TARGET_DSCP=m
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+CONFIG_NETFILTER_XT_TARGET_NFLOG=m
+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
+CONFIG_NETFILTER_XT_TARGET_NOTRACK=m
+CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
+CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
+CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
+CONFIG_NETFILTER_XT_MATCH_DCCP=m
+CONFIG_NETFILTER_XT_MATCH_DSCP=m
+CONFIG_NETFILTER_XT_MATCH_ESP=m
+CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
+CONFIG_NETFILTER_XT_MATCH_HELPER=m
+CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
+CONFIG_NETFILTER_XT_MATCH_POLICY=m
+CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
+CONFIG_NETFILTER_XT_MATCH_QUOTA=m
+CONFIG_NETFILTER_XT_MATCH_REALM=m
+CONFIG_NETFILTER_XT_MATCH_RECENT=m
+CONFIG_NETFILTER_XT_MATCH_SCTP=m
+CONFIG_NETFILTER_XT_MATCH_STATE=m
+CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
+CONFIG_NETFILTER_XT_MATCH_STRING=m
+CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
+CONFIG_NETFILTER_XT_MATCH_TIME=m
+CONFIG_NF_CONNTRACK_IPV4=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_NF_NAT=m
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_CLUSTERIP=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_TTL=m
+CONFIG_IP_NF_RAW=m
+CONFIG_NF_CONNTRACK_IPV6=m
+CONFIG_IP6_NF_IPTABLES=m
+CONFIG_IP6_NF_MATCH_AH=m
+CONFIG_IP6_NF_MATCH_EUI64=m
+CONFIG_IP6_NF_MATCH_FRAG=m
+CONFIG_IP6_NF_MATCH_OPTS=m
+CONFIG_IP6_NF_MATCH_HL=m
+CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+CONFIG_IP6_NF_MATCH_MH=m
+CONFIG_IP6_NF_MATCH_RT=m
+CONFIG_IP6_NF_TARGET_HL=m
+CONFIG_IP6_NF_TARGET_LOG=m
+CONFIG_IP6_NF_FILTER=m
+CONFIG_IP6_NF_TARGET_REJECT=m
+CONFIG_IP6_NF_MANGLE=m
+CONFIG_BRIDGE_NF_EBTABLES=m
+CONFIG_BRIDGE_EBT_BROUTE=m
+CONFIG_BRIDGE_EBT_T_FILTER=m
+CONFIG_BRIDGE_EBT_T_NAT=m
+CONFIG_BRIDGE_EBT_802_3=m
+CONFIG_BRIDGE_EBT_AMONG=m
+CONFIG_BRIDGE_EBT_ARP=m
+CONFIG_BRIDGE_EBT_IP=m
+CONFIG_BRIDGE_EBT_LIMIT=m
+CONFIG_BRIDGE_EBT_MARK=m
+CONFIG_BRIDGE_EBT_PKTTYPE=m
+CONFIG_BRIDGE_EBT_STP=m
+CONFIG_BRIDGE_EBT_VLAN=m
+CONFIG_BRIDGE_EBT_ARPREPLY=m
+CONFIG_BRIDGE_EBT_DNAT=m
+CONFIG_BRIDGE_EBT_MARK_T=m
+CONFIG_BRIDGE_EBT_REDIRECT=m
+CONFIG_BRIDGE_EBT_SNAT=m
+CONFIG_BRIDGE_EBT_LOG=m
+CONFIG_BRIDGE_EBT_ULOG=m
+CONFIG_BRIDGE=m
+CONFIG_NET_SCHED=y
+CONFIG_NET_SCH_CBQ=m
+CONFIG_NET_SCH_HTB=m
+CONFIG_NET_SCH_HFSC=m
+CONFIG_NET_SCH_PRIO=m
+CONFIG_NET_SCH_RED=m
+CONFIG_NET_SCH_SFQ=m
+CONFIG_NET_SCH_TEQL=m
+CONFIG_NET_SCH_TBF=m
+CONFIG_NET_SCH_GRED=m
+CONFIG_NET_SCH_DSMARK=m
+CONFIG_NET_SCH_NETEM=m
+CONFIG_NET_CLS_BASIC=m
+CONFIG_NET_CLS_TCINDEX=m
+CONFIG_NET_CLS_ROUTE4=m
+CONFIG_NET_CLS_FW=m
+CONFIG_NET_CLS_U32=m
+CONFIG_CLS_U32_PERF=y
+CONFIG_CLS_U32_MARK=y
+CONFIG_NET_CLS_RSVP=m
+CONFIG_NET_CLS_RSVP6=m
+CONFIG_BT=m
+CONFIG_BT_HCIBTUSB=m
+CONFIG_RFKILL=y
+CONFIG_RFKILL_INPUT=y
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+# CONFIG_FIRMWARE_IN_KERNEL is not set
+CONFIG_CONNECTOR=m
+CONFIG_MTD=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_CFI=y
+CONFIG_MTD_CFI_INTELEXT=y
+CONFIG_MTD_ROM=y
+CONFIG_MTD_ABSENT=y
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_VERIFY_WRITE=y
+CONFIG_MTD_NAND_S3C2410=y
+CONFIG_MTD_NAND_S3C2410_HWECC=y
+CONFIG_MTD_UBI=y
+CONFIG_MTD_UBI_GLUEBI=y
+CONFIG_BLK_DEV_LOOP=m
+CONFIG_BLK_DEV_UB=m
+CONFIG_BLK_DEV_RAM=y
+CONFIG_MISC_DEVICES=y
+CONFIG_SCSI=m
+CONFIG_BLK_DEV_SD=m
+CONFIG_BLK_DEV_SR=m
+CONFIG_CHR_DEV_SG=m
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_SCSI_SCAN_ASYNC=y
+CONFIG_NETDEVICES=y
+CONFIG_TUN=m
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+CONFIG_USB_CATC=m
+CONFIG_USB_KAWETH=m
+CONFIG_USB_PEGASUS=m
+CONFIG_USB_RTL8150=m
+CONFIG_USB_USBNET=m
+# CONFIG_USB_NET_AX8817X is not set
+CONFIG_PPP=m
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPP_FILTER=y
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=480
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640
+CONFIG_INPUT_JOYDEV=m
+CONFIG_INPUT_EVDEV=y
+# CONFIG_KEYBOARD_ATKBD is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_KEYBOARD_STOWAWAY=m
+# CONFIG_INPUT_MOUSE is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_S3C2410=y
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+CONFIG_INPUT_PCF50633_PMU=y
+# CONFIG_SERIO_SERPORT is not set
+CONFIG_VT_HW_CONSOLE_BINDING=y
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_N_GSM=m
+# CONFIG_DEVKMEM is not set
+CONFIG_SERIAL_SAMSUNG=y
+CONFIG_SERIAL_SAMSUNG_CONSOLE=y
+# CONFIG_HW_RANDOM is not set
+CONFIG_I2C_CHARDEV=y
+# CONFIG_I2C_HELPER_AUTO is not set
+CONFIG_I2C_ALGOBIT=y
+CONFIG_I2C_S3C2410=y
+CONFIG_SPI=y
+CONFIG_SPI_GPIO=y
+CONFIG_SPI_S3C24XX=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_GPIO_GLAMO=y
+CONFIG_BATTERY_PLATFORM=y
+CONFIG_CHARGER_PCF50633=y
+# CONFIG_HWMON is not set
+CONFIG_WATCHDOG=y
+CONFIG_S3C2410_WATCHDOG=y
+CONFIG_PCF50633_ADC=y
+CONFIG_MFD_GLAMO=y
+CONFIG_REGULATOR=y
+CONFIG_REGULATOR_FIXED_VOLTAGE=y
+CONFIG_REGULATOR_PCF50633=y
+CONFIG_FB=y
+CONFIG_FB_S3C2410=y
+CONFIG_FB_GLAMO=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_LCD_JBT6K74=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+# CONFIG_BACKLIGHT_GENERIC is not set
+CONFIG_BACKLIGHT_PWM=y
+CONFIG_BACKLIGHT_PCF50633=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_SOUND=m
+CONFIG_SND=m
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_SEQ_DUMMY=m
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_SEQUENCER_OSS=y
+# CONFIG_SND_SUPPORT_OLD_API is not set
+# CONFIG_SND_VERBOSE_PROCFS is not set
+# CONFIG_SND_DRIVERS is not set
+# CONFIG_SND_ARM is not set
+# CONFIG_SND_SPI is not set
+# CONFIG_SND_USB is not set
+CONFIG_SND_SOC=m
+CONFIG_HID_A4TECH=m
+CONFIG_HID_APPLE=m
+CONFIG_HID_BELKIN=m
+CONFIG_HID_CHERRY=m
+CONFIG_HID_CHICONY=m
+CONFIG_HID_CYPRESS=m
+CONFIG_HID_DRAGONRISE=m
+CONFIG_HID_EZKEY=m
+CONFIG_HID_KYE=m
+CONFIG_HID_GYRATION=m
+CONFIG_HID_TWINHAN=m
+CONFIG_HID_KENSINGTON=m
+CONFIG_HID_LOGITECH=m
+CONFIG_HID_MICROSOFT=m
+CONFIG_HID_MONTEREY=m
+CONFIG_HID_NTRIG=m
+CONFIG_HID_ORTEK=m
+CONFIG_HID_PANTHERLORD=m
+CONFIG_HID_PETALYNX=m
+CONFIG_HID_SAMSUNG=m
+CONFIG_HID_SONY=m
+CONFIG_HID_SUNPLUS=m
+CONFIG_HID_GREENASIA=m
+CONFIG_HID_SMARTJOYPLUS=m
+CONFIG_HID_TOPSEED=m
+CONFIG_HID_THRUSTMASTER=m
+CONFIG_HID_ZEROPLUS=m
+CONFIG_USB=m
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+# CONFIG_USB_DEVICE_CLASS is not set
+CONFIG_USB_OHCI_HCD=m
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
+CONFIG_USB_TMC=m
+CONFIG_USB_STORAGE=m
+CONFIG_USB_STORAGE_DATAFAB=m
+CONFIG_USB_STORAGE_FREECOM=m
+CONFIG_USB_STORAGE_USBAT=m
+CONFIG_USB_STORAGE_SDDR09=m
+CONFIG_USB_STORAGE_SDDR55=m
+CONFIG_USB_STORAGE_JUMPSHOT=m
+CONFIG_USB_STORAGE_ALAUDA=m
+CONFIG_USB_STORAGE_KARMA=m
+CONFIG_USB_SERIAL=m
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_AIRCABLE=m
+CONFIG_USB_SERIAL_ARK3116=m
+CONFIG_USB_SERIAL_BELKIN=m
+CONFIG_USB_SERIAL_WHITEHEAT=m
+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
+CONFIG_USB_SERIAL_CYPRESS_M8=m
+CONFIG_USB_SERIAL_EMPEG=m
+CONFIG_USB_SERIAL_FTDI_SIO=m
+CONFIG_USB_SERIAL_FUNSOFT=m
+CONFIG_USB_SERIAL_VISOR=m
+CONFIG_USB_SERIAL_IPAQ=m
+CONFIG_USB_SERIAL_IR=m
+CONFIG_USB_SERIAL_EDGEPORT=m
+CONFIG_USB_SERIAL_EDGEPORT_TI=m
+CONFIG_USB_SERIAL_GARMIN=m
+CONFIG_USB_SERIAL_IPW=m
+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
+CONFIG_USB_SERIAL_KEYSPAN=m
+CONFIG_USB_SERIAL_KLSI=m
+CONFIG_USB_SERIAL_KOBIL_SCT=m
+CONFIG_USB_SERIAL_MCT_U232=m
+CONFIG_USB_SERIAL_MOS7720=m
+CONFIG_USB_SERIAL_MOS7840=m
+CONFIG_USB_SERIAL_NAVMAN=m
+CONFIG_USB_SERIAL_PL2303=m
+CONFIG_USB_SERIAL_HP4X=m
+CONFIG_USB_SERIAL_SAFE=m
+CONFIG_USB_SERIAL_SAFE_PADDED=y
+CONFIG_USB_SERIAL_SIERRAWIRELESS=m
+CONFIG_USB_SERIAL_TI=m
+CONFIG_USB_SERIAL_CYBERJACK=m
+CONFIG_USB_SERIAL_XIRCOM=m
+CONFIG_USB_SERIAL_OPTION=m
+CONFIG_USB_SERIAL_OMNINET=m
+CONFIG_USB_TRANCEVIBRATOR=m
+CONFIG_USB_IOWARRIOR=m
+CONFIG_USB_GADGET=m
+CONFIG_USB_GADGET_VBUS_DRAW=500
+CONFIG_USB_GADGET_S3C2410=y
+CONFIG_USB_ETH=m
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+CONFIG_USB_MASS_STORAGE=m
+CONFIG_USB_G_SERIAL=m
+CONFIG_USB_CDC_COMPOSITE=m
+CONFIG_MMC=y
+CONFIG_MMC_UNSAFE_RESUME=y
+CONFIG_MMC_S3C=y
+CONFIG_MMC_GLAMO=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_S3C24XX=y
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_PWM=y
+CONFIG_LEDS_REGULATOR=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_LEDS_TRIGGER_BACKLIGHT=y
+CONFIG_LEDS_TRIGGER_GPIO=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_DRV_PCF50633=y
+CONFIG_RTC_DRV_S3C=y
+CONFIG_EXT2_FS=y
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+# CONFIG_EXT3_FS_XATTR is not set
+CONFIG_REISERFS_FS=y
+CONFIG_XFS_FS=m
+CONFIG_BTRFS_FS=m
+# CONFIG_DNOTIFY is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+CONFIG_CUSE=m
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+CONFIG_UDF_FS=m
+CONFIG_VFAT_FS=m
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_CONFIGFS_FS=m
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_SUMMARY=y
+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+CONFIG_UBIFS_FS=y
+CONFIG_UBIFS_FS_XATTR=y
+CONFIG_UBIFS_FS_ADVANCED_COMPR=y
+CONFIG_SQUASHFS=m
+CONFIG_NFS_FS=m
+CONFIG_NFS_V3=y
+CONFIG_NFS_V3_ACL=y
+CONFIG_NFS_V4=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V3_ACL=y
+CONFIG_NFSD_V4=y
+CONFIG_CIFS=m
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_EFI_PARTITION=y
+CONFIG_NLS=y
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_866=m
+CONFIG_NLS_CODEPAGE_936=m
+CONFIG_NLS_CODEPAGE_950=m
+CONFIG_NLS_CODEPAGE_1250=m
+CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=m
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_UTF8=m
+CONFIG_PRINTK_TIME=y
+# CONFIG_ENABLE_WARN_DEPRECATED is not set
+# CONFIG_ENABLE_MUST_CHECK is not set
+CONFIG_STRIP_ASM_SYMS=y
+CONFIG_DEBUG_S3C_UART=2
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_TEST=m
+CONFIG_CRYPTO_LRW=m
+CONFIG_CRYPTO_PCBC=m
+CONFIG_CRYPTO_XCBC=m
+CONFIG_CRYPTO_MICHAEL_MIC=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_TGR192=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_CAMELLIA=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_FCRYPT=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_TWOFISH=m
+CONFIG_CRYPTO_ZLIB=y
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
+# CONFIG_CRYPTO_HW is not set
+CONFIG_CRC_CCITT=y
+CONFIG_CRC_T10DIF=y
+CONFIG_CRC_ITU_T=y
+CONFIG_LIBCRC32C=y
diff --git a/recipes-kernel/linux/linux-2.6.39/openmoko.patch b/recipes-kernel/linux/linux-2.6.39/openmoko.patch
new file mode 100644
index 0000000..5c4af4f
--- /dev/null
+++ b/recipes-kernel/linux/linux-2.6.39/openmoko.patch
@@ -0,0 +1,46285 @@
+All patches from openmoko repository
+
+http://git.openmoko.org/?p=kernel.git;a=commit;h=164905f9f5843aa94b04eef724238c77dc47af0f
+
+diff --git a/arch/arm/include/asm/fiq.h b/arch/arm/include/asm/fiq.h
+index 2242ce2..7ade2b8 100644
+--- a/arch/arm/include/asm/fiq.h
++++ b/arch/arm/include/asm/fiq.h
+@@ -29,8 +29,9 @@ struct fiq_handler {
+ extern int claim_fiq(struct fiq_handler *f);
+ extern void release_fiq(struct fiq_handler *f);
+ extern void set_fiq_handler(void *start, unsigned int length);
+-extern void set_fiq_regs(struct pt_regs *regs);
+-extern void get_fiq_regs(struct pt_regs *regs);
++extern void set_fiq_c_handler(void (*handler)(void));
++extern void __attribute__((naked)) set_fiq_regs(struct pt_regs *regs);
++extern void __attribute__((naked)) get_fiq_regs(struct pt_regs *regs);
+ extern void enable_fiq(int fiq);
+ extern void disable_fiq(int fiq);
+
+diff --git a/arch/arm/kernel/fiq.c b/arch/arm/kernel/fiq.c
+index e72dc34..0dd0fc0 100644
+--- a/arch/arm/kernel/fiq.c
++++ b/arch/arm/kernel/fiq.c
+@@ -8,6 +8,8 @@
+ *
+ * FIQ support re-written by Russell King to be more generic
+ *
++ * FIQ handler in C supoprt written by Andy Green <andy@openmoko.com>
++ *
+ * We now properly support a method by which the FIQ handlers can
+ * be stacked onto the vector. We still do not support sharing
+ * the FIQ vector itself.
+@@ -130,6 +132,83 @@ void __naked get_fiq_regs(struct pt_regs *regs)
+ : "r" (&regs->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE));
+ }
+
++/* -------- FIQ handler in C ---------
++ *
++ * Major Caveats for using this
++ * ---------------------------
++ * *
++ * * 1) it CANNOT touch any vmalloc()'d memory, only memory
++ * that was kmalloc()'d. Static allocations in the monolithic kernel
++ * are kmalloc()'d so they are okay. You can touch memory-mapped IO, but
++ * the pointer for it has to have been stored in kmalloc'd memory. The
++ * reason for this is simple: every now and then Linux turns off interrupts
++ * and reorders the paging tables. If a FIQ happens during this time, the
++ * virtual memory space can be partly or entirely disordered or missing.
++ *
++ * 2) Because vmalloc() is used when a module is inserted, THIS FIQ
++ * ISR HAS TO BE IN THE MONOLITHIC KERNEL, not a module. But the way
++ * it is set up, you can all to enable and disable it from your module
++ * and intercommunicate with it through struct fiq_ipc
++ * fiq_ipc which you can define in
++ * asm/archfiq_ipc_type.h. The reason is the same as above, a
++ * FIQ could happen while even the ISR is not present in virtual memory
++ * space due to pagetables being changed at the time.
++ *
++ * 3) You can't call any Linux API code except simple macros
++ * - understand that FIQ can come in at any time, no matter what
++ * state of undress the kernel may privately be in, thinking it
++ * locked the door by turning off interrupts... FIQ is an
++ * unstoppable monster force (which is its value)
++ * - they are not vmalloc()'d memory safe
++ * - they might do crazy stuff like sleep: FIQ pisses fire and
++ * is not interested in 'sleep' that the weak seem to need
++ * - calling APIs from FIQ can re-enter un-renterable things
++ * - summary: you cannot interoperate with linux APIs directly in the FIQ ISR
++ *
++ * If you follow these rules, it is fantastic, an extremely powerful, solid,
++ * genuine hard realtime feature.
++ */
++
++static void (*current_fiq_c_isr)(void);
++#define FIQ_C_ISR_STACK_SIZE 256
++
++static void __attribute__((naked)) __jump_to_isr(void)
++{
++ asm __volatile__ ("mov pc, r8");
++}
++
++
++static void __attribute__((naked)) __actual_isr(void)
++{
++ asm __volatile__ (
++ "stmdb sp!, {r0-r12, lr};"
++ "mov fp, sp;"
++ );
++
++ current_fiq_c_isr();
++
++ asm __volatile__ (
++ "ldmia sp!, {r0-r12, lr};"
++ "subs pc, lr, #4;"
++ );
++}
++
++void set_fiq_c_handler(void (*isr)(void))
++{
++ struct pt_regs regs;
++
++ memset(&regs, 0, sizeof(regs));
++ regs.ARM_r8 = (unsigned long) __actual_isr;
++ regs.ARM_sp = 0xffff001c + FIQ_C_ISR_STACK_SIZE;
++
++ set_fiq_handler(__jump_to_isr, 4);
++
++ current_fiq_c_isr = isr;
++
++ set_fiq_regs(&regs);
++}
++/* -------- FIQ handler in C ---------*/
++
+ int claim_fiq(struct fiq_handler *f)
+ {
+ int ret = 0;
+diff --git a/arch/arm/mach-s3c2410/include/mach/gpio.h b/arch/arm/mach-s3c2410/include/mach/gpio.h
+index f7f6b07..f9ddfa9 100644
+--- a/arch/arm/mach-s3c2410/include/mach/gpio.h
++++ b/arch/arm/mach-s3c2410/include/mach/gpio.h
+@@ -16,26 +16,20 @@
+ #define gpio_cansleep __gpio_cansleep
+ #define gpio_to_irq __gpio_to_irq
+
+-/* some boards require extra gpio capacity to support external
+- * devices that need GPIO.
+- */
++#include <mach/gpio-fns.h>
++#include <mach/gpio-nrs.h>
+
+-#ifdef CONFIG_CPU_S3C244X
+-#define ARCH_NR_GPIOS (32 * 9 + CONFIG_S3C24XX_GPIO_EXTRA)
+-#elif defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2416)
+-#define ARCH_NR_GPIOS (32 * 12 + CONFIG_S3C24XX_GPIO_EXTRA)
++#if defined(CPU_S3C2416) || defined(CPU_S3C2443)
++#define S3C_GPIO_END S3C2410_GPM(S3C2410_GPIO_M_NR)
++#elif defined(CONFIG_CPU_S3C244X)
++#define S3C_GPIO_END S3C2410_GPJ(S3C2410_GPIO_J_NR)
+ #else
+-#define ARCH_NR_GPIOS (256 + CONFIG_S3C24XX_GPIO_EXTRA)
++#define S3C_GPIO_END S3C2410_GPH(S3C2410_GPIO_H_NR)
+ #endif
+
+-#include <asm-generic/gpio.h>
+-#include <mach/gpio-nrs.h>
+-#include <mach/gpio-fns.h>
++/* some boards require extra gpio capacity to support external
++ * devices that need GPIO.
++ */
++#define ARCH_NR_GPIOS (S3C_GPIO_END + CONFIG_S3C24XX_GPIO_EXTRA)
+
+-#ifdef CONFIG_CPU_S3C244X
+-#define S3C_GPIO_END (S3C2410_GPJ(0) + 32)
+-#elif defined(CONFIG_CPU_S3C2443) || defined(CONFIG_CPU_S3C2416)
+-#define S3C_GPIO_END (S3C2410_GPM(0) + 32)
+-#else
+-#define S3C_GPIO_END (S3C2410_GPH(0) + 32)
+-#endif
++#include <asm-generic/gpio.h>
+diff --git a/arch/arm/mach-s3c2440/Kconfig b/arch/arm/mach-s3c2440/Kconfig
+index 50825a3..5122b3e 100644
+--- a/arch/arm/mach-s3c2440/Kconfig
++++ b/arch/arm/mach-s3c2440/Kconfig
+@@ -93,13 +93,16 @@ config MACH_ANUBIS
+ config MACH_NEO1973_GTA02
+ bool "Openmoko GTA02 / Freerunner phone"
+ select CPU_S3C2442
++ select S3C24XX_GPIO_EXTRA64
+ select MFD_PCF50633
+- select PCF50633_GPIO
++ select GPIO_PCF50633
+ select I2C
+ select POWER_SUPPLY
+ select MACH_NEO1973
+ select S3C2410_PWM
+ select S3C_DEV_USB_HOST
++ select SPARSE_IRQ
++ select FIQ
+ help
+ Say Y here if you are using the Openmoko GTA02 / Freerunner GSM Phone
+
+diff --git a/arch/arm/mach-s3c2440/Makefile b/arch/arm/mach-s3c2440/Makefile
+index d5440fa..035d116 100644
+--- a/arch/arm/mach-s3c2440/Makefile
++++ b/arch/arm/mach-s3c2440/Makefile
+@@ -33,8 +33,14 @@ obj-$(CONFIG_ARCH_S3C2440) += mach-smdk2440.o
+ obj-$(CONFIG_MACH_NEXCODER_2440) += mach-nexcoder.o
+ obj-$(CONFIG_MACH_AT2440EVB) += mach-at2440evb.o
+ obj-$(CONFIG_MACH_MINI2440) += mach-mini2440.o
+-obj-$(CONFIG_MACH_NEO1973_GTA02) += mach-gta02.o
+ obj-$(CONFIG_MACH_RX1950) += mach-rx1950.o
++obj-$(CONFIG_MACH_NEO1973_GTA02) += mach-gta02.o \
++ gta02-pm-bt.o \
++ gta02-pm-gps.o \
++ gta02-pm-gsm.o \
++ gta02-pm-wlan.o \
++ gta02-fiq.o \
++ gta02-hdq.o \
+
+ # extra machine support
+
+diff --git a/arch/arm/mach-s3c2440/gta02-fiq.c b/arch/arm/mach-s3c2440/gta02-fiq.c
+new file mode 100644
+index 0000000..6a9061d
+--- /dev/null
++++ b/arch/arm/mach-s3c2440/gta02-fiq.c
+@@ -0,0 +1,133 @@
++#include <linux/kernel.h>
++
++#include <asm/fiq.h>
++#include <mach/regs-irq.h>
++#include <plat/regs-timer.h>
++#include <mach/irqs.h>
++#include <linux/io.h>
++#include <linux/pwm.h>
++#include <linux/err.h>
++#include <mach/gta02-hdq.h>
++
++/*
++ * GTA02 FIQ related
++ *
++ * Calls into vibrator and hdq and based on the return values
++ * determines if we the FIQ source be kept alive
++ */
++
++#define DIVISOR_FROM_US(x) ((x) << 3)
++
++#define FIQ_DIVISOR_HDQ DIVISOR_FROM_US(HDQ_SAMPLE_PERIOD_US)
++extern int hdq_fiq_handler(void);
++
++/* Global data related to our fiq source */
++static uint32_t gta02_fiq_ack_mask;
++static const int gta02_gta02_fiq_timer_id = 2;
++
++struct pwm_device *gta02_fiq_timer;
++
++void gta02_fiq_handler(void)
++{
++ unsigned long intmask;
++ int keep_running = 0;
++ /* disable further timer interrupts if nobody has any work
++ * or adjust rate according to who still has work
++ *
++ * CAUTION: it means forground code must disable FIQ around
++ * its own non-atomic S3C2410_INTMSK changes... not common
++ * thankfully and taken care of by the fiq-basis patch
++ */
++
++ keep_running = hdq_fiq_handler();
++ if (!keep_running) {
++ /* Disable irq */
++ intmask = __raw_readl(S3C2410_INTMSK);
++ intmask |= (gta02_fiq_ack_mask);
++ __raw_writel(intmask, S3C2410_INTMSK);
++ }
++
++ __raw_writel(gta02_fiq_ack_mask, S3C2410_SRCPND);
++}
++
++void gta02_fiq_kick(void)
++{
++ unsigned long flags;
++ unsigned long intmask;
++ /* we have to take care about FIQ because this modification is
++ * non-atomic, FIQ could come in after the read and before the
++ * writeback and its changes to the register would be lost
++ * (platform INTMSK mod code is taken care of already)
++ */
++ local_save_flags(flags);
++ local_fiq_disable();
++
++ /* allow FIQs to resume */
++ intmask = __raw_readl(S3C2410_INTMSK);
++ intmask &= ~(gta02_fiq_ack_mask);
++ __raw_writel(intmask, S3C2410_INTMSK);
++
++ local_irq_restore(flags);
++
++}
++
++int gta02_fiq_enable(void)
++{
++ int ret = 0;
++
++ local_fiq_disable();
++
++ gta02_fiq_timer = pwm_request(gta02_gta02_fiq_timer_id, "fiq timer");
++
++ if (IS_ERR(gta02_fiq_timer)) {
++ ret = PTR_ERR(gta02_fiq_timer);
++ printk(KERN_ERR "GTA02 FIQ: Could not request fiq timer: %d\n",
++ ret);
++ return ret;
++ }
++
++ gta02_fiq_ack_mask = 1 << (IRQ_TIMER0 + gta02_gta02_fiq_timer_id
++ - S3C2410_CPUIRQ_OFFSET);
++
++
++ ret = pwm_config(gta02_fiq_timer, HDQ_SAMPLE_PERIOD_US * 1000,
++ HDQ_SAMPLE_PERIOD_US * 1000);
++ if (ret) {
++ printk(KERN_ERR "GTA02 FIQ: Could not configure fiq timer: %d\n",
++ ret);
++ goto err;
++ }
++
++ set_fiq_c_handler(gta02_fiq_handler);
++
++ __raw_writel(gta02_fiq_ack_mask, S3C2410_INTMOD);
++
++ pwm_enable(gta02_fiq_timer);
++
++ local_fiq_enable();
++
++ return 0;
++
++err:
++ pwm_free(gta02_fiq_timer);
++
++ return ret;
++}
++
++void gta02_fiq_disable(void)
++{
++ local_fiq_disable();
++
++ if (!gta02_fiq_timer)
++ return;
++
++ __raw_writel(0, S3C2410_INTMOD);
++ set_fiq_c_handler(NULL);
++
++ pwm_disable(gta02_fiq_timer);
++
++ pwm_free(gta02_fiq_timer);
++
++ gta02_fiq_timer = NULL;
++}
++/* -------------------- /GTA02 FIQ Handler ------------------------------------- */
+diff --git a/arch/arm/mach-s3c2440/gta02-hdq.c b/arch/arm/mach-s3c2440/gta02-hdq.c
+new file mode 100644
+index 0000000..a1dadc2
+--- /dev/null
++++ b/arch/arm/mach-s3c2440/gta02-hdq.c
+@@ -0,0 +1,414 @@
++/*
++ * HDQ generic GPIO bitbang driver using FIQ
++ *
++ * (C) 2006-2007 by Openmoko, Inc.
++ * Author: Andy Green <andy@openmoko.com>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++#include <linux/platform_device.h>
++#include <mach/gta02-hdq.h>
++
++#define HDQ_READ 0
++
++enum hdq_bitbang_states {
++ HDQB_IDLE = 0,
++ HDQB_TX_BREAK,
++ HDQB_TX_BREAK_RECOVERY,
++ HDQB_ADS_CALC,
++ HDQB_ADS_LOW,
++ HDQB_ADS_HIGH,
++ HDQB_WAIT_RX,
++ HDQB_DATA_RX_LOW,
++ HDQB_DATA_RX_HIGH,
++ HDQB_WAIT_TX,
++};
++
++static struct hdq_priv {
++ struct mutex lock; /* if you want to use hdq, you have to take lock */
++ u8 hdq_probed; /* nonzero after HDQ driver probed */
++ u8 hdq_ads; /* b7..b6 = register address, b0 = r/w */
++ u8 hdq_tx_data; /* data to tx for write action */
++ u8 hdq_rx_data; /* data received in read action */
++ u8 hdq_request_ctr; /* incremented by "user" to request a transfer */
++ u8 hdq_transaction_ctr; /* incremented after each transfer */
++ u8 hdq_error; /* 0 = no error */
++ u8 hdq_ctr;
++ u8 hdq_ctr2;
++ u8 hdq_bit;
++ u8 hdq_shifter;
++ u8 hdq_tx_data_done;
++ enum hdq_bitbang_states hdq_state;
++ int reported_error;
++
++ struct hdq_platform_data *pdata;
++} hdq_priv;
++
++
++static void hdq_bad(void)
++{
++ if (!hdq_priv.reported_error)
++ printk(KERN_ERR "HDQ error: %d\n", hdq_priv.hdq_error);
++ hdq_priv.reported_error = 1;
++}
++
++static void hdq_good(void)
++{
++ if (hdq_priv.reported_error)
++ printk(KERN_INFO "HDQ responds again\n");
++ hdq_priv.reported_error = 0;
++}
++
++int hdq_fiq_handler(void)
++{
++ if (!hdq_priv.hdq_probed)
++ return 0;
++
++ switch (hdq_priv.hdq_state) {
++ case HDQB_IDLE:
++ if (hdq_priv.hdq_request_ctr == hdq_priv.hdq_transaction_ctr)
++ break;
++ hdq_priv.hdq_ctr = 250 / HDQ_SAMPLE_PERIOD_US;
++ hdq_priv.pdata->gpio_set(0);
++ hdq_priv.pdata->gpio_dir_out();
++ hdq_priv.hdq_tx_data_done = 0;
++ hdq_priv.hdq_state = HDQB_TX_BREAK;
++ break;
++
++ case HDQB_TX_BREAK: /* issue low for > 190us */
++ if (--hdq_priv.hdq_ctr == 0) {
++ hdq_priv.hdq_ctr = 60 / HDQ_SAMPLE_PERIOD_US;
++ hdq_priv.hdq_state = HDQB_TX_BREAK_RECOVERY;
++ hdq_priv.pdata->gpio_set(1);
++ }
++ break;
++
++ case HDQB_TX_BREAK_RECOVERY: /* issue low for > 40us */
++ if (--hdq_priv.hdq_ctr)
++ break;
++ hdq_priv.hdq_shifter = hdq_priv.hdq_ads;
++ hdq_priv.hdq_bit = 8; /* 8 bits of ads / rw */
++ hdq_priv.hdq_tx_data_done = 0; /* doing ads */
++ /* fallthru on last one */
++ case HDQB_ADS_CALC:
++ if (hdq_priv.hdq_shifter & 1)
++ hdq_priv.hdq_ctr = 50 / HDQ_SAMPLE_PERIOD_US;
++ else
++ hdq_priv.hdq_ctr = 120 / HDQ_SAMPLE_PERIOD_US;
++ /* carefully precompute the other phase length */
++ hdq_priv.hdq_ctr2 = (210 - (hdq_priv.hdq_ctr *
++ HDQ_SAMPLE_PERIOD_US)) / HDQ_SAMPLE_PERIOD_US;
++ hdq_priv.hdq_state = HDQB_ADS_LOW;
++ hdq_priv.hdq_shifter >>= 1;
++ hdq_priv.hdq_bit--;
++ hdq_priv.pdata->gpio_set(0);
++ break;
++
++ case HDQB_ADS_LOW:
++ if (--hdq_priv.hdq_ctr)
++ break;
++ hdq_priv.pdata->gpio_set(1);
++ hdq_priv.hdq_state = HDQB_ADS_HIGH;
++ break;
++
++ case HDQB_ADS_HIGH:
++ if (--hdq_priv.hdq_ctr2 > 1) /* account for HDQB_ADS_CALC */
++ break;
++ if (hdq_priv.hdq_bit) { /* more bits to do */
++ hdq_priv.hdq_state = HDQB_ADS_CALC;
++ break;
++ }
++ /* no more bits, wait until hdq_priv.hdq_ctr2 exhausted */
++ if (hdq_priv.hdq_ctr2)
++ break;
++ /* ok no more bits and very last state */
++ hdq_priv.hdq_ctr = 60 / HDQ_SAMPLE_PERIOD_US;
++ /* FIXME 0 = read */
++ if (hdq_priv.hdq_ads & 0x80) { /* write the byte out */
++ /* set delay before payload */
++ hdq_priv.hdq_ctr = 300 / HDQ_SAMPLE_PERIOD_US;
++ /* already high, no need to write */
++ hdq_priv.hdq_state = HDQB_WAIT_TX;
++ break;
++ }
++ /* read the next byte */
++ hdq_priv.hdq_bit = 8; /* 8 bits of data */
++ hdq_priv.hdq_ctr = 2500 / HDQ_SAMPLE_PERIOD_US;
++ hdq_priv.hdq_state = HDQB_WAIT_RX;
++ hdq_priv.pdata->gpio_dir_in();
++ break;
++
++ case HDQB_WAIT_TX: /* issue low for > 40us */
++ if (--hdq_priv.hdq_ctr)
++ break;
++ if (!hdq_priv.hdq_tx_data_done) { /* was that the data sent? */
++ hdq_priv.hdq_tx_data_done++;
++ hdq_priv.hdq_shifter = hdq_priv.hdq_tx_data;
++ hdq_priv.hdq_bit = 8; /* 8 bits of data */
++ hdq_priv.hdq_state = HDQB_ADS_CALC; /* start sending */
++ break;
++ }
++ hdq_priv.hdq_error = 0;
++ hdq_priv.hdq_transaction_ctr = hdq_priv.hdq_request_ctr;
++ hdq_priv.hdq_state = HDQB_IDLE; /* all tx is done */
++ /* idle in input mode, it's pulled up by 10K */
++ hdq_priv.pdata->gpio_dir_in();
++ break;
++
++ case HDQB_WAIT_RX: /* wait for battery to talk to us */
++ if (hdq_priv.pdata->gpio_get() == 0) {
++ /* it talks to us! */
++ hdq_priv.hdq_ctr2 = 1;
++ hdq_priv.hdq_bit = 8; /* 8 bits of data */
++ /* timeout */
++ hdq_priv.hdq_ctr = 500 / HDQ_SAMPLE_PERIOD_US;
++ hdq_priv.hdq_state = HDQB_DATA_RX_LOW;
++ break;
++ }
++ if (--hdq_priv.hdq_ctr == 0) { /* timed out, error */
++ hdq_priv.hdq_error = 1;
++ hdq_priv.hdq_transaction_ctr = hdq_priv.hdq_request_ctr;
++ hdq_priv.hdq_state = HDQB_IDLE; /* abort */
++ }
++ break;
++
++ /*
++ * HDQ basically works by measuring the low time of the bit cell
++ * 32-50us --> '1', 80 - 145us --> '0'
++ */
++
++ case HDQB_DATA_RX_LOW:
++ if (hdq_priv.pdata->gpio_get()) {
++ hdq_priv.hdq_rx_data >>= 1;
++ if (hdq_priv.hdq_ctr2 <= (65 / HDQ_SAMPLE_PERIOD_US))
++ hdq_priv.hdq_rx_data |= 0x80;
++
++ if (--hdq_priv.hdq_bit == 0) {
++ hdq_priv.hdq_error = 0;
++ hdq_priv.hdq_transaction_ctr =
++ hdq_priv.hdq_request_ctr;
++
++ hdq_priv.hdq_state = HDQB_IDLE;
++ } else
++ hdq_priv.hdq_state = HDQB_DATA_RX_HIGH;
++ /* timeout */
++ hdq_priv.hdq_ctr = 1000 / HDQ_SAMPLE_PERIOD_US;
++ hdq_priv.hdq_ctr2 = 1;
++ break;
++ }
++ hdq_priv.hdq_ctr2++;
++ if (--hdq_priv.hdq_ctr)
++ break;
++ /* timed out, error */
++ hdq_priv.hdq_error = 2;
++ hdq_priv.hdq_transaction_ctr = hdq_priv.hdq_request_ctr;
++ hdq_priv.hdq_state = HDQB_IDLE; /* abort */
++ break;
++
++ case HDQB_DATA_RX_HIGH:
++ if (!hdq_priv.pdata->gpio_get()) {
++ /* it talks to us! */
++ hdq_priv.hdq_ctr2 = 1;
++ /* timeout */
++ hdq_priv.hdq_ctr = 400 / HDQ_SAMPLE_PERIOD_US;
++ hdq_priv.hdq_state = HDQB_DATA_RX_LOW;
++ break;
++ }
++ if (--hdq_priv.hdq_ctr)
++ break;
++ /* timed out, error */
++ hdq_priv.hdq_error = 3;
++ hdq_priv.hdq_transaction_ctr = hdq_priv.hdq_request_ctr;
++
++ /* we're in input mode already */
++ hdq_priv.hdq_state = HDQB_IDLE; /* abort */
++ break;
++ }
++
++ /* Are we interested in keeping the FIQ source alive ? */
++ if (hdq_priv.hdq_state != HDQB_IDLE)
++ return 1;
++ else
++ return 0;
++}
++
++static int fiq_busy(void)
++{
++ int request;
++ int transact;
++
++ request = (volatile u8)hdq_priv.hdq_request_ctr;
++ transact = (volatile u8)hdq_priv.hdq_transaction_ctr;
++ return (request != transact);
++}
++
++int hdq_read(struct device *dev, unsigned int address)
++{
++ int count_sleeps = 5;
++ int ret = -ETIME;
++
++ if (!hdq_priv.hdq_probed)
++ return -EINVAL;
++
++ mutex_lock(&hdq_priv.lock);
++
++ hdq_priv.hdq_error = 0;
++ hdq_priv.hdq_ads = address | HDQ_READ;
++ hdq_priv.hdq_request_ctr++;
++ hdq_priv.pdata->kick_fiq();
++ /*
++ * FIQ takes care of it while we block our calling process
++ * But we're not spinning -- other processes run normally while
++ * we wait for the result
++ */
++ while (count_sleeps--) {
++ msleep(10); /* valid transaction always completes in < 10ms */
++
++ if (fiq_busy())
++ continue;
++
++ if (hdq_priv.hdq_error) {
++ hdq_bad();
++ goto done; /* didn't see a response in good time */
++ }
++ hdq_good();
++
++ ret = hdq_priv.hdq_rx_data;
++ goto done;
++ }
++
++done:
++ mutex_unlock(&hdq_priv.lock);
++ return ret;
++}
++EXPORT_SYMBOL_GPL(hdq_read);
++
++/* sysfs */
++
++static ssize_t hdq_sysfs_dump(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ int n;
++ int v;
++ u8 u8a[128]; /* whole address space for HDQ */
++ char *end = buf;
++
++ if (!hdq_priv.hdq_probed)
++ return -EINVAL;
++
++ /* the dump does not take care about 16 bit regs, because at this
++ * bus level we don't know about the chip details
++ */
++ for (n = 0; n < sizeof(u8a); n++) {
++ v = hdq_read(NULL, n);
++ if (v < 0)
++ goto bail;
++ u8a[n] = v;
++ }
++
++ for (n = 0; n < sizeof(u8a); n += 16) {
++ hex_dump_to_buffer(u8a + n, sizeof(u8a), 16, 1, end, 4096, 0);
++ end += strlen(end);
++ *end++ = '\n';
++ *end = '\0';
++ }
++ return end - buf;
++
++bail:
++ return sprintf(buf, "ERROR %d\n", v);
++}
++
++
++static DEVICE_ATTR(dump, 0400, hdq_sysfs_dump, NULL);
++
++#ifdef CONFIG_PM
++static int hdq_suspend(struct platform_device *pdev, pm_message_t state)
++{
++ /* after 18s of this, the battery monitor will also go to sleep */
++ hdq_priv.pdata->gpio_dir_in();
++ hdq_priv.pdata->disable_fiq();
++ return 0;
++}
++
++static int hdq_resume(struct platform_device *pdev)
++{
++ hdq_priv.pdata->gpio_set(1);
++ hdq_priv.pdata->gpio_dir_out();
++ hdq_priv.pdata->enable_fiq();
++ return 0;
++}
++#endif
++
++static int __devinit hdq_probe(struct platform_device *pdev)
++{
++ struct hdq_platform_data *pdata = pdev->dev.platform_data;
++ int ret;
++
++ if (!pdata)
++ return -ENXIO;
++
++ mutex_init(&hdq_priv.lock);
++
++ /* set our HDQ comms pin from the platform data */
++ hdq_priv.pdata = pdata;
++
++ hdq_priv.pdata->gpio_set(1);
++ hdq_priv.pdata->gpio_dir_out();
++
++ /* Initialize FIQ */
++ if (hdq_priv.pdata->enable_fiq() < 0) {
++ dev_err(&pdev->dev, "Could not enable FIQ source\n");
++ return -EINVAL;
++ }
++
++ ret = device_create_file(&pdev->dev, &dev_attr_dump);
++ if (ret)
++ return ret;
++
++ hdq_priv.hdq_probed = 1; /* we are ready to do stuff now */
++
++ hdq_priv.pdata = pdata;
++
++ return 0;
++}
++
++static int __devexit hdq_remove(struct platform_device *pdev)
++{
++ device_remove_file(&pdev->dev, &dev_attr_dump);
++ return 0;
++}
++
++static struct platform_driver hdq_driver = {
++ .probe = hdq_probe,
++ .remove = hdq_remove,
++#ifdef CONFIG_PM
++ .suspend = hdq_suspend,
++ .resume = hdq_resume,
++#endif
++ .driver = {
++ .name = "hdq",
++ },
++};
++
++static int __init hdq_init(void)
++{
++ return platform_driver_register(&hdq_driver);
++}
++module_init(hdq_init);
++
++static void __exit hdq_exit(void)
++{
++ platform_driver_unregister(&hdq_driver);
++}
++module_exit(hdq_exit);
++
++MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
++MODULE_DESCRIPTION("HDQ driver");
+diff --git a/arch/arm/mach-s3c2440/gta02-pm-bt.c b/arch/arm/mach-s3c2440/gta02-pm-bt.c
+new file mode 100644
+index 0000000..28aaa3c
+--- /dev/null
++++ b/arch/arm/mach-s3c2440/gta02-pm-bt.c
+@@ -0,0 +1,264 @@
++/*
++ * Bluetooth PM code for the Openmoko Freerunner GSM Phone
++ *
++ * (C) 2007 by Openmoko Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation
++ *
++ */
++
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/platform_device.h>
++#include <linux/rfkill.h>
++#include <linux/slab.h>
++#include <linux/gpio.h>
++
++#include <linux/err.h>
++
++#include <mach/gpio-fns.h>
++
++#include <mach/hardware.h>
++#include <asm/mach-types.h>
++
++#include <mach/gta02.h>
++
++#include <linux/regulator/consumer.h>
++
++#define DRVMSG "Openmoko Freerunner Bluetooth Power Management"
++
++struct gta02_pm_bt_data {
++ struct regulator *regulator;
++ struct rfkill *rfkill;
++ int pre_resume_state;
++};
++
++static ssize_t bt_read(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ int ret = 0;
++ if (!strcmp(attr->attr.name, "power_on")) {
++ if (gpio_get_value(GTA02_GPIO_BT_EN))
++ ret = 1;
++ } else if (!strcmp(attr->attr.name, "reset")) {
++ if (gpio_get_value(GTA02_GPIO_BT_EN) == 0)
++ ret = 1;
++ }
++
++ if (!ret)
++ return strlcpy(buf, "0\n", 3);
++ else
++ return strlcpy(buf, "1\n", 3);
++}
++
++static void __gta02_pm_bt_toggle_radio(struct device *dev, unsigned int on)
++{
++ struct gta02_pm_bt_data *bt_data = dev_get_drvdata(dev);
++
++ dev_info(dev, "__gta02_pm_bt_toggle_radio %d\n", on);
++
++ bt_data = dev_get_drvdata(dev);
++
++ gpio_set_value(GTA02_GPIO_BT_EN, !on);
++
++ if (on) {
++ if (!regulator_is_enabled(bt_data->regulator))
++ regulator_enable(bt_data->regulator);
++ } else {
++ if (regulator_is_enabled(bt_data->regulator))
++ regulator_disable(bt_data->regulator);
++ }
++
++ gpio_set_value(GTA02_GPIO_BT_EN, on);
++}
++
++
++static int bt_rfkill_set_block(void *data, bool blocked)
++{
++ struct device *dev = data;
++
++ __gta02_pm_bt_toggle_radio(dev, !blocked);
++
++ return 0;
++}
++
++static const struct rfkill_ops gta02_bt_rfkill_ops = {
++ .set_block = bt_rfkill_set_block,
++};
++
++
++static ssize_t bt_write(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ int ret;
++ unsigned long on;
++ struct gta02_pm_bt_data *bt_data = dev_get_drvdata(dev);
++
++ ret = strict_strtoul(buf, 10, &on);
++ if (ret)
++ return ret;
++
++ if (!strcmp(attr->attr.name, "power_on")) {
++ rfkill_set_sw_state(bt_data->rfkill, on ? 1 : 0);
++
++ __gta02_pm_bt_toggle_radio(dev, on);
++ } else if (!strcmp(attr->attr.name, "reset")) {
++ /* reset is low-active, so we need to invert */
++ gpio_set_value(GTA02_GPIO_BT_EN, on ? 0 : 1);
++ }
++
++ return count;
++}
++
++static DEVICE_ATTR(power_on, 0644, bt_read, bt_write);
++static DEVICE_ATTR(reset, 0644, bt_read, bt_write);
++
++#ifdef CONFIG_PM
++static int gta02_bt_suspend(struct platform_device *pdev, pm_message_t state)
++{
++ struct gta02_pm_bt_data *bt_data = dev_get_drvdata(&pdev->dev);
++
++ dev_dbg(&pdev->dev, DRVMSG ": suspending\n");
++
++ bt_data->pre_resume_state = gpio_get_value(GTA02_GPIO_BT_EN);
++ __gta02_pm_bt_toggle_radio(&pdev->dev, 0);
++
++ return 0;
++}
++
++static int gta02_bt_resume(struct platform_device *pdev)
++{
++ struct gta02_pm_bt_data *bt_data = dev_get_drvdata(&pdev->dev);
++ dev_dbg(&pdev->dev, DRVMSG ": resuming\n");
++
++ __gta02_pm_bt_toggle_radio(&pdev->dev, bt_data->pre_resume_state);
++ return 0;
++}
++#else
++#define gta02_bt_suspend NULL
++#define gta02_bt_resume NULL
++#endif
++
++static struct attribute *gta02_bt_sysfs_entries[] = {
++ &dev_attr_power_on.attr,
++ &dev_attr_reset.attr,
++ NULL
++};
++
++static struct attribute_group gta02_bt_attr_group = {
++ .name = NULL,
++ .attrs = gta02_bt_sysfs_entries,
++};
++
++static int __devinit gta02_bt_probe(struct platform_device *pdev)
++{
++ struct rfkill *rfkill;
++ struct regulator *regulator;
++ struct gta02_pm_bt_data *bt_data;
++ int ret;
++
++ dev_info(&pdev->dev, DRVMSG ": starting\n");
++
++ bt_data = kzalloc(sizeof(*bt_data), GFP_KERNEL);
++ dev_set_drvdata(&pdev->dev, bt_data);
++
++ regulator = regulator_get(&pdev->dev, "BT_3V2");
++ if (IS_ERR(regulator))
++ return -ENODEV;
++
++ bt_data->regulator = regulator;
++
++ /* this tests the true physical state of the regulator... */
++ if (regulator_is_enabled(regulator)) {
++ /*
++ * but these only operate on the logical state of the
++ * regulator... so we need to logicaly "adopt" it on
++ * to turn it off
++ */
++ regulator_enable(regulator);
++ regulator_disable(regulator);
++ }
++
++ /* we pull reset to low to make sure that the chip doesn't
++ * drain power through the reset line */
++ gpio_request(GTA02_GPIO_BT_EN, "Bluetooth enable");
++ gpio_direction_output(GTA02_GPIO_BT_EN, 0);
++
++ rfkill = rfkill_alloc(pdev->name, &pdev->dev, RFKILL_TYPE_BLUETOOTH,
++ &gta02_bt_rfkill_ops, &pdev->dev);
++
++ if (!rfkill) {
++ dev_err(&pdev->dev, "Failed to allocate rfkill\n");
++ return -ENOMEM;
++ }
++
++ rfkill_init_sw_state(rfkill, 0);
++
++ ret = rfkill_register(rfkill);
++ if (ret) {
++ rfkill_destroy(rfkill);
++ dev_err(&pdev->dev, "Failed to register rfkill\n");
++ return ret;
++ }
++
++ bt_data->rfkill = rfkill;
++
++ return sysfs_create_group(&pdev->dev.kobj, &gta02_bt_attr_group);
++}
++
++static int __devexit gta02_bt_remove(struct platform_device *pdev)
++{
++ struct gta02_pm_bt_data *bt_data = dev_get_drvdata(&pdev->dev);
++ struct regulator *regulator;
++
++ sysfs_remove_group(&pdev->dev.kobj, &gta02_bt_attr_group);
++
++ if (bt_data->rfkill)
++ rfkill_destroy(bt_data->rfkill);
++
++ if (!bt_data || !bt_data->regulator)
++ return 0;
++
++ regulator = bt_data->regulator;
++
++ /* Make sure regulator is disabled before calling regulator_put */
++ if (regulator_is_enabled(regulator))
++ regulator_disable(regulator);
++
++ regulator_put(regulator);
++
++ kfree(bt_data);
++
++ return 0;
++}
++
++static struct platform_driver gta02_bt_driver = {
++ .probe = gta02_bt_probe,
++ .remove = __devexit_p(gta02_bt_remove),
++ .suspend = gta02_bt_suspend,
++ .resume = gta02_bt_resume,
++ .driver = {
++ .name = "gta02-pm-bt",
++ },
++};
++
++static int __init gta02_bt_init(void)
++{
++ return platform_driver_register(&gta02_bt_driver);
++}
++module_init(gta02_bt_init);
++
++static void __exit gta02_bt_exit(void)
++{
++ platform_driver_unregister(&gta02_bt_driver);
++}
++module_exit(gta02_bt_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
++MODULE_DESCRIPTION(DRVMSG);
+diff --git a/arch/arm/mach-s3c2440/gta02-pm-gps.c b/arch/arm/mach-s3c2440/gta02-pm-gps.c
+new file mode 100644
+index 0000000..4ca3ac6
+--- /dev/null
++++ b/arch/arm/mach-s3c2440/gta02-pm-gps.c
+@@ -0,0 +1,229 @@
++/*
++ * GPS Power Management code for the Openmoko Freerunner GSM Phone
++ *
++ * (C) 2007-2009 by Openmoko Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/platform_device.h>
++
++#include <mach/hardware.h>
++#include <mach/gpio-fns.h>
++#include <linux/gpio.h>
++
++#include <mach/gta02.h>
++
++#include <linux/regulator/consumer.h>
++#include <linux/err.h>
++
++struct gta02_pm_gps_data {
++#ifdef CONFIG_PM
++ int keep_on_in_suspend;
++#endif
++ int power_was_on;
++ struct regulator *regulator;
++};
++
++static struct gta02_pm_gps_data gta02_gps;
++
++int gta02_pm_gps_is_on(void)
++{
++ return gta02_gps.power_was_on;
++}
++EXPORT_SYMBOL_GPL(gta02_pm_gps_is_on);
++
++/* This is the POWERON pin */
++static void gps_pwron_set(int on)
++{
++ if (on) {
++ /* return UART pins to being UART pins */
++ s3c_gpio_cfgpin(S3C2410_GPH(4), S3C2410_GPH4_TXD1);
++ /* remove pulldown now it won't be floating any more */
++ s3c_gpio_setpull(S3C2410_GPH(5), S3C_GPIO_PULL_NONE);
++
++ if (!gta02_gps.power_was_on)
++ regulator_enable(gta02_gps.regulator);
++ } else {
++ /*
++ * take care not to power unpowered GPS from UART TX
++ * return them to GPIO and force low
++ */
++ s3c_gpio_cfgpin(S3C2410_GPH(4), S3C2410_GPIO_OUTPUT);
++ gpio_set_value(S3C2410_GPH(4), 0);
++ /* don't let RX from unpowered GPS float */
++ s3c_gpio_setpull(S3C2410_GPH(5), S3C_GPIO_PULL_DOWN);
++ if (gta02_gps.power_was_on)
++ regulator_disable(gta02_gps.regulator);
++ }
++}
++
++static int gps_pwron_get(void)
++{
++ return regulator_is_enabled(gta02_gps.regulator);
++}
++
++#ifdef CONFIG_PM
++/* This is the flag for keeping gps ON during suspend */
++static void gps_keep_on_in_suspend_set(int on)
++{
++ gta02_gps.keep_on_in_suspend = on;
++}
++
++static int gps_keep_on_in_suspend_get(void)
++{
++ return gta02_gps.keep_on_in_suspend;
++}
++#endif
++
++static ssize_t power_gps_read(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ int ret = 0;
++
++ if (!strcmp(attr->attr.name, "power_on"))
++ ret = gps_pwron_get();
++#ifdef CONFIG_PM
++ else if (!strcmp(attr->attr.name, "keep_on_in_suspend"))
++ ret = gps_keep_on_in_suspend_get();
++#endif
++ if (ret)
++ return strlcpy(buf, "1\n", 3);
++ else
++ return strlcpy(buf, "0\n", 3);
++}
++
++static ssize_t power_gps_write(struct device *dev,
++ struct device_attribute *attr, const char *buf,
++ size_t count)
++{
++ int ret;
++ unsigned long on;
++
++ ret = strict_strtoul(buf, 10, &on);
++ if (ret)
++ return ret;
++
++ if (!strcmp(attr->attr.name, "power_on")) {
++ gps_pwron_set(on);
++ gta02_gps.power_was_on = !!on;
++#ifdef CONFIG_PM
++ } else if (!strcmp(attr->attr.name, "keep_on_in_suspend")) {
++ gps_keep_on_in_suspend_set(on);
++#endif
++ }
++ return count;
++}
++
++#ifdef CONFIG_PM
++static int gta02_pm_gps_suspend(struct device *dev)
++{
++ if (!gta02_gps.keep_on_in_suspend ||
++ !gta02_gps.power_was_on)
++ gps_pwron_set(0);
++ else
++ dev_warn(dev, "GTA02: keeping gps ON "
++ "during suspend\n");
++ return 0;
++}
++
++static int gta02_pm_gps_resume(struct device *dev)
++{
++ if (!gta02_gps.keep_on_in_suspend && gta02_gps.power_was_on)
++ gps_pwron_set(1);
++
++ return 0;
++}
++
++static DEVICE_ATTR(keep_on_in_suspend, 0644, power_gps_read, power_gps_write);
++
++static const struct dev_pm_ops gta02_gps_pm_ops = {
++ .suspend = gta02_pm_gps_suspend,
++ .resume = gta02_pm_gps_resume,
++};
++
++#define GTA02_GPS_PM_OPS (&gta02_gps_pm_ops)
++
++#else
++#define GTA02_GPS_PM_OPS NULL
++#endif
++
++static DEVICE_ATTR(power_on, 0644, power_gps_read, power_gps_write);
++
++static struct attribute *gta02_gps_sysfs_entries[] = {
++ &dev_attr_power_on.attr,
++#ifdef CONFIG_PM
++ &dev_attr_keep_on_in_suspend.attr,
++#endif
++ NULL
++};
++
++static struct attribute_group gta02_gps_attr_group = {
++ .name = NULL,
++ .attrs = gta02_gps_sysfs_entries,
++};
++
++static int __devinit gta02_pm_gps_probe(struct platform_device *pdev)
++{
++ gta02_gps.regulator = regulator_get(&pdev->dev, "RF_3V");
++ if (IS_ERR(gta02_gps.regulator)) {
++ dev_err(&pdev->dev, "probe failed %ld\n",
++ PTR_ERR(gta02_gps.regulator));
++
++ return PTR_ERR(gta02_gps.regulator);
++ }
++
++ dev_info(&pdev->dev, "starting\n");
++
++
++ /*
++ * take care not to power unpowered GPS from UART TX
++ * return them to GPIO and force low
++ */
++ gpio_request(S3C2410_GPH(4), "gps tx");
++ gpio_direction_output(S3C2410_GPH(4), 0);
++ /* don't let RX from unpowered GPS float */
++ s3c_gpio_setpull(S3C2410_GPH(5), S3C_GPIO_PULL_UP);
++
++ return sysfs_create_group(&pdev->dev.kobj,
++ &gta02_gps_attr_group);
++}
++
++static int __devexit gta02_pm_gps_remove(struct platform_device *pdev)
++{
++ regulator_put(gta02_gps.regulator);
++ sysfs_remove_group(&pdev->dev.kobj, &gta02_gps_attr_group);
++ return 0;
++}
++
++static struct platform_driver gta02_pm_gps_driver = {
++ .probe = gta02_pm_gps_probe,
++ .remove = __devexit_p(gta02_pm_gps_remove),
++ .driver = {
++ .name = "gta02-pm-gps",
++ .pm = GTA02_GPS_PM_OPS,
++ },
++};
++
++static int __init gta02_pm_gps_init(void)
++{
++ return platform_driver_register(&gta02_pm_gps_driver);
++}
++module_init(gta02_pm_gps_init);
++
++static void __exit gta02_pm_gps_exit(void)
++{
++ platform_driver_unregister(&gta02_pm_gps_driver);
++}
++module_exit(gta02_pm_gps_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
+diff --git a/arch/arm/mach-s3c2440/gta02-pm-gsm.c b/arch/arm/mach-s3c2440/gta02-pm-gsm.c
+new file mode 100644
+index 0000000..a2b4e91
+--- /dev/null
++++ b/arch/arm/mach-s3c2440/gta02-pm-gsm.c
+@@ -0,0 +1,368 @@
++/*
++ * GSM Management code for the Openmoko Freerunner GSM Phone
++ *
++ * (C) 2007 by Openmoko Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/platform_device.h>
++#include <linux/console.h>
++#include <linux/errno.h>
++#include <linux/interrupt.h>
++#include <linux/delay.h>
++#include <linux/err.h>
++#include <linux/regulator/consumer.h>
++
++#include <linux/gpio.h>
++#include <mach/gpio.h>
++#include <asm/mach-types.h>
++
++#include <mach/hardware.h>
++
++#include <mach/gta02.h>
++#include <mach/regs-gpio.h>
++#include <mach/regs-gpioj.h>
++
++static int gta02_gsm_interrupts;
++
++extern void s3c24xx_serial_console_set_silence(int);
++
++struct gta02pm_priv {
++ int gpio_ndl_gsm;
++ struct console *con;
++ struct regulator *regulator;
++};
++
++static struct gta02pm_priv gta02_gsm;
++
++static struct console *find_s3c24xx_console(void)
++{
++ struct console *con;
++
++ console_lock();
++
++ for (con = console_drivers; con; con = con->next) {
++ if (!strcmp(con->name, "ttySAC"))
++ break;
++ }
++
++ console_unlock();
++
++ return con;
++}
++
++static ssize_t gsm_read(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ if (!strcmp(attr->attr.name, "power_on")) {
++ if (regulator_is_enabled(gta02_gsm.regulator))
++ goto out_1;
++ } else if (!strcmp(attr->attr.name, "download")) {
++ if (!gpio_get_value(GTA02_GPIO_nDL_GSM))
++ goto out_1;
++ } else if (!strcmp(attr->attr.name, "flowcontrolled")) {
++ if (s3c_gpio_getcfg(S3C2410_GPH(1)) == S3C2410_GPIO_OUTPUT)
++ goto out_1;
++ }
++
++ return strlcpy(buf, "0\n", 3);
++out_1:
++ return strlcpy(buf, "1\n", 3);
++}
++
++static void gsm_on_off(struct device *dev, bool on)
++{
++ if (on == regulator_is_enabled(gta02_gsm.regulator))
++ return;
++
++ if (!on) {
++ s3c_gpio_cfgpin(S3C2410_GPH(1), S3C2410_GPIO_INPUT);
++ s3c_gpio_cfgpin(S3C2410_GPH(2), S3C2410_GPIO_INPUT);
++
++ regulator_disable(gta02_gsm.regulator);
++
++ if (gta02_gsm.con) {
++ s3c24xx_serial_console_set_silence(0);
++ console_start(gta02_gsm.con);
++
++ dev_dbg(dev, "powered down gta02 GSM, enabling "
++ "serial console\n");
++ }
++
++ return;
++ }
++
++ if (gta02_gsm.con) {
++ dev_dbg(dev, "powering up GSM, thus "
++ "disconnecting serial console\n");
++
++ console_stop(gta02_gsm.con);
++ s3c24xx_serial_console_set_silence(1);
++ }
++
++ /* allow UART to talk to GSM side now we will power it */
++ s3c_gpio_cfgpin(S3C2410_GPH(1), S3C2410_GPH1_nRTS0);
++ s3c_gpio_cfgpin(S3C2410_GPH(2), S3C2410_GPH2_TXD0);
++
++ regulator_enable(gta02_gsm.regulator);
++
++ msleep(100);
++
++ gpio_set_value(GTA02_GPIO_MODEM_ON, 1);
++ msleep(500);
++ gpio_set_value(GTA02_GPIO_MODEM_ON, 0);
++
++ /*
++ * workaround for calypso firmware moko10 and earlier,
++ * without this it will leave IRQ line high after
++ * booting
++ */
++ s3c2410_gpio_setpin(S3C2410_GPH(1), 1);
++ s3c_gpio_cfgpin(S3C2410_GPH(1), S3C2410_GPIO_OUTPUT);
++ msleep(1000);
++ s3c_gpio_cfgpin(S3C2410_GPH(1), S3C2410_GPH1_nRTS0);
++
++}
++
++static ssize_t gsm_write(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ int ret;
++ unsigned long on;
++
++ ret = strict_strtoul(buf, 10, &on);
++ if (ret)
++ return ret;
++
++ if (!strcmp(attr->attr.name, "power_on")) {
++ gsm_on_off(dev, on);
++
++ return count;
++ }
++
++ if (!strcmp(attr->attr.name, "download")) {
++ /*
++ * the keyboard / buttons driver requests and enables
++ * the JACK_INSERT IRQ. We have to take care about
++ * not enabling and disabling the IRQ when it was
++ * already in that state or we get "unblanaced IRQ"
++ * kernel warnings and stack dumps. So we use the
++ * copy of the ndl_gsm state to figure out if we should
++ * enable or disable the jack interrupt
++ */
++ if (on) {
++ if (gta02_gsm.gpio_ndl_gsm)
++ disable_irq(gpio_to_irq(
++ GTA02_GPIO_JACK_INSERT));
++ } else {
++ if (!gta02_gsm.gpio_ndl_gsm)
++ enable_irq(gpio_to_irq(
++ GTA02_GPIO_JACK_INSERT));
++ }
++
++ gta02_gsm.gpio_ndl_gsm = !on;
++ gpio_set_value(GTA02_GPIO_nDL_GSM, !on);
++
++ return count;
++ }
++
++ if (!strcmp(attr->attr.name, "flowcontrolled")) {
++ if (on) {
++ gta02_gsm_interrupts = 0;
++ gpio_set_value(S3C2410_GPH(1), 1);
++ s3c_gpio_cfgpin(S3C2410_GPH(1), S3C2410_GPIO_OUTPUT);
++ } else
++ s3c_gpio_cfgpin(S3C2410_GPH(1), S3C2410_GPH1_nRTS0);
++ }
++
++ return count;
++}
++
++static DEVICE_ATTR(power_on, 0644, gsm_read, gsm_write);
++static DEVICE_ATTR(reset, 0644, gsm_read, gsm_write);
++static DEVICE_ATTR(download, 0644, gsm_read, gsm_write);
++static DEVICE_ATTR(flowcontrolled, 0644, gsm_read, gsm_write);
++
++#ifdef CONFIG_PM
++
++static int gta02_gsm_suspend(struct device *dev)
++{
++ /* GPIO state is saved/restored by S3C2410 core GPIO driver, so we
++ * don't need to do much here. */
++
++
++ /* If flowcontrol asserted, abort if GSM already interrupted */
++ if (s3c_gpio_getcfg(S3C2410_GPH(1)) == S3C2410_GPIO_OUTPUT) {
++ if (gta02_gsm_interrupts)
++ goto busy;
++ }
++
++ /* disable DL GSM to prevent jack_insert becoming 'floating' */
++ gpio_set_value(GTA02_GPIO_nDL_GSM, 1);
++
++ if (device_may_wakeup(dev))
++ enable_irq_wake(GTA02_IRQ_MODEM);
++
++ return 0;
++
++busy:
++ return -EBUSY;
++}
++
++static int gta02_gsm_suspend_late(struct device *dev)
++{
++ /* Last chance: abort if GSM already interrupted */
++ if (s3c_gpio_getcfg(S3C2410_GPH(1)) == S3C2410_GPIO_OUTPUT) {
++ if (gta02_gsm_interrupts)
++ return -EBUSY;
++ }
++ return 0;
++}
++
++static int gta02_gsm_resume(struct device *dev)
++{
++ if (device_may_wakeup(dev))
++ disable_irq_wake(GTA02_IRQ_MODEM);
++
++ /* GPIO state is saved/restored by S3C2410 core GPIO driver, so we
++ * don't need to do much here. */
++
++ /* Make sure that the kernel console on the serial port is still
++ * disabled. FIXME: resume ordering race with serial driver! */
++ if (gta02_gsm.con && gpio_get_value(GTA02_GPIO_MODEM_ON))
++ console_stop(gta02_gsm.con);
++
++ gpio_set_value(GTA02_GPIO_nDL_GSM, gta02_gsm.gpio_ndl_gsm);
++
++ return 0;
++}
++
++static const struct dev_pm_ops gta02_gsm_pm_ops = {
++ .suspend = gta02_gsm_suspend,
++ .suspend_noirq = gta02_gsm_suspend_late,
++ .resume = gta02_gsm_resume,
++};
++
++#define GTA02_GSM_PM_OPS (&gta02_gsm_pm_ops)
++
++#else
++#define GTA02_GSM_PM_OPS NULL
++#endif /* CONFIG_PM */
++
++static struct attribute *gta02_gsm_sysfs_entries[] = {
++ &dev_attr_power_on.attr,
++ &dev_attr_reset.attr,
++ &dev_attr_download.attr,
++ &dev_attr_flowcontrolled.attr,
++ NULL
++};
++
++static struct attribute_group gta02_gsm_attr_group = {
++ .name = NULL,
++ .attrs = gta02_gsm_sysfs_entries,
++};
++
++static irqreturn_t gta02_gsm_irq(int irq, void *devid)
++{
++ gta02_gsm_interrupts++;
++ return IRQ_HANDLED;
++}
++
++static int __devinit gta02_gsm_probe(struct platform_device *pdev)
++{
++ int ret;
++
++ gta02_gsm.con = find_s3c24xx_console();
++ if (!gta02_gsm.con)
++ dev_warn(&pdev->dev,
++ "cannot find S3C24xx console driver\n");
++
++ gta02_gsm.regulator = regulator_get_exclusive(&pdev->dev, "GSM");
++
++ if (IS_ERR(gta02_gsm.regulator)) {
++ ret = PTR_ERR(gta02_gsm.regulator);
++ dev_err(&pdev->dev, "Failed to get regulator: %d\n", ret);
++ return ret;
++ }
++
++ ret = request_irq(GTA02_IRQ_MODEM, gta02_gsm_irq,
++ IRQF_DISABLED | IRQF_TRIGGER_RISING, "modem", NULL);
++
++ if (ret) {
++ regulator_put(gta02_gsm.regulator);
++ dev_err(&pdev->dev, "Failed to get modem irq: %d\n", ret);
++ goto err_regulator_put;
++ }
++
++ ret = sysfs_create_group(&pdev->dev.kobj, &gta02_gsm_attr_group);
++ if (ret) {
++ dev_err(&pdev->dev, "Failed to create sysfs entries: %d\n",
++ ret);
++ goto err_free_irq;
++ }
++
++ device_init_wakeup(&pdev->dev, 1);
++
++ /* note that download initially disabled, and enforce that */
++ gta02_gsm.gpio_ndl_gsm = 1;
++ gpio_request(GTA02_GPIO_nDL_GSM, "GSM nDL");
++ gpio_direction_output(GTA02_GPIO_nDL_GSM, 1);
++ gpio_request(GTA02_GPIO_MODEM_ON, "GSM modem enable");
++ gpio_direction_output(GTA02_GPIO_MODEM_ON, 0);
++
++ /* GSM is to be initially off (at boot, or if this module inserted) */
++ gsm_on_off(&pdev->dev, 0);
++
++ return 0;
++err_free_irq:
++ free_irq(GTA02_IRQ_MODEM, NULL);
++err_regulator_put:
++ regulator_put(gta02_gsm.regulator);
++
++ return ret;
++}
++
++static int __devexit gta02_gsm_remove(struct platform_device *pdev)
++{
++ gsm_on_off(&pdev->dev, 0);
++
++ sysfs_remove_group(&pdev->dev.kobj, &gta02_gsm_attr_group);
++ free_irq(GTA02_IRQ_MODEM, NULL);
++ regulator_put(gta02_gsm.regulator);
++
++ return 0;
++}
++
++static struct platform_driver gta02_gsm_driver = {
++ .probe = gta02_gsm_probe,
++ .remove = __devexit_p(gta02_gsm_remove),
++ .driver = {
++ .name = "gta02-pm-gsm",
++ .pm = GTA02_GSM_PM_OPS,
++ },
++};
++
++static int __init gta02_gsm_init(void)
++{
++ return platform_driver_register(&gta02_gsm_driver);
++}
++module_init(gta02_gsm_init);
++
++static void __exit gta02_gsm_exit(void)
++{
++ platform_driver_unregister(&gta02_gsm_driver);
++}
++module_exit(gta02_gsm_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
++MODULE_DESCRIPTION("Openmoko Freerunner GSM Power Management");
+diff --git a/arch/arm/mach-s3c2440/gta02-pm-wlan.c b/arch/arm/mach-s3c2440/gta02-pm-wlan.c
+new file mode 100644
+index 0000000..1c8da2c
+--- /dev/null
++++ b/arch/arm/mach-s3c2440/gta02-pm-wlan.c
+@@ -0,0 +1,198 @@
++/*
++ * GTA02 WLAN power management
++ *
++ * (C) 2008, 2009 by Openmoko Inc.
++ * Author: Andy Green <andy@openmoko.com>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/mutex.h>
++#include <linux/platform_device.h>
++
++#include <mach/hardware.h>
++#include <asm/mach-types.h>
++
++#include <mach/gta02.h>
++#include <mach/gta02-pm-wlan.h>
++#include <mach/regs-gpio.h>
++#include <mach/gpio-fns.h>
++#include <linux/gpio.h>
++
++#include <linux/delay.h>
++#include <linux/rfkill.h>
++
++
++/* ----- Module hardware reset ("power") ----------------------------------- */
++
++
++void gta02_wlan_reset()
++{
++ gpio_set_value(GTA02_GPIO_nWLAN_RESET, 0);
++ msleep(200); /* probably excessive but we don't have specs */
++ gpio_set_value(GTA02_GPIO_nWLAN_RESET, 1);
++}
++
++/* ----- rfkill ------------------------------------------------------------ */
++
++/*
++ * S3C MCI handles suspend/resume through device removal/insertion. In order to
++ * preserve rfkill state, as required in clause 7 of section 3.1 in rfkill.txt,
++ * we therefore need to maintain rfkill state outside the driver.
++ *
++ * This platform driver is as good a place as any other.
++ */
++
++static int (*gta02_wlan_rfkill_cb)(void *user, int on);
++static void *gta02_wlan_rfkill_user;
++static DEFINE_MUTEX(gta02_wlan_rfkill_lock);
++static int gta02_wlan_rfkill_on;
++
++/*
++ * gta02_wlan_query_rfkill_lock is used to obtain the rfkill state before the
++ * driver is ready to process rfkill callbacks. To prevent the state from
++ * changing until the driver has completed its initialization, we grab and hold
++ * the rfkill lock.
++ *
++ * A call to gta02_wlan_query_rfkill_lock must be followed by either
++ * - a call to gta02_wlan_set_rfkill_cb, to complete the setup, or
++ * - a call to gta02_wlan_query_rfkill_unlock to abort the setup process.
++ */
++
++int gta02_wlan_query_rfkill_lock(void)
++{
++ mutex_lock(&gta02_wlan_rfkill_lock);
++ return gta02_wlan_rfkill_on;
++}
++EXPORT_SYMBOL_GPL(gta02_wlan_query_rfkill_lock);
++
++void gta02_wlan_query_rfkill_unlock(void)
++{
++ mutex_unlock(&gta02_wlan_rfkill_lock);
++}
++EXPORT_SYMBOL_GPL(gta02_wlan_query_rfkill_unlock);
++
++void gta02_wlan_set_rfkill_cb(int (*cb)(void *user, int on), void *user)
++{
++ BUG_ON(!mutex_is_locked(&gta02_wlan_rfkill_lock));
++ BUG_ON(gta02_wlan_rfkill_cb);
++ gta02_wlan_rfkill_cb = cb;
++ gta02_wlan_rfkill_user = user;
++ mutex_unlock(&gta02_wlan_rfkill_lock);
++}
++EXPORT_SYMBOL_GPL(gta02_wlan_set_rfkill_cb);
++
++void gta02_wlan_clear_rfkill_cb(void)
++{
++ mutex_lock(&gta02_wlan_rfkill_lock);
++ BUG_ON(!gta02_wlan_rfkill_cb);
++ gta02_wlan_rfkill_cb = NULL;
++ mutex_unlock(&gta02_wlan_rfkill_lock);
++}
++EXPORT_SYMBOL_GPL(gta02_wlan_clear_rfkill_cb);
++
++static int gta02_wlan_set_radio_block(void *data, bool blocked)
++{
++ struct device *dev = data;
++ int res = 0;
++
++ dev_dbg(dev, "gta02_wlan_toggle_radio: blocked %d (%p)\n",
++ blocked, gta02_wlan_rfkill_cb);
++ mutex_lock(&gta02_wlan_rfkill_lock);
++ if (gta02_wlan_rfkill_cb)
++ res = gta02_wlan_rfkill_cb(gta02_wlan_rfkill_user, !blocked);
++ if (!res)
++ gta02_wlan_rfkill_on = !blocked;
++ mutex_unlock(&gta02_wlan_rfkill_lock);
++ return res;
++}
++
++static const struct rfkill_ops gta02_wlan_rfkill_ops = {
++ .set_block = gta02_wlan_set_radio_block,
++};
++
++/* ----- Initialization/removal -------------------------------------------- */
++
++
++static int __devinit gta02_wlan_probe(struct platform_device *pdev)
++{
++ /* default-on for now */
++ const int default_state = 1;
++ struct rfkill *rfkill;
++ int ret;
++
++ dev_info(&pdev->dev, "starting\n");
++
++ gpio_request(GTA02_GPIO_nWLAN_RESET, "wlan reset");
++ gpio_direction_output(GTA02_GPIO_nWLAN_RESET, 0);
++ gta02_wlan_reset();
++
++ rfkill = rfkill_alloc("ar6000", &pdev->dev, RFKILL_TYPE_WLAN,
++ &gta02_wlan_rfkill_ops, &pdev->dev);
++
++
++ if (!rfkill) {
++ dev_err(&pdev->dev, "Failed to allocate rfkill\n");
++ return -ENOMEM;
++ }
++
++ rfkill_init_sw_state(rfkill, default_state);
++ /*
++ * If the WLAN driver somehow managed to get activated before we're
++ * ready, the driver is now in an unknown state, which isn't something
++ * we're prepared to handle. This can't happen, so just fail hard.
++ */
++ BUG_ON(gta02_wlan_rfkill_cb);
++ gta02_wlan_rfkill_on = default_state;
++
++ ret = rfkill_register(rfkill);
++ if (ret) {
++ rfkill_destroy(rfkill);
++ dev_err(&pdev->dev, "Failed to register rfkill\n");
++ return ret;
++ }
++
++ dev_set_drvdata(&pdev->dev, rfkill);
++
++ return 0;
++}
++
++static int __devexit gta02_wlan_remove(struct platform_device *pdev)
++{
++ struct rfkill *rfkill = dev_get_drvdata(&pdev->dev);
++
++ rfkill_destroy(rfkill);
++
++ return 0;
++}
++
++static struct platform_driver gta02_wlan_driver = {
++ .probe = gta02_wlan_probe,
++ .remove = __devexit_p(gta02_wlan_remove),
++ .driver = {
++ .name = "gta02-pm-wlan",
++ },
++};
++
++static int __init gta02_wlan_init(void)
++{
++ return platform_driver_register(&gta02_wlan_driver);
++}
++module_init(gta02_wlan_init);
++
++static void __exit gta02_wlan_exit(void)
++{
++ platform_driver_unregister(&gta02_wlan_driver);
++}
++module_exit(gta02_wlan_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
++MODULE_DESCRIPTION("Openmoko GTA02 WLAN power management");
+diff --git a/arch/arm/mach-s3c2440/include/mach/gta02-fiq.h b/arch/arm/mach-s3c2440/include/mach/gta02-fiq.h
+new file mode 100644
+index 0000000..90de353
+--- /dev/null
++++ b/arch/arm/mach-s3c2440/include/mach/gta02-fiq.h
+@@ -0,0 +1,9 @@
++#ifndef __GTA02_FIQ_H
++#define __GTA02_FIQ_H
++
++extern void gta02_fiq_handler(void);
++extern void gta02_fiq_kick(void);
++extern int gta02_fiq_enable(void);
++extern void gta02_fiq_disable(void);
++
++#endif
+diff --git a/arch/arm/mach-s3c2440/include/mach/gta02-hdq.h b/arch/arm/mach-s3c2440/include/mach/gta02-hdq.h
+new file mode 100644
+index 0000000..ba98f8f
+--- /dev/null
++++ b/arch/arm/mach-s3c2440/include/mach/gta02-hdq.h
+@@ -0,0 +1,23 @@
++#ifndef __LINUX_HDQ_H__
++#define __LINUX_HDQ_H__
++
++#include <linux/device.h>
++
++#define HDQ_SAMPLE_PERIOD_US 10
++
++/* platform data */
++
++struct hdq_platform_data {
++ void (*gpio_dir_out)(void);
++ void (*gpio_dir_in)(void);
++ void (*gpio_set)(int);
++ int (*gpio_get)(void);
++
++ int (*enable_fiq)(void);
++ void (*disable_fiq)(void);
++ void (*kick_fiq)(void);
++};
++
++int hdq_read(struct device *dev, unsigned int address);
++
++#endif
+diff --git a/arch/arm/mach-s3c2440/include/mach/gta02-pm-gps.h b/arch/arm/mach-s3c2440/include/mach/gta02-pm-gps.h
+new file mode 100644
+index 0000000..f15180a
+--- /dev/null
++++ b/arch/arm/mach-s3c2440/include/mach/gta02-pm-gps.h
+@@ -0,0 +1 @@
++extern int gta02_pm_gps_is_on(void);
+diff --git a/arch/arm/mach-s3c2440/include/mach/gta02-pm-wlan.h b/arch/arm/mach-s3c2440/include/mach/gta02-pm-wlan.h
+new file mode 100644
+index 0000000..0c96db4
+--- /dev/null
++++ b/arch/arm/mach-s3c2440/include/mach/gta02-pm-wlan.h
+@@ -0,0 +1,10 @@
++#ifndef __MACH_GTA02_PM_WLAN_H
++#define __MACH_GTA02_PM_WLAN_H
++
++void gta02_wlan_reset(void);
++int gta02_wlan_query_rfkill_lock(void);
++void gta02_wlan_query_rfkill_unlock(void);
++void gta02_wlan_set_rfkill_cb(int (*cb)(void *user, int on), void *user);
++void gta02_wlan_clear_rfkill_cb(void);
++
++#endif /* __MACH_GTA02_PM_WLAN_H */
+diff --git a/arch/arm/mach-s3c2440/include/mach/gta02.h b/arch/arm/mach-s3c2440/include/mach/gta02.h
+index 3a56a22..2e84b5a 100644
+--- a/arch/arm/mach-s3c2440/include/mach/gta02.h
++++ b/arch/arm/mach-s3c2440/include/mach/gta02.h
+@@ -79,6 +79,11 @@
+ #define GTA02_PCB_ID2_0 S3C2410_GPD(3)
+ #define GTA02_PCB_ID2_1 S3C2410_GPD(4)
+
++#define GTA02_GPIO_GLAMO_BASE S3C_GPIO_END
++#define GTA02_GPIO_GLAMO(x) (GTA02_GPIO_GLAMO_BASE + (x))
++#define GTA02_GPIO_PCF_BASE (GTA02_GPIO_GLAMO_BASE + 32)
++#define GTA02_GPIO_PCF(x) (GTA02_GPIO_PCF_BASE + (x))
++
+ int gta02_get_pcb_revision(void);
+
+ #endif /* _GTA02_H */
+diff --git a/arch/arm/mach-s3c2440/mach-gta02.c b/arch/arm/mach-s3c2440/mach-gta02.c
+index 7166620..aa31b8d 100644
+--- a/arch/arm/mach-s3c2440/mach-gta02.c
++++ b/arch/arm/mach-s3c2440/mach-gta02.c
+@@ -38,6 +38,7 @@
+ #include <linux/platform_device.h>
+ #include <linux/serial_core.h>
+ #include <linux/spi/spi.h>
++#include <linux/spi/spi_gpio.h>
+
+ #include <linux/mmc/host.h>
+
+@@ -50,6 +51,7 @@
+
+ #include <linux/i2c.h>
+ #include <linux/regulator/machine.h>
++#include <linux/regulator/fixed.h>
+
+ #include <linux/mfd/pcf50633/core.h>
+ #include <linux/mfd/pcf50633/mbc.h>
+@@ -61,6 +63,9 @@
+ #include <linux/input.h>
+ #include <linux/gpio_keys.h>
+
++#include <linux/leds.h>
++#include <linux/leds_pwm.h>
++
+ #include <asm/mach/arch.h>
+ #include <asm/mach/map.h>
+ #include <asm/mach/irq.h>
+@@ -92,6 +97,19 @@
+ #include <plat/ts.h>
+
+
++#include <mach/gta02-pm-gps.h>
++#include <mach/gta02-pm-wlan.h>
++
++#include <mach/gta02-fiq.h>
++
++#include <mach/gta02-hdq.h>
++#include <linux/power/bq27x00_battery.h>
++#include <linux/platform_battery.h>
++
++#include <linux/jbt6k74.h>
++#include <linux/glamofb.h>
++#include <linux/mfd/glamo.h>
++
+ static struct pcf50633 *gta02_pcf;
+
+ /*
+@@ -147,6 +165,183 @@ static struct s3c2410_uartcfg gta02_uartcfgs[] = {
+ },
+ };
+
++static struct platform_device gta02_pm_bt_dev = {
++ .name = "gta02-pm-bt",
++};
++
++static struct platform_device gta02_pm_gps_dev = {
++ .name = "gta02-pm-gps",
++};
++
++static struct platform_device gta02_pm_gsm_dev = {
++ .name = "gta02-pm-gsm",
++};
++
++static struct platform_device gta02_pm_wlan_dev = {
++ .name = "gta02-pm-wlan",
++};
++
++static struct regulator_consumer_supply gsm_supply_consumer = {
++ .dev = &gta02_pm_gsm_dev.dev,
++ .supply = "GSM",
++};
++
++static struct regulator_init_data gsm_supply_init_data = {
++ .constraints = {
++ .min_uV = 3700000,
++ .max_uV = 3700000,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .valid_ops_mask = REGULATOR_CHANGE_STATUS,
++ },
++ .num_consumer_supplies = 1,
++ .consumer_supplies = &gsm_supply_consumer,
++};
++
++static struct fixed_voltage_config gsm_supply_config = {
++ .supply_name = "GSM",
++ .microvolts = 3700000,
++ .gpio = GTA02_GPIO_PCF(PCF50633_GPIO2),
++ .enable_high = 1,
++ .init_data = &gsm_supply_init_data,
++};
++
++static struct platform_device gta02_gsm_supply_device = {
++ .name = "reg-fixed-voltage",
++ .id = 1,
++ .dev = {
++ .platform_data = &gsm_supply_config,
++ },
++};
++
++/*
++ * we crank down SD Card clock dynamically when GPS is powered
++ */
++
++static int gta02_glamo_mci_use_slow(void)
++{
++ return gta02_pm_gps_is_on();
++}
++
++static void gta02_glamo_external_reset(int level)
++{
++ s3c2410_gpio_setpin(GTA02_GPIO_3D_RESET, level);
++ s3c2410_gpio_cfgpin(GTA02_GPIO_3D_RESET, S3C2410_GPIO_OUTPUT);
++}
++
++struct spi_gpio_platform_data spigpio_platform_data = {
++ .sck = GTA02_GPIO_GLAMO(10),
++ .mosi = GTA02_GPIO_GLAMO(11),
++ .miso = GTA02_GPIO_GLAMO(5),
++ .num_chipselect = 1,
++};
++
++static struct platform_device spigpio_device = {
++ .name = "spi_gpio",
++ .id = 2,
++ .dev = {
++ .platform_data = &spigpio_platform_data,
++ },
++};
++
++static struct fb_videomode gta02_glamo_modes[] = {
++ {
++ .name = "480x640",
++ .xres = 480,
++ .yres = 640,
++ .pixclock = 40816,
++ .left_margin = 8,
++ .right_margin = 16,
++ .upper_margin = 2,
++ .lower_margin = 16,
++ .hsync_len = 8,
++ .vsync_len = 2,
++ .vmode = FB_VMODE_NONINTERLACED,
++ }, {
++ .name = "240x320",
++ .xres = 240,
++ .yres = 320,
++ .pixclock = 40816,
++ .left_margin = 8,
++ .right_margin = 16,
++ .upper_margin = 2,
++ .lower_margin = 16,
++ .hsync_len = 8,
++ .vsync_len = 2,
++ .vmode = FB_VMODE_NONINTERLACED,
++ }
++};
++
++static struct glamo_fb_platform_data gta02_glamo_fb_pdata = {
++ .width = 43,
++ .height = 58,
++
++ .num_modes = ARRAY_SIZE(gta02_glamo_modes),
++ .modes = gta02_glamo_modes,
++};
++
++static struct glamo_mmc_platform_data gta02_glamo_mmc_pdata = {
++ .glamo_mmc_use_slow = gta02_glamo_mci_use_slow,
++};
++
++static struct glamo_gpio_platform_data gta02_glamo_gpio_pdata = {
++ .base = GTA02_GPIO_GLAMO_BASE,
++};
++
++static struct glamo_platform_data gta02_glamo_pdata = {
++ .fb_data = &gta02_glamo_fb_pdata,
++ .mmc_data = &gta02_glamo_mmc_pdata,
++ .gpio_data = &gta02_glamo_gpio_pdata,
++
++ .osci_clock_rate = 32768,
++
++ .glamo_external_reset = gta02_glamo_external_reset,
++};
++
++/* JBT6k74 display controller */
++static void gta02_jbt6k74_probe_completed(struct device *dev)
++{
++ pcf50633_bl_set_brightness_limit(gta02_pcf, 0x3f);
++}
++
++const static struct jbt6k74_platform_data jbt6k74_pdata = {
++ .gpio_reset = GTA02_GPIO_GLAMO(4),
++};
++
++static struct spi_board_info gta02_spi_board_info[] = {
++ {
++ .modalias = "jbt6k74",
++ .platform_data = &jbt6k74_pdata,
++ .controller_data = (void *)GTA02_GPIO_GLAMO(12),
++ /* irq */
++ .max_speed_hz = 100 * 1000,
++ .bus_num = 2,
++ .chip_select = 0
++ },
++};
++
++static struct resource gta02_glamo_resources[] = {
++ [0] = {
++ .start = S3C2410_CS1,
++ .end = S3C2410_CS1 + 0x1000000 - 1,
++ .flags = IORESOURCE_MEM,
++ },
++ [1] = {
++ .start = GTA02_IRQ_3D,
++ .end = GTA02_IRQ_3D,
++ .flags = IORESOURCE_IRQ,
++ },
++};
++
++static struct platform_device gta02_glamo_dev = {
++ .name = "glamo3362",
++ .num_resources = ARRAY_SIZE(gta02_glamo_resources),
++ .resource = gta02_glamo_resources,
++ .dev = {
++ .platform_data = &gta02_glamo_pdata,
++ },
++};
++
++
+ #ifdef CONFIG_CHARGER_PCF50633
+ /*
+ * On GTA02 the 1A charger features a 48K resistor to 0V on the ID pin.
+@@ -159,22 +354,28 @@ static struct s3c2410_uartcfg gta02_uartcfgs[] = {
+ #define ADC_NOM_CHG_DETECT_1A 6
+ #define ADC_NOM_CHG_DETECT_USB 43
+
+-static void
+-gta02_configure_pmu_for_charger(struct pcf50633 *pcf, void *unused, int res)
++static int gta02_get_charger_online_status(void)
+ {
+- int ma;
++ struct pcf50633 *pcf = gta02_pcf;
+
+- /* Interpret charger type */
+- if (res < ((ADC_NOM_CHG_DETECT_USB + ADC_NOM_CHG_DETECT_1A) / 2)) {
++ return pcf50633_mbc_get_status(pcf) & PCF50633_MBC_USB_ONLINE;
++}
+
+- /*
+- * Sanity - stop GPO driving out now that we have a 1A charger
+- * GPO controls USB Host power generation on GTA02
+- */
+- pcf50633_gpio_set(pcf, PCF50633_GPO, 0);
++static int gta02_get_charger_active_status(void)
++{
++ struct pcf50633 *pcf = gta02_pcf;
++
++ return pcf50633_mbc_get_status(pcf) & PCF50633_MBC_USB_ACTIVE;
++}
++
++static void
++gta02_configure_pmu_for_charger(struct pcf50633 *pcf, void *unused, int res)
++{
++ int ma;
+
++ if (res < ((ADC_NOM_CHG_DETECT_USB + ADC_NOM_CHG_DETECT_1A) / 2))
+ ma = 1000;
+- } else
++ else
+ ma = 100;
+
+ pcf50633_mbc_usb_curlim_set(pcf, ma);
+@@ -235,6 +436,8 @@ static void gta02_udc_vbus_draw(unsigned int ma)
+ #else /* !CONFIG_CHARGER_PCF50633 */
+ #define gta02_pmu_event_callback NULL
+ #define gta02_udc_vbus_draw NULL
++#define gta02_get_charger_online_status NULL
++#define gta02_get_charger_active_status NULL
+ #endif
+
+ /*
+@@ -258,6 +461,32 @@ static struct pcf50633_bl_platform_data gta02_backlight_data = {
+ .ramp_time = 5,
+ };
+
++static struct regulator_consumer_supply ldo4_consumers[] = {
++ {
++ .dev = &gta02_pm_bt_dev.dev,
++ .supply = "BT_3V2",
++ },
++};
++
++static struct regulator_consumer_supply ldo5_consumers[] = {
++ {
++ .dev = &gta02_pm_gps_dev.dev,
++ .supply = "RF_3V",
++ },
++};
++
++static struct regulator_consumer_supply ldo6_consumers[] = {
++ REGULATOR_SUPPLY("VDC", "spi2.0"),
++ REGULATOR_SUPPLY("VDDIO", "spi2.0"),
++};
++
++static struct regulator_consumer_supply hcldo_consumers[] = {
++ {
++ .dev = &gta02_glamo_dev.dev,
++ .supply = "SD_3V3",
++ },
++};
++
+ struct pcf50633_platform_data gta02_pcf_pdata = {
+ .resumers = {
+ [0] = PCF50633_INT1_USBINS |
+@@ -276,6 +505,7 @@ struct pcf50633_platform_data gta02_pcf_pdata = {
+ .charger_reference_current_ma = 1000,
+
+ .backlight_data = &gta02_backlight_data,
++ .gpio_base = GTA02_GPIO_PCF_BASE,
+
+ .reg_init_data = {
+ [PCF50633_REGULATOR_AUTO] = {
+@@ -313,6 +543,8 @@ struct pcf50633_platform_data gta02_pcf_pdata = {
+ .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
+ REGULATOR_CHANGE_STATUS,
+ },
++ .num_consumer_supplies = ARRAY_SIZE(hcldo_consumers),
++ .consumer_supplies = hcldo_consumers,
+ },
+ [PCF50633_REGULATOR_LDO1] = {
+ .constraints = {
+@@ -347,6 +579,8 @@ struct pcf50633_platform_data gta02_pcf_pdata = {
+ .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+ .apply_uV = 1,
+ },
++ .num_consumer_supplies = ARRAY_SIZE(ldo4_consumers),
++ .consumer_supplies = ldo4_consumers,
+ },
+ [PCF50633_REGULATOR_LDO5] = {
+ .constraints = {
+@@ -356,13 +590,18 @@ struct pcf50633_platform_data gta02_pcf_pdata = {
+ .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+ .apply_uV = 1,
+ },
++ .num_consumer_supplies = ARRAY_SIZE(ldo5_consumers),
++ .consumer_supplies = ldo5_consumers,
+ },
+ [PCF50633_REGULATOR_LDO6] = {
+ .constraints = {
+ .min_uV = 3000000,
+ .max_uV = 3000000,
+ .valid_modes_mask = REGULATOR_MODE_NORMAL,
++ .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+ },
++ .num_consumer_supplies = ARRAY_SIZE(ldo6_consumers),
++ .consumer_supplies = ldo6_consumers,
+ },
+ [PCF50633_REGULATOR_MEMLDO] = {
+ .constraints = {
+@@ -403,7 +642,6 @@ static struct platform_device gta02_nor_flash = {
+ .num_resources = 1,
+ };
+
+-
+ struct platform_device s3c24xx_pwm_device = {
+ .name = "s3c24xx_pwm",
+ .num_resources = 0,
+@@ -449,6 +687,7 @@ static struct s3c2410_platform_nand __initdata gta02_nand_info = {
+ .twrph1 = 15,
+ .nr_sets = ARRAY_SIZE(gta02_nand_sets),
+ .sets = gta02_nand_sets,
++ .software_ecc = 1,
+ };
+
+
+@@ -506,6 +745,273 @@ static struct platform_device gta02_buttons_device = {
+ },
+ };
+
++/* LEDs */
++static struct gpio_led gta02_gpio_leds[] = {
++ {
++ .name = "gta02:red:aux",
++ .gpio = GTA02_GPIO_AUX_LED,
++ },
++};
++
++static struct gpio_led_platform_data gta02_gpio_leds_pdata = {
++ .leds = gta02_gpio_leds,
++ .num_leds = ARRAY_SIZE(gta02_gpio_leds),
++};
++
++static struct platform_device gta02_leds_device = {
++ .name = "leds-gpio",
++ .id = -1,
++ .dev = {
++ .platform_data = &gta02_gpio_leds_pdata,
++ },
++};
++
++static inline int gta02_pwm_to_gpio(int pwm_id)
++{
++ return S3C2410_GPB(pwm_id);
++}
++
++static int gta02_pwm_led_init(struct device *dev, struct led_pwm *led)
++{
++ int ret;
++ int gpio = gta02_pwm_to_gpio(led->pwm_id);
++
++ ret = gpio_request(gpio, dev_name(dev));
++ if (ret)
++ return ret;
++
++ gpio_direction_output(gpio, 0);
++
++ return 0;
++}
++
++static enum led_brightness gta02_pwm_led_notify(struct device *dev,
++ struct led_pwm *led, enum led_brightness brightness)
++{
++ int gpio = gta02_pwm_to_gpio(led->pwm_id);
++
++ if (brightness == led->max_brightness || brightness == 0) {
++ s3c2410_gpio_cfgpin(gpio, S3C2410_GPIO_OUTPUT);
++ gpio_set_value(gpio, brightness ? 1 : 0);
++
++ brightness = 0;
++ } else {
++ s3c2410_gpio_cfgpin(gpio, S3C2410_GPIO_SFN2);
++ }
++
++ return brightness;
++}
++
++static void gta02_pwm_led_exit(struct device *dev, struct led_pwm *led)
++{
++ gpio_free(gta02_pwm_to_gpio(led->pwm_id));
++}
++
++static struct led_pwm gta02_pwm_leds[] = {
++ {
++ .name = "gta02:orange:power",
++ .max_brightness = 0xff,
++ .pwm_period_ns = 1000000,
++ .pwm_id = 0,
++ },
++ {
++ .name = "gta02:blue:power",
++ .max_brightness = 0xff,
++ .pwm_period_ns = 1000000,
++ .pwm_id = 1,
++ },
++ {
++ .name = "gta02::vibrator",
++ .max_brightness = 0x3f,
++ .pwm_period_ns = 60000000,
++ .pwm_id = 3,
++ }
++};
++
++static struct led_pwm_platform_data gta02_pwm_leds_pdata = {
++ .num_leds = ARRAY_SIZE(gta02_pwm_leds),
++ .leds = gta02_pwm_leds,
++
++ .init = gta02_pwm_led_init,
++ .notify = gta02_pwm_led_notify,
++ .exit = gta02_pwm_led_exit,
++};
++
++static struct platform_device gta02_pwm_leds_device = {
++ .name = "leds_pwm",
++ .id = -1,
++ .dev = {
++ .platform_data = &gta02_pwm_leds_pdata,
++ }
++};
++
++/* BQ27000 Battery */
++
++static struct bq27000_platform_data bq27000_pdata = {
++ .read = hdq_read,
++ .name = "battery",
++};
++
++static struct platform_device bq27000_battery_device = {
++ .name = "bq27000-battery",
++ .dev = {
++ .platform_data = &bq27000_pdata,
++ },
++};
++
++/* Platform battery */
++
++/* Capacity of a typical BL-5C dumb battery */
++#define GTA02_BAT_CHARGE_FULL 850000
++
++static int gta02_bat_voltscale(int volt)
++{
++ /* This table is suggested by SpeedEvil based on analysis of
++ * experimental data */
++ static const int lut[][2] = {
++ { 4120, 100 },
++ { 3900, 60 },
++ { 3740, 25 },
++ { 3600, 5 },
++ { 3000, 0 } };
++ int i, res = 0;
++
++ if (volt > lut[0][0])
++ res = lut[0][1];
++ else
++ for (i = 0; lut[i][1]; i++) {
++ if (volt <= lut[i][0] && volt >= lut[i+1][0]) {
++ res = lut[i][1] - (lut[i][0]-volt)*
++ (lut[i][1]-lut[i+1][1])/
++ (lut[i][0]-lut[i+1][0]);
++ break;
++ }
++ }
++ return res;
++}
++
++static int gta02_bat_get_voltage(void)
++{
++ struct pcf50633 *pcf = gta02_pcf;
++ u16 adc, mv = 0;
++ adc = pcf50633_adc_sync_read(pcf,
++ PCF50633_ADCC1_MUX_BATSNS_RES,
++ PCF50633_ADCC1_AVERAGE_16);
++ /* The formula from DS is for divide-by-two mode, current driver uses
++ divide-by-three */
++ mv = (adc * 6000) / 1023;
++ return mv * 1000;
++}
++
++static int gta02_bat_get_present(void)
++{
++ /* There is no reliable way to tell if it is present or not */
++ return 1;
++}
++
++static int gta02_bat_get_status(void)
++{
++#ifdef CONFIG_CHARGER_PCF50633
++ if (gta02_get_charger_active_status())
++ return POWER_SUPPLY_STATUS_CHARGING;
++ else
++ return POWER_SUPPLY_STATUS_DISCHARGING;
++#else
++ return POWER_SUPPLY_STATUS_UNKNOWN;
++#endif
++}
++
++static int gta02_bat_get_capacity(void)
++{
++ return gta02_bat_voltscale(gta02_bat_get_voltage()/1000);
++}
++
++static int gta02_bat_get_charge_full(void)
++{
++ return GTA02_BAT_CHARGE_FULL;
++}
++
++static int gta02_bat_get_charge_now(void)
++{
++ return gta02_bat_get_capacity() * gta02_bat_get_charge_full() / 100;
++}
++
++static enum power_supply_property gta02_platform_bat_properties[] = {
++ POWER_SUPPLY_PROP_PRESENT,
++ POWER_SUPPLY_PROP_STATUS,
++ POWER_SUPPLY_PROP_VOLTAGE_NOW,
++ POWER_SUPPLY_PROP_CAPACITY,
++ POWER_SUPPLY_PROP_CHARGE_FULL,
++ POWER_SUPPLY_PROP_CHARGE_NOW,
++};
++
++int (*gta02_platform_bat_get_property[])(void) = {
++ gta02_bat_get_present,
++ gta02_bat_get_status,
++ gta02_bat_get_voltage,
++ gta02_bat_get_capacity,
++ gta02_bat_get_charge_full,
++ gta02_bat_get_charge_now,
++};
++
++static struct platform_bat_platform_data gta02_platform_bat_pdata = {
++ .name = "battery",
++ .properties = gta02_platform_bat_properties,
++ .num_properties = ARRAY_SIZE(gta02_platform_bat_properties),
++ .get_property = gta02_platform_bat_get_property,
++ .is_present = gta02_bat_get_present,
++};
++
++struct platform_device gta02_platform_bat = {
++ .name = "platform_battery",
++ .id = -1,
++ .dev = {
++ .platform_data = &gta02_platform_bat_pdata,
++ }
++};
++
++/* HDQ */
++
++static void gta02_hdq_gpio_direction_out(void)
++{
++ s3c2410_gpio_cfgpin(GTA02v5_GPIO_HDQ, S3C2410_GPIO_OUTPUT);
++}
++
++static void gta02_hdq_gpio_direction_in(void)
++{
++ s3c2410_gpio_cfgpin(GTA02v5_GPIO_HDQ, S3C2410_GPIO_INPUT);
++}
++
++static void gta02_hdq_gpio_set_value(int val)
++{
++ s3c2410_gpio_setpin(GTA02v5_GPIO_HDQ, val);
++}
++
++static int gta02_hdq_gpio_get_value(void)
++{
++ return s3c2410_gpio_getpin(GTA02v5_GPIO_HDQ);
++}
++
++struct hdq_platform_data gta02_hdq_platform_data = {
++ .gpio_dir_out = gta02_hdq_gpio_direction_out,
++ .gpio_dir_in = gta02_hdq_gpio_direction_in,
++ .gpio_set = gta02_hdq_gpio_set_value,
++ .gpio_get = gta02_hdq_gpio_get_value,
++
++ .enable_fiq = gta02_fiq_enable,
++ .disable_fiq = gta02_fiq_disable,
++ .kick_fiq = gta02_fiq_kick,
++};
++
++struct platform_device gta02_hdq_device = {
++ .name = "hdq",
++ .id = -1,
++ .dev = {
++ .platform_data = &gta02_hdq_platform_data,
++ .parent = &s3c_device_timer[2].dev,
++ },
++};
++
+ static void __init gta02_map_io(void)
+ {
+ s3c24xx_init_io(gta02_iodesc, ARRAY_SIZE(gta02_iodesc));
+@@ -523,19 +1029,30 @@ static struct platform_device *gta02_devices[] __initdata = {
+ &s3c_device_usbgadget,
+ &s3c_device_nand,
+ &gta02_nor_flash,
+- &s3c24xx_pwm_device,
++ &s3c_device_timer[0],
++ &s3c_device_timer[1],
++ &s3c_device_timer[2],
++ &s3c_device_timer[3],
+ &s3c_device_iis,
+ &samsung_asoc_dma,
+ &s3c_device_i2c0,
+ &gta02_dfbmcs320_device,
+ &gta02_buttons_device,
++ &gta02_leds_device,
++ &gta02_pwm_leds_device,
+ &s3c_device_adc,
+ &s3c_device_ts,
++ &gta02_pm_bt_dev,
++ &gta02_pm_gps_dev,
++ &gta02_pm_wlan_dev,
++ &gta02_glamo_dev,
+ };
+
+ /* These guys DO need to be children of PMU. */
+
+ static struct platform_device *gta02_devices_pmu_children[] = {
++ &gta02_hdq_device,
++ &gta02_platform_bat,
+ };
+
+
+@@ -568,11 +1085,118 @@ static void gta02_poweroff(void)
+ pcf50633_reg_set_bit_mask(gta02_pcf, PCF50633_REG_OOCSHDWN, 1, 1);
+ }
+
++struct gta02_device_children {
++ const char *dev_name;
++ size_t num_children;
++ struct platform_device **children;
++ void (*probed_callback)(struct device *dev);
++};
++
++static struct platform_device *gta02_glamo_gpio_children[] = {
++ &spigpio_device,
++};
++
++static struct platform_device *gta02_pcf50633_gpio_children[] = {
++ &gta02_gsm_supply_device,
++};
++
++static struct platform_device *gta02_gsm_supply_children[] = {
++ &gta02_pm_gsm_dev,
++};
++
++static struct platform_device *gta02_hdq_children[] = {
++ &bq27000_battery_device,
++};
++
++
++static struct gta02_device_children gta02_device_children[] = {
++ {
++ .dev_name = "glamo-gpio.0",
++ .num_children = ARRAY_SIZE(gta02_glamo_gpio_children),
++ .children = gta02_glamo_gpio_children,
++ },
++ {
++ .dev_name = "pcf50633-gpio",
++ .num_children = 1,
++ .children = gta02_pcf50633_gpio_children,
++ },
++ {
++ .dev_name = "reg-fixed-voltage.1",
++ .num_children = 1,
++ .children = gta02_gsm_supply_children,
++ },
++ {
++ .dev_name = "spi2.0",
++ .probed_callback = gta02_jbt6k74_probe_completed,
++ },
++ {
++ .dev_name = "hdq",
++ .num_children = 1,
++ .children = gta02_hdq_children,
++ },
++};
++
++static int gta02_add_child_devices(struct device *parent,
++ struct platform_device **children, size_t num_children)
++{
++ size_t i;
++
++ for (i = 0; i < num_children; ++i)
++ children[i]->dev.parent = parent;
++
++ return platform_add_devices(children, num_children);
++}
++
++static int gta02_device_registered(struct notifier_block *block,
++ unsigned long action, void *data)
++{
++ struct device *dev = data;
++ const char *devname = dev_name(dev);
++ size_t i;
++
++ if (action != BUS_NOTIFY_BOUND_DRIVER)
++ return 0;
++
++ for (i = 0; i < ARRAY_SIZE(gta02_device_children); ++i) {
++ if (strcmp(devname, gta02_device_children[i].dev_name) == 0) {
++ gta02_add_child_devices(dev, gta02_device_children[i].children,
++ gta02_device_children[i].num_children);
++
++ if (gta02_device_children[i].probed_callback)
++ gta02_device_children[i].probed_callback(dev);
++ break;
++ }
++ }
++
++ return 0;
++}
++
++static struct notifier_block gta02_device_register_notifier = {
++ .notifier_call = gta02_device_registered,
++ .priority = INT_MAX,
++};
++
++
++/*
++ * Allow the bootloader to enable hw ecc
++ * hardware_ecc=1|0
++ */
++static int __init hardware_ecc_setup(char *str)
++{
++ if (str && str[0] == '1')
++ gta02_nand_info.software_ecc = 0;
++ return 1;
++}
++__setup("hardware_ecc=", hardware_ecc_setup);
++
+ static void __init gta02_machine_init(void)
+ {
+ /* Set the panic callback to turn AUX LED on or off. */
+ panic_blink = gta02_panic_blink;
+
++ bus_register_notifier(&platform_bus_type, &gta02_device_register_notifier);
++ bus_register_notifier(&spi_bus_type, &gta02_device_register_notifier);
++
+ s3c_pm_init();
+
+ #ifdef CONFIG_CHARGER_PCF50633
+@@ -584,10 +1208,13 @@ static void __init gta02_machine_init(void)
+ s3c_ohci_set_platdata(&gta02_usb_info);
+ s3c_nand_set_platdata(&gta02_nand_info);
+ s3c_i2c0_set_platdata(NULL);
++ spi_register_board_info(gta02_spi_board_info,
++ ARRAY_SIZE(gta02_spi_board_info));
+
+ i2c_register_board_info(0, gta02_i2c_devs, ARRAY_SIZE(gta02_i2c_devs));
+
+ platform_add_devices(gta02_devices, ARRAY_SIZE(gta02_devices));
++
+ pm_power_off = gta02_poweroff;
+
+ regulator_has_full_constraints();
+diff --git a/arch/arm/plat-s3c24xx/gpiolib.c b/arch/arm/plat-s3c24xx/gpiolib.c
+index 243b641..72fa584 100644
+--- a/arch/arm/plat-s3c24xx/gpiolib.c
++++ b/arch/arm/plat-s3c24xx/gpiolib.c
+@@ -217,6 +217,8 @@ static __init int s3c24xx_gpiolib_init(void)
+ int gpn;
+
+ for (gpn = 0; gpn < ARRAY_SIZE(s3c24xx_gpios); gpn++, chip++) {
++ if (chip->chip.base >= S3C_GPIO_END)
++ break;
+ if (!chip->config)
+ chip->config = &s3c24xx_gpiocfg_default;
+
+diff --git a/arch/arm/plat-s3c24xx/include/plat/irq.h b/arch/arm/plat-s3c24xx/include/plat/irq.h
+index ec087d6..3256861 100644
+--- a/arch/arm/plat-s3c24xx/include/plat/irq.h
++++ b/arch/arm/plat-s3c24xx/include/plat/irq.h
+@@ -12,6 +12,7 @@
+
+ #include <linux/io.h>
+
++#include <mach/irqs.h>
+ #include <mach/hardware.h>
+ #include <mach/regs-irq.h>
+ #include <mach/regs-gpio.h>
+@@ -31,8 +32,15 @@ s3c_irqsub_mask(unsigned int irqno, unsigned int parentbit,
+ {
+ unsigned long mask;
+ unsigned long submask;
++#ifdef CONFIG_S3C2440_C_FIQ
++ unsigned long flags;
++#endif
+
+ submask = __raw_readl(S3C2410_INTSUBMSK);
++#ifdef CONFIG_S3C2440_C_FIQ
++ local_save_flags(flags);
++ local_fiq_disable();
++#endif
+ mask = __raw_readl(S3C2410_INTMSK);
+
+ submask |= (1UL << (irqno - IRQ_S3CUART_RX0));
+@@ -45,6 +53,9 @@ s3c_irqsub_mask(unsigned int irqno, unsigned int parentbit,
+
+ /* write back masks */
+ __raw_writel(submask, S3C2410_INTSUBMSK);
++#ifdef CONFIG_S3C2440_C_FIQ
++ local_irq_restore(flags);
++#endif
+
+ }
+
+@@ -53,8 +64,15 @@ s3c_irqsub_unmask(unsigned int irqno, unsigned int parentbit)
+ {
+ unsigned long mask;
+ unsigned long submask;
++#ifdef CONFIG_S3C2440_C_FIQ
++ unsigned long flags;
++#endif
+
+ submask = __raw_readl(S3C2410_INTSUBMSK);
++#ifdef CONFIG_S3C2440_C_FIQ
++ local_save_flags(flags);
++ local_fiq_disable();
++#endif
+ mask = __raw_readl(S3C2410_INTMSK);
+
+ submask &= ~(1UL << (irqno - IRQ_S3CUART_RX0));
+@@ -63,6 +81,9 @@ s3c_irqsub_unmask(unsigned int irqno, unsigned int parentbit)
+ /* write back masks */
+ __raw_writel(submask, S3C2410_INTSUBMSK);
+ __raw_writel(mask, S3C2410_INTMSK);
++#ifdef CONFIG_S3C2440_C_FIQ
++ local_irq_restore(flags);
++#endif
+ }
+
+
+diff --git a/arch/arm/plat-s3c24xx/irq.c b/arch/arm/plat-s3c24xx/irq.c
+index 9aee7e1..1317f04 100644
+--- a/arch/arm/plat-s3c24xx/irq.c
++++ b/arch/arm/plat-s3c24xx/irq.c
+@@ -28,6 +28,8 @@
+ #include <asm/mach/irq.h>
+
+ #include <plat/regs-irqtype.h>
++#include <mach/regs-irq.h>
++#include <mach/regs-gpio.h>
+
+ #include <plat/cpu.h>
+ #include <plat/pm.h>
+@@ -39,9 +41,20 @@ s3c_irq_mask(struct irq_data *data)
+ unsigned int irqno = data->irq - IRQ_EINT0;
+ unsigned long mask;
+
++#ifdef CONFIG_S3C2440_C_FIQ
++ unsigned long flags;
++
++ local_save_flags(flags);
++ local_fiq_disable();
++#endif
++
+ mask = __raw_readl(S3C2410_INTMSK);
+ mask |= 1UL << irqno;
+ __raw_writel(mask, S3C2410_INTMSK);
++
++#ifdef CONFIG_S3C2440_C_FIQ
++ local_irq_restore(flags);
++#endif
+ }
+
+ static inline void
+@@ -58,9 +71,19 @@ s3c_irq_maskack(struct irq_data *data)
+ {
+ unsigned long bitval = 1UL << (data->irq - IRQ_EINT0);
+ unsigned long mask;
++#ifdef CONFIG_S3C2440_C_FIQ
++ unsigned long flags;
++#endif
+
++#ifdef CONFIG_S3C2440_C_FIQ
++ local_save_flags(flags);
++ local_fiq_disable();
++#endif
+ mask = __raw_readl(S3C2410_INTMSK);
+ __raw_writel(mask|bitval, S3C2410_INTMSK);
++#ifdef CONFIG_S3C2440_C_FIQ
++ local_irq_restore(flags);
++#endif
+
+ __raw_writel(bitval, S3C2410_SRCPND);
+ __raw_writel(bitval, S3C2410_INTPND);
+@@ -72,15 +95,25 @@ s3c_irq_unmask(struct irq_data *data)
+ {
+ unsigned int irqno = data->irq;
+ unsigned long mask;
++#ifdef CONFIG_S3C2440_C_FIQ
++ unsigned long flags;
++#endif
+
+ if (irqno != IRQ_TIMER4 && irqno != IRQ_EINT8t23)
+ irqdbf2("s3c_irq_unmask %d\n", irqno);
+
+ irqno -= IRQ_EINT0;
+
++#ifdef CONFIG_S3C2440_C_FIQ
++ local_save_flags(flags);
++ local_fiq_disable();
++#endif
+ mask = __raw_readl(S3C2410_INTMSK);
+ mask &= ~(1UL << irqno);
+ __raw_writel(mask, S3C2410_INTMSK);
++#ifdef CONFIG_S3C2440_C_FIQ
++ local_irq_restore(flags);
++#endif
+ }
+
+ struct irq_chip s3c_irq_level_chip = {
+@@ -553,26 +586,26 @@ void __init s3c24xx_init_irq(void)
+
+ last = 0;
+ for (i = 0; i < 4; i++) {
+- pend = __raw_readl(S3C2410_INTPND);
++ pend = __raw_readl(S3C2410_SUBSRCPND);
+
+ if (pend == 0 || pend == last)
+ break;
+
+- __raw_writel(pend, S3C2410_SRCPND);
+- __raw_writel(pend, S3C2410_INTPND);
+- printk("irq: clearing pending status %08x\n", (int)pend);
++ printk("irq: clearing subpending status %08x\n", (int)pend);
++ __raw_writel(pend, S3C2410_SUBSRCPND);
+ last = pend;
+ }
+
+ last = 0;
+ for (i = 0; i < 4; i++) {
+- pend = __raw_readl(S3C2410_SUBSRCPND);
++ pend = __raw_readl(S3C2410_INTPND);
+
+ if (pend == 0 || pend == last)
+ break;
+
+- printk("irq: clearing subpending status %08x\n", (int)pend);
+- __raw_writel(pend, S3C2410_SUBSRCPND);
++ __raw_writel(pend, S3C2410_SRCPND);
++ __raw_writel(pend, S3C2410_INTPND);
++ printk("irq: clearing pending status %08x\n", (int)pend);
+ last = pend;
+ }
+
+@@ -624,14 +657,14 @@ void __init s3c24xx_init_irq(void)
+ for (irqno = IRQ_EINT0; irqno <= IRQ_EINT3; irqno++) {
+ irqdbf("registering irq %d (ext int)\n", irqno);
+ irq_set_chip_and_handler(irqno, &s3c_irq_eint0t4,
+- handle_edge_irq);
++ handle_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);
+ irq_set_chip_and_handler(irqno, &s3c_irqext_chip,
+- handle_edge_irq);
++ handle_level_irq);
+ set_irq_flags(irqno, IRQF_VALID);
+ }
+
+diff --git a/arch/arm/plat-samsung/include/plat/nand.h b/arch/arm/plat-samsung/include/plat/nand.h
+index b64115f..cbdc8f0 100644
+--- a/arch/arm/plat-samsung/include/plat/nand.h
++++ b/arch/arm/plat-samsung/include/plat/nand.h
+@@ -49,6 +49,7 @@ struct s3c2410_platform_nand {
+ int twrph1; /* time for release CLE/ALE from nWE/nOE inactive */
+
+ unsigned int ignore_unset_ecc:1;
++ unsigned int software_ecc:1; /* force software ecc at runtime */
+
+ int nr_sets;
+ struct s3c2410_nand_set *sets;
+diff --git a/drivers/Kconfig b/drivers/Kconfig
+index 177c7d1..14e9dd6 100644
+--- a/drivers/Kconfig
++++ b/drivers/Kconfig
+@@ -116,6 +116,8 @@ source "drivers/staging/Kconfig"
+
+ source "drivers/platform/Kconfig"
+
++source "drivers/ar6000/Kconfig"
++
+ source "drivers/clk/Kconfig"
+
+ source "drivers/hwspinlock/Kconfig"
+diff --git a/drivers/Makefile b/drivers/Makefile
+index 3f135b6..1077025 100644
+--- a/drivers/Makefile
++++ b/drivers/Makefile
+@@ -95,6 +95,7 @@ obj-$(CONFIG_CPU_IDLE) += cpuidle/
+ obj-$(CONFIG_DMA_ENGINE) += dma/
+ obj-$(CONFIG_MMC) += mmc/
+ obj-$(CONFIG_MEMSTICK) += memstick/
++obj-$(CONFIG_AR6000_WLAN) += ar6000/
+ obj-$(CONFIG_NEW_LEDS) += leds/
+ obj-$(CONFIG_INFINIBAND) += infiniband/
+ obj-$(CONFIG_SGI_SN) += sn/
+diff --git a/drivers/ar6000/Kconfig b/drivers/ar6000/Kconfig
+new file mode 100644
+index 0000000..29b28b8
+--- /dev/null
++++ b/drivers/ar6000/Kconfig
+@@ -0,0 +1,32 @@
++config AR6000_WLAN
++ tristate "AR6000 wireless networking over SDIO"
++ depends on MMC
++ select WIRELESS_EXT
++ select WEXT_PRIV
++ default m
++ help
++ good luck.
++
++config AR6000_WLAN_DEBUG
++ bool "Enable retrieval of firmware debugging information"
++ depends on AR6000_WLAN
++ default n
++ help
++ The AR6k firmware maintains a log of debugging events that
++ gets flushed to the host on various occasions. Retrieval of
++ this data is very slow, taking several seconds.
++
++ If in doubt, say N.
++
++config AR6000_WLAN_RESET
++ bool "Soft-reset when shutting down"
++ depends on AR6000_WLAN
++ default n
++ help
++ The AR6k module can be explicitly reset when shutting down
++ the device. This adds a delay of about two seconds to suspend,
++ module removal, and so on. Since the WLAN SDIO function is
++ generally disabled soon thereafter anyway, this reset seems
++ superfluous.
++
++ If in doubt, say N.
+diff --git a/drivers/ar6000/Makefile b/drivers/ar6000/Makefile
+new file mode 100644
+index 0000000..f8f4431
+--- /dev/null
++++ b/drivers/ar6000/Makefile
+@@ -0,0 +1,38 @@
++REV ?= 2
++
++PWD := $(shell pwd)
++
++EXTRA_CFLAGS += -I$(src)/include
++
++EXTRA_CFLAGS += -DLINUX -D__KERNEL__ -DHTC_RAW_INTERFACE\
++ -DTCMD -DUSER_KEYS \
++ -DNO_SYNC_FLUSH #\
++ -DMULTIPLE_FRAMES_PER_INTERRUPT -DAR6000REV$(REV) \
++ -DBLOCK_TX_PATH_FLAG \
++ -DSDIO \
++
++EXTRA_CFLAGS += -DKERNEL_2_6
++
++obj-$(CONFIG_AR6000_WLAN) += ar6000.o
++
++ar6000-objs += htc/ar6k.o \
++ htc/ar6k_events.o \
++ htc/htc_send.o \
++ htc/htc_recv.o \
++ htc/htc_services.o \
++ htc/htc.o \
++ hif/hif2.o \
++ bmi/bmi.o \
++ ar6000/ar6000_drv.o \
++ ar6000/ar6000_raw_if.o \
++ ar6000/netbuf.o \
++ ar6000/wireless_ext.o \
++ ar6000/ioctl.o \
++ miscdrv/common_drv.o \
++ miscdrv/credit_dist.o \
++ wmi/wmi.o \
++ wlan/wlan_node.o \
++ wlan/wlan_recv_beacon.o \
++ wlan/wlan_utils.o
++
++
+diff --git a/drivers/ar6000/ar6000/ar6000_drv.c b/drivers/ar6000/ar6000/ar6000_drv.c
+new file mode 100644
+index 0000000..90533ab
+--- /dev/null
++++ b/drivers/ar6000/ar6000/ar6000_drv.c
+@@ -0,0 +1,3129 @@
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++/*
++ * This driver is a pseudo ethernet driver to access the Atheros AR6000
++ * WLAN Device
++ */
++static const char athId[] __attribute__ ((unused)) = "$Id: //depot/sw/releases/olca2.0-GPL/host/os/linux/ar6000_drv.c#2 $";
++
++#include "ar6000_drv.h"
++#include "htc.h"
++
++MODULE_LICENSE("GPL and additional rights");
++
++#ifndef REORG_APTC_HEURISTICS
++#undef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++#endif /* REORG_APTC_HEURISTICS */
++
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++#define APTC_TRAFFIC_SAMPLING_INTERVAL 100 /* msec */
++#define APTC_UPPER_THROUGHPUT_THRESHOLD 3000 /* Kbps */
++#define APTC_LOWER_THROUGHPUT_THRESHOLD 2000 /* Kbps */
++
++typedef struct aptc_traffic_record {
++ A_BOOL timerScheduled;
++ struct timeval samplingTS;
++ unsigned long bytesReceived;
++ unsigned long bytesTransmitted;
++} APTC_TRAFFIC_RECORD;
++
++A_TIMER aptcTimer;
++APTC_TRAFFIC_RECORD aptcTR;
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++
++unsigned int bypasswmi = 0;
++unsigned int debuglevel = 0;
++int tspecCompliance = 1;
++unsigned int busspeedlow = 0;
++unsigned int onebitmode = 0;
++unsigned int skipflash = 0;
++unsigned int wmitimeout = 2;
++unsigned int wlanNodeCaching = 1;
++unsigned int enableuartprint = 0;
++unsigned int logWmiRawMsgs = 0;
++unsigned int enabletimerwar = 0;
++unsigned int mbox_yield_limit = 99;
++int reduce_credit_dribble = 1 + HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_ONE_HALF;
++int allow_trace_signal = 0;
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++unsigned int testmode =0;
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
++module_param(bypasswmi, int, 0644);
++module_param(debuglevel, int, 0644);
++module_param(tspecCompliance, int, 0644);
++module_param(onebitmode, int, 0644);
++module_param(busspeedlow, int, 0644);
++module_param(skipflash, int, 0644);
++module_param(wmitimeout, int, 0644);
++module_param(wlanNodeCaching, int, 0644);
++module_param(logWmiRawMsgs, int, 0644);
++module_param(enableuartprint, int, 0644);
++module_param(enabletimerwar, int, 0644);
++module_param(mbox_yield_limit, int, 0644);
++module_param(reduce_credit_dribble, int, 0644);
++module_param(allow_trace_signal, int, 0644);
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++module_param(testmode, int, 0644);
++#endif
++#else
++
++#define __user
++/* for linux 2.4 and lower */
++MODULE_PARM(bypasswmi,"i");
++MODULE_PARM(debuglevel, "i");
++MODULE_PARM(onebitmode,"i");
++MODULE_PARM(busspeedlow, "i");
++MODULE_PARM(skipflash, "i");
++MODULE_PARM(wmitimeout, "i");
++MODULE_PARM(wlanNodeCaching, "i");
++MODULE_PARM(enableuartprint,"i");
++MODULE_PARM(logWmiRawMsgs, "i");
++MODULE_PARM(enabletimerwar,"i");
++MODULE_PARM(mbox_yield_limit,"i");
++MODULE_PARM(reduce_credit_dribble,"i");
++MODULE_PARM(allow_trace_signal,"i");
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++MODULE_PARM(testmode, "i");
++#endif
++#endif
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
++/* in 2.6.10 and later this is now a pointer to a uint */
++unsigned int _mboxnum = HTC_MAILBOX_NUM_MAX;
++#define mboxnum &_mboxnum
++#else
++unsigned int mboxnum = HTC_MAILBOX_NUM_MAX;
++#endif
++
++#ifdef CONFIG_AR6000_WLAN_RESET
++unsigned int resetok = 1;
++#else
++unsigned int resetok = 0;
++#endif
++
++#ifdef DEBUG
++A_UINT32 g_dbg_flags = DBG_DEFAULTS;
++unsigned int debugflags = 0;
++int debugdriver = 1;
++unsigned int debughtc = 128;
++unsigned int debugbmi = 1;
++unsigned int debughif = 2;
++unsigned int txcreditsavailable[HTC_MAILBOX_NUM_MAX] = {0};
++unsigned int txcreditsconsumed[HTC_MAILBOX_NUM_MAX] = {0};
++unsigned int txcreditintrenable[HTC_MAILBOX_NUM_MAX] = {0};
++unsigned int txcreditintrenableaggregate[HTC_MAILBOX_NUM_MAX] = {0};
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
++module_param(debugflags, int, 0644);
++module_param(debugdriver, int, 0644);
++module_param(debughtc, int, 0644);
++module_param(debugbmi, int, 0644);
++module_param(debughif, int, 0644);
++module_param(resetok, int, 0644);
++module_param_array(txcreditsavailable, int, mboxnum, 0644);
++module_param_array(txcreditsconsumed, int, mboxnum, 0644);
++module_param_array(txcreditintrenable, int, mboxnum, 0644);
++module_param_array(txcreditintrenableaggregate, int, mboxnum, 0644);
++#else
++/* linux 2.4 and lower */
++MODULE_PARM(debugflags,"i");
++MODULE_PARM(debugdriver, "i");
++MODULE_PARM(debughtc, "i");
++MODULE_PARM(debugbmi, "i");
++MODULE_PARM(debughif, "i");
++MODULE_PARM(resetok, "i");
++MODULE_PARM(txcreditsavailable, "0-3i");
++MODULE_PARM(txcreditsconsumed, "0-3i");
++MODULE_PARM(txcreditintrenable, "0-3i");
++MODULE_PARM(txcreditintrenableaggregate, "0-3i");
++#endif
++
++#endif /* DEBUG */
++
++unsigned int tx_attempt[HTC_MAILBOX_NUM_MAX] = {0};
++unsigned int tx_post[HTC_MAILBOX_NUM_MAX] = {0};
++unsigned int tx_complete[HTC_MAILBOX_NUM_MAX] = {0};
++unsigned int hifBusRequestNumMax = 40;
++unsigned int war23838_disabled = 0;
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++unsigned int enableAPTCHeuristics = 1;
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
++module_param_array(tx_attempt, int, mboxnum, 0644);
++module_param_array(tx_post, int, mboxnum, 0644);
++module_param_array(tx_complete, int, mboxnum, 0644);
++module_param(hifBusRequestNumMax, int, 0644);
++module_param(war23838_disabled, int, 0644);
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++module_param(enableAPTCHeuristics, int, 0644);
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++#else
++MODULE_PARM(tx_attempt, "0-3i");
++MODULE_PARM(tx_post, "0-3i");
++MODULE_PARM(tx_complete, "0-3i");
++MODULE_PARM(hifBusRequestNumMax, "i");
++MODULE_PARM(war23838_disabled, "i");
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++MODULE_PARM(enableAPTCHeuristics, "i");
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++#endif
++
++#ifdef BLOCK_TX_PATH_FLAG
++int blocktx = 0;
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
++module_param(blocktx, int, 0644);
++#else
++MODULE_PARM(blocktx, "i");
++#endif
++#endif /* BLOCK_TX_PATH_FLAG */
++
++// TODO move to arsoft_c
++USER_RSSI_THOLD rssi_map[12];
++
++int reconnect_flag = 0;
++
++DECLARE_WAIT_QUEUE_HEAD(ar6000_scan_queue);
++
++/* Function declarations */
++static int ar6000_init_module(void);
++static void ar6000_cleanup_module(void);
++
++int ar6000_init(struct net_device *dev);
++static int ar6000_open(struct net_device *dev);
++static int ar6000_close(struct net_device *dev);
++static int ar6000_cleanup(struct net_device *dev);
++static void ar6000_init_control_info(AR_SOFTC_T *ar);
++static int ar6000_data_tx(struct sk_buff *skb, struct net_device *dev);
++
++static void ar6000_destroy(struct net_device *dev, unsigned int unregister);
++static void ar6000_detect_error(unsigned long ptr);
++static struct net_device_stats *ar6000_get_stats(struct net_device *dev);
++static struct iw_statistics *ar6000_get_iwstats(struct net_device * dev);
++
++/*
++ * HTC service connection handlers
++ */
++static void ar6000_avail_ev(HTC_HANDLE HTCHandle);
++
++static void ar6000_unavail_ev(void *Instance);
++
++static void ar6000_target_failure(void *Instance, A_STATUS Status);
++
++static void ar6000_rx(void *Context, HTC_PACKET *pPacket);
++
++static void ar6000_rx_refill(void *Context,HTC_ENDPOINT_ID Endpoint);
++
++static void ar6000_tx_complete(void *Context, HTC_PACKET *pPacket);
++
++static void ar6000_tx_queue_full(void *Context, HTC_ENDPOINT_ID Endpoint);
++
++static void ar6000_tx_queue_avail(void *Context, HTC_ENDPOINT_ID Endpoint);
++
++/*
++ * Static variables
++ */
++
++static struct net_device *ar6000_devices[MAX_AR6000];
++extern struct iw_handler_def ath_iw_handler_def;
++DECLARE_WAIT_QUEUE_HEAD(arEvent);
++static void ar6000_cookie_init(AR_SOFTC_T *ar);
++static void ar6000_cookie_cleanup(AR_SOFTC_T *ar);
++static void ar6000_free_cookie(AR_SOFTC_T *ar, struct ar_cookie * cookie);
++static struct ar_cookie *ar6000_alloc_cookie(AR_SOFTC_T *ar);
++static void ar6000_TxDataCleanup(AR_SOFTC_T *ar);
++
++#ifdef USER_KEYS
++static A_STATUS ar6000_reinstall_keys(AR_SOFTC_T *ar,A_UINT8 key_op_ctrl);
++#endif
++
++
++static struct ar_cookie s_ar_cookie_mem[MAX_COOKIE_NUM];
++
++#define HOST_INTEREST_ITEM_ADDRESS(ar, item) \
++((ar->arTargetType == TARGET_TYPE_AR6001) ? \
++ AR6001_HOST_INTEREST_ITEM_ADDRESS(item) : \
++ AR6002_HOST_INTEREST_ITEM_ADDRESS(item))
++
++
++/* Debug log support */
++
++/*
++ * Flag to govern whether the debug logs should be parsed in the kernel
++ * or reported to the application.
++ */
++#ifdef DEBUG
++#define REPORT_DEBUG_LOGS_TO_APP
++#endif
++
++A_STATUS
++ar6000_set_host_app_area(AR_SOFTC_T *ar)
++{
++ A_UINT32 address, data;
++ struct host_app_area_s host_app_area;
++
++ /* Fetch the address of the host_app_area_s instance in the host interest area */
++ address = HOST_INTEREST_ITEM_ADDRESS(ar, hi_app_host_interest);
++ if (ar6000_ReadRegDiag(ar->arHifDevice, &address, &data) != A_OK) {
++ return A_ERROR;
++ }
++ address = data;
++ host_app_area.wmi_protocol_ver = WMI_PROTOCOL_VERSION;
++ if (ar6000_WriteDataDiag(ar->arHifDevice, address,
++ (A_UCHAR *)&host_app_area,
++ sizeof(struct host_app_area_s)) != A_OK)
++ {
++ return A_ERROR;
++ }
++
++ return A_OK;
++}
++
++A_UINT32
++dbglog_get_debug_hdr_ptr(AR_SOFTC_T *ar)
++{
++ A_UINT32 param;
++ A_UINT32 address;
++ A_STATUS status;
++
++ address = HOST_INTEREST_ITEM_ADDRESS(ar, hi_dbglog_hdr);
++ if ((status = ar6000_ReadDataDiag(ar->arHifDevice, address,
++ (A_UCHAR *)&param, 4)) != A_OK)
++ {
++ param = 0;
++ }
++
++ return param;
++}
++
++/*
++ * The dbglog module has been initialized. Its ok to access the relevant
++ * data stuctures over the diagnostic window.
++ */
++void
++ar6000_dbglog_init_done(AR_SOFTC_T *ar)
++{
++ ar->dbglog_init_done = TRUE;
++}
++
++A_UINT32
++dbglog_get_debug_fragment(A_INT8 *datap, A_UINT32 len, A_UINT32 limit)
++{
++ A_INT32 *buffer;
++ A_UINT32 count;
++ A_UINT32 numargs;
++ A_UINT32 length;
++ A_UINT32 fraglen;
++
++ count = fraglen = 0;
++ buffer = (A_INT32 *)datap;
++ length = (limit >> 2);
++
++ if (len <= limit) {
++ fraglen = len;
++ } else {
++ while (count < length) {
++ numargs = DBGLOG_GET_NUMARGS(buffer[count]);
++ fraglen = (count << 2);
++ count += numargs + 1;
++ }
++ }
++
++ return fraglen;
++}
++
++void
++dbglog_parse_debug_logs(A_INT8 *datap, A_UINT32 len)
++{
++ A_INT32 *buffer;
++ A_UINT32 count;
++ A_UINT32 timestamp;
++ A_UINT32 debugid;
++ A_UINT32 moduleid;
++ A_UINT32 numargs;
++ A_UINT32 length;
++
++ count = 0;
++ buffer = (A_INT32 *)datap;
++ length = (len >> 2);
++ while (count < length) {
++ debugid = DBGLOG_GET_DBGID(buffer[count]);
++ moduleid = DBGLOG_GET_MODULEID(buffer[count]);
++ numargs = DBGLOG_GET_NUMARGS(buffer[count]);
++ timestamp = DBGLOG_GET_TIMESTAMP(buffer[count]);
++ switch (numargs) {
++ case 0:
++ AR_DEBUG_PRINTF("%d %d (%d)\n", moduleid, debugid, timestamp);
++ break;
++
++ case 1:
++ AR_DEBUG_PRINTF("%d %d (%d): 0x%x\n", moduleid, debugid,
++ timestamp, buffer[count+1]);
++ break;
++
++ case 2:
++ AR_DEBUG_PRINTF("%d %d (%d): 0x%x, 0x%x\n", moduleid, debugid,
++ timestamp, buffer[count+1], buffer[count+2]);
++ break;
++
++ default:
++ AR_DEBUG_PRINTF("Invalid args: %d\n", numargs);
++ }
++ count += numargs + 1;
++ }
++}
++
++int
++ar6000_dbglog_get_debug_logs(AR_SOFTC_T *ar)
++{
++ struct dbglog_hdr_s debug_hdr;
++ struct dbglog_buf_s debug_buf;
++ A_UINT32 address;
++ A_UINT32 length;
++ A_UINT32 dropped;
++ A_UINT32 firstbuf;
++ A_UINT32 debug_hdr_ptr;
++
++ if (!ar->dbglog_init_done) return A_ERROR;
++
++#ifndef CONFIG_AR6000_WLAN_DEBUG
++ return 0;
++#endif
++
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++
++ if (ar->dbgLogFetchInProgress) {
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ return A_EBUSY;
++ }
++
++ /* block out others */
++ ar->dbgLogFetchInProgress = TRUE;
++
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++
++ debug_hdr_ptr = dbglog_get_debug_hdr_ptr(ar);
++ printk("debug_hdr_ptr: 0x%x\n", debug_hdr_ptr);
++
++ /* Get the contents of the ring buffer */
++ if (debug_hdr_ptr) {
++ address = debug_hdr_ptr;
++ length = sizeof(struct dbglog_hdr_s);
++ ar6000_ReadDataDiag(ar->arHifDevice, address,
++ (A_UCHAR *)&debug_hdr, length);
++ address = (A_UINT32)debug_hdr.dbuf;
++ firstbuf = address;
++ dropped = debug_hdr.dropped;
++ length = sizeof(struct dbglog_buf_s);
++ ar6000_ReadDataDiag(ar->arHifDevice, address,
++ (A_UCHAR *)&debug_buf, length);
++
++ do {
++ address = (A_UINT32)debug_buf.buffer;
++ length = debug_buf.length;
++ if ((length) && (debug_buf.length <= debug_buf.bufsize)) {
++ /* Rewind the index if it is about to overrun the buffer */
++ if (ar->log_cnt > (DBGLOG_HOST_LOG_BUFFER_SIZE - length)) {
++ ar->log_cnt = 0;
++ }
++ if(A_OK != ar6000_ReadDataDiag(ar->arHifDevice, address,
++ (A_UCHAR *)&ar->log_buffer[ar->log_cnt], length))
++ {
++ break;
++ }
++ ar6000_dbglog_event(ar, dropped, &ar->log_buffer[ar->log_cnt], length);
++ ar->log_cnt += length;
++ } else {
++ AR_DEBUG_PRINTF("Length: %d (Total size: %d)\n",
++ debug_buf.length, debug_buf.bufsize);
++ }
++
++ address = (A_UINT32)debug_buf.next;
++ length = sizeof(struct dbglog_buf_s);
++ if(A_OK != ar6000_ReadDataDiag(ar->arHifDevice, address,
++ (A_UCHAR *)&debug_buf, length))
++ {
++ break;
++ }
++
++ } while (address != firstbuf);
++ }
++
++ ar->dbgLogFetchInProgress = FALSE;
++
++ return A_OK;
++}
++
++void
++ar6000_dbglog_event(AR_SOFTC_T *ar, A_UINT32 dropped,
++ A_INT8 *buffer, A_UINT32 length)
++{
++#ifdef REPORT_DEBUG_LOGS_TO_APP
++ #define MAX_WIRELESS_EVENT_SIZE 252
++ /*
++ * Break it up into chunks of MAX_WIRELESS_EVENT_SIZE bytes of messages.
++ * There seems to be a limitation on the length of message that could be
++ * transmitted to the user app via this mechanism.
++ */
++ A_UINT32 send, sent;
++
++ sent = 0;
++ send = dbglog_get_debug_fragment(&buffer[sent], length - sent,
++ MAX_WIRELESS_EVENT_SIZE);
++ while (send) {
++ ar6000_send_event_to_app(ar, WMIX_DBGLOG_EVENTID, &buffer[sent], send);
++ sent += send;
++ send = dbglog_get_debug_fragment(&buffer[sent], length - sent,
++ MAX_WIRELESS_EVENT_SIZE);
++ }
++#else
++ AR_DEBUG_PRINTF("Dropped logs: 0x%x\nDebug info length: %d\n",
++ dropped, length);
++
++ /* Interpret the debug logs */
++ dbglog_parse_debug_logs(buffer, length);
++#endif /* REPORT_DEBUG_LOGS_TO_APP */
++}
++
++
++
++static int __init
++ar6000_init_module(void)
++{
++ static int probed = 0;
++ A_STATUS status;
++ HTC_INIT_INFO initInfo;
++
++ A_MEMZERO(&initInfo,sizeof(initInfo));
++ initInfo.AddInstance = ar6000_avail_ev;
++ initInfo.DeleteInstance = ar6000_unavail_ev;
++ initInfo.TargetFailure = ar6000_target_failure;
++
++
++#ifdef DEBUG
++ /* Set the debug flags if specified at load time */
++ if(debugflags != 0)
++ {
++ g_dbg_flags = debugflags;
++ }
++#endif
++
++ if (probed) {
++ return -ENODEV;
++ }
++ probed++;
++
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++ memset(&aptcTR, 0, sizeof(APTC_TRAFFIC_RECORD));
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++
++#ifdef CONFIG_HOST_GPIO_SUPPORT
++ ar6000_gpio_init();
++#endif /* CONFIG_HOST_GPIO_SUPPORT */
++
++ status = HTCInit(&initInfo);
++ if(status != A_OK)
++ return -ENODEV;
++
++ return 0;
++}
++
++static void __exit
++ar6000_cleanup_module(void)
++{
++ int i = 0;
++ struct net_device *ar6000_netdev;
++
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++ /* Delete the Adaptive Power Control timer */
++ if (timer_pending(&aptcTimer)) {
++ del_timer_sync(&aptcTimer);
++ }
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++
++ for (i=0; i < MAX_AR6000; i++) {
++ if (ar6000_devices[i] != NULL) {
++ ar6000_netdev = ar6000_devices[i];
++ ar6000_devices[i] = NULL;
++ ar6000_destroy(ar6000_netdev, 1);
++ }
++ }
++
++ /* shutting down HTC will cause the HIF layer to detach from the
++ * underlying bus driver which will cause the subsequent deletion of
++ * all HIF and HTC instances */
++ HTCShutDown();
++
++ AR_DEBUG_PRINTF("ar6000_cleanup: success\n");
++}
++
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++void
++aptcTimerHandler(unsigned long arg)
++{
++ A_UINT32 numbytes;
++ A_UINT32 throughput;
++ AR_SOFTC_T *ar;
++ A_STATUS status;
++
++ ar = (AR_SOFTC_T *)arg;
++ A_ASSERT(ar != NULL);
++ A_ASSERT(!timer_pending(&aptcTimer));
++
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++
++ /* Get the number of bytes transferred */
++ numbytes = aptcTR.bytesTransmitted + aptcTR.bytesReceived;
++ aptcTR.bytesTransmitted = aptcTR.bytesReceived = 0;
++
++ /* Calculate and decide based on throughput thresholds */
++ throughput = ((numbytes * 8)/APTC_TRAFFIC_SAMPLING_INTERVAL); /* Kbps */
++ if (throughput < APTC_LOWER_THROUGHPUT_THRESHOLD) {
++ /* Enable Sleep and delete the timer */
++ A_ASSERT(ar->arWmiReady == TRUE);
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ status = wmi_powermode_cmd(ar->arWmi, REC_POWER);
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ A_ASSERT(status == A_OK);
++ aptcTR.timerScheduled = FALSE;
++ } else {
++ A_TIMEOUT_MS(&aptcTimer, APTC_TRAFFIC_SAMPLING_INTERVAL, 0);
++ }
++
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++}
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++
++
++
++/* set HTC block size, assume BMI is already initialized */
++A_STATUS ar6000_SetHTCBlockSize(AR_SOFTC_T *ar)
++{
++ A_STATUS status;
++ A_UINT32 blocksizes[HTC_MAILBOX_NUM_MAX];
++
++ do {
++ /* get the block sizes */
++ status = HIFConfigureDevice(ar->arHifDevice, HIF_DEVICE_GET_MBOX_BLOCK_SIZE,
++ blocksizes, sizeof(blocksizes));
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF("Failed to get block size info from HIF layer...\n");
++ break;
++ }
++ /* note: we actually get the block size for mailbox 1, for SDIO the block
++ * size on mailbox 0 is artificially set to 1 */
++ /* must be a power of 2 */
++ A_ASSERT((blocksizes[1] & (blocksizes[1] - 1)) == 0);
++
++ /* set the host interest area for the block size */
++ status = BMIWriteMemory(ar->arHifDevice,
++ HOST_INTEREST_ITEM_ADDRESS(ar, hi_mbox_io_block_sz),
++ (A_UCHAR *)&blocksizes[1],
++ 4);
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF("BMIWriteMemory for IO block size failed \n");
++ break;
++ }
++
++ AR_DEBUG_PRINTF("Block Size Set: %d (target address:0x%X)\n",
++ blocksizes[1], HOST_INTEREST_ITEM_ADDRESS(ar, hi_mbox_io_block_sz));
++
++ /* set the host interest area for the mbox ISR yield limit */
++ status = BMIWriteMemory(ar->arHifDevice,
++ HOST_INTEREST_ITEM_ADDRESS(ar, hi_mbox_isr_yield_limit),
++ (A_UCHAR *)&mbox_yield_limit,
++ 4);
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF("BMIWriteMemory for yield limit failed \n");
++ break;
++ }
++
++ } while (FALSE);
++
++ return status;
++}
++
++static void free_raw_buffers(AR_SOFTC_T *ar)
++{
++ int i, j;
++
++ for (i = 0; i != HTC_RAW_STREAM_NUM_MAX; i++) {
++ for (j = 0; j != RAW_HTC_READ_BUFFERS_NUM; j++)
++ kfree(ar->raw_htc_read_buffer[i][j]);
++ for (j = 0; j != RAW_HTC_WRITE_BUFFERS_NUM; j++)
++ kfree(ar->raw_htc_write_buffer[i][j]);
++ }
++}
++
++static int alloc_raw_buffers(AR_SOFTC_T *ar)
++{
++ int i, j;
++ raw_htc_buffer *b;
++
++ for (i = 0; i != HTC_RAW_STREAM_NUM_MAX; i++) {
++ for (j = 0; j != RAW_HTC_READ_BUFFERS_NUM; j++) {
++ b = kzalloc(sizeof(*b), GFP_KERNEL);
++ if (!b)
++ return -ENOMEM;
++ ar->raw_htc_read_buffer[i][j] = b;
++ }
++ for (j = 0; j != RAW_HTC_WRITE_BUFFERS_NUM; j++) {
++ b = kzalloc(sizeof(*b), GFP_KERNEL);
++ if (!b)
++ return -ENOMEM;
++ ar->raw_htc_write_buffer[i][j] = b;
++ }
++ }
++ return 0;
++}
++
++static const struct net_device_ops ar6000_netdev_ops = {
++ .ndo_init = &ar6000_init,
++ .ndo_open = &ar6000_open,
++ .ndo_stop = &ar6000_close,
++ .ndo_start_xmit = &ar6000_data_tx,
++ .ndo_get_stats = &ar6000_get_stats,
++ .ndo_do_ioctl = &ar6000_ioctl,
++};
++/*
++ * HTC Event handlers
++ */
++static void
++ar6000_avail_ev(HTC_HANDLE HTCHandle)
++{
++ int i;
++ struct net_device *dev;
++ AR_SOFTC_T *ar;
++ int device_index = 0;
++
++ AR_DEBUG_PRINTF("ar6000_available\n");
++
++ for (i=0; i < MAX_AR6000; i++) {
++ if (ar6000_devices[i] == NULL) {
++ break;
++ }
++ }
++
++ if (i == MAX_AR6000) {
++ AR_DEBUG_PRINTF("ar6000_available: max devices reached\n");
++ return;
++ }
++
++ /* Save this. It gives a bit better readability especially since */
++ /* we use another local "i" variable below. */
++ device_index = i;
++
++ A_ASSERT(HTCHandle != NULL);
++
++ dev = alloc_etherdev(sizeof(AR_SOFTC_T));
++ if (dev == NULL) {
++ AR_DEBUG_PRINTF("ar6000_available: can't alloc etherdev\n");
++ return;
++ }
++
++ ether_setup(dev);
++
++ if (netdev_priv(dev) == NULL) {
++ printk(KERN_CRIT "ar6000_available: Could not allocate memory\n");
++ return;
++ }
++
++ A_MEMZERO(netdev_priv(dev), sizeof(AR_SOFTC_T));
++
++ ar = (AR_SOFTC_T *)netdev_priv(dev);
++ ar->arNetDev = dev;
++ ar->arHtcTarget = HTCHandle;
++ ar->arHifDevice = HTCGetHifDevice(HTCHandle);
++ ar->arWlanState = WLAN_ENABLED;
++ ar->arRadioSwitch = WLAN_ENABLED;
++ ar->arDeviceIndex = device_index;
++
++ A_INIT_TIMER(&ar->arHBChallengeResp.timer, ar6000_detect_error, dev);
++ ar->arHBChallengeResp.seqNum = 0;
++ ar->arHBChallengeResp.outstanding = FALSE;
++ ar->arHBChallengeResp.missCnt = 0;
++ ar->arHBChallengeResp.frequency = AR6000_HB_CHALLENGE_RESP_FREQ_DEFAULT;
++ ar->arHBChallengeResp.missThres = AR6000_HB_CHALLENGE_RESP_MISS_THRES_DEFAULT;
++
++ ar6000_init_control_info(ar);
++ init_waitqueue_head(&arEvent);
++ sema_init(&ar->arSem, 1);
++
++ if (alloc_raw_buffers(ar)) {
++ free_raw_buffers(ar);
++ /*
++ * @@@ Clean up our own mess, but for anything else, cheerfully mimick
++ * the beautiful error non-handling of the rest of this function.
++ */
++ return;
++ }
++
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++ A_INIT_TIMER(&aptcTimer, aptcTimerHandler, ar);
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++
++ /*
++ * If requested, perform some magic which requires no cooperation from
++ * the Target. It causes the Target to ignore flash and execute to the
++ * OS from ROM.
++ *
++ * This is intended to support recovery from a corrupted flash on Targets
++ * that support flash.
++ */
++ if (skipflash)
++ {
++ ar6000_reset_device_skipflash(ar->arHifDevice);
++ }
++
++ BMIInit();
++ {
++ struct bmi_target_info targ_info;
++
++ if (BMIGetTargetInfo(ar->arHifDevice, &targ_info) != A_OK) {
++ return;
++ }
++
++ ar->arVersion.target_ver = targ_info.target_ver;
++ ar->arTargetType = targ_info.target_type;
++ }
++
++ if (enableuartprint) {
++ A_UINT32 param;
++ param = 1;
++ if (BMIWriteMemory(ar->arHifDevice,
++ HOST_INTEREST_ITEM_ADDRESS(ar, hi_serial_enable),
++ (A_UCHAR *)&param,
++ 4)!= A_OK)
++ {
++ AR_DEBUG_PRINTF("BMIWriteMemory for enableuartprint failed \n");
++ return ;
++ }
++ AR_DEBUG_PRINTF("Serial console prints enabled\n");
++ }
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++ if(testmode) {
++ ar->arTargetMode = AR6000_TCMD_MODE;
++ }else {
++ ar->arTargetMode = AR6000_WLAN_MODE;
++ }
++#endif
++ if (enabletimerwar) {
++ A_UINT32 param;
++
++ if (BMIReadMemory(ar->arHifDevice,
++ HOST_INTEREST_ITEM_ADDRESS(ar, hi_option_flag),
++ (A_UCHAR *)&param,
++ 4)!= A_OK)
++ {
++ AR_DEBUG_PRINTF("BMIReadMemory for enabletimerwar failed \n");
++ return;
++ }
++
++ param |= HI_OPTION_TIMER_WAR;
++
++ if (BMIWriteMemory(ar->arHifDevice,
++ HOST_INTEREST_ITEM_ADDRESS(ar, hi_option_flag),
++ (A_UCHAR *)&param,
++ 4) != A_OK)
++ {
++ AR_DEBUG_PRINTF("BMIWriteMemory for enabletimerwar failed \n");
++ return;
++ }
++ AR_DEBUG_PRINTF("Timer WAR enabled\n");
++ }
++
++
++ /* since BMIInit is called in the driver layer, we have to set the block
++ * size here for the target */
++
++ if (A_FAILED(ar6000_SetHTCBlockSize(ar))) {
++ return;
++ }
++
++ spin_lock_init(&ar->arLock);
++
++ dev->netdev_ops = &ar6000_netdev_ops;
++ dev->watchdog_timeo = AR6000_TX_TIMEOUT;
++ ar6000_ioctl_iwsetup(&ath_iw_handler_def);
++ dev->wireless_handlers = &ath_iw_handler_def;
++ ath_iw_handler_def.get_wireless_stats = ar6000_get_iwstats; /*Displayed via proc fs */
++
++ /*
++ * We need the OS to provide us with more headroom in order to
++ * perform dix to 802.3, WMI header encap, and the HTC header
++ */
++ dev->hard_header_len = ETH_HLEN + sizeof(ATH_LLC_SNAP_HDR) +
++ sizeof(WMI_DATA_HDR) + HTC_HEADER_LEN;
++
++ /* This runs the init function */
++ SET_NETDEV_DEV(dev, HIFGetOSDevice(ar->arHifDevice));
++ if (register_netdev(dev)) {
++ AR_DEBUG_PRINTF("ar6000_avail: register_netdev failed\n");
++ ar6000_destroy(dev, 0);
++ return;
++ }
++
++ HTCSetInstance(ar->arHtcTarget, ar);
++
++ /* We only register the device in the global list if we succeed. */
++ /* If the device is in the global list, it will be destroyed */
++ /* when the module is unloaded. */
++ ar6000_devices[device_index] = dev;
++
++ AR_DEBUG_PRINTF("ar6000_avail: name=%s htcTarget=0x%x, dev=0x%x (%d), ar=0x%x\n",
++ dev->name, (A_UINT32)HTCHandle, (A_UINT32)dev, device_index,
++ (A_UINT32)ar);
++}
++
++static void ar6000_target_failure(void *Instance, A_STATUS Status)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)Instance;
++ WMI_TARGET_ERROR_REPORT_EVENT errEvent;
++ static A_BOOL sip = FALSE;
++
++ if (Status != A_OK) {
++ if (timer_pending(&ar->arHBChallengeResp.timer)) {
++ A_UNTIMEOUT(&ar->arHBChallengeResp.timer);
++ }
++
++ /* try dumping target assertion information (if any) */
++ ar6000_dump_target_assert_info(ar->arHifDevice,ar->arTargetType);
++
++ /*
++ * Fetch the logs from the target via the diagnostic
++ * window.
++ */
++ ar6000_dbglog_get_debug_logs(ar);
++
++ /* Report the error only once */
++ if (!sip) {
++ sip = TRUE;
++ errEvent.errorVal = WMI_TARGET_COM_ERR |
++ WMI_TARGET_FATAL_ERR;
++#ifdef SEND_EVENT_TO_APP
++ ar6000_send_event_to_app(ar, WMI_ERROR_REPORT_EVENTID,
++ (A_UINT8 *)&errEvent,
++ sizeof(WMI_TARGET_ERROR_REPORT_EVENT));
++#endif
++ }
++ }
++}
++
++static void
++ar6000_unavail_ev(void *Instance)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)Instance;
++ /* NULL out it's entry in the global list */
++ ar6000_devices[ar->arDeviceIndex] = NULL;
++ ar6000_destroy(ar->arNetDev, 1);
++}
++
++/*
++ * We need to differentiate between the surprise and planned removal of the
++ * device because of the following consideration:
++ * - In case of surprise removal, the hcd already frees up the pending
++ * for the device and hence there is no need to unregister the function
++ * driver inorder to get these requests. For planned removal, the function
++ * driver has to explictly unregister itself to have the hcd return all the
++ * pending requests before the data structures for the devices are freed up.
++ * Note that as per the current implementation, the function driver will
++ * end up releasing all the devices since there is no API to selectively
++ * release a particular device.
++ * - Certain commands issued to the target can be skipped for surprise
++ * removal since they will anyway not go through.
++ */
++static void
++ar6000_destroy(struct net_device *dev, unsigned int unregister)
++{
++ AR_SOFTC_T *ar;
++
++ AR_DEBUG_PRINTF("+ar6000_destroy \n");
++
++ if((dev == NULL) || ((ar = netdev_priv(dev)) == NULL))
++ {
++ AR_DEBUG_PRINTF("%s(): Failed to get device structure.\n", __func__);
++ return;
++ }
++
++ /* Clear the tx counters */
++ memset(tx_attempt, 0, sizeof(tx_attempt));
++ memset(tx_post, 0, sizeof(tx_post));
++ memset(tx_complete, 0, sizeof(tx_complete));
++
++ /* Free up the device data structure */
++ if (unregister) {
++ unregister_netdev(dev);
++ } else {
++ ar6000_close(dev);
++ ar6000_cleanup(dev);
++ }
++
++ free_raw_buffers(ar);
++
++#ifndef free_netdev
++ kfree(dev);
++#else
++ free_netdev(dev);
++#endif
++
++ AR_DEBUG_PRINTF("-ar6000_destroy \n");
++}
++
++static void ar6000_detect_error(unsigned long ptr)
++{
++ struct net_device *dev = (struct net_device *)ptr;
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_TARGET_ERROR_REPORT_EVENT errEvent;
++
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++
++ if (ar->arHBChallengeResp.outstanding) {
++ ar->arHBChallengeResp.missCnt++;
++ } else {
++ ar->arHBChallengeResp.missCnt = 0;
++ }
++
++ if (ar->arHBChallengeResp.missCnt > ar->arHBChallengeResp.missThres) {
++ /* Send Error Detect event to the application layer and do not reschedule the error detection module timer */
++ ar->arHBChallengeResp.missCnt = 0;
++ ar->arHBChallengeResp.seqNum = 0;
++ errEvent.errorVal = WMI_TARGET_COM_ERR | WMI_TARGET_FATAL_ERR;
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++#ifdef SEND_EVENT_TO_APP
++ ar6000_send_event_to_app(ar, WMI_ERROR_REPORT_EVENTID,
++ (A_UINT8 *)&errEvent,
++ sizeof(WMI_TARGET_ERROR_REPORT_EVENT));
++#endif
++ return;
++ }
++
++ /* Generate the sequence number for the next challenge */
++ ar->arHBChallengeResp.seqNum++;
++ ar->arHBChallengeResp.outstanding = TRUE;
++
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++
++ /* Send the challenge on the control channel */
++ if (wmi_get_challenge_resp_cmd(ar->arWmi, ar->arHBChallengeResp.seqNum, DRV_HB_CHALLENGE) != A_OK) {
++ AR_DEBUG_PRINTF("Unable to send heart beat challenge\n");
++ }
++
++
++ /* Reschedule the timer for the next challenge */
++ A_TIMEOUT_MS(&ar->arHBChallengeResp.timer, ar->arHBChallengeResp.frequency * 1000, 0);
++}
++
++void ar6000_init_profile_info(AR_SOFTC_T *ar)
++{
++ ar->arSsidLen = 0;
++ A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
++ ar->arNetworkType = INFRA_NETWORK;
++ ar->arDot11AuthMode = OPEN_AUTH;
++ ar->arAuthMode = NONE_AUTH;
++ ar->arPairwiseCrypto = NONE_CRYPT;
++ ar->arPairwiseCryptoLen = 0;
++ ar->arGroupCrypto = NONE_CRYPT;
++ ar->arGroupCryptoLen = 0;
++ A_MEMZERO(ar->arWepKeyList, sizeof(ar->arWepKeyList));
++ A_MEMZERO(ar->arReqBssid, sizeof(ar->arReqBssid));
++ A_MEMZERO(ar->arBssid, sizeof(ar->arBssid));
++ ar->arBssChannel = 0;
++}
++
++static void
++ar6000_init_control_info(AR_SOFTC_T *ar)
++{
++ ar->arWmiEnabled = FALSE;
++ ar6000_init_profile_info(ar);
++ ar->arDefTxKeyIndex = 0;
++ A_MEMZERO(ar->arWepKeyList, sizeof(ar->arWepKeyList));
++ ar->arChannelHint = 0;
++ ar->arListenInterval = MAX_LISTEN_INTERVAL;
++ ar->arVersion.host_ver = AR6K_SW_VERSION;
++ ar->arRssi = 0;
++ ar->arTxPwr = 0;
++ ar->arTxPwrSet = FALSE;
++ ar->arSkipScan = 0;
++ ar->arBeaconInterval = 0;
++ ar->arBitRate = 0;
++ ar->arMaxRetries = 0;
++ ar->arWmmEnabled = TRUE;
++}
++
++static int
++ar6000_open(struct net_device *dev)
++{
++ /* Wake up the queues */
++ netif_start_queue(dev);
++
++ return 0;
++}
++
++static int
++ar6000_close(struct net_device *dev)
++{
++ /* Stop the transmit queues */
++ netif_stop_queue(dev);
++ return 0;
++}
++
++static int
++ar6000_cleanup(struct net_device *dev)
++{
++ AR_SOFTC_T *ar = netdev_priv(dev);
++
++ /* Stop the transmit queues */
++ netif_stop_queue(dev);
++
++ /* Disable the target and the interrupts associated with it */
++ if (ar->arWmiReady == TRUE)
++ {
++ if (!bypasswmi)
++ {
++ if (ar->arConnected == TRUE || ar->arConnectPending == TRUE)
++ {
++ AR_DEBUG_PRINTF("%s(): Disconnect\n", __func__);
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ ar6000_init_profile_info(ar);
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ wmi_disconnect_cmd(ar->arWmi);
++ }
++
++ ar6000_dbglog_get_debug_logs(ar);
++ ar->arWmiReady = FALSE;
++ ar->arConnected = FALSE;
++ ar->arConnectPending = FALSE;
++ wmi_shutdown(ar->arWmi);
++ ar->arWmiEnabled = FALSE;
++ ar->arWmi = NULL;
++ ar->arWlanState = WLAN_ENABLED;
++#ifdef USER_KEYS
++ ar->user_savedkeys_stat = USER_SAVEDKEYS_STAT_INIT;
++ ar->user_key_ctrl = 0;
++#endif
++ }
++
++ AR_DEBUG_PRINTF("%s(): WMI stopped\n", __func__);
++ }
++ else
++ {
++ AR_DEBUG_PRINTF("%s(): WMI not ready 0x%08x 0x%08x\n",
++ __func__, (unsigned int) ar, (unsigned int) ar->arWmi);
++
++ /* Shut down WMI if we have started it */
++ if(ar->arWmiEnabled == TRUE)
++ {
++ AR_DEBUG_PRINTF("%s(): Shut down WMI\n", __func__);
++ wmi_shutdown(ar->arWmi);
++ ar->arWmiEnabled = FALSE;
++ ar->arWmi = NULL;
++ }
++ }
++
++ /* stop HTC */
++ HTCStop(ar->arHtcTarget);
++
++ /* set the instance to NULL so we do not get called back on remove incase we
++ * we're explicity destroyed by module unload */
++ HTCSetInstance(ar->arHtcTarget, NULL);
++
++ if (resetok) {
++ /* try to reset the device if we can
++ * The driver may have been configure NOT to reset the target during
++ * a debug session */
++ AR_DEBUG_PRINTF(" Attempting to reset target on instance destroy.... \n");
++ ar6000_reset_device(ar->arHifDevice, ar->arTargetType);
++ } else {
++ AR_DEBUG_PRINTF(" Host does not want target reset. \n");
++ }
++
++ /* Done with cookies */
++ ar6000_cookie_cleanup(ar);
++
++ /* Cleanup BMI */
++ BMIInit();
++
++ return 0;
++}
++
++/* connect to a service */
++static A_STATUS ar6000_connectservice(AR_SOFTC_T *ar,
++ HTC_SERVICE_CONNECT_REQ *pConnect,
++ WMI_PRI_STREAM_ID WmiStreamID,
++ char *pDesc)
++{
++ A_STATUS status;
++ HTC_SERVICE_CONNECT_RESP response;
++
++ do {
++
++ A_MEMZERO(&response,sizeof(response));
++
++ status = HTCConnectService(ar->arHtcTarget,
++ pConnect,
++ &response);
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF(" Failed to connect to %s service status:%d \n", pDesc, status);
++ break;
++ }
++
++ if (WmiStreamID == WMI_NOT_MAPPED) {
++ /* done */
++ break;
++ }
++
++ /* set endpoint mapping for the WMI stream in the driver layer */
++ arSetWMIStream2EndpointIDMap(ar,WmiStreamID,response.Endpoint);
++
++ } while (FALSE);
++
++ return status;
++}
++
++static void ar6000_TxDataCleanup(AR_SOFTC_T *ar)
++{
++ /* flush all the data (non-control) streams
++ * we only flush packets that are tagged as data, we leave any control packets that
++ * were in the TX queues alone */
++ HTCFlushEndpoint(ar->arHtcTarget,
++ arWMIStream2EndpointID(ar,WMI_BEST_EFFORT_PRI),
++ AR6K_DATA_PKT_TAG);
++ HTCFlushEndpoint(ar->arHtcTarget,
++ arWMIStream2EndpointID(ar,WMI_LOW_PRI),
++ AR6K_DATA_PKT_TAG);
++ HTCFlushEndpoint(ar->arHtcTarget,
++ arWMIStream2EndpointID(ar,WMI_HIGH_PRI),
++ AR6K_DATA_PKT_TAG);
++ HTCFlushEndpoint(ar->arHtcTarget,
++ arWMIStream2EndpointID(ar,WMI_HIGHEST_PRI),
++ AR6K_DATA_PKT_TAG);
++}
++
++/* This function does one time initialization for the lifetime of the device */
++int ar6000_init(struct net_device *dev)
++{
++ AR_SOFTC_T *ar;
++ A_STATUS status;
++ A_INT32 timeleft;
++
++ if((ar = netdev_priv(dev)) == NULL)
++ {
++ return(-EIO);
++ }
++
++ /* Do we need to finish the BMI phase */
++ if(BMIDone(ar->arHifDevice) != A_OK)
++ {
++ return -EIO;
++ }
++
++ if (!bypasswmi)
++ {
++#if 0 /* TBDXXX */
++ if (ar->arVersion.host_ver != ar->arVersion.target_ver) {
++ A_PRINTF("WARNING: Host version 0x%x does not match Target "
++ " version 0x%x!\n",
++ ar->arVersion.host_ver, ar->arVersion.target_ver);
++ }
++#endif
++
++ /* Indicate that WMI is enabled (although not ready yet) */
++ ar->arWmiEnabled = TRUE;
++ if ((ar->arWmi = wmi_init((void *) ar)) == NULL)
++ {
++ AR_DEBUG_PRINTF("%s() Failed to initialize WMI.\n", __func__);
++ return(-EIO);
++ }
++
++ AR_DEBUG_PRINTF("%s() Got WMI @ 0x%08x.\n", __func__,
++ (unsigned int) ar->arWmi);
++ }
++
++ do {
++ HTC_SERVICE_CONNECT_REQ connect;
++
++ /* the reason we have to wait for the target here is that the driver layer
++ * has to init BMI in order to set the host block size,
++ */
++ status = HTCWaitTarget(ar->arHtcTarget);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ A_MEMZERO(&connect,sizeof(connect));
++ /* meta data is unused for now */
++ connect.pMetaData = NULL;
++ connect.MetaDataLength = 0;
++ /* these fields are the same for all service endpoints */
++ connect.EpCallbacks.pContext = ar;
++ connect.EpCallbacks.EpTxComplete = ar6000_tx_complete;
++ connect.EpCallbacks.EpRecv = ar6000_rx;
++ connect.EpCallbacks.EpRecvRefill = ar6000_rx_refill;
++ connect.EpCallbacks.EpSendFull = ar6000_tx_queue_full;
++ connect.EpCallbacks.EpSendAvail = ar6000_tx_queue_avail;
++ /* set the max queue depth so that our ar6000_tx_queue_full handler gets called.
++ * Linux has the peculiarity of not providing flow control between the
++ * NIC and the network stack. There is no API to indicate that a TX packet
++ * was sent which could provide some back pressure to the network stack.
++ * Under linux you would have to wait till the network stack consumed all sk_buffs
++ * before any back-flow kicked in. Which isn't very friendly.
++ * So we have to manage this ourselves */
++ connect.MaxSendQueueDepth = 32;
++
++ /* connect to control service */
++ connect.ServiceID = WMI_CONTROL_SVC;
++ status = ar6000_connectservice(ar,
++ &connect,
++ WMI_CONTROL_PRI,
++ "WMI CONTROL");
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ /* for the remaining data services set the connection flag to reduce dribbling,
++ * if configured to do so */
++ if (reduce_credit_dribble) {
++ connect.ConnectionFlags |= HTC_CONNECT_FLAGS_REDUCE_CREDIT_DRIBBLE;
++ /* the credit dribble trigger threshold is (reduce_credit_dribble - 1) for a value
++ * of 0-3 */
++ connect.ConnectionFlags &= ~HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_MASK;
++ connect.ConnectionFlags |=
++ ((A_UINT16)reduce_credit_dribble - 1) & HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_MASK;
++ }
++ /* connect to best-effort service */
++ connect.ServiceID = WMI_DATA_BE_SVC;
++
++ status = ar6000_connectservice(ar,
++ &connect,
++ WMI_BEST_EFFORT_PRI,
++ "WMI DATA BE");
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ /* connect to back-ground
++ * map this to WMI LOW_PRI */
++ connect.ServiceID = WMI_DATA_BK_SVC;
++ status = ar6000_connectservice(ar,
++ &connect,
++ WMI_LOW_PRI,
++ "WMI DATA BK");
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ /* connect to Video service, map this to
++ * to HI PRI */
++ connect.ServiceID = WMI_DATA_VI_SVC;
++ status = ar6000_connectservice(ar,
++ &connect,
++ WMI_HIGH_PRI,
++ "WMI DATA VI");
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ /* connect to VO service, this is currently not
++ * mapped to a WMI priority stream due to historical reasons.
++ * WMI originally defined 3 priorities over 3 mailboxes
++ * We can change this when WMI is reworked so that priorities are not
++ * dependent on mailboxes */
++ connect.ServiceID = WMI_DATA_VO_SVC;
++ status = ar6000_connectservice(ar,
++ &connect,
++ WMI_HIGHEST_PRI,
++ "WMI DATA VO");
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ A_ASSERT(arWMIStream2EndpointID(ar,WMI_CONTROL_PRI) != 0);
++ A_ASSERT(arWMIStream2EndpointID(ar,WMI_BEST_EFFORT_PRI) != 0);
++ A_ASSERT(arWMIStream2EndpointID(ar,WMI_LOW_PRI) != 0);
++ A_ASSERT(arWMIStream2EndpointID(ar,WMI_HIGH_PRI) != 0);
++ A_ASSERT(arWMIStream2EndpointID(ar,WMI_HIGHEST_PRI) != 0);
++ } while (FALSE);
++
++ if (A_FAILED(status)) {
++ return (-EIO);
++ }
++
++ /*
++ * give our connected endpoints some buffers
++ */
++ ar6000_rx_refill(ar, arWMIStream2EndpointID(ar,WMI_CONTROL_PRI));
++
++ ar6000_rx_refill(ar, arWMIStream2EndpointID(ar,WMI_BEST_EFFORT_PRI));
++
++ /*
++ * We will post the receive buffers only for SPE testing and so we are
++ * making it conditional on the 'bypasswmi' flag.
++ */
++ if (bypasswmi) {
++ ar6000_rx_refill(ar,arWMIStream2EndpointID(ar,WMI_LOW_PRI));
++ ar6000_rx_refill(ar,arWMIStream2EndpointID(ar,WMI_HIGH_PRI));
++ }
++
++ /* setup credit distribution */
++ ar6000_setup_credit_dist(ar->arHtcTarget, &ar->arCreditStateInfo);
++
++ /* Since cookies are used for HTC transports, they should be */
++ /* initialized prior to enabling HTC. */
++ ar6000_cookie_init(ar);
++
++ /* start HTC */
++ status = HTCStart(ar->arHtcTarget);
++
++ if (status != A_OK) {
++ if (ar->arWmiEnabled == TRUE) {
++ wmi_shutdown(ar->arWmi);
++ ar->arWmiEnabled = FALSE;
++ ar->arWmi = NULL;
++ }
++ ar6000_cookie_cleanup(ar);
++ return -EIO;
++ }
++
++ if (!bypasswmi) {
++ /* Wait for Wmi event to be ready */
++ timeleft = wait_event_interruptible_timeout(arEvent,
++ (ar->arWmiReady == TRUE), wmitimeout * HZ);
++
++ if(!timeleft || signal_pending(current))
++ {
++ AR_DEBUG_PRINTF("WMI is not ready or wait was interrupted\n");
++#if defined(DWSIM) /* TBDXXX */
++ AR_DEBUG_PRINTF(".....but proceed anyway.\n");
++#else
++ return -EIO;
++#endif
++ }
++
++ AR_DEBUG_PRINTF("%s() WMI is ready\n", __func__);
++
++ /* Communicate the wmi protocol verision to the target */
++ if ((ar6000_set_host_app_area(ar)) != A_OK) {
++ AR_DEBUG_PRINTF("Unable to set the host app area\n");
++ }
++ }
++
++ ar->arNumDataEndPts = 1;
++
++ return(0);
++}
++
++
++void
++ar6000_bitrate_rx(void *devt, A_INT32 rateKbps)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
++
++ ar->arBitRate = rateKbps;
++ wake_up(&arEvent);
++}
++
++void
++ar6000_ratemask_rx(void *devt, A_UINT16 ratemask)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
++
++ ar->arRateMask = ratemask;
++ wake_up(&arEvent);
++}
++
++void
++ar6000_txPwr_rx(void *devt, A_UINT8 txPwr)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
++
++ ar->arTxPwr = txPwr;
++ wake_up(&arEvent);
++}
++
++
++void
++ar6000_channelList_rx(void *devt, A_INT8 numChan, A_UINT16 *chanList)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
++
++ A_MEMCPY(ar->arChannelList, chanList, numChan * sizeof (A_UINT16));
++ ar->arNumChannels = numChan;
++
++ wake_up(&arEvent);
++}
++
++A_UINT8
++ar6000_ibss_map_epid(struct sk_buff *skb, struct net_device *dev, A_UINT32 * mapNo)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ A_UINT8 *datap;
++ ATH_MAC_HDR *macHdr;
++ A_UINT32 i, eptMap;
++
++ (*mapNo) = 0;
++ datap = A_NETBUF_DATA(skb);
++ macHdr = (ATH_MAC_HDR *)(datap + sizeof(WMI_DATA_HDR));
++ if (IEEE80211_IS_MULTICAST(macHdr->dstMac)) {
++ return ENDPOINT_2;
++ }
++
++ eptMap = -1;
++ for (i = 0; i < ar->arNodeNum; i ++) {
++ if (IEEE80211_ADDR_EQ(macHdr->dstMac, ar->arNodeMap[i].macAddress)) {
++ (*mapNo) = i + 1;
++ ar->arNodeMap[i].txPending ++;
++ return ar->arNodeMap[i].epId;
++ }
++
++ if ((eptMap == -1) && !ar->arNodeMap[i].txPending) {
++ eptMap = i;
++ }
++ }
++
++ if (eptMap == -1) {
++ eptMap = ar->arNodeNum;
++ ar->arNodeNum ++;
++ A_ASSERT(ar->arNodeNum <= MAX_NODE_NUM);
++ }
++
++ A_MEMCPY(ar->arNodeMap[eptMap].macAddress, macHdr->dstMac, IEEE80211_ADDR_LEN);
++
++ for (i = ENDPOINT_2; i <= ENDPOINT_5; i ++) {
++ if (!ar->arTxPending[i]) {
++ ar->arNodeMap[eptMap].epId = i;
++ break;
++ }
++ // No free endpoint is available, start redistribution on the inuse endpoints.
++ if (i == ENDPOINT_5) {
++ ar->arNodeMap[eptMap].epId = ar->arNexEpId;
++ ar->arNexEpId ++;
++ if (ar->arNexEpId > ENDPOINT_5) {
++ ar->arNexEpId = ENDPOINT_2;
++ }
++ }
++ }
++
++ (*mapNo) = eptMap + 1;
++ ar->arNodeMap[eptMap].txPending ++;
++
++ return ar->arNodeMap[eptMap].epId;
++}
++
++#ifdef DEBUG
++static void ar6000_dump_skb(struct sk_buff *skb)
++{
++ u_char *ch;
++ for (ch = A_NETBUF_DATA(skb);
++ (A_UINT32)ch < ((A_UINT32)A_NETBUF_DATA(skb) +
++ A_NETBUF_LEN(skb)); ch++)
++ {
++ AR_DEBUG_PRINTF("%2.2x ", *ch);
++ }
++ AR_DEBUG_PRINTF("\n");
++}
++#endif
++
++static int
++ar6000_data_tx(struct sk_buff *skb, struct net_device *dev)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_PRI_STREAM_ID streamID = WMI_NOT_MAPPED;
++ A_UINT32 mapNo = 0;
++ int len;
++ struct ar_cookie *cookie;
++ A_BOOL checkAdHocPsMapping = FALSE;
++
++#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)
++ skb->list = NULL;
++#endif
++
++ AR_DEBUG2_PRINTF("ar6000_data_tx start - skb=0x%x, data=0x%x, len=0x%x\n",
++ (A_UINT32)skb, (A_UINT32)A_NETBUF_DATA(skb),
++ A_NETBUF_LEN(skb));
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++ /* TCMD doesnt support any data, free the buf and return */
++ if(ar->arTargetMode == AR6000_TCMD_MODE) {
++ A_NETBUF_FREE(skb);
++ return 0;
++ }
++#endif
++ do {
++
++ if (ar->arWmiReady == FALSE && bypasswmi == 0) {
++ break;
++ }
++
++#ifdef BLOCK_TX_PATH_FLAG
++ if (blocktx) {
++ break;
++ }
++#endif /* BLOCK_TX_PATH_FLAG */
++
++ if (ar->arWmiEnabled) {
++ if (A_NETBUF_HEADROOM(skb) < dev->hard_header_len) {
++ struct sk_buff *newbuf;
++ /*
++ * We really should have gotten enough headroom but sometimes
++ * we still get packets with not enough headroom. Copy the packet.
++ */
++ len = A_NETBUF_LEN(skb);
++ newbuf = A_NETBUF_ALLOC(len);
++ if (newbuf == NULL) {
++ break;
++ }
++ A_NETBUF_PUT(newbuf, len);
++ A_MEMCPY(A_NETBUF_DATA(newbuf), A_NETBUF_DATA(skb), len);
++ A_NETBUF_FREE(skb);
++ skb = newbuf;
++ /* fall through and assemble header */
++ }
++
++ if (wmi_dix_2_dot3(ar->arWmi, skb) != A_OK) {
++ AR_DEBUG_PRINTF("ar6000_data_tx - wmi_dix_2_dot3 failed\n");
++ break;
++ }
++
++ if (wmi_data_hdr_add(ar->arWmi, skb, DATA_MSGTYPE) != A_OK) {
++ AR_DEBUG_PRINTF("ar6000_data_tx - wmi_data_hdr_add failed\n");
++ break;
++ }
++
++ if ((ar->arNetworkType == ADHOC_NETWORK) &&
++ ar->arIbssPsEnable && ar->arConnected) {
++ /* flag to check adhoc mapping once we take the lock below: */
++ checkAdHocPsMapping = TRUE;
++
++ } else {
++ /* get the stream mapping */
++ if (ar->arWmmEnabled) {
++ streamID = wmi_get_stream_id(ar->arWmi,
++ wmi_implicit_create_pstream(ar->arWmi, skb, UPLINK_TRAFFIC, UNDEFINED_PRI));
++ } else {
++ streamID = WMI_BEST_EFFORT_PRI;
++ }
++ }
++
++ } else {
++ struct iphdr *ipHdr;
++ /*
++ * the endpoint is directly based on the TOS field in the IP
++ * header **** only for testing ******
++ */
++ ipHdr = A_NETBUF_DATA(skb) + sizeof(ATH_MAC_HDR);
++ /* here we map the TOS field to an endpoint number, this is for
++ * the endpointping test application */
++ streamID = IP_TOS_TO_WMI_PRI(ipHdr->tos);
++ }
++
++ } while (FALSE);
++
++ /* did we succeed ? */
++ if ((streamID == WMI_NOT_MAPPED) && !checkAdHocPsMapping) {
++ /* cleanup and exit */
++ A_NETBUF_FREE(skb);
++ AR6000_STAT_INC(ar, tx_dropped);
++ AR6000_STAT_INC(ar, tx_aborted_errors);
++ return 0;
++ }
++
++ cookie = NULL;
++
++ /* take the lock to protect driver data */
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++
++ do {
++
++ if (checkAdHocPsMapping) {
++ streamID = ar6000_ibss_map_epid(skb, dev, &mapNo);
++ }
++
++ A_ASSERT(streamID != WMI_NOT_MAPPED);
++
++ /* validate that the endpoint is connected */
++ if (arWMIStream2EndpointID(ar,streamID) == 0) {
++ AR_DEBUG_PRINTF("Stream %d is NOT mapped!\n",streamID);
++ break;
++ }
++ /* allocate resource for this packet */
++ cookie = ar6000_alloc_cookie(ar);
++
++ if (cookie != NULL) {
++ /* update counts while the lock is held */
++ ar->arTxPending[streamID]++;
++ ar->arTotalTxDataPending++;
++ }
++
++ } while (FALSE);
++
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++
++ if (cookie != NULL) {
++ cookie->arc_bp[0] = (A_UINT32)skb;
++ cookie->arc_bp[1] = mapNo;
++ SET_HTC_PACKET_INFO_TX(&cookie->HtcPkt,
++ cookie,
++ A_NETBUF_DATA(skb),
++ A_NETBUF_LEN(skb),
++ arWMIStream2EndpointID(ar,streamID),
++ AR6K_DATA_PKT_TAG);
++
++#ifdef DEBUG
++ if (debugdriver >= 3) {
++ ar6000_dump_skb(skb);
++ }
++#endif
++ /* HTC interface is asynchronous, if this fails, cleanup will happen in
++ * the ar6000_tx_complete callback */
++ HTCSendPkt(ar->arHtcTarget, &cookie->HtcPkt);
++ } else {
++ /* no packet to send, cleanup */
++ A_NETBUF_FREE(skb);
++ AR6000_STAT_INC(ar, tx_dropped);
++ AR6000_STAT_INC(ar, tx_aborted_errors);
++ }
++
++ return 0;
++}
++
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++static void
++tvsub(register struct timeval *out, register struct timeval *in)
++{
++ if((out->tv_usec -= in->tv_usec) < 0) {
++ out->tv_sec--;
++ out->tv_usec += 1000000;
++ }
++ out->tv_sec -= in->tv_sec;
++}
++
++void
++applyAPTCHeuristics(AR_SOFTC_T *ar)
++{
++ A_UINT32 duration;
++ A_UINT32 numbytes;
++ A_UINT32 throughput;
++ struct timeval ts;
++ A_STATUS status;
++
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++
++ if ((enableAPTCHeuristics) && (!aptcTR.timerScheduled)) {
++ do_gettimeofday(&ts);
++ tvsub(&ts, &aptcTR.samplingTS);
++ duration = ts.tv_sec * 1000 + ts.tv_usec / 1000; /* ms */
++ numbytes = aptcTR.bytesTransmitted + aptcTR.bytesReceived;
++
++ if (duration > APTC_TRAFFIC_SAMPLING_INTERVAL) {
++ /* Initialize the time stamp and byte count */
++ aptcTR.bytesTransmitted = aptcTR.bytesReceived = 0;
++ do_gettimeofday(&aptcTR.samplingTS);
++
++ /* Calculate and decide based on throughput thresholds */
++ throughput = ((numbytes * 8) / duration);
++ if (throughput > APTC_UPPER_THROUGHPUT_THRESHOLD) {
++ /* Disable Sleep and schedule a timer */
++ A_ASSERT(ar->arWmiReady == TRUE);
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ status = wmi_powermode_cmd(ar->arWmi, MAX_PERF_POWER);
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ A_TIMEOUT_MS(&aptcTimer, APTC_TRAFFIC_SAMPLING_INTERVAL, 0);
++ aptcTR.timerScheduled = TRUE;
++ }
++ }
++ }
++
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++}
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++
++static void
++ar6000_tx_queue_full(void *Context, HTC_ENDPOINT_ID Endpoint)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *) Context;
++
++ if (Endpoint == arWMIStream2EndpointID(ar,WMI_CONTROL_PRI)) {
++ if (!bypasswmi) {
++ /* under normal WMI if this is getting full, then something is running rampant
++ * the host should not be exhausting the WMI queue with too many commands
++ * the only exception to this is during testing using endpointping */
++
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ /* set flag to handle subsequent messages */
++ ar->arWMIControlEpFull = TRUE;
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ AR_DEBUG_PRINTF("WMI Control Endpoint is FULL!!! \n");
++ }
++ } else {
++ /* one of the data endpoints queues is getting full..need to stop network stack
++ * the queue will resume after credits received */
++ netif_stop_queue(ar->arNetDev);
++ }
++}
++
++static void
++ar6000_tx_queue_avail(void *Context, HTC_ENDPOINT_ID Endpoint)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)Context;
++
++ if (Endpoint == arWMIStream2EndpointID(ar,WMI_CONTROL_PRI)) {
++ /* FIXME: what do for it? */
++ } else {
++ /* Wake up interface, rescheduling prevented. */
++ if (ar->arConnected == TRUE || bypasswmi)
++ netif_wake_queue(ar->arNetDev);
++ }
++}
++
++static void
++ar6000_tx_complete(void *Context, HTC_PACKET *pPacket)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)Context;
++ void *cookie = (void *)pPacket->pPktContext;
++ struct sk_buff *skb = NULL;
++ A_UINT32 mapNo = 0;
++ A_STATUS status;
++ struct ar_cookie * ar_cookie;
++ WMI_PRI_STREAM_ID streamID;
++ A_BOOL wakeEvent = FALSE;
++
++ status = pPacket->Status;
++ ar_cookie = (struct ar_cookie *)cookie;
++ skb = (struct sk_buff *)ar_cookie->arc_bp[0];
++ streamID = arEndpoint2WMIStreamID(ar,pPacket->Endpoint);
++ mapNo = ar_cookie->arc_bp[1];
++
++ A_ASSERT(skb);
++ A_ASSERT(pPacket->pBuffer == A_NETBUF_DATA(skb));
++
++ if (A_SUCCESS(status)) {
++ A_ASSERT(pPacket->ActualLength == A_NETBUF_LEN(skb));
++ }
++
++ AR_DEBUG2_PRINTF("ar6000_tx_complete skb=0x%x data=0x%x len=0x%x sid=%d ",
++ (A_UINT32)skb, (A_UINT32)pPacket->pBuffer,
++ pPacket->ActualLength,
++ streamID);
++
++ /* lock the driver as we update internal state */
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++
++ ar->arTxPending[streamID]--;
++
++ if ((streamID != WMI_CONTROL_PRI) || bypasswmi) {
++ ar->arTotalTxDataPending--;
++ }
++
++ if (streamID == WMI_CONTROL_PRI)
++ {
++ if (ar->arWMIControlEpFull) {
++ /* since this packet completed, the WMI EP is no longer full */
++ ar->arWMIControlEpFull = FALSE;
++ }
++
++ if (ar->arTxPending[streamID] == 0) {
++ wakeEvent = TRUE;
++ }
++ }
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF("%s() -TX ERROR, status: 0x%x\n", __func__,
++ status);
++ AR6000_STAT_INC(ar, tx_errors);
++ } else {
++ AR_DEBUG2_PRINTF("OK\n");
++ AR6000_STAT_INC(ar, tx_packets);
++ ar->arNetStats.tx_bytes += A_NETBUF_LEN(skb);
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++ aptcTR.bytesTransmitted += a_netbuf_to_len(skb);
++ applyAPTCHeuristics(ar);
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++ }
++
++ // TODO this needs to be looked at
++ if ((ar->arNetworkType == ADHOC_NETWORK) && ar->arIbssPsEnable
++ && (streamID != WMI_CONTROL_PRI) && mapNo)
++ {
++ mapNo --;
++ ar->arNodeMap[mapNo].txPending --;
++
++ if (!ar->arNodeMap[mapNo].txPending && (mapNo == (ar->arNodeNum - 1))) {
++ A_UINT32 i;
++ for (i = ar->arNodeNum; i > 0; i --) {
++ if (!ar->arNodeMap[i - 1].txPending) {
++ A_MEMZERO(&ar->arNodeMap[i - 1], sizeof(struct ar_node_mapping));
++ ar->arNodeNum --;
++ } else {
++ break;
++ }
++ }
++ }
++ }
++
++ /* Freeing a cookie should not be contingent on either of */
++ /* these flags, just if we have a cookie or not. */
++ /* Can we even get here without a cookie? Fix later. */
++ if (ar->arWmiReady == TRUE || (bypasswmi))
++ {
++ ar6000_free_cookie(ar, cookie);
++ }
++
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++
++ /* lock is released, we can freely call other kernel APIs */
++
++ /* this indirectly frees the HTC_PACKET */
++ A_NETBUF_FREE(skb);
++
++ if (wakeEvent) {
++ wake_up(&arEvent);
++ }
++}
++
++/*
++ * Receive event handler. This is called by HTC when a packet is received
++ */
++int pktcount;
++static void
++ar6000_rx(void *Context, HTC_PACKET *pPacket)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)Context;
++ struct sk_buff *skb = (struct sk_buff *)pPacket->pPktContext;
++ int minHdrLen;
++ A_STATUS status = pPacket->Status;
++ WMI_PRI_STREAM_ID streamID = arEndpoint2WMIStreamID(ar,pPacket->Endpoint);
++ HTC_ENDPOINT_ID ept = pPacket->Endpoint;
++
++ A_ASSERT((status != A_OK) || (pPacket->pBuffer == (A_NETBUF_DATA(skb) + HTC_HEADER_LEN)));
++
++ AR_DEBUG2_PRINTF("ar6000_rx ar=0x%x sid=%d, skb=0x%x, data=0x%x, len=0x%x ",
++ (A_UINT32)ar, streamID, (A_UINT32)skb, (A_UINT32)pPacket->pBuffer,
++ pPacket->ActualLength);
++ if (status != A_OK) {
++ AR_DEBUG2_PRINTF("ERR\n");
++ } else {
++ AR_DEBUG2_PRINTF("OK\n");
++ }
++
++ /* take lock to protect buffer counts
++ * and adaptive power throughput state */
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++
++ ar->arRxBuffers[streamID]--;
++
++ if (A_SUCCESS(status)) {
++ AR6000_STAT_INC(ar, rx_packets);
++ ar->arNetStats.rx_bytes += pPacket->ActualLength;
++#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
++ aptcTR.bytesReceived += a_netbuf_to_len(skb);
++ applyAPTCHeuristics(ar);
++#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
++
++ A_NETBUF_PUT(skb, pPacket->ActualLength + HTC_HEADER_LEN);
++ A_NETBUF_PULL(skb, HTC_HEADER_LEN);
++
++#ifdef DEBUG
++ if (debugdriver >= 2) {
++ ar6000_dump_skb(skb);
++ }
++#endif /* DEBUG */
++ }
++
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++
++ if (status != A_OK) {
++ AR6000_STAT_INC(ar, rx_errors);
++ A_NETBUF_FREE(skb);
++ } else if (ar->arWmiEnabled == TRUE) {
++ if (streamID == WMI_CONTROL_PRI) {
++ /*
++ * this is a wmi control msg
++ */
++ wmi_control_rx(ar->arWmi, skb);
++ } else {
++ WMI_DATA_HDR *dhdr = (WMI_DATA_HDR *)A_NETBUF_DATA(skb);
++ if (WMI_DATA_HDR_IS_MSG_TYPE(dhdr, CNTL_MSGTYPE)) {
++ /*
++ * this is a wmi control msg
++ */
++ /* strip off WMI hdr */
++ wmi_data_hdr_remove(ar->arWmi, skb);
++ wmi_control_rx(ar->arWmi, skb);
++ } else {
++ /*
++ * this is a wmi data packet
++ */
++ minHdrLen = sizeof (WMI_DATA_HDR) + sizeof(ATH_MAC_HDR) +
++ sizeof(ATH_LLC_SNAP_HDR);
++
++ if ((pPacket->ActualLength < minHdrLen) ||
++ (pPacket->ActualLength > AR6000_BUFFER_SIZE))
++ {
++ /*
++ * packet is too short or too long
++ */
++ AR_DEBUG_PRINTF("TOO SHORT or TOO LONG\n");
++ AR6000_STAT_INC(ar, rx_errors);
++ AR6000_STAT_INC(ar, rx_length_errors);
++ A_NETBUF_FREE(skb);
++ } else {
++ if (ar->arWmmEnabled) {
++ wmi_implicit_create_pstream(ar->arWmi, skb,
++ DNLINK_TRAFFIC, UNDEFINED_PRI);
++ }
++#if 0
++ /* Access RSSI values here */
++ AR_DEBUG_PRINTF("RSSI %d\n",
++ ((WMI_DATA_HDR *) A_NETBUF_DATA(skb))->rssi);
++#endif
++ wmi_data_hdr_remove(ar->arWmi, skb);
++ wmi_dot3_2_dix(ar->arWmi, skb);
++
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
++ /*
++ * extra push and memcpy, for eth_type_trans() of 2.4 kernel
++ * will pull out hard_header_len bytes of the skb.
++ */
++ A_NETBUF_PUSH(skb, sizeof(WMI_DATA_HDR) + sizeof(ATH_LLC_SNAP_HDR) + HTC_HEADER_LEN);
++ A_MEMCPY(A_NETBUF_DATA(skb), A_NETBUF_DATA(skb) + sizeof(WMI_DATA_HDR) +
++ sizeof(ATH_LLC_SNAP_HDR) + HTC_HEADER_LEN, sizeof(ATH_MAC_HDR));
++#endif
++ if ((ar->arNetDev->flags & IFF_UP) == IFF_UP)
++ {
++ skb->dev = ar->arNetDev;
++ skb->protocol = eth_type_trans(skb, ar->arNetDev);
++ netif_rx(skb);
++ }
++ else
++ {
++ A_NETBUF_FREE(skb);
++ }
++ }
++ }
++ }
++ } else {
++ if ((ar->arNetDev->flags & IFF_UP) == IFF_UP)
++ {
++ skb->dev = ar->arNetDev;
++ skb->protocol = eth_type_trans(skb, ar->arNetDev);
++ netif_rx(skb);
++ }
++ else
++ {
++ A_NETBUF_FREE(skb);
++ }
++ }
++
++ if (status != A_ECANCELED) {
++ /*
++ * HTC provides A_ECANCELED status when it doesn't want to be refilled
++ * (probably due to a shutdown)
++ */
++ ar6000_rx_refill(Context, ept);
++ }
++
++
++}
++
++static void
++ar6000_rx_refill(void *Context, HTC_ENDPOINT_ID Endpoint)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)Context;
++ void *osBuf;
++ int RxBuffers;
++ int buffersToRefill;
++ HTC_PACKET *pPacket;
++ WMI_PRI_STREAM_ID streamId = arEndpoint2WMIStreamID(ar,Endpoint);
++
++ buffersToRefill = (int)AR6000_MAX_RX_BUFFERS -
++ (int)ar->arRxBuffers[streamId];
++
++ if (buffersToRefill <= 0) {
++ /* fast return, nothing to fill */
++ return;
++ }
++
++ AR_DEBUG2_PRINTF("ar6000_rx_refill: providing htc with %d buffers at eid=%d\n",
++ buffersToRefill, Endpoint);
++
++ for (RxBuffers = 0; RxBuffers < buffersToRefill; RxBuffers++) {
++ osBuf = A_NETBUF_ALLOC(AR6000_BUFFER_SIZE);
++ if (NULL == osBuf) {
++ break;
++ }
++ /* the HTC packet wrapper is at the head of the reserved area
++ * in the skb */
++ pPacket = (HTC_PACKET *)(A_NETBUF_HEAD(osBuf));
++ /* set re-fill info */
++ SET_HTC_PACKET_INFO_RX_REFILL(pPacket,osBuf,A_NETBUF_DATA(osBuf),AR6000_BUFFER_SIZE,Endpoint);
++ /* add this packet */
++ HTCAddReceivePkt(ar->arHtcTarget, pPacket);
++ }
++
++ /* update count */
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ ar->arRxBuffers[streamId] += RxBuffers;
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++}
++
++static struct net_device_stats *
++ar6000_get_stats(struct net_device *dev)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ return &ar->arNetStats;
++}
++
++static struct iw_statistics *
++ar6000_get_iwstats(struct net_device * dev)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ TARGET_STATS *pStats = &ar->arTargetStats;
++ struct iw_statistics * pIwStats = &ar->arIwStats;
++
++ if ((ar->arWmiReady == FALSE)
++ /*
++ * The in_atomic function is used to determine if the scheduling is
++ * allowed in the current context or not. This was introduced in 2.6
++ * From what I have read on the differences between 2.4 and 2.6, the
++ * 2.4 kernel did not support preemption and so this check might not
++ * be required for 2.4 kernels.
++ */
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
++ || (in_atomic())
++#endif
++ )
++ {
++ pIwStats->status = 0;
++ pIwStats->qual.qual = 0;
++ pIwStats->qual.level =0;
++ pIwStats->qual.noise = 0;
++ pIwStats->discard.code =0;
++ pIwStats->discard.retries=0;
++ pIwStats->miss.beacon =0;
++ return pIwStats;
++ }
++ if (down_interruptible(&ar->arSem)) {
++ pIwStats->status = 0;
++ return pIwStats;
++ }
++
++
++ ar->statsUpdatePending = TRUE;
++
++ if(wmi_get_stats_cmd(ar->arWmi) != A_OK) {
++ up(&ar->arSem);
++ pIwStats->status = 0;
++ return pIwStats;
++ }
++
++ wait_event_interruptible_timeout(arEvent, ar->statsUpdatePending == FALSE, wmitimeout * HZ);
++
++ if (signal_pending(current)) {
++ AR_DEBUG_PRINTF("ar6000 : WMI get stats timeout \n");
++ up(&ar->arSem);
++ pIwStats->status = 0;
++ return pIwStats;
++ }
++ pIwStats->status = 1 ;
++ pIwStats->qual.qual = pStats->cs_aveBeacon_rssi;
++ pIwStats->qual.level =pStats->cs_aveBeacon_rssi + 161; /* noise is -95 dBm */
++ pIwStats->qual.noise = pStats->noise_floor_calibation;
++ pIwStats->discard.code = pStats->rx_decrypt_err;
++ pIwStats->discard.retries = pStats->tx_retry_cnt;
++ pIwStats->miss.beacon = pStats->cs_bmiss_cnt;
++ up(&ar->arSem);
++ return pIwStats;
++}
++
++void
++ar6000_ready_event(void *devt, A_UINT8 *datap, A_UINT8 phyCap)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
++ struct net_device *dev = ar->arNetDev;
++
++ ar->arWmiReady = TRUE;
++ wake_up(&arEvent);
++ A_MEMCPY(dev->dev_addr, datap, AR6000_ETH_ADDR_LEN);
++ AR_DEBUG_PRINTF("mac address = %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
++ dev->dev_addr[0], dev->dev_addr[1],
++ dev->dev_addr[2], dev->dev_addr[3],
++ dev->dev_addr[4], dev->dev_addr[5]);
++
++ ar->arPhyCapability = phyCap;
++}
++
++A_UINT8
++ar6000_iptos_to_userPriority(A_UINT8 *pkt)
++{
++ struct iphdr *ipHdr = (struct iphdr *)pkt;
++ A_UINT8 userPriority;
++
++ /*
++ * IP Tos format :
++ * (Refer Pg 57 WMM-test-plan-v1.2)
++ * IP-TOS - 8bits
++ * : DSCP(6-bits) ECN(2-bits)
++ * : DSCP - P2 P1 P0 X X X
++ * where (P2 P1 P0) form 802.1D
++ */
++ userPriority = ipHdr->tos >> 5;
++ return (userPriority & 0x7);
++}
++
++void
++ar6000_connect_event(AR_SOFTC_T *ar, A_UINT16 channel, A_UINT8 *bssid,
++ A_UINT16 listenInterval, A_UINT16 beaconInterval,
++ NETWORK_TYPE networkType, A_UINT8 beaconIeLen,
++ A_UINT8 assocReqLen, A_UINT8 assocRespLen,
++ A_UINT8 *assocInfo)
++{
++ union iwreq_data wrqu;
++ int i, beacon_ie_pos, assoc_resp_ie_pos, assoc_req_ie_pos;
++ static const char *tag1 = "ASSOCINFO(ReqIEs=";
++ static const char *tag2 = "ASSOCRESPIE=";
++ static const char *beaconIetag = "BEACONIE=";
++ char buf[WMI_CONTROL_MSG_MAX_LEN * 2 + sizeof(tag1)];
++ char *pos;
++ A_UINT8 key_op_ctrl;
++
++ A_MEMCPY(ar->arBssid, bssid, sizeof(ar->arBssid));
++ ar->arBssChannel = channel;
++
++ A_PRINTF("AR6000 connected event on freq %d ", channel);
++ A_PRINTF("with bssid %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x "
++ " listenInterval=%d, beaconInterval = %d, beaconIeLen = %d assocReqLen=%d"
++ " assocRespLen =%d\n",
++ bssid[0], bssid[1], bssid[2],
++ bssid[3], bssid[4], bssid[5],
++ listenInterval, beaconInterval,
++ beaconIeLen, assocReqLen, assocRespLen);
++ if (networkType & ADHOC_NETWORK) {
++ if (networkType & ADHOC_CREATOR) {
++ A_PRINTF("Network: Adhoc (Creator)\n");
++ } else {
++ A_PRINTF("Network: Adhoc (Joiner)\n");
++ }
++ } else {
++ A_PRINTF("Network: Infrastructure\n");
++ }
++
++ if (beaconIeLen && (sizeof(buf) > (9 + beaconIeLen * 2))) {
++ AR_DEBUG_PRINTF("\nBeaconIEs= ");
++
++ beacon_ie_pos = 0;
++ A_MEMZERO(buf, sizeof(buf));
++ sprintf(buf, "%s", beaconIetag);
++ pos = buf + 9;
++ for (i = beacon_ie_pos; i < beacon_ie_pos + beaconIeLen; i++) {
++ AR_DEBUG_PRINTF("%2.2x ", assocInfo[i]);
++ sprintf(pos, "%2.2x", assocInfo[i]);
++ pos += 2;
++ }
++ AR_DEBUG_PRINTF("\n");
++
++ A_MEMZERO(&wrqu, sizeof(wrqu));
++ wrqu.data.length = strlen(buf);
++ wireless_send_event(ar->arNetDev, IWEVCUSTOM, &wrqu, buf);
++ }
++
++ if (assocRespLen && (sizeof(buf) > (12 + (assocRespLen * 2))))
++ {
++ assoc_resp_ie_pos = beaconIeLen + assocReqLen +
++ sizeof(A_UINT16) + /* capinfo*/
++ sizeof(A_UINT16) + /* status Code */
++ sizeof(A_UINT16) ; /* associd */
++ A_MEMZERO(buf, sizeof(buf));
++ sprintf(buf, "%s", tag2);
++ pos = buf + 12;
++ AR_DEBUG_PRINTF("\nAssocRespIEs= ");
++ /*
++ * The Association Response Frame w.o. the WLAN header is delivered to
++ * the host, so skip over to the IEs
++ */
++ for (i = assoc_resp_ie_pos; i < assoc_resp_ie_pos + assocRespLen - 6; i++)
++ {
++ AR_DEBUG_PRINTF("%2.2x ", assocInfo[i]);
++ sprintf(pos, "%2.2x", assocInfo[i]);
++ pos += 2;
++ }
++ AR_DEBUG_PRINTF("\n");
++
++ A_MEMZERO(&wrqu, sizeof(wrqu));
++ wrqu.data.length = strlen(buf);
++ wireless_send_event(ar->arNetDev, IWEVCUSTOM, &wrqu, buf);
++ }
++
++ if (assocReqLen && (sizeof(buf) > (17 + (assocReqLen * 2)))) {
++ /*
++ * assoc Request includes capability and listen interval. Skip these.
++ */
++ assoc_req_ie_pos = beaconIeLen +
++ sizeof(A_UINT16) + /* capinfo*/
++ sizeof(A_UINT16); /* listen interval */
++
++ A_MEMZERO(buf, sizeof(buf));
++ sprintf(buf, "%s", tag1);
++ pos = buf + 17;
++ AR_DEBUG_PRINTF("AssocReqIEs= ");
++ for (i = assoc_req_ie_pos; i < assoc_req_ie_pos + assocReqLen - 4; i++) {
++ AR_DEBUG_PRINTF("%2.2x ", assocInfo[i]);
++ sprintf(pos, "%2.2x", assocInfo[i]);
++ pos += 2;;
++ }
++ AR_DEBUG_PRINTF("\n");
++
++ A_MEMZERO(&wrqu, sizeof(wrqu));
++ wrqu.data.length = strlen(buf);
++ wireless_send_event(ar->arNetDev, IWEVCUSTOM, &wrqu, buf);
++ }
++
++#ifdef USER_KEYS
++ if (ar->user_savedkeys_stat == USER_SAVEDKEYS_STAT_RUN &&
++ ar->user_saved_keys.keyOk == TRUE)
++ {
++
++ key_op_ctrl = KEY_OP_VALID_MASK & ~KEY_OP_INIT_TSC;
++ if (ar->user_key_ctrl & AR6000_USER_SETKEYS_RSC_UNCHANGED) {
++ key_op_ctrl &= ~KEY_OP_INIT_RSC;
++ } else {
++ key_op_ctrl |= KEY_OP_INIT_RSC;
++ }
++ ar6000_reinstall_keys(ar, key_op_ctrl);
++ }
++#endif /* USER_KEYS */
++
++ /* flush data queues */
++ ar6000_TxDataCleanup(ar);
++
++ netif_start_queue(ar->arNetDev);
++
++ if ((OPEN_AUTH == ar->arDot11AuthMode) &&
++ (NONE_AUTH == ar->arAuthMode) &&
++ (WEP_CRYPT == ar->arPairwiseCrypto))
++ {
++ if (!ar->arConnected) {
++ ar6000_install_static_wep_keys(ar);
++ }
++ }
++
++ ar->arConnected = TRUE;
++ ar->arConnectPending = FALSE;
++
++ reconnect_flag = 0;
++
++ A_MEMZERO(&wrqu, sizeof(wrqu));
++ A_MEMCPY(wrqu.addr.sa_data, bssid, IEEE80211_ADDR_LEN);
++ wrqu.addr.sa_family = ARPHRD_ETHER;
++ wireless_send_event(ar->arNetDev, SIOCGIWAP, &wrqu, NULL);
++ if ((ar->arNetworkType == ADHOC_NETWORK) && ar->arIbssPsEnable) {
++ A_MEMZERO(ar->arNodeMap, sizeof(ar->arNodeMap));
++ ar->arNodeNum = 0;
++ ar->arNexEpId = ENDPOINT_2;
++ }
++
++}
++
++void ar6000_set_numdataendpts(AR_SOFTC_T *ar, A_UINT32 num)
++{
++ A_ASSERT(num <= (HTC_MAILBOX_NUM_MAX - 1));
++ ar->arNumDataEndPts = num;
++}
++
++void
++ar6000_disconnect_event(AR_SOFTC_T *ar, A_UINT8 reason, A_UINT8 *bssid,
++ A_UINT8 assocRespLen, A_UINT8 *assocInfo, A_UINT16 protocolReasonStatus)
++{
++ A_UINT8 i;
++
++ A_PRINTF("AR6000 disconnected");
++ if (bssid[0] || bssid[1] || bssid[2] || bssid[3] || bssid[4] || bssid[5]) {
++ A_PRINTF(" from %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x ",
++ bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]);
++ }
++ A_PRINTF("\n");
++
++ AR_DEBUG_PRINTF("\nDisconnect Reason is %d", reason);
++ AR_DEBUG_PRINTF("\nProtocol Reason/Status Code is %d", protocolReasonStatus);
++ AR_DEBUG_PRINTF("\nAssocResp Frame = %s",
++ assocRespLen ? " " : "NULL");
++ for (i = 0; i < assocRespLen; i++) {
++ if (!(i % 0x10)) {
++ AR_DEBUG_PRINTF("\n");
++ }
++ AR_DEBUG_PRINTF("%2.2x ", assocInfo[i]);
++ }
++ AR_DEBUG_PRINTF("\n");
++ /*
++ * If the event is due to disconnect cmd from the host, only they the target
++ * would stop trying to connect. Under any other condition, target would
++ * keep trying to connect.
++ *
++ */
++ if( reason == DISCONNECT_CMD)
++ {
++ ar->arConnectPending = FALSE;
++ } else {
++ ar->arConnectPending = TRUE;
++ if (((reason == ASSOC_FAILED) && (protocolReasonStatus == 0x11)) ||
++ ((reason == ASSOC_FAILED) && (protocolReasonStatus == 0x0) && (reconnect_flag == 1))) {
++ ar->arConnected = TRUE;
++ return;
++ }
++ }
++ ar->arConnected = FALSE;
++
++ if( (reason != CSERV_DISCONNECT) || (reconnect_flag != 1) ) {
++ reconnect_flag = 0;
++ }
++
++#ifdef USER_KEYS
++ if (reason != CSERV_DISCONNECT)
++ {
++ ar->user_savedkeys_stat = USER_SAVEDKEYS_STAT_INIT;
++ ar->user_key_ctrl = 0;
++ }
++#endif /* USER_KEYS */
++
++ netif_stop_queue(ar->arNetDev);
++ A_MEMZERO(ar->arBssid, sizeof(ar->arBssid));
++ ar->arBssChannel = 0;
++ ar->arBeaconInterval = 0;
++
++ ar6000_TxDataCleanup(ar);
++}
++
++void
++ar6000_regDomain_event(AR_SOFTC_T *ar, A_UINT32 regCode)
++{
++ A_PRINTF("AR6000 Reg Code = 0x%x\n", regCode);
++ ar->arRegCode = regCode;
++}
++
++void
++ar6000_neighborReport_event(AR_SOFTC_T *ar, int numAps, WMI_NEIGHBOR_INFO *info)
++{
++ static const char *tag = "PRE-AUTH";
++ char buf[128];
++ union iwreq_data wrqu;
++ int i;
++
++ AR_DEBUG_PRINTF("AR6000 Neighbor Report Event\n");
++ for (i=0; i < numAps; info++, i++) {
++ AR_DEBUG_PRINTF("bssid %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x ",
++ info->bssid[0], info->bssid[1], info->bssid[2],
++ info->bssid[3], info->bssid[4], info->bssid[5]);
++ if (info->bssFlags & WMI_PREAUTH_CAPABLE_BSS) {
++ AR_DEBUG_PRINTF("preauth-cap");
++ }
++ if (info->bssFlags & WMI_PMKID_VALID_BSS) {
++ AR_DEBUG_PRINTF(" pmkid-valid\n");
++ continue; /* we skip bss if the pmkid is already valid */
++ }
++ AR_DEBUG_PRINTF("\n");
++ snprintf(buf, sizeof(buf), "%s%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x",
++ tag,
++ info->bssid[0], info->bssid[1], info->bssid[2],
++ info->bssid[3], info->bssid[4], info->bssid[5],
++ i, info->bssFlags);
++ A_MEMZERO(&wrqu, sizeof(wrqu));
++ wrqu.data.length = strlen(buf);
++ wireless_send_event(ar->arNetDev, IWEVCUSTOM, &wrqu, buf);
++ }
++}
++
++void
++ar6000_tkip_micerr_event(AR_SOFTC_T *ar, A_UINT8 keyid, A_BOOL ismcast)
++{
++ static const char *tag = "MLME-MICHAELMICFAILURE.indication";
++ char buf[128];
++ union iwreq_data wrqu;
++
++ A_PRINTF("AR6000 TKIP MIC error received for keyid %d %scast\n",
++ keyid, ismcast ? "multi": "uni");
++ snprintf(buf, sizeof(buf), "%s(keyid=%d %scat)", tag, keyid,
++ ismcast ? "multi" : "uni");
++ memset(&wrqu, 0, sizeof(wrqu));
++ wrqu.data.length = strlen(buf);
++ wireless_send_event(ar->arNetDev, IWEVCUSTOM, &wrqu, buf);
++}
++
++void
++ar6000_scanComplete_event(AR_SOFTC_T *ar, A_STATUS status)
++{
++ AR_DEBUG_PRINTF("AR6000 scan complete: %d\n", status);
++
++ ar->scan_complete = 1;
++ wake_up_interruptible(&ar6000_scan_queue);
++}
++
++void
++ar6000_targetStats_event(AR_SOFTC_T *ar, WMI_TARGET_STATS *pTarget)
++{
++ TARGET_STATS *pStats = &ar->arTargetStats;
++ A_UINT8 ac;
++
++ /*A_PRINTF("AR6000 updating target stats\n");*/
++ pStats->tx_packets += pTarget->txrxStats.tx_stats.tx_packets;
++ pStats->tx_bytes += pTarget->txrxStats.tx_stats.tx_bytes;
++ pStats->tx_unicast_pkts += pTarget->txrxStats.tx_stats.tx_unicast_pkts;
++ pStats->tx_unicast_bytes += pTarget->txrxStats.tx_stats.tx_unicast_bytes;
++ pStats->tx_multicast_pkts += pTarget->txrxStats.tx_stats.tx_multicast_pkts;
++ pStats->tx_multicast_bytes += pTarget->txrxStats.tx_stats.tx_multicast_bytes;
++ pStats->tx_broadcast_pkts += pTarget->txrxStats.tx_stats.tx_broadcast_pkts;
++ pStats->tx_broadcast_bytes += pTarget->txrxStats.tx_stats.tx_broadcast_bytes;
++ pStats->tx_rts_success_cnt += pTarget->txrxStats.tx_stats.tx_rts_success_cnt;
++ for(ac = 0; ac < WMM_NUM_AC; ac++)
++ pStats->tx_packet_per_ac[ac] += pTarget->txrxStats.tx_stats.tx_packet_per_ac[ac];
++ pStats->tx_errors += pTarget->txrxStats.tx_stats.tx_errors;
++ pStats->tx_failed_cnt += pTarget->txrxStats.tx_stats.tx_failed_cnt;
++ pStats->tx_retry_cnt += pTarget->txrxStats.tx_stats.tx_retry_cnt;
++ pStats->tx_rts_fail_cnt += pTarget->txrxStats.tx_stats.tx_rts_fail_cnt;
++ pStats->tx_unicast_rate = wmi_get_rate(pTarget->txrxStats.tx_stats.tx_unicast_rate);
++
++ pStats->rx_packets += pTarget->txrxStats.rx_stats.rx_packets;
++ pStats->rx_bytes += pTarget->txrxStats.rx_stats.rx_bytes;
++ pStats->rx_unicast_pkts += pTarget->txrxStats.rx_stats.rx_unicast_pkts;
++ pStats->rx_unicast_bytes += pTarget->txrxStats.rx_stats.rx_unicast_bytes;
++ pStats->rx_multicast_pkts += pTarget->txrxStats.rx_stats.rx_multicast_pkts;
++ pStats->rx_multicast_bytes += pTarget->txrxStats.rx_stats.rx_multicast_bytes;
++ pStats->rx_broadcast_pkts += pTarget->txrxStats.rx_stats.rx_broadcast_pkts;
++ pStats->rx_broadcast_bytes += pTarget->txrxStats.rx_stats.rx_broadcast_bytes;
++ pStats->rx_fragment_pkt += pTarget->txrxStats.rx_stats.rx_fragment_pkt;
++ pStats->rx_errors += pTarget->txrxStats.rx_stats.rx_errors;
++ pStats->rx_crcerr += pTarget->txrxStats.rx_stats.rx_crcerr;
++ pStats->rx_key_cache_miss += pTarget->txrxStats.rx_stats.rx_key_cache_miss;
++ pStats->rx_decrypt_err += pTarget->txrxStats.rx_stats.rx_decrypt_err;
++ pStats->rx_duplicate_frames += pTarget->txrxStats.rx_stats.rx_duplicate_frames;
++ pStats->rx_unicast_rate = wmi_get_rate(pTarget->txrxStats.rx_stats.rx_unicast_rate);
++
++
++ pStats->tkip_local_mic_failure
++ += pTarget->txrxStats.tkipCcmpStats.tkip_local_mic_failure;
++ pStats->tkip_counter_measures_invoked
++ += pTarget->txrxStats.tkipCcmpStats.tkip_counter_measures_invoked;
++ pStats->tkip_replays += pTarget->txrxStats.tkipCcmpStats.tkip_replays;
++ pStats->tkip_format_errors += pTarget->txrxStats.tkipCcmpStats.tkip_format_errors;
++ pStats->ccmp_format_errors += pTarget->txrxStats.tkipCcmpStats.ccmp_format_errors;
++ pStats->ccmp_replays += pTarget->txrxStats.tkipCcmpStats.ccmp_replays;
++
++
++ pStats->power_save_failure_cnt += pTarget->pmStats.power_save_failure_cnt;
++ pStats->noise_floor_calibation = pTarget->noise_floor_calibation;
++
++ pStats->cs_bmiss_cnt += pTarget->cservStats.cs_bmiss_cnt;
++ pStats->cs_lowRssi_cnt += pTarget->cservStats.cs_lowRssi_cnt;
++ pStats->cs_connect_cnt += pTarget->cservStats.cs_connect_cnt;
++ pStats->cs_disconnect_cnt += pTarget->cservStats.cs_disconnect_cnt;
++ pStats->cs_aveBeacon_snr = pTarget->cservStats.cs_aveBeacon_snr;
++ pStats->cs_aveBeacon_rssi = pTarget->cservStats.cs_aveBeacon_rssi;
++ pStats->cs_lastRoam_msec = pTarget->cservStats.cs_lastRoam_msec;
++ pStats->cs_snr = pTarget->cservStats.cs_snr;
++ pStats->cs_rssi = pTarget->cservStats.cs_rssi;
++
++ pStats->lq_val = pTarget->lqVal;
++
++ pStats->wow_num_pkts_dropped += pTarget->wowStats.wow_num_pkts_dropped;
++ pStats->wow_num_host_pkt_wakeups += pTarget->wowStats.wow_num_host_pkt_wakeups;
++ pStats->wow_num_host_event_wakeups += pTarget->wowStats.wow_num_host_event_wakeups;
++ pStats->wow_num_events_discarded += pTarget->wowStats.wow_num_events_discarded;
++
++ ar->statsUpdatePending = FALSE;
++ wake_up(&arEvent);
++}
++
++void
++ar6000_rssiThreshold_event(AR_SOFTC_T *ar, WMI_RSSI_THRESHOLD_VAL newThreshold, A_INT16 rssi)
++{
++ USER_RSSI_THOLD userRssiThold;
++
++ userRssiThold.tag = rssi_map[newThreshold].tag;
++ userRssiThold.rssi = rssi;
++ AR_DEBUG2_PRINTF("rssi Threshold range = %d tag = %d rssi = %d\n", newThreshold, userRssiThold.tag, rssi);
++#ifdef SEND_EVENT_TO_APP
++ ar6000_send_event_to_app(ar, WMI_RSSI_THRESHOLD_EVENTID,(A_UINT8 *)&userRssiThold, sizeof(USER_RSSI_THOLD));
++#endif
++}
++
++
++void
++ar6000_hbChallengeResp_event(AR_SOFTC_T *ar, A_UINT32 cookie, A_UINT32 source)
++{
++ if (source == APP_HB_CHALLENGE) {
++ /* Report it to the app in case it wants a positive acknowledgement */
++#ifdef SEND_EVENT_TO_APP
++ ar6000_send_event_to_app(ar, WMIX_HB_CHALLENGE_RESP_EVENTID,
++ (A_UINT8 *)&cookie, sizeof(cookie));
++#endif
++ } else {
++ /* This would ignore the replys that come in after their due time */
++ if (cookie == ar->arHBChallengeResp.seqNum) {
++ ar->arHBChallengeResp.outstanding = FALSE;
++ }
++ }
++}
++
++
++void
++ar6000_reportError_event(AR_SOFTC_T *ar, WMI_TARGET_ERROR_VAL errorVal)
++{
++ char *errString[] = {
++ [WMI_TARGET_PM_ERR_FAIL] "WMI_TARGET_PM_ERR_FAIL",
++ [WMI_TARGET_KEY_NOT_FOUND] "WMI_TARGET_KEY_NOT_FOUND",
++ [WMI_TARGET_DECRYPTION_ERR] "WMI_TARGET_DECRYPTION_ERR",
++ [WMI_TARGET_BMISS] "WMI_TARGET_BMISS",
++ [WMI_PSDISABLE_NODE_JOIN] "WMI_PSDISABLE_NODE_JOIN"
++ };
++
++ A_PRINTF("AR6000 Error on Target. Error = 0x%x\n", errorVal);
++
++ /* One error is reported at a time, and errorval is a bitmask */
++ if(errorVal & (errorVal - 1))
++ return;
++
++ A_PRINTF("AR6000 Error type = ");
++ switch(errorVal)
++ {
++ case WMI_TARGET_PM_ERR_FAIL:
++ case WMI_TARGET_KEY_NOT_FOUND:
++ case WMI_TARGET_DECRYPTION_ERR:
++ case WMI_TARGET_BMISS:
++ case WMI_PSDISABLE_NODE_JOIN:
++ A_PRINTF("%s\n", errString[errorVal]);
++ break;
++ default:
++ A_PRINTF("INVALID\n");
++ break;
++ }
++
++}
++
++
++void
++ar6000_cac_event(AR_SOFTC_T *ar, A_UINT8 ac, A_UINT8 cacIndication,
++ A_UINT8 statusCode, A_UINT8 *tspecSuggestion)
++{
++ WMM_TSPEC_IE *tspecIe;
++
++ /*
++ * This is the TSPEC IE suggestion from AP.
++ * Suggestion provided by AP under some error
++ * cases, could be helpful for the host app.
++ * Check documentation.
++ */
++ tspecIe = (WMM_TSPEC_IE *)tspecSuggestion;
++
++ /*
++ * What do we do, if we get TSPEC rejection? One thought
++ * that comes to mind is implictly delete the pstream...
++ */
++ A_PRINTF("AR6000 CAC notification. "
++ "AC = %d, cacIndication = 0x%x, statusCode = 0x%x\n",
++ ac, cacIndication, statusCode);
++}
++
++#define AR6000_PRINT_BSSID(_pBss) do { \
++ A_PRINTF("%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x ",\
++ (_pBss)[0],(_pBss)[1],(_pBss)[2],(_pBss)[3],\
++ (_pBss)[4],(_pBss)[5]); \
++} while(0)
++
++void
++ar6000_roam_tbl_event(AR_SOFTC_T *ar, WMI_TARGET_ROAM_TBL *pTbl)
++{
++ A_UINT8 i;
++
++ A_PRINTF("ROAM TABLE NO OF ENTRIES is %d ROAM MODE is %d\n",
++ pTbl->numEntries, pTbl->roamMode);
++ for (i= 0; i < pTbl->numEntries; i++) {
++ A_PRINTF("[%d]bssid %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x ", i,
++ pTbl->bssRoamInfo[i].bssid[0], pTbl->bssRoamInfo[i].bssid[1],
++ pTbl->bssRoamInfo[i].bssid[2],
++ pTbl->bssRoamInfo[i].bssid[3],
++ pTbl->bssRoamInfo[i].bssid[4],
++ pTbl->bssRoamInfo[i].bssid[5]);
++ A_PRINTF("RSSI %d RSSIDT %d LAST RSSI %d UTIL %d ROAM_UTIL %d"
++ " BIAS %d\n",
++ pTbl->bssRoamInfo[i].rssi,
++ pTbl->bssRoamInfo[i].rssidt,
++ pTbl->bssRoamInfo[i].last_rssi,
++ pTbl->bssRoamInfo[i].util,
++ pTbl->bssRoamInfo[i].roam_util,
++ pTbl->bssRoamInfo[i].bias);
++ }
++}
++
++void
++ar6000_wow_list_event(struct ar6_softc *ar, A_UINT8 num_filters, WMI_GET_WOW_LIST_REPLY *wow_reply)
++{
++ A_UINT8 i,j;
++
++ /*Each event now contains exactly one filter, see bug 26613*/
++ A_PRINTF("WOW pattern %d of %d patterns\n", wow_reply->this_filter_num, wow_reply->num_filters);
++ A_PRINTF("wow mode = %s host mode = %s\n",
++ (wow_reply->wow_mode == 0? "disabled":"enabled"),
++ (wow_reply->host_mode == 1 ? "awake":"asleep"));
++
++
++ /*If there are no patterns, the reply will only contain generic
++ WoW information. Pattern information will exist only if there are
++ patterns present. Bug 26716*/
++
++ /* If this event contains pattern information, display it*/
++ if (wow_reply->this_filter_num) {
++ i=0;
++ A_PRINTF("id=%d size=%d offset=%d\n",
++ wow_reply->wow_filters[i].wow_filter_id,
++ wow_reply->wow_filters[i].wow_filter_size,
++ wow_reply->wow_filters[i].wow_filter_offset);
++ A_PRINTF("wow pattern = ");
++ for (j=0; j< wow_reply->wow_filters[i].wow_filter_size; j++) {
++ A_PRINTF("%2.2x",wow_reply->wow_filters[i].wow_filter_pattern[j]);
++ }
++
++ A_PRINTF("\nwow mask = ");
++ for (j=0; j< wow_reply->wow_filters[i].wow_filter_size; j++) {
++ A_PRINTF("%2.2x",wow_reply->wow_filters[i].wow_filter_mask[j]);
++ }
++ A_PRINTF("\n");
++ }
++}
++
++/*
++ * Report the Roaming related data collected on the target
++ */
++void
++ar6000_display_roam_time(WMI_TARGET_ROAM_TIME *p)
++{
++ A_PRINTF("Disconnect Data : BSSID: ");
++ AR6000_PRINT_BSSID(p->disassoc_bssid);
++ A_PRINTF(" RSSI %d DISASSOC Time %d NO_TXRX_TIME %d\n",
++ p->disassoc_bss_rssi,p->disassoc_time,
++ p->no_txrx_time);
++ A_PRINTF("Connect Data: BSSID: ");
++ AR6000_PRINT_BSSID(p->assoc_bssid);
++ A_PRINTF(" RSSI %d ASSOC Time %d TXRX_TIME %d\n",
++ p->assoc_bss_rssi,p->assoc_time,
++ p->allow_txrx_time);
++ A_PRINTF("Last Data Tx Time (b4 Disassoc) %d "\
++ "First Data Tx Time (after Assoc) %d\n",
++ p->last_data_txrx_time, p->first_data_txrx_time);
++}
++
++void
++ar6000_roam_data_event(AR_SOFTC_T *ar, WMI_TARGET_ROAM_DATA *p)
++{
++ switch (p->roamDataType) {
++ case ROAM_DATA_TIME:
++ ar6000_display_roam_time(&p->u.roamTime);
++ break;
++ default:
++ break;
++ }
++}
++
++void
++ar6000_bssInfo_event_rx(AR_SOFTC_T *ar, A_UINT8 *datap, int len)
++{
++ struct sk_buff *skb;
++ WMI_BSS_INFO_HDR *bih = (WMI_BSS_INFO_HDR *)datap;
++
++
++ if (!ar->arMgmtFilter) {
++ return;
++ }
++ if (((ar->arMgmtFilter & IEEE80211_FILTER_TYPE_BEACON) &&
++ (bih->frameType != BEACON_FTYPE)) ||
++ ((ar->arMgmtFilter & IEEE80211_FILTER_TYPE_PROBE_RESP) &&
++ (bih->frameType != PROBERESP_FTYPE)))
++ {
++ return;
++ }
++
++ if ((skb = A_NETBUF_ALLOC_RAW(len)) != NULL) {
++
++ A_NETBUF_PUT(skb, len);
++ A_MEMCPY(A_NETBUF_DATA(skb), datap, len);
++ skb->dev = ar->arNetDev;
++ printk("MAC RAW...\n");
++// skb->mac.raw = A_NETBUF_DATA(skb);
++ skb->ip_summed = CHECKSUM_NONE;
++ skb->pkt_type = PACKET_OTHERHOST;
++ skb->protocol = __constant_htons(0x0019);
++ netif_rx(skb);
++ }
++}
++
++A_UINT32 wmiSendCmdNum;
++
++A_STATUS
++ar6000_control_tx(void *devt, void *osbuf, WMI_PRI_STREAM_ID streamID)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
++ A_STATUS status = A_OK;
++ struct ar_cookie *cookie = NULL;
++ int i;
++
++ /* take lock to protect ar6000_alloc_cookie() */
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++
++ do {
++
++ AR_DEBUG2_PRINTF("ar_contrstatus = ol_tx: skb=0x%x, len=0x%x, sid=%d\n",
++ (A_UINT32)osbuf, A_NETBUF_LEN(osbuf), streamID);
++
++ if ((streamID == WMI_CONTROL_PRI) && (ar->arWMIControlEpFull)) {
++ /* control endpoint is full, don't allocate resources, we
++ * are just going to drop this packet */
++ cookie = NULL;
++ AR_DEBUG_PRINTF(" WMI Control EP full, dropping packet : 0x%X, len:%d \n",
++ (A_UINT32)osbuf, A_NETBUF_LEN(osbuf));
++ } else {
++ cookie = ar6000_alloc_cookie(ar);
++ }
++
++ if (cookie == NULL) {
++ status = A_NO_MEMORY;
++ break;
++ }
++
++ if(logWmiRawMsgs) {
++ A_PRINTF("WMI cmd send, msgNo %d :", wmiSendCmdNum);
++ for(i = 0; i < a_netbuf_to_len(osbuf); i++)
++ A_PRINTF("%x ", ((A_UINT8 *)a_netbuf_to_data(osbuf))[i]);
++ A_PRINTF("\n");
++ }
++
++ wmiSendCmdNum++;
++
++ } while (FALSE);
++
++ if (cookie != NULL) {
++ /* got a structure to send it out on */
++ ar->arTxPending[streamID]++;
++
++ if (streamID != WMI_CONTROL_PRI) {
++ ar->arTotalTxDataPending++;
++ }
++ }
++
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++
++ if (cookie != NULL) {
++ cookie->arc_bp[0] = (A_UINT32)osbuf;
++ cookie->arc_bp[1] = 0;
++ SET_HTC_PACKET_INFO_TX(&cookie->HtcPkt,
++ cookie,
++ A_NETBUF_DATA(osbuf),
++ A_NETBUF_LEN(osbuf),
++ arWMIStream2EndpointID(ar,streamID),
++ AR6K_CONTROL_PKT_TAG);
++ /* this interface is asynchronous, if there is an error, cleanup will happen in the
++ * TX completion callback */
++ HTCSendPkt(ar->arHtcTarget, &cookie->HtcPkt);
++ status = A_OK;
++ }
++
++ return status;
++}
++
++/* indicate tx activity or inactivity on a WMI stream */
++void ar6000_indicate_tx_activity(void *devt, A_UINT8 TrafficClass, A_BOOL Active)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
++ WMI_PRI_STREAM_ID streamid;
++
++ if (ar->arWmiEnabled) {
++ streamid = wmi_get_stream_id(ar->arWmi, TrafficClass);
++ } else {
++ /* for mbox ping testing, the traffic class is mapped directly as a stream ID,
++ * see handling of AR6000_XIOCTL_TRAFFIC_ACTIVITY_CHANGE in ioctl.c */
++ streamid = (WMI_PRI_STREAM_ID)TrafficClass;
++ }
++
++ /* notify HTC, this may cause credit distribution changes */
++
++ HTCIndicateActivityChange(ar->arHtcTarget,
++ arWMIStream2EndpointID(ar,streamid),
++ Active);
++
++}
++
++module_init(ar6000_init_module);
++module_exit(ar6000_cleanup_module);
++
++/* Init cookie queue */
++static void
++ar6000_cookie_init(AR_SOFTC_T *ar)
++{
++ A_UINT32 i;
++
++ ar->arCookieList = NULL;
++ A_MEMZERO(s_ar_cookie_mem, sizeof(s_ar_cookie_mem));
++
++ for (i = 0; i < MAX_COOKIE_NUM; i++) {
++ ar6000_free_cookie(ar, &s_ar_cookie_mem[i]);
++ }
++}
++
++/* cleanup cookie queue */
++static void
++ar6000_cookie_cleanup(AR_SOFTC_T *ar)
++{
++ /* It is gone .... */
++ ar->arCookieList = NULL;
++}
++
++/* Init cookie queue */
++static void
++ar6000_free_cookie(AR_SOFTC_T *ar, struct ar_cookie * cookie)
++{
++ /* Insert first */
++ A_ASSERT(ar != NULL);
++ A_ASSERT(cookie != NULL);
++ cookie->arc_list_next = ar->arCookieList;
++ ar->arCookieList = cookie;
++}
++
++/* cleanup cookie queue */
++static struct ar_cookie *
++ar6000_alloc_cookie(AR_SOFTC_T *ar)
++{
++ struct ar_cookie *cookie;
++
++ cookie = ar->arCookieList;
++ if(cookie != NULL)
++ {
++ ar->arCookieList = cookie->arc_list_next;
++ }
++
++ return cookie;
++}
++
++#ifdef SEND_EVENT_TO_APP
++/*
++ * This function is used to send event which come from taget to
++ * the application. The buf which send to application is include
++ * the event ID and event content.
++ */
++#define EVENT_ID_LEN 2
++void ar6000_send_event_to_app(AR_SOFTC_T *ar, A_UINT16 eventId,
++ A_UINT8 *datap, int len)
++{
++
++#if (WIRELESS_EXT >= 15)
++
++/* note: IWEVCUSTOM only exists in wireless extensions after version 15 */
++
++ char *buf;
++ A_UINT16 size;
++ union iwreq_data wrqu;
++
++ size = len + EVENT_ID_LEN;
++
++ if (size > IW_CUSTOM_MAX) {
++ AR_DEBUG_PRINTF("WMI event ID : 0x%4.4X, len = %d too big for IWEVCUSTOM (max=%d) \n",
++ eventId, size, IW_CUSTOM_MAX);
++ return;
++ }
++
++ buf = A_MALLOC_NOWAIT(size);
++ A_MEMZERO(buf, size);
++ A_MEMCPY(buf, &eventId, EVENT_ID_LEN);
++ A_MEMCPY(buf+EVENT_ID_LEN, datap, len);
++
++ //AR_DEBUG_PRINTF("event ID = %d,len = %d\n",*(A_UINT16*)buf, size);
++ A_MEMZERO(&wrqu, sizeof(wrqu));
++ wrqu.data.length = size;
++ wireless_send_event(ar->arNetDev, IWEVCUSTOM, &wrqu, buf);
++
++ A_FREE(buf);
++#endif
++
++
++}
++#endif
++
++
++void
++ar6000_tx_retry_err_event(void *devt)
++{
++ AR_DEBUG2_PRINTF("Tx retries reach maximum!\n");
++}
++
++void
++ar6000_snrThresholdEvent_rx(void *devt, WMI_SNR_THRESHOLD_VAL newThreshold, A_UINT8 snr)
++{
++ AR_DEBUG2_PRINTF("snr threshold range %d, snr %d\n", newThreshold, snr);
++}
++
++void
++ar6000_lqThresholdEvent_rx(void *devt, WMI_LQ_THRESHOLD_VAL newThreshold, A_UINT8 lq)
++{
++ AR_DEBUG2_PRINTF("lq threshold range %d, lq %d\n", newThreshold, lq);
++}
++
++
++
++A_UINT32
++a_copy_to_user(void *to, const void *from, A_UINT32 n)
++{
++ return(copy_to_user(to, from, n));
++}
++
++A_UINT32
++a_copy_from_user(void *to, const void *from, A_UINT32 n)
++{
++ return(copy_from_user(to, from, n));
++}
++
++
++A_STATUS
++ar6000_get_driver_cfg(struct net_device *dev,
++ A_UINT16 cfgParam,
++ void *result)
++{
++
++ A_STATUS ret = 0;
++
++ switch(cfgParam)
++ {
++ case AR6000_DRIVER_CFG_GET_WLANNODECACHING:
++ *((A_UINT32 *)result) = wlanNodeCaching;
++ break;
++ case AR6000_DRIVER_CFG_LOG_RAW_WMI_MSGS:
++ *((A_UINT32 *)result) = logWmiRawMsgs;
++ break;
++ default:
++ ret = EINVAL;
++ break;
++ }
++
++ return ret;
++}
++
++void
++ar6000_keepalive_rx(void *devt, A_UINT8 configured)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
++
++ ar->arKeepaliveConfigured = configured;
++ wake_up(&arEvent);
++}
++
++void
++ar6000_pmkid_list_event(void *devt, A_UINT8 numPMKID, WMI_PMKID *pmkidList)
++{
++ A_UINT8 i, j;
++
++ A_PRINTF("Number of Cached PMKIDs is %d\n", numPMKID);
++
++ for (i = 0; i < numPMKID; i++) {
++ A_PRINTF("\nPMKID %d ", i);
++ for (j = 0; j < WMI_PMKID_LEN; j++) {
++ A_PRINTF("%2.2x", pmkidList->pmkid[j]);
++ }
++ pmkidList++;
++ }
++}
++
++#ifdef USER_KEYS
++static A_STATUS
++
++ar6000_reinstall_keys(AR_SOFTC_T *ar, A_UINT8 key_op_ctrl)
++{
++ A_STATUS status = A_OK;
++ struct ieee80211req_key *uik = &ar->user_saved_keys.ucast_ik;
++ struct ieee80211req_key *bik = &ar->user_saved_keys.bcast_ik;
++ CRYPTO_TYPE keyType = ar->user_saved_keys.keyType;
++
++ if (IEEE80211_CIPHER_CCKM_KRK != uik->ik_type) {
++ if (NONE_CRYPT == keyType) {
++ goto _reinstall_keys_out;
++ }
++
++ if (uik->ik_keylen) {
++ status = wmi_addKey_cmd(ar->arWmi, uik->ik_keyix,
++ ar->user_saved_keys.keyType, PAIRWISE_USAGE,
++ uik->ik_keylen, (A_UINT8 *)&uik->ik_keyrsc,
++ uik->ik_keydata, key_op_ctrl, SYNC_BEFORE_WMIFLAG);
++ }
++
++ } else {
++ status = wmi_add_krk_cmd(ar->arWmi, uik->ik_keydata);
++ }
++
++ if (IEEE80211_CIPHER_CCKM_KRK != bik->ik_type) {
++ if (NONE_CRYPT == keyType) {
++ goto _reinstall_keys_out;
++ }
++
++ if (bik->ik_keylen) {
++ status = wmi_addKey_cmd(ar->arWmi, bik->ik_keyix,
++ ar->user_saved_keys.keyType, GROUP_USAGE,
++ bik->ik_keylen, (A_UINT8 *)&bik->ik_keyrsc,
++ bik->ik_keydata, key_op_ctrl, NO_SYNC_WMIFLAG);
++ }
++ } else {
++ status = wmi_add_krk_cmd(ar->arWmi, bik->ik_keydata);
++ }
++
++_reinstall_keys_out:
++ ar->user_savedkeys_stat = USER_SAVEDKEYS_STAT_INIT;
++ ar->user_key_ctrl = 0;
++
++ return status;
++}
++#endif /* USER_KEYS */
++
++
++void
++ar6000_dset_open_req(
++ void *context,
++ A_UINT32 id,
++ A_UINT32 targHandle,
++ A_UINT32 targReplyFn,
++ A_UINT32 targReplyArg)
++{
++}
++
++void
++ar6000_dset_close(
++ void *context,
++ A_UINT32 access_cookie)
++{
++ return;
++}
++
++void
++ar6000_dset_data_req(
++ void *context,
++ A_UINT32 accessCookie,
++ A_UINT32 offset,
++ A_UINT32 length,
++ A_UINT32 targBuf,
++ A_UINT32 targReplyFn,
++ A_UINT32 targReplyArg)
++{
++}
+diff --git a/drivers/ar6000/ar6000/ar6000_drv.h b/drivers/ar6000/ar6000/ar6000_drv.h
+new file mode 100644
+index 0000000..3230d32
+--- /dev/null
++++ b/drivers/ar6000/ar6000/ar6000_drv.h
+@@ -0,0 +1,361 @@
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef _AR6000_H_
++#define _AR6000_H_
++
++#include <linux/version.h>
++
++
++#include <generated/autoconf.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/spinlock.h>
++#include <linux/skbuff.h>
++#include <linux/if_ether.h>
++#include <linux/netdevice.h>
++#include <linux/etherdevice.h>
++#include <net/iw_handler.h>
++#include <linux/if_arp.h>
++#include <linux/ip.h>
++#include <linux/semaphore.h>
++#include <linux/wireless.h>
++#include <linux/module.h>
++#include <linux/sched.h>
++#include <asm/io.h>
++
++#include <a_config.h>
++#include <athdefs.h>
++#include "a_types.h"
++#include "a_osapi.h"
++#include "htc_api.h"
++#include "wmi.h"
++#include "a_drv.h"
++#include "bmi.h"
++#include <ieee80211.h>
++#include <ieee80211_ioctl.h>
++#include <wlan_api.h>
++#include <wmi_api.h>
++#include "gpio_api.h"
++#include "gpio.h"
++#include <host_version.h>
++#include <linux/rtnetlink.h>
++#include <linux/init.h>
++#include <linux/moduleparam.h>
++#include "AR6Khwreg.h"
++#include "ar6000_api.h"
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++#include <testcmd.h>
++#endif
++
++#include "targaddrs.h"
++#include "dbglog_api.h"
++#include "ar6000_diag.h"
++#include "common_drv.h"
++
++#ifndef __dev_put
++#define __dev_put(dev) dev_put(dev)
++#endif
++
++#ifdef USER_KEYS
++
++#define USER_SAVEDKEYS_STAT_INIT 0
++#define USER_SAVEDKEYS_STAT_RUN 1
++
++// TODO this needs to move into the AR_SOFTC struct
++struct USER_SAVEDKEYS {
++ struct ieee80211req_key ucast_ik;
++ struct ieee80211req_key bcast_ik;
++ CRYPTO_TYPE keyType;
++ A_BOOL keyOk;
++};
++#endif
++
++#define DBG_INFO 0x00000001
++#define DBG_ERROR 0x00000002
++#define DBG_WARNING 0x00000004
++#define DBG_SDIO 0x00000008
++#define DBG_HIF 0x00000010
++#define DBG_HTC 0x00000020
++#define DBG_WMI 0x00000040
++#define DBG_WMI2 0x00000080
++#define DBG_DRIVER 0x00000100
++
++#define DBG_DEFAULTS (DBG_ERROR|DBG_WARNING)
++
++
++#ifdef DEBUG
++#define AR_DEBUG_PRINTF(args...) if (debugdriver) A_PRINTF(args);
++#define AR_DEBUG2_PRINTF(args...) if (debugdriver >= 2) A_PRINTF(args);
++extern int debugdriver;
++#else
++#define AR_DEBUG_PRINTF(args...)
++#define AR_DEBUG2_PRINTF(args...)
++#endif
++
++A_STATUS ar6000_ReadRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data);
++A_STATUS ar6000_WriteRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data);
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define MAX_AR6000 1
++#define AR6000_MAX_RX_BUFFERS 16
++#define AR6000_BUFFER_SIZE 1664
++#define AR6000_TX_TIMEOUT 10
++#define AR6000_ETH_ADDR_LEN 6
++#define AR6000_MAX_ENDPOINTS 4
++#define MAX_NODE_NUM 15
++#define MAX_COOKIE_NUM 150
++#define AR6000_HB_CHALLENGE_RESP_FREQ_DEFAULT 1
++#define AR6000_HB_CHALLENGE_RESP_MISS_THRES_DEFAULT 1
++
++enum {
++ DRV_HB_CHALLENGE = 0,
++ APP_HB_CHALLENGE
++};
++
++/* HTC RAW streams */
++typedef enum _HTC_RAW_STREAM_ID {
++ HTC_RAW_STREAM_NOT_MAPPED = -1,
++ HTC_RAW_STREAM_0 = 0,
++ HTC_RAW_STREAM_1 = 1,
++ HTC_RAW_STREAM_2 = 2,
++ HTC_RAW_STREAM_3 = 3,
++ HTC_RAW_STREAM_NUM_MAX
++} HTC_RAW_STREAM_ID;
++
++#define RAW_HTC_READ_BUFFERS_NUM 4
++#define RAW_HTC_WRITE_BUFFERS_NUM 4
++
++typedef struct {
++ int currPtr;
++ int length;
++ unsigned char data[AR6000_BUFFER_SIZE];
++ HTC_PACKET HTCPacket;
++} raw_htc_buffer;
++
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++/*
++ * add TCMD_MODE besides wmi and bypasswmi
++ * in TCMD_MODE, only few TCMD releated wmi commands
++ * counld be hanlder
++ */
++enum {
++ AR6000_WMI_MODE = 0,
++ AR6000_BYPASS_MODE,
++ AR6000_TCMD_MODE,
++ AR6000_WLAN_MODE
++};
++#endif /* CONFIG_HOST_TCMD_SUPPORT */
++
++struct ar_wep_key {
++ A_UINT8 arKeyIndex;
++ A_UINT8 arKeyLen;
++ A_UINT8 arKey[64];
++} ;
++
++struct ar_node_mapping {
++ A_UINT8 macAddress[6];
++ A_UINT8 epId;
++ A_UINT8 txPending;
++};
++
++struct ar_cookie {
++ A_UINT32 arc_bp[2]; /* Must be first field */
++ HTC_PACKET HtcPkt; /* HTC packet wrapper */
++ struct ar_cookie *arc_list_next;
++};
++
++struct ar_hb_chlng_resp {
++ A_TIMER timer;
++ A_UINT32 frequency;
++ A_UINT32 seqNum;
++ A_BOOL outstanding;
++ A_UINT8 missCnt;
++ A_UINT8 missThres;
++};
++
++typedef struct ar6_softc {
++ struct net_device *arNetDev; /* net_device pointer */
++ void *arWmi;
++ int arTxPending[WMI_PRI_MAX_COUNT];
++ int arTotalTxDataPending;
++ A_UINT8 arNumDataEndPts;
++ A_BOOL arWmiEnabled;
++ A_BOOL arWmiReady;
++ A_BOOL arConnected;
++ A_BOOL arRadioSwitch;
++ HTC_HANDLE arHtcTarget;
++ void *arHifDevice;
++ spinlock_t arLock;
++ struct semaphore arSem;
++ int arRxBuffers[WMI_PRI_MAX_COUNT];
++ int arSsidLen;
++ u_char arSsid[32];
++ A_UINT8 arNetworkType;
++ A_UINT8 arDot11AuthMode;
++ A_UINT8 arAuthMode;
++ A_UINT8 arPairwiseCrypto;
++ A_UINT8 arPairwiseCryptoLen;
++ A_UINT8 arGroupCrypto;
++ A_UINT8 arGroupCryptoLen;
++ A_UINT8 arDefTxKeyIndex;
++ struct ar_wep_key arWepKeyList[WMI_MAX_KEY_INDEX + 1];
++ A_UINT8 arBssid[6];
++ A_UINT8 arReqBssid[6];
++ A_UINT16 arChannelHint;
++ A_UINT16 arBssChannel;
++ A_UINT16 arListenInterval;
++ struct ar6000_version arVersion;
++ A_UINT32 arTargetType;
++ A_INT8 arRssi;
++ A_UINT8 arTxPwr;
++ A_BOOL arTxPwrSet;
++ A_INT32 arBitRate;
++ struct net_device_stats arNetStats;
++ struct iw_statistics arIwStats;
++ A_INT8 arNumChannels;
++ A_UINT16 arChannelList[32];
++ A_UINT32 arRegCode;
++ A_BOOL statsUpdatePending;
++ TARGET_STATS arTargetStats;
++ A_INT8 arMaxRetries;
++ A_UINT8 arPhyCapability;
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++ A_UINT8 tcmdRxReport;
++ A_UINT32 tcmdRxTotalPkt;
++ A_INT32 tcmdRxRssi;
++ A_UINT32 tcmdPm;
++ A_UINT32 arTargetMode;
++#endif
++ AR6000_WLAN_STATE arWlanState;
++ struct ar_node_mapping arNodeMap[MAX_NODE_NUM];
++ A_UINT8 arIbssPsEnable;
++ A_UINT8 arNodeNum;
++ A_UINT8 arNexEpId;
++ struct ar_cookie *arCookieList;
++ A_UINT16 arRateMask;
++ A_UINT8 arSkipScan;
++ A_UINT16 arBeaconInterval;
++ A_BOOL arConnectPending;
++ A_BOOL arWmmEnabled;
++ struct ar_hb_chlng_resp arHBChallengeResp;
++ A_UINT8 arKeepaliveConfigured;
++ A_UINT32 arMgmtFilter;
++ HTC_ENDPOINT_ID arWmi2EpMapping[WMI_PRI_MAX_COUNT];
++ WMI_PRI_STREAM_ID arEp2WmiMapping[ENDPOINT_MAX];
++#ifdef HTC_RAW_INTERFACE
++ HTC_ENDPOINT_ID arRaw2EpMapping[HTC_RAW_STREAM_NUM_MAX];
++ HTC_RAW_STREAM_ID arEp2RawMapping[ENDPOINT_MAX];
++ struct semaphore raw_htc_read_sem[HTC_RAW_STREAM_NUM_MAX];
++ struct semaphore raw_htc_write_sem[HTC_RAW_STREAM_NUM_MAX];
++ wait_queue_head_t raw_htc_read_queue[HTC_RAW_STREAM_NUM_MAX];
++ wait_queue_head_t raw_htc_write_queue[HTC_RAW_STREAM_NUM_MAX];
++ raw_htc_buffer *raw_htc_read_buffer[HTC_RAW_STREAM_NUM_MAX][RAW_HTC_READ_BUFFERS_NUM];
++ raw_htc_buffer *raw_htc_write_buffer[HTC_RAW_STREAM_NUM_MAX][RAW_HTC_WRITE_BUFFERS_NUM];
++ A_BOOL write_buffer_available[HTC_RAW_STREAM_NUM_MAX];
++ A_BOOL read_buffer_available[HTC_RAW_STREAM_NUM_MAX];
++#endif
++ A_BOOL arRawIfInit;
++ int arDeviceIndex;
++ COMMON_CREDIT_STATE_INFO arCreditStateInfo;
++ A_BOOL arWMIControlEpFull;
++ A_BOOL dbgLogFetchInProgress;
++ A_UCHAR log_buffer[DBGLOG_HOST_LOG_BUFFER_SIZE];
++ A_UINT32 log_cnt;
++ A_UINT32 dbglog_init_done;
++ A_UINT32 arConnectCtrlFlags;
++ A_UINT32 scan_complete;
++#ifdef USER_KEYS
++ A_INT32 user_savedkeys_stat;
++ A_UINT32 user_key_ctrl;
++ struct USER_SAVEDKEYS user_saved_keys;
++#endif
++} AR_SOFTC_T;
++
++
++#define arWMIStream2EndpointID(ar,wmi) (ar)->arWmi2EpMapping[(wmi)]
++#define arSetWMIStream2EndpointIDMap(ar,wmi,ep) \
++{ (ar)->arWmi2EpMapping[(wmi)] = (ep); \
++ (ar)->arEp2WmiMapping[(ep)] = (wmi); }
++#define arEndpoint2WMIStreamID(ar,ep) (ar)->arEp2WmiMapping[(ep)]
++
++#define arRawIfEnabled(ar) (ar)->arRawIfInit
++#define arRawStream2EndpointID(ar,raw) (ar)->arRaw2EpMapping[(raw)]
++#define arSetRawStream2EndpointIDMap(ar,raw,ep) \
++{ (ar)->arRaw2EpMapping[(raw)] = (ep); \
++ (ar)->arEp2RawMapping[(ep)] = (raw); }
++#define arEndpoint2RawStreamID(ar,ep) (ar)->arEp2RawMapping[(ep)]
++
++struct ar_giwscan_param {
++ char *current_ev;
++ char *end_buf;
++ A_BOOL firstPass;
++};
++
++#define AR6000_STAT_INC(ar, stat) (ar->arNetStats.stat++)
++
++#define AR6000_SPIN_LOCK(lock, param) do { \
++ if (irqs_disabled()) { \
++ AR_DEBUG_PRINTF("IRQs disabled:AR6000_LOCK\n"); \
++ } \
++ spin_lock_bh(lock); \
++} while (0)
++
++#define AR6000_SPIN_UNLOCK(lock, param) do { \
++ if (irqs_disabled()) { \
++ AR_DEBUG_PRINTF("IRQs disabled: AR6000_UNLOCK\n"); \
++ } \
++ spin_unlock_bh(lock); \
++} while (0)
++
++int ar6000_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
++int ar6000_ioctl_dispatcher(struct net_device *dev, struct ifreq *rq, int cmd);
++void ar6000_ioctl_iwsetup(struct iw_handler_def *def);
++void ar6000_gpio_init(void);
++void ar6000_init_profile_info(AR_SOFTC_T *ar);
++void ar6000_install_static_wep_keys(AR_SOFTC_T *ar);
++int ar6000_init(struct net_device *dev);
++int ar6000_dbglog_get_debug_logs(AR_SOFTC_T *ar);
++A_STATUS ar6000_SetHTCBlockSize(AR_SOFTC_T *ar);
++
++#ifdef HTC_RAW_INTERFACE
++
++#ifndef __user
++#define __user
++#endif
++
++int ar6000_htc_raw_open(AR_SOFTC_T *ar);
++int ar6000_htc_raw_close(AR_SOFTC_T *ar);
++ssize_t ar6000_htc_raw_read(AR_SOFTC_T *ar,
++ HTC_RAW_STREAM_ID StreamID,
++ char __user *buffer, size_t count);
++ssize_t ar6000_htc_raw_write(AR_SOFTC_T *ar,
++ HTC_RAW_STREAM_ID StreamID,
++ char __user *buffer, size_t count);
++
++#endif /* HTC_RAW_INTERFACE */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _AR6000_H_ */
+diff --git a/drivers/ar6000/ar6000/ar6000_raw_if.c b/drivers/ar6000/ar6000/ar6000_raw_if.c
+new file mode 100644
+index 0000000..c0d9f8e
+--- /dev/null
++++ b/drivers/ar6000/ar6000/ar6000_raw_if.c
+@@ -0,0 +1,440 @@
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "ar6000_drv.h"
++
++#ifdef HTC_RAW_INTERFACE
++
++static void
++ar6000_htc_raw_read_cb(void *Context, HTC_PACKET *pPacket)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)Context;
++ raw_htc_buffer *busy;
++ HTC_RAW_STREAM_ID streamID;
++
++ busy = (raw_htc_buffer *)pPacket->pPktContext;
++ A_ASSERT(busy != NULL);
++
++ if (pPacket->Status == A_ECANCELED) {
++ /*
++ * HTC provides A_ECANCELED status when it doesn't want to be refilled
++ * (probably due to a shutdown)
++ */
++ return;
++ }
++
++ streamID = arEndpoint2RawStreamID(ar,pPacket->Endpoint);
++ A_ASSERT(streamID != HTC_RAW_STREAM_NOT_MAPPED);
++
++#ifdef CF
++ if (down_trylock(&ar->raw_htc_read_sem[streamID])) {
++#else
++ if (down_interruptible(&ar->raw_htc_read_sem[streamID])) {
++#endif /* CF */
++ AR_DEBUG2_PRINTF("Unable to down the semaphore\n");
++ }
++
++ A_ASSERT((pPacket->Status != A_OK) ||
++ (pPacket->pBuffer == (busy->data + HTC_HEADER_LEN)));
++
++ busy->length = pPacket->ActualLength + HTC_HEADER_LEN;
++ busy->currPtr = HTC_HEADER_LEN;
++ ar->read_buffer_available[streamID] = TRUE;
++ //AR_DEBUG_PRINTF("raw read cb: 0x%X 0x%X \n", busy->currPtr,busy->length);
++ up(&ar->raw_htc_read_sem[streamID]);
++
++ /* Signal the waiting process */
++ AR_DEBUG2_PRINTF("Waking up the StreamID(%d) read process\n", streamID);
++ wake_up_interruptible(&ar->raw_htc_read_queue[streamID]);
++}
++
++static void
++ar6000_htc_raw_write_cb(void *Context, HTC_PACKET *pPacket)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)Context;
++ raw_htc_buffer *free;
++ HTC_RAW_STREAM_ID streamID;
++
++ free = (raw_htc_buffer *)pPacket->pPktContext;
++ A_ASSERT(free != NULL);
++
++ if (pPacket->Status == A_ECANCELED) {
++ /*
++ * HTC provides A_ECANCELED status when it doesn't want to be refilled
++ * (probably due to a shutdown)
++ */
++ return;
++ }
++
++ streamID = arEndpoint2RawStreamID(ar,pPacket->Endpoint);
++ A_ASSERT(streamID != HTC_RAW_STREAM_NOT_MAPPED);
++
++#ifdef CF
++ if (down_trylock(&ar->raw_htc_write_sem[streamID])) {
++#else
++ if (down_interruptible(&ar->raw_htc_write_sem[streamID])) {
++#endif
++ AR_DEBUG2_PRINTF("Unable to down the semaphore\n");
++ }
++
++ A_ASSERT(pPacket->pBuffer == (free->data + HTC_HEADER_LEN));
++
++ free->length = 0;
++ ar->write_buffer_available[streamID] = TRUE;
++ up(&ar->raw_htc_write_sem[streamID]);
++
++ /* Signal the waiting process */
++ AR_DEBUG2_PRINTF("Waking up the StreamID(%d) write process\n", streamID);
++ wake_up_interruptible(&ar->raw_htc_write_queue[streamID]);
++}
++
++/* connect to a service */
++static A_STATUS ar6000_connect_raw_service(AR_SOFTC_T *ar,
++ HTC_RAW_STREAM_ID StreamID)
++{
++ A_STATUS status;
++ HTC_SERVICE_CONNECT_RESP response;
++ A_UINT8 streamNo;
++ HTC_SERVICE_CONNECT_REQ connect;
++
++ do {
++
++ A_MEMZERO(&connect,sizeof(connect));
++ /* pass the stream ID as meta data to the RAW streams service */
++ streamNo = (A_UINT8)StreamID;
++ connect.pMetaData = &streamNo;
++ connect.MetaDataLength = sizeof(A_UINT8);
++ /* these fields are the same for all endpoints */
++ connect.EpCallbacks.pContext = ar;
++ connect.EpCallbacks.EpTxComplete = ar6000_htc_raw_write_cb;
++ connect.EpCallbacks.EpRecv = ar6000_htc_raw_read_cb;
++ /* simple interface, we don't need these optional callbacks */
++ connect.EpCallbacks.EpRecvRefill = NULL;
++ connect.EpCallbacks.EpSendFull = NULL;
++ connect.EpCallbacks.EpSendAvail = NULL;
++ connect.MaxSendQueueDepth = RAW_HTC_WRITE_BUFFERS_NUM;
++
++ /* connect to the raw streams service, we may be able to get 1 or more
++ * connections, depending on WHAT is running on the target */
++ connect.ServiceID = HTC_RAW_STREAMS_SVC;
++
++ A_MEMZERO(&response,sizeof(response));
++
++ /* try to connect to the raw stream, it is okay if this fails with
++ * status HTC_SERVICE_NO_MORE_EP */
++ status = HTCConnectService(ar->arHtcTarget,
++ &connect,
++ &response);
++
++ if (A_FAILED(status)) {
++ if (response.ConnectRespCode == HTC_SERVICE_NO_MORE_EP) {
++ AR_DEBUG_PRINTF("HTC RAW , No more streams allowed \n");
++ status = A_OK;
++ }
++ break;
++ }
++
++ /* set endpoint mapping for the RAW HTC streams */
++ arSetRawStream2EndpointIDMap(ar,StreamID,response.Endpoint);
++
++ AR_DEBUG_PRINTF("HTC RAW : stream ID: %d, endpoint: %d\n",
++ StreamID, arRawStream2EndpointID(ar,StreamID));
++
++ } while (FALSE);
++
++ return status;
++}
++
++int ar6000_htc_raw_open(AR_SOFTC_T *ar)
++{
++ A_STATUS status;
++ int streamID, endPt, count2;
++ raw_htc_buffer *buffer;
++ HTC_SERVICE_ID servicepriority;
++
++ A_ASSERT(ar->arHtcTarget != NULL);
++
++ /* wait for target */
++ status = HTCWaitTarget(ar->arHtcTarget);
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF("HTCWaitTarget failed (%d)\n", status);
++ return -ENODEV;
++ }
++
++ for (endPt = 0; endPt < ENDPOINT_MAX; endPt++) {
++ ar->arEp2RawMapping[endPt] = HTC_RAW_STREAM_NOT_MAPPED;
++ }
++
++ for (streamID = HTC_RAW_STREAM_0; streamID < HTC_RAW_STREAM_NUM_MAX; streamID++) {
++ /* Initialize the data structures */
++ sema_init(&ar->raw_htc_read_sem[streamID], 1);
++ sema_init(&ar->raw_htc_write_sem[streamID], 1);
++ init_waitqueue_head(&ar->raw_htc_read_queue[streamID]);
++ init_waitqueue_head(&ar->raw_htc_write_queue[streamID]);
++
++ /* try to connect to the raw service */
++ status = ar6000_connect_raw_service(ar,streamID);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ if (arRawStream2EndpointID(ar,streamID) == 0) {
++ break;
++ }
++
++ for (count2 = 0; count2 < RAW_HTC_READ_BUFFERS_NUM; count2 ++) {
++ /* Initialize the receive buffers */
++ buffer = ar->raw_htc_write_buffer[streamID][count2];
++ memset(buffer, 0, sizeof(raw_htc_buffer));
++ buffer = ar->raw_htc_read_buffer[streamID][count2];
++ memset(buffer, 0, sizeof(raw_htc_buffer));
++
++ SET_HTC_PACKET_INFO_RX_REFILL(&buffer->HTCPacket,
++ buffer,
++ buffer->data,
++ AR6000_BUFFER_SIZE,
++ arRawStream2EndpointID(ar,streamID));
++
++ /* Queue buffers to HTC for receive */
++ if ((status = HTCAddReceivePkt(ar->arHtcTarget, &buffer->HTCPacket)) != A_OK)
++ {
++ BMIInit();
++ return -EIO;
++ }
++ }
++
++ for (count2 = 0; count2 < RAW_HTC_WRITE_BUFFERS_NUM; count2 ++) {
++ /* Initialize the receive buffers */
++ buffer = ar->raw_htc_write_buffer[streamID][count2];
++ memset(buffer, 0, sizeof(raw_htc_buffer));
++ }
++
++ ar->read_buffer_available[streamID] = FALSE;
++ ar->write_buffer_available[streamID] = TRUE;
++ }
++
++ if (A_FAILED(status)) {
++ return -EIO;
++ }
++
++ AR_DEBUG_PRINTF("HTC RAW, number of streams the target supports: %d \n", streamID);
++
++ servicepriority = HTC_RAW_STREAMS_SVC; /* only 1 */
++
++ /* set callbacks and priority list */
++ HTCSetCreditDistribution(ar->arHtcTarget,
++ ar,
++ NULL, /* use default */
++ NULL, /* use default */
++ &servicepriority,
++ 1);
++
++ /* Start the HTC component */
++ if ((status = HTCStart(ar->arHtcTarget)) != A_OK) {
++ BMIInit();
++ return -EIO;
++ }
++
++ (ar)->arRawIfInit = TRUE;
++
++ return 0;
++}
++
++int ar6000_htc_raw_close(AR_SOFTC_T *ar)
++{
++ A_PRINTF("ar6000_htc_raw_close called \n");
++ HTCStop(ar->arHtcTarget);
++
++ /* reset the device */
++ ar6000_reset_device(ar->arHifDevice, ar->arTargetType);
++ /* Initialize the BMI component */
++ BMIInit();
++
++ return 0;
++}
++
++raw_htc_buffer *
++get_filled_buffer(AR_SOFTC_T *ar, HTC_RAW_STREAM_ID StreamID)
++{
++ int count;
++ raw_htc_buffer *busy;
++
++ /* Check for data */
++ for (count = 0; count < RAW_HTC_READ_BUFFERS_NUM; count ++) {
++ busy = ar->raw_htc_read_buffer[StreamID][count];
++ if (busy->length) {
++ break;
++ }
++ }
++ if (busy->length) {
++ ar->read_buffer_available[StreamID] = TRUE;
++ } else {
++ ar->read_buffer_available[StreamID] = FALSE;
++ }
++
++ return busy;
++}
++
++ssize_t ar6000_htc_raw_read(AR_SOFTC_T *ar, HTC_RAW_STREAM_ID StreamID,
++ char __user *buffer, size_t length)
++{
++ int readPtr;
++ raw_htc_buffer *busy;
++
++ if (arRawStream2EndpointID(ar,StreamID) == 0) {
++ AR_DEBUG_PRINTF("StreamID(%d) not connected! \n", StreamID);
++ return -EFAULT;
++ }
++
++ if (down_interruptible(&ar->raw_htc_read_sem[StreamID])) {
++ return -ERESTARTSYS;
++ }
++
++ busy = get_filled_buffer(ar,StreamID);
++ while (!ar->read_buffer_available[StreamID]) {
++ up(&ar->raw_htc_read_sem[StreamID]);
++
++ /* Wait for the data */
++ AR_DEBUG2_PRINTF("Sleeping StreamID(%d) read process\n", StreamID);
++ if (wait_event_interruptible(ar->raw_htc_read_queue[StreamID],
++ ar->read_buffer_available[StreamID]))
++ {
++ return -EINTR;
++ }
++ if (down_interruptible(&ar->raw_htc_read_sem[StreamID])) {
++ return -ERESTARTSYS;
++ }
++ busy = get_filled_buffer(ar,StreamID);
++ }
++
++ /* Read the data */
++ readPtr = busy->currPtr;
++ if (length > busy->length - HTC_HEADER_LEN) {
++ length = busy->length - HTC_HEADER_LEN;
++ }
++ if (copy_to_user(buffer, &busy->data[readPtr], length)) {
++ up(&ar->raw_htc_read_sem[StreamID]);
++ return -EFAULT;
++ }
++
++ busy->currPtr += length;
++
++ //AR_DEBUG_PRINTF("raw read ioctl: currPTR : 0x%X 0x%X \n", busy->currPtr,busy->length);
++
++ if (busy->currPtr == busy->length)
++ {
++ busy->currPtr = 0;
++ busy->length = 0;
++ HTC_PACKET_RESET_RX(&busy->HTCPacket);
++ //AR_DEBUG_PRINTF("raw read ioctl: ep for packet:%d \n", busy->HTCPacket.Endpoint);
++ HTCAddReceivePkt(ar->arHtcTarget, &busy->HTCPacket);
++ }
++ ar->read_buffer_available[StreamID] = FALSE;
++ up(&ar->raw_htc_read_sem[StreamID]);
++
++ return length;
++}
++
++static raw_htc_buffer *
++get_free_buffer(AR_SOFTC_T *ar, HTC_ENDPOINT_ID StreamID)
++{
++ int count;
++ raw_htc_buffer *free;
++
++ free = NULL;
++ for (count = 0; count < RAW_HTC_WRITE_BUFFERS_NUM; count ++) {
++ free = ar->raw_htc_write_buffer[StreamID][count];
++ if (free->length == 0) {
++ break;
++ }
++ }
++ if (!free->length) {
++ ar->write_buffer_available[StreamID] = TRUE;
++ } else {
++ ar->write_buffer_available[StreamID] = FALSE;
++ }
++
++ return free;
++}
++
++ssize_t ar6000_htc_raw_write(AR_SOFTC_T *ar, HTC_RAW_STREAM_ID StreamID,
++ char __user *buffer, size_t length)
++{
++ int writePtr;
++ raw_htc_buffer *free;
++
++ if (arRawStream2EndpointID(ar,StreamID) == 0) {
++ AR_DEBUG_PRINTF("StreamID(%d) not connected! \n", StreamID);
++ return -EFAULT;
++ }
++
++ if (down_interruptible(&ar->raw_htc_write_sem[StreamID])) {
++ return -ERESTARTSYS;
++ }
++
++ /* Search for a free buffer */
++ free = get_free_buffer(ar,StreamID);
++
++ /* Check if there is space to write else wait */
++ while (!ar->write_buffer_available[StreamID]) {
++ up(&ar->raw_htc_write_sem[StreamID]);
++
++ /* Wait for buffer to become free */
++ AR_DEBUG2_PRINTF("Sleeping StreamID(%d) write process\n", StreamID);
++ if (wait_event_interruptible(ar->raw_htc_write_queue[StreamID],
++ ar->write_buffer_available[StreamID]))
++ {
++ return -EINTR;
++ }
++ if (down_interruptible(&ar->raw_htc_write_sem[StreamID])) {
++ return -ERESTARTSYS;
++ }
++ free = get_free_buffer(ar,StreamID);
++ }
++
++ /* Send the data */
++ writePtr = HTC_HEADER_LEN;
++ if (length > (AR6000_BUFFER_SIZE - HTC_HEADER_LEN)) {
++ length = AR6000_BUFFER_SIZE - HTC_HEADER_LEN;
++ }
++
++ if (copy_from_user(&free->data[writePtr], buffer, length)) {
++ up(&ar->raw_htc_read_sem[StreamID]);
++ return -EFAULT;
++ }
++
++ free->length = length;
++
++ SET_HTC_PACKET_INFO_TX(&free->HTCPacket,
++ free,
++ &free->data[writePtr],
++ length,
++ arRawStream2EndpointID(ar,StreamID),
++ AR6K_DATA_PKT_TAG);
++
++ HTCSendPkt(ar->arHtcTarget,&free->HTCPacket);
++
++ ar->write_buffer_available[StreamID] = FALSE;
++ up(&ar->raw_htc_write_sem[StreamID]);
++
++ return length;
++}
++#endif /* HTC_RAW_INTERFACE */
+diff --git a/drivers/ar6000/ar6000/ar6xapi_linux.h b/drivers/ar6000/ar6000/ar6xapi_linux.h
+new file mode 100644
+index 0000000..b8e6e09
+--- /dev/null
++++ b/drivers/ar6000/ar6000/ar6xapi_linux.h
+@@ -0,0 +1,128 @@
++#ifndef _AR6XAPI_LINUX_H
++#define _AR6XAPI_LINUX_H
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++struct ar6_softc;
++
++void ar6000_ready_event(void *devt, A_UINT8 *datap, A_UINT8 phyCap);
++A_UINT8 ar6000_iptos_to_userPriority(A_UINT8 *pkt);
++A_STATUS ar6000_control_tx(void *devt, void *osbuf, WMI_PRI_STREAM_ID streamID);
++void ar6000_connect_event(struct ar6_softc *ar, A_UINT16 channel,
++ A_UINT8 *bssid, A_UINT16 listenInterval,
++ A_UINT16 beaconInterval, NETWORK_TYPE networkType,
++ A_UINT8 beaconIeLen, A_UINT8 assocReqLen,
++ A_UINT8 assocRespLen,A_UINT8 *assocInfo);
++void ar6000_disconnect_event(struct ar6_softc *ar, A_UINT8 reason,
++ A_UINT8 *bssid, A_UINT8 assocRespLen,
++ A_UINT8 *assocInfo, A_UINT16 protocolReasonStatus);
++void ar6000_tkip_micerr_event(struct ar6_softc *ar, A_UINT8 keyid,
++ A_BOOL ismcast);
++void ar6000_bitrate_rx(void *devt, A_INT32 rateKbps);
++void ar6000_channelList_rx(void *devt, A_INT8 numChan, A_UINT16 *chanList);
++void ar6000_regDomain_event(struct ar6_softc *ar, A_UINT32 regCode);
++void ar6000_txPwr_rx(void *devt, A_UINT8 txPwr);
++void ar6000_keepalive_rx(void *devt, A_UINT8 configured);
++void ar6000_neighborReport_event(struct ar6_softc *ar, int numAps,
++ WMI_NEIGHBOR_INFO *info);
++void ar6000_set_numdataendpts(struct ar6_softc *ar, A_UINT32 num);
++void ar6000_scanComplete_event(struct ar6_softc *ar, A_STATUS status);
++void ar6000_targetStats_event(struct ar6_softc *ar, WMI_TARGET_STATS *pStats);
++void ar6000_rssiThreshold_event(struct ar6_softc *ar,
++ WMI_RSSI_THRESHOLD_VAL newThreshold,
++ A_INT16 rssi);
++void ar6000_reportError_event(struct ar6_softc *, WMI_TARGET_ERROR_VAL errorVal);
++void ar6000_cac_event(struct ar6_softc *ar, A_UINT8 ac, A_UINT8 cac_indication,
++ A_UINT8 statusCode, A_UINT8 *tspecSuggestion);
++void ar6000_hbChallengeResp_event(struct ar6_softc *, A_UINT32 cookie, A_UINT32 source);
++void
++ar6000_roam_tbl_event(struct ar6_softc *ar, WMI_TARGET_ROAM_TBL *pTbl);
++
++void
++ar6000_roam_data_event(struct ar6_softc *ar, WMI_TARGET_ROAM_DATA *p);
++
++void
++ar6000_wow_list_event(struct ar6_softc *ar, A_UINT8 num_filters,
++ WMI_GET_WOW_LIST_REPLY *wow_reply);
++
++void ar6000_pmkid_list_event(void *devt, A_UINT8 numPMKID,
++ WMI_PMKID *pmkidList);
++
++void ar6000_gpio_intr_rx(A_UINT32 intr_mask, A_UINT32 input_values);
++void ar6000_gpio_data_rx(A_UINT32 reg_id, A_UINT32 value);
++void ar6000_gpio_ack_rx(void);
++
++void ar6000_dbglog_init_done(struct ar6_softc *ar);
++
++#ifdef SEND_EVENT_TO_APP
++void ar6000_send_event_to_app(struct ar6_softc *ar, A_UINT16 eventId, A_UINT8 *datap, int len);
++#endif
++
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++void ar6000_tcmd_rx_report_event(void *devt, A_UINT8 * results, int len);
++#endif
++
++void ar6000_tx_retry_err_event(void *devt);
++
++void ar6000_snrThresholdEvent_rx(void *devt,
++ WMI_SNR_THRESHOLD_VAL newThreshold,
++ A_UINT8 snr);
++
++void ar6000_lqThresholdEvent_rx(void *devt, WMI_LQ_THRESHOLD_VAL range, A_UINT8 lqVal);
++
++
++void ar6000_ratemask_rx(void *devt, A_UINT16 ratemask);
++
++A_STATUS ar6000_get_driver_cfg(struct net_device *dev,
++ A_UINT16 cfgParam,
++ void *result);
++void ar6000_bssInfo_event_rx(struct ar6_softc *ar, A_UINT8 *data, int len);
++
++void ar6000_dbglog_event(struct ar6_softc *ar, A_UINT32 dropped,
++ A_INT8 *buffer, A_UINT32 length);
++
++int ar6000_dbglog_get_debug_logs(struct ar6_softc *ar);
++
++void ar6000_indicate_tx_activity(void *devt, A_UINT8 trafficClass, A_BOOL Active);
++
++void ar6000_dset_open_req(void *devt,
++ A_UINT32 id,
++ A_UINT32 targ_handle,
++ A_UINT32 targ_reply_fn,
++ A_UINT32 targ_reply_arg);
++void ar6000_dset_close(void *devt, A_UINT32 access_cookie);
++void ar6000_dset_data_req(void *devt,
++ A_UINT32 access_cookie,
++ A_UINT32 offset,
++ A_UINT32 length,
++ A_UINT32 targ_buf,
++ A_UINT32 targ_reply_fn,
++ A_UINT32 targ_reply_arg);
++
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff --git a/drivers/ar6000/ar6000/athdrv_linux.h b/drivers/ar6000/ar6000/athdrv_linux.h
+new file mode 100644
+index 0000000..9c3e449
+--- /dev/null
++++ b/drivers/ar6000/ar6000/athdrv_linux.h
+@@ -0,0 +1,993 @@
++/*
++ * Copyright (c) 2004-2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef _ATHDRV_LINUX_H
++#define _ATHDRV_LINUX_H
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++/*
++ * There are two types of ioctl's here: Standard ioctls and
++ * eXtended ioctls. All extended ioctls (XIOCTL) are multiplexed
++ * off of the single ioctl command, AR6000_IOCTL_EXTENDED. The
++ * arguments for every XIOCTL starts with a 32-bit command word
++ * that is used to select which extended ioctl is in use. After
++ * the command word are command-specific arguments.
++ */
++
++/* Linux standard Wireless Extensions, private ioctl interfaces */
++#define IEEE80211_IOCTL_SETPARAM (SIOCIWFIRSTPRIV+0)
++#define IEEE80211_IOCTL_GETPARAM (SIOCIWFIRSTPRIV+1)
++#define IEEE80211_IOCTL_SETKEY (SIOCIWFIRSTPRIV+2)
++#define IEEE80211_IOCTL_SETWMMPARAMS (SIOCIWFIRSTPRIV+3)
++#define IEEE80211_IOCTL_DELKEY (SIOCIWFIRSTPRIV+4)
++#define IEEE80211_IOCTL_GETWMMPARAMS (SIOCIWFIRSTPRIV+5)
++#define IEEE80211_IOCTL_SETOPTIE (SIOCIWFIRSTPRIV+6)
++#define IEEE80211_IOCTL_SETMLME (SIOCIWFIRSTPRIV+7)
++//#define IEEE80211_IOCTL_GETOPTIE (SIOCIWFIRSTPRIV+7)
++#define IEEE80211_IOCTL_ADDPMKID (SIOCIWFIRSTPRIV+8)
++//#define IEEE80211_IOCTL_SETAUTHALG (SIOCIWFIRSTPRIV+10)
++#define IEEE80211_IOCTL_LASTONE (SIOCIWFIRSTPRIV+9)
++
++
++
++/* ====WMI Ioctls==== */
++/*
++ *
++ * Many ioctls simply provide WMI services to application code:
++ * an application makes such an ioctl call with a set of arguments
++ * that are packaged into the corresponding WMI message, and sent
++ * to the Target.
++ */
++
++#define AR6000_IOCTL_WMI_GETREV (SIOCIWFIRSTPRIV+10)
++/*
++ * arguments:
++ * ar6000_version *revision
++ */
++
++#define AR6000_IOCTL_WMI_SETPWR (SIOCIWFIRSTPRIV+11)
++/*
++ * arguments:
++ * WMI_POWER_MODE_CMD pwrModeCmd (see include/wmi.h)
++ * uses: WMI_SET_POWER_MODE_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SETSCAN (SIOCIWFIRSTPRIV+12)
++/*
++ * arguments:
++ * WMI_SCAN_PARAMS_CMD scanParams (see include/wmi.h)
++ * uses: WMI_SET_SCAN_PARAMS_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SETLISTENINT (SIOCIWFIRSTPRIV+13)
++/*
++ * arguments:
++ * UINT32 listenInterval
++ * uses: WMI_SET_LISTEN_INT_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SETBSSFILTER (SIOCIWFIRSTPRIV+14)
++/*
++ * arguments:
++ * WMI_BSS_FILTER filter (see include/wmi.h)
++ * uses: WMI_SET_BSS_FILTER_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_CHANNELPARAMS (SIOCIWFIRSTPRIV+16)
++/*
++ * arguments:
++ * WMI_CHANNEL_PARAMS_CMD chParams
++ * uses: WMI_SET_CHANNEL_PARAMS_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_PROBEDSSID (SIOCIWFIRSTPRIV+17)
++/*
++ * arguments:
++ * WMI_PROBED_SSID_CMD probedSsids (see include/wmi.h)
++ * uses: WMI_SETPROBED_SSID_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_PMPARAMS (SIOCIWFIRSTPRIV+18)
++/*
++ * arguments:
++ * WMI_POWER_PARAMS_CMD powerParams (see include/wmi.h)
++ * uses: WMI_SET_POWER_PARAMS_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_BADAP (SIOCIWFIRSTPRIV+19)
++/*
++ * arguments:
++ * WMI_ADD_BAD_AP_CMD badAPs (see include/wmi.h)
++ * uses: WMI_ADD_BAD_AP_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_GET_QOS_QUEUE (SIOCIWFIRSTPRIV+20)
++/*
++ * arguments:
++ * ar6000_queuereq queueRequest (see below)
++ */
++
++#define AR6000_IOCTL_WMI_CREATE_QOS (SIOCIWFIRSTPRIV+21)
++/*
++ * arguments:
++ * WMI_CREATE_PSTREAM createPstreamCmd (see include/wmi.h)
++ * uses: WMI_CREATE_PSTREAM_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_DELETE_QOS (SIOCIWFIRSTPRIV+22)
++/*
++ * arguments:
++ * WMI_DELETE_PSTREAM_CMD deletePstreamCmd (see include/wmi.h)
++ * uses: WMI_DELETE_PSTREAM_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_SNRTHRESHOLD (SIOCIWFIRSTPRIV+23)
++/*
++ * arguments:
++ * WMI_SNR_THRESHOLD_PARAMS_CMD thresholdParams (see include/wmi.h)
++ * uses: WMI_SNR_THRESHOLD_PARAMS_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_ERROR_REPORT_BITMASK (SIOCIWFIRSTPRIV+24)
++/*
++ * arguments:
++ * WMI_TARGET_ERROR_REPORT_BITMASK errorReportBitMask (see include/wmi.h)
++ * uses: WMI_TARGET_ERROR_REPORT_BITMASK_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_GET_TARGET_STATS (SIOCIWFIRSTPRIV+25)
++/*
++ * arguments:
++ * TARGET_STATS *targetStats (see below)
++ * uses: WMI_GET_STATISTICS_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_ASSOC_INFO (SIOCIWFIRSTPRIV+26)
++/*
++ * arguments:
++ * WMI_SET_ASSOC_INFO_CMD setAssocInfoCmd
++ * uses: WMI_SET_ASSOC_INFO_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_ACCESS_PARAMS (SIOCIWFIRSTPRIV+27)
++/*
++ * arguments:
++ * WMI_SET_ACCESS_PARAMS_CMD setAccessParams (see include/wmi.h)
++ * uses: WMI_SET_ACCESS_PARAMS_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_BMISS_TIME (SIOCIWFIRSTPRIV+28)
++/*
++ * arguments:
++ * UINT32 beaconMissTime
++ * uses: WMI_SET_BMISS_TIME_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_DISC_TIMEOUT (SIOCIWFIRSTPRIV+29)
++/*
++ * arguments:
++ * WMI_DISC_TIMEOUT_CMD disconnectTimeoutCmd (see include/wmi.h)
++ * uses: WMI_SET_DISC_TIMEOUT_CMDID
++ */
++
++#define AR6000_IOCTL_WMI_SET_IBSS_PM_CAPS (SIOCIWFIRSTPRIV+30)
++/*
++ * arguments:
++ * WMI_IBSS_PM_CAPS_CMD ibssPowerMgmtCapsCmd
++ * uses: WMI_SET_IBSS_PM_CAPS_CMDID
++ */
++
++/*
++ * There is a very small space available for driver-private
++ * wireless ioctls. In order to circumvent this limitation,
++ * we multiplex a bunch of ioctls (XIOCTLs) on top of a
++ * single AR6000_IOCTL_EXTENDED ioctl.
++ */
++#define AR6000_IOCTL_EXTENDED (SIOCIWFIRSTPRIV+31)
++
++
++/* ====BMI Extended Ioctls==== */
++
++#define AR6000_XIOCTL_BMI_DONE 1
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_BMI_DONE)
++ * uses: BMI_DONE
++ */
++
++#define AR6000_XIOCTL_BMI_READ_MEMORY 2
++/*
++ * arguments:
++ * union {
++ * struct {
++ * UINT32 cmd (AR6000_XIOCTL_BMI_READ_MEMORY)
++ * UINT32 address
++ * UINT32 length
++ * }
++ * char results[length]
++ * }
++ * uses: BMI_READ_MEMORY
++ */
++
++#define AR6000_XIOCTL_BMI_WRITE_MEMORY 3
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_BMI_WRITE_MEMORY)
++ * UINT32 address
++ * UINT32 length
++ * char data[length]
++ * uses: BMI_WRITE_MEMORY
++ */
++
++#define AR6000_XIOCTL_BMI_EXECUTE 4
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_BMI_EXECUTE)
++ * UINT32 TargetAddress
++ * UINT32 parameter
++ * uses: BMI_EXECUTE
++ */
++
++#define AR6000_XIOCTL_BMI_SET_APP_START 5
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_BMI_SET_APP_START)
++ * UINT32 TargetAddress
++ * uses: BMI_SET_APP_START
++ */
++
++#define AR6000_XIOCTL_BMI_READ_SOC_REGISTER 6
++/*
++ * arguments:
++ * union {
++ * struct {
++ * UINT32 cmd (AR6000_XIOCTL_BMI_READ_SOC_REGISTER)
++ * UINT32 TargetAddress, 32-bit aligned
++ * }
++ * UINT32 result
++ * }
++ * uses: BMI_READ_SOC_REGISTER
++ */
++
++#define AR6000_XIOCTL_BMI_WRITE_SOC_REGISTER 7
++/*
++ * arguments:
++ * struct {
++ * UINT32 cmd (AR6000_XIOCTL_BMI_WRITE_SOC_REGISTER)
++ * UINT32 TargetAddress, 32-bit aligned
++ * UINT32 newValue
++ * }
++ * uses: BMI_WRITE_SOC_REGISTER
++ */
++
++#define AR6000_XIOCTL_BMI_TEST 8
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_BMI_TEST)
++ * UINT32 address
++ * UINT32 length
++ * UINT32 count
++ */
++
++
++
++/* Historical Host-side DataSet support */
++#define AR6000_XIOCTL_UNUSED9 9
++#define AR6000_XIOCTL_UNUSED10 10
++#define AR6000_XIOCTL_UNUSED11 11
++
++/* ====Misc Extended Ioctls==== */
++
++#define AR6000_XIOCTL_FORCE_TARGET_RESET 12
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_FORCE_TARGET_RESET)
++ */
++
++
++#ifdef HTC_RAW_INTERFACE
++/* HTC Raw Interface Ioctls */
++#define AR6000_XIOCTL_HTC_RAW_OPEN 13
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_HTC_RAW_OPEN)
++ */
++
++#define AR6000_XIOCTL_HTC_RAW_CLOSE 14
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_HTC_RAW_CLOSE)
++ */
++
++#define AR6000_XIOCTL_HTC_RAW_READ 15
++/*
++ * arguments:
++ * union {
++ * struct {
++ * UINT32 cmd (AR6000_XIOCTL_HTC_RAW_READ)
++ * UINT32 mailboxID
++ * UINT32 length
++ * }
++ * results[length]
++ * }
++ */
++
++#define AR6000_XIOCTL_HTC_RAW_WRITE 16
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_HTC_RAW_WRITE)
++ * UINT32 mailboxID
++ * UINT32 length
++ * char buffer[length]
++ */
++#endif /* HTC_RAW_INTERFACE */
++
++#define AR6000_XIOCTL_CHECK_TARGET_READY 17
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_CHECK_TARGET_READY)
++ */
++
++
++
++/* ====GPIO (General Purpose I/O) Extended Ioctls==== */
++
++#define AR6000_XIOCTL_GPIO_OUTPUT_SET 18
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_GPIO_OUTPUT_SET)
++ * ar6000_gpio_output_set_cmd_s (see below)
++ * uses: WMIX_GPIO_OUTPUT_SET_CMDID
++ */
++
++#define AR6000_XIOCTL_GPIO_INPUT_GET 19
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_GPIO_INPUT_GET)
++ * uses: WMIX_GPIO_INPUT_GET_CMDID
++ */
++
++#define AR6000_XIOCTL_GPIO_REGISTER_SET 20
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_GPIO_REGISTER_SET)
++ * ar6000_gpio_register_cmd_s (see below)
++ * uses: WMIX_GPIO_REGISTER_SET_CMDID
++ */
++
++#define AR6000_XIOCTL_GPIO_REGISTER_GET 21
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_GPIO_REGISTER_GET)
++ * ar6000_gpio_register_cmd_s (see below)
++ * uses: WMIX_GPIO_REGISTER_GET_CMDID
++ */
++
++#define AR6000_XIOCTL_GPIO_INTR_ACK 22
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_GPIO_INTR_ACK)
++ * ar6000_cpio_intr_ack_cmd_s (see below)
++ * uses: WMIX_GPIO_INTR_ACK_CMDID
++ */
++
++#define AR6000_XIOCTL_GPIO_INTR_WAIT 23
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_GPIO_INTR_WAIT)
++ */
++
++
++
++/* ====more wireless commands==== */
++
++#define AR6000_XIOCTL_SET_ADHOC_BSSID 24
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_SET_ADHOC_BSSID)
++ * WMI_SET_ADHOC_BSSID_CMD setAdHocBssidCmd (see include/wmi.h)
++ */
++
++#define AR6000_XIOCTL_SET_OPT_MODE 25
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_SET_OPT_MODE)
++ * WMI_SET_OPT_MODE_CMD setOptModeCmd (see include/wmi.h)
++ * uses: WMI_SET_OPT_MODE_CMDID
++ */
++
++#define AR6000_XIOCTL_OPT_SEND_FRAME 26
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_OPT_SEND_FRAME)
++ * WMI_OPT_TX_FRAME_CMD optTxFrameCmd (see include/wmi.h)
++ * uses: WMI_OPT_TX_FRAME_CMDID
++ */
++
++#define AR6000_XIOCTL_SET_ADHOC_BEACON_INTVAL 27
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_SET_ADHOC_BEACON_INTVAL)
++ * WMI_BEACON_INT_CMD beaconIntCmd (see include/wmi.h)
++ * uses: WMI_SET_BEACON_INT_CMDID
++ */
++
++
++#define IEEE80211_IOCTL_SETAUTHALG 28
++
++
++#define AR6000_XIOCTL_SET_VOICE_PKT_SIZE 29
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_SET_VOICE_PKT_SIZE)
++ * WMI_SET_VOICE_PKT_SIZE_CMD setVoicePktSizeCmd (see include/wmi.h)
++ * uses: WMI_SET_VOICE_PKT_SIZE_CMDID
++ */
++
++
++#define AR6000_XIOCTL_SET_MAX_SP 30
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_SET_MAX_SP)
++ * WMI_SET_MAX_SP_LEN_CMD maxSPLen(see include/wmi.h)
++ * uses: WMI_SET_MAX_SP_LEN_CMDID
++ */
++
++#define AR6000_XIOCTL_WMI_GET_ROAM_TBL 31
++
++#define AR6000_XIOCTL_WMI_SET_ROAM_CTRL 32
++
++#define AR6000_XIOCTRL_WMI_SET_POWERSAVE_TIMERS 33
++
++
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTRL_WMI_SET_POWERSAVE_TIMERS)
++ * WMI_SET_POWERSAVE_TIMERS_CMD powerSaveTimers(see include/wmi.h)
++ * WMI_SET_POWERSAVE_TIMERS_CMDID
++ */
++
++#define AR6000_XIOCTRL_WMI_GET_POWER_MODE 34
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTRL_WMI_GET_POWER_MODE)
++ */
++
++#define AR6000_XIOCTRL_WMI_SET_WLAN_STATE 35
++typedef enum {
++ WLAN_DISABLED,
++ WLAN_ENABLED
++} AR6000_WLAN_STATE;
++/*
++ * arguments:
++ * enable/disable
++ */
++
++#define AR6000_XIOCTL_WMI_GET_ROAM_DATA 36
++
++#define AR6000_XIOCTL_WMI_SETRETRYLIMITS 37
++/*
++ * arguments:
++ * WMI_SET_RETRY_LIMITS_CMD ibssSetRetryLimitsCmd
++ * uses: WMI_SET_RETRY_LIMITS_CMDID
++ */
++
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++/* ====extended commands for radio test ==== */
++
++#define AR6000_XIOCTL_TCMD_CONT_TX 38
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_TCMD_CONT_TX)
++ * WMI_TCMD_CONT_TX_CMD contTxCmd (see include/wmi.h)
++ * uses: WMI_TCMD_CONT_TX_CMDID
++ */
++
++#define AR6000_XIOCTL_TCMD_CONT_RX 39
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_TCMD_CONT_RX)
++ * WMI_TCMD_CONT_RX_CMD rxCmd (see include/wmi.h)
++ * uses: WMI_TCMD_CONT_RX_CMDID
++ */
++
++#define AR6000_XIOCTL_TCMD_PM 40
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_TCMD_PM)
++ * WMI_TCMD_PM_CMD pmCmd (see include/wmi.h)
++ * uses: WMI_TCMD_PM_CMDID
++ */
++
++#endif /* CONFIG_HOST_TCMD_SUPPORT */
++
++#define AR6000_XIOCTL_WMI_STARTSCAN 41
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_WMI_STARTSCAN)
++ * UINT8 scanType
++ * UINT8 scanConnected
++ * A_BOOL forceFgScan
++ * uses: WMI_START_SCAN_CMDID
++ */
++
++#define AR6000_XIOCTL_WMI_SETFIXRATES 42
++
++#define AR6000_XIOCTL_WMI_GETFIXRATES 43
++
++
++#define AR6000_XIOCTL_WMI_SET_RSSITHRESHOLD 44
++/*
++ * arguments:
++ * WMI_RSSI_THRESHOLD_PARAMS_CMD thresholdParams (see include/wmi.h)
++ * uses: WMI_RSSI_THRESHOLD_PARAMS_CMDID
++ */
++
++#define AR6000_XIOCTL_WMI_CLR_RSSISNR 45
++/*
++ * arguments:
++ * WMI_CLR_RSSISNR_CMD thresholdParams (see include/wmi.h)
++ * uses: WMI_CLR_RSSISNR_CMDID
++ */
++
++#define AR6000_XIOCTL_WMI_SET_LQTHRESHOLD 46
++/*
++ * arguments:
++ * WMI_LQ_THRESHOLD_PARAMS_CMD thresholdParams (see include/wmi.h)
++ * uses: WMI_LQ_THRESHOLD_PARAMS_CMDID
++ */
++
++#define AR6000_XIOCTL_WMI_SET_RTS 47
++/*
++ * arguments:
++ * WMI_SET_RTS_MODE_CMD (see include/wmi.h)
++ * uses: WMI_SET_RTS_MODE_CMDID
++ */
++
++#define AR6000_XIOCTL_WMI_SET_LPREAMBLE 48
++
++#define AR6000_XIOCTL_WMI_SET_AUTHMODE 49
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_WMI_SET_AUTHMODE)
++ * UINT8 mode
++ * uses: WMI_SET_RECONNECT_AUTH_MODE_CMDID
++ */
++
++#define AR6000_XIOCTL_WMI_SET_REASSOCMODE 50
++
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_WMI_SET_WMM)
++ * UINT8 mode
++ * uses: WMI_SET_WMM_CMDID
++ */
++#define AR6000_XIOCTL_WMI_SET_WMM 51
++
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_WMI_SET_HB_CHALLENGE_RESP_PARAMS)
++ * UINT32 frequency
++ * UINT8 threshold
++ */
++#define AR6000_XIOCTL_WMI_SET_HB_CHALLENGE_RESP_PARAMS 52
++
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_WMI_GET_HB_CHALLENGE_RESP)
++ * UINT32 cookie
++ */
++#define AR6000_XIOCTL_WMI_GET_HB_CHALLENGE_RESP 53
++
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_WMI_GET_RD)
++ * UINT32 regDomain
++ */
++#define AR6000_XIOCTL_WMI_GET_RD 54
++
++#define AR6000_XIOCTL_DIAG_READ 55
++
++#define AR6000_XIOCTL_DIAG_WRITE 56
++
++/*
++ * arguments cmd (AR6000_XIOCTL_SET_TXOP)
++ * WMI_TXOP_CFG txopEnable
++ */
++#define AR6000_XIOCTL_WMI_SET_TXOP 57
++
++#ifdef USER_KEYS
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_USER_SETKEYS)
++ * UINT32 keyOpCtrl
++ * uses AR6000_USER_SETKEYS_INFO
++ */
++#define AR6000_XIOCTL_USER_SETKEYS 58
++#endif /* USER_KEYS */
++
++#define AR6000_XIOCTL_WMI_SET_KEEPALIVE 59
++/*
++ * arguments:
++ * UINT8 cmd (AR6000_XIOCTL_WMI_SET_KEEPALIVE)
++ * UINT8 keepaliveInterval
++ * uses: WMI_SET_KEEPALIVE_CMDID
++ */
++
++#define AR6000_XIOCTL_WMI_GET_KEEPALIVE 60
++/*
++ * arguments:
++ * UINT8 cmd (AR6000_XIOCTL_WMI_GET_KEEPALIVE)
++ * UINT8 keepaliveInterval
++ * A_BOOL configured
++ * uses: WMI_GET_KEEPALIVE_CMDID
++ */
++
++/* ====ROM Patching Extended Ioctls==== */
++
++#define AR6000_XIOCTL_BMI_ROMPATCH_INSTALL 61
++/*
++ * arguments:
++ * union {
++ * struct {
++ * UINT32 cmd (AR6000_XIOCTL_BMI_ROMPATCH_INSTALL)
++ * UINT32 ROM Address
++ * UINT32 RAM Address
++ * UINT32 number of bytes
++ * UINT32 activate? (0 or 1)
++ * }
++ * A_UINT32 resulting rompatch ID
++ * }
++ * uses: BMI_ROMPATCH_INSTALL
++ */
++
++#define AR6000_XIOCTL_BMI_ROMPATCH_UNINSTALL 62
++/*
++ * arguments:
++ * struct {
++ * UINT32 cmd (AR6000_XIOCTL_BMI_ROMPATCH_UNINSTALL)
++ * UINT32 rompatch ID
++ * }
++ * uses: BMI_ROMPATCH_UNINSTALL
++ */
++
++#define AR6000_XIOCTL_BMI_ROMPATCH_ACTIVATE 63
++/*
++ * arguments:
++ * struct {
++ * UINT32 cmd (AR6000_XIOCTL_BMI_ROMPATCH_ACTIVATE)
++ * UINT32 rompatch count
++ * UINT32 rompatch IDs[rompatch count]
++ * }
++ * uses: BMI_ROMPATCH_ACTIVATE
++ */
++
++#define AR6000_XIOCTL_BMI_ROMPATCH_DEACTIVATE 64
++/*
++ * arguments:
++ * struct {
++ * UINT32 cmd (AR6000_XIOCTL_BMI_ROMPATCH_DEACTIVATE)
++ * UINT32 rompatch count
++ * UINT32 rompatch IDs[rompatch count]
++ * }
++ * uses: BMI_ROMPATCH_DEACTIVATE
++ */
++
++#define AR6000_XIOCTL_WMI_SET_APPIE 65
++/*
++ * arguments:
++ * struct {
++ * UINT32 cmd (AR6000_XIOCTL_WMI_SET_APPIE)
++ * UINT32 app_frmtype;
++ * UINT32 app_buflen;
++ * UINT8 app_buf[];
++ * }
++ */
++#define AR6000_XIOCTL_WMI_SET_MGMT_FRM_RX_FILTER 66
++/*
++ * arguments:
++ * A_UINT32 filter_type;
++ */
++
++#define AR6000_XIOCTL_DBGLOG_CFG_MODULE 67
++
++#define AR6000_XIOCTL_DBGLOG_GET_DEBUG_LOGS 68
++
++#define AR6000_XIOCTL_WMI_SET_WSC_STATUS 70
++/*
++ * arguments:
++ * A_UINT32 wsc_status;
++ * (WSC_REG_INACTIVE or WSC_REG_ACTIVE)
++ */
++
++/*
++ * arguments:
++ * struct {
++ * A_UINT8 streamType;
++ * A_UINT8 status;
++ * }
++ * uses: WMI_SET_BT_STATUS_CMDID
++ */
++#define AR6000_XIOCTL_WMI_SET_BT_STATUS 71
++
++/*
++ * arguments:
++ * struct {
++ * A_UINT8 paramType;
++ * union {
++ * A_UINT8 noSCOPkts;
++ * BT_PARAMS_A2DP a2dpParams;
++ * BT_COEX_REGS regs;
++ * };
++ * }
++ * uses: WMI_SET_BT_PARAM_CMDID
++ */
++#define AR6000_XIOCTL_WMI_SET_BT_PARAMS 72
++
++#define AR6000_XIOCTL_WMI_SET_HOST_SLEEP_MODE 73
++#define AR6000_XIOCTL_WMI_SET_WOW_MODE 74
++#define AR6000_XIOCTL_WMI_GET_WOW_LIST 75
++#define AR6000_XIOCTL_WMI_ADD_WOW_PATTERN 76
++#define AR6000_XIOCTL_WMI_DEL_WOW_PATTERN 77
++
++
++
++#define AR6000_XIOCTL_TARGET_INFO 78
++/*
++ * arguments:
++ * UINT32 cmd (AR6000_XIOCTL_TARGET_INFO)
++ * A_UINT32 TargetVersion (returned)
++ * A_UINT32 TargetType (returned)
++ * (See also bmi_msg.h target_ver and target_type)
++ */
++
++#define AR6000_XIOCTL_DUMP_HTC_CREDIT_STATE 79
++/*
++ * arguments:
++ * none
++ */
++
++#define AR6000_XIOCTL_TRAFFIC_ACTIVITY_CHANGE 80
++/*
++ * This ioctl is used to emulate traffic activity
++ * timeouts. Activity/inactivity will trigger the driver
++ * to re-balance credits.
++ *
++ * arguments:
++ * ar6000_traffic_activity_change
++ */
++
++#define AR6000_XIOCTL_WMI_SET_CONNECT_CTRL_FLAGS 81
++/*
++ * This ioctl is used to set the connect control flags
++ *
++ * arguments:
++ * A_UINT32 connectCtrlFlags
++ */
++
++#define AR6000_XIOCTL_WMI_SET_AKMP_PARAMS 82
++/*
++ * This IOCTL sets any Authentication,Key Management and Protection
++ * related parameters. This is used along with the information set in
++ * Connect Command.
++ * Currently this enables Multiple PMKIDs to an AP.
++ *
++ * arguments:
++ * struct {
++ * A_UINT32 akmpInfo;
++ * }
++ * uses: WMI_SET_AKMP_PARAMS_CMD
++ */
++
++#define AR6000_XIOCTL_WMI_GET_PMKID_LIST 83
++
++#define AR6000_XIOCTL_WMI_SET_PMKID_LIST 84
++/*
++ * This IOCTL is used to set a list of PMKIDs. This list of
++ * PMKIDs is used in the [Re]AssocReq Frame. This list is used
++ * only if the MultiPMKID option is enabled via the
++ * AR6000_XIOCTL_WMI_SET_AKMP_PARAMS IOCTL.
++ *
++ * arguments:
++ * struct {
++ * A_UINT32 numPMKID;
++ * WMI_PMKID pmkidList[WMI_MAX_PMKID_CACHE];
++ * }
++ * uses: WMI_SET_PMKIDLIST_CMD
++ */
++
++/* Historical DSETPATCH support for INI patches */
++#define AR6000_XIOCTL_UNUSED90 90
++
++
++
++/* used by AR6000_IOCTL_WMI_GETREV */
++struct ar6000_version {
++ A_UINT32 host_ver;
++ A_UINT32 target_ver;
++};
++
++/* used by AR6000_IOCTL_WMI_GET_QOS_QUEUE */
++struct ar6000_queuereq {
++ A_UINT8 trafficClass;
++ A_UINT16 activeTsids;
++};
++
++/* used by AR6000_IOCTL_WMI_GET_TARGET_STATS */
++typedef struct targetStats_t {
++ A_UINT64 tx_packets;
++ A_UINT64 tx_bytes;
++ A_UINT64 tx_unicast_pkts;
++ A_UINT64 tx_unicast_bytes;
++ A_UINT64 tx_multicast_pkts;
++ A_UINT64 tx_multicast_bytes;
++ A_UINT64 tx_broadcast_pkts;
++ A_UINT64 tx_broadcast_bytes;
++ A_UINT64 tx_rts_success_cnt;
++ A_UINT64 tx_packet_per_ac[4];
++
++ A_UINT64 tx_errors;
++ A_UINT64 tx_failed_cnt;
++ A_UINT64 tx_retry_cnt;
++ A_UINT64 tx_rts_fail_cnt;
++ A_INT32 tx_unicast_rate;
++ A_UINT64 rx_packets;
++ A_UINT64 rx_bytes;
++ A_UINT64 rx_unicast_pkts;
++ A_UINT64 rx_unicast_bytes;
++ A_UINT64 rx_multicast_pkts;
++ A_UINT64 rx_multicast_bytes;
++ A_UINT64 rx_broadcast_pkts;
++ A_UINT64 rx_broadcast_bytes;
++ A_UINT64 rx_fragment_pkt;
++
++ A_UINT64 rx_errors;
++ A_UINT64 rx_crcerr;
++ A_UINT64 rx_key_cache_miss;
++ A_UINT64 rx_decrypt_err;
++ A_UINT64 rx_duplicate_frames;
++ A_INT32 rx_unicast_rate;
++
++ A_UINT64 tkip_local_mic_failure;
++ A_UINT64 tkip_counter_measures_invoked;
++ A_UINT64 tkip_replays;
++ A_UINT64 tkip_format_errors;
++ A_UINT64 ccmp_format_errors;
++ A_UINT64 ccmp_replays;
++
++ A_UINT64 power_save_failure_cnt;
++ A_INT16 noise_floor_calibation;
++
++ A_UINT64 cs_bmiss_cnt;
++ A_UINT64 cs_lowRssi_cnt;
++ A_UINT64 cs_connect_cnt;
++ A_UINT64 cs_disconnect_cnt;
++ A_UINT8 cs_aveBeacon_snr;
++ A_INT16 cs_aveBeacon_rssi;
++ A_UINT8 cs_lastRoam_msec;
++ A_UINT8 cs_snr;
++ A_INT16 cs_rssi;
++
++ A_UINT32 lq_val;
++
++ A_UINT32 wow_num_pkts_dropped;
++ A_UINT8 wow_num_host_pkt_wakeups;
++ A_UINT8 wow_num_host_event_wakeups;
++ A_UINT16 wow_num_events_discarded;
++
++}TARGET_STATS;
++
++typedef struct targetStats_cmd_t {
++ TARGET_STATS targetStats;
++ int clearStats;
++} TARGET_STATS_CMD;
++
++/* used by AR6000_XIOCTL_USER_SETKEYS */
++
++/*
++ * Setting this bit to 1 doesnot initialize the RSC on the firmware
++ */
++#define AR6000_XIOCTL_USER_SETKEYS_RSC_CTRL 1
++#define AR6000_USER_SETKEYS_RSC_UNCHANGED 0x00000002
++
++typedef struct {
++ A_UINT32 keyOpCtrl; /* Bit Map of Key Mgmt Ctrl Flags */
++} AR6000_USER_SETKEYS_INFO;
++
++
++/* used by AR6000_XIOCTL_GPIO_OUTPUT_SET */
++struct ar6000_gpio_output_set_cmd_s {
++ A_UINT32 set_mask;
++ A_UINT32 clear_mask;
++ A_UINT32 enable_mask;
++ A_UINT32 disable_mask;
++};
++
++/*
++ * used by AR6000_XIOCTL_GPIO_REGISTER_GET and AR6000_XIOCTL_GPIO_REGISTER_SET
++ */
++struct ar6000_gpio_register_cmd_s {
++ A_UINT32 gpioreg_id;
++ A_UINT32 value;
++};
++
++/* used by AR6000_XIOCTL_GPIO_INTR_ACK */
++struct ar6000_gpio_intr_ack_cmd_s {
++ A_UINT32 ack_mask;
++};
++
++/* used by AR6000_XIOCTL_GPIO_INTR_WAIT */
++struct ar6000_gpio_intr_wait_cmd_s {
++ A_UINT32 intr_mask;
++ A_UINT32 input_values;
++};
++
++/* used by the AR6000_XIOCTL_DBGLOG_CFG_MODULE */
++typedef struct ar6000_dbglog_module_config_s {
++ A_UINT32 valid;
++ A_UINT16 mmask;
++ A_UINT16 tsr;
++ A_BOOL rep;
++ A_UINT16 size;
++} DBGLOG_MODULE_CONFIG;
++
++typedef struct user_rssi_thold_t {
++ A_INT16 tag;
++ A_INT16 rssi;
++} USER_RSSI_THOLD;
++
++typedef struct user_rssi_params_t {
++ A_UINT8 weight;
++ A_UINT32 pollTime;
++ USER_RSSI_THOLD tholds[12];
++} USER_RSSI_PARAMS;
++
++/*
++ * Host driver may have some config parameters. Typically, these
++ * config params are one time config parameters. These could
++ * correspond to any of the underlying modules. Host driver exposes
++ * an api for the underlying modules to get this config.
++ */
++#define AR6000_DRIVER_CFG_BASE 0x8000
++
++/* Should driver perform wlan node caching? */
++#define AR6000_DRIVER_CFG_GET_WLANNODECACHING 0x8001
++/*Should we log raw WMI msgs */
++#define AR6000_DRIVER_CFG_LOG_RAW_WMI_MSGS 0x8002
++
++/* used by AR6000_XIOCTL_DIAG_READ & AR6000_XIOCTL_DIAG_WRITE */
++struct ar6000_diag_window_cmd_s {
++ unsigned int addr;
++ unsigned int value;
++};
++
++
++struct ar6000_traffic_activity_change {
++ A_UINT32 StreamID; /* stream ID to indicate activity change */
++ A_UINT32 Active; /* active (1) or inactive (0) */
++};
++
++#ifdef __cplusplus
++}
++#endif
++#endif
+diff --git a/drivers/ar6000/ar6000/athtypes_linux.h b/drivers/ar6000/ar6000/athtypes_linux.h
+new file mode 100644
+index 0000000..3e91de3
+--- /dev/null
++++ b/drivers/ar6000/ar6000/athtypes_linux.h
+@@ -0,0 +1,47 @@
++/*
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/os/linux/include/athtypes_linux.h#1 $
++ *
++ * This file contains the definitions of the basic atheros data types.
++ * It is used to map the data types in atheros files to a platform specific
++ * type.
++ *
++ * Copyright 2003-2005 Atheros Communications, Inc., All Rights Reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef _ATHTYPES_LINUX_H_
++#define _ATHTYPES_LINUX_H_
++
++#ifdef __KERNEL__
++#include <linux/types.h>
++#endif
++
++typedef int8_t A_INT8;
++typedef int16_t A_INT16;
++typedef int32_t A_INT32;
++typedef int64_t A_INT64;
++
++typedef u_int8_t A_UINT8;
++typedef u_int16_t A_UINT16;
++typedef u_int32_t A_UINT32;
++typedef u_int64_t A_UINT64;
++
++typedef int A_BOOL;
++typedef char A_CHAR;
++typedef unsigned char A_UCHAR;
++typedef unsigned long A_ATH_TIMER;
++
++
++#endif /* _ATHTYPES_LINUX_H_ */
+diff --git a/drivers/ar6000/ar6000/config_linux.h b/drivers/ar6000/ar6000/config_linux.h
+new file mode 100644
+index 0000000..11a691d
+--- /dev/null
++++ b/drivers/ar6000/ar6000/config_linux.h
+@@ -0,0 +1,44 @@
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef _CONFIG_LINUX_H_
++#define _CONFIG_LINUX_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*
++ * Host-side GPIO support is optional.
++ * If run-time access to GPIO pins is not required, then
++ * this should be changed to #undef.
++ */
++#define CONFIG_HOST_GPIO_SUPPORT
++
++/*
++ * Host side Test Command support
++ */
++#define CONFIG_HOST_TCMD_SUPPORT
++
++#define USE_4BYTE_REGISTER_ACCESS
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff --git a/drivers/ar6000/ar6000/debug_linux.h b/drivers/ar6000/ar6000/debug_linux.h
+new file mode 100644
+index 0000000..c74e1df
+--- /dev/null
++++ b/drivers/ar6000/ar6000/debug_linux.h
+@@ -0,0 +1,86 @@
++/*
++ * Copyright (c) 2004-2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef _DEBUG_LINUX_H_
++#define _DEBUG_LINUX_H_
++
++#define DBG_DEFAULTS (DBG_ERROR|DBG_WARNING)
++
++extern A_UINT32 g_dbg_flags;
++
++#define DBGFMT "%s() : "
++#define DBGARG __func__
++#define DBGFN A_PRINTF
++
++/* ------- Debug related stuff ------- */
++enum {
++ ATH_DEBUG_SEND = 0x0001,
++ ATH_DEBUG_RECV = 0x0002,
++ ATH_DEBUG_SYNC = 0x0004,
++ ATH_DEBUG_DUMP = 0x0008,
++ ATH_DEBUG_IRQ = 0x0010,
++ ATH_DEBUG_TRC = 0x0020,
++ ATH_DEBUG_WARN = 0x0040,
++ ATH_DEBUG_ERR = 0x0080,
++ ATH_LOG_INF = 0x0100,
++ ATH_DEBUG_BMI = 0x0110,
++ ATH_DEBUG_WMI = 0x0120,
++ ATH_DEBUG_HIF = 0x0140,
++ ATH_DEBUG_HTC = 0x0180,
++ ATH_DEBUG_WLAN = 0x1000,
++ ATH_LOG_ERR = 0x1010,
++ ATH_DEBUG_ANY = 0xFFFF,
++};
++
++#ifdef DEBUG
++
++#define A_DPRINTF(f, a) \
++ if(g_dbg_flags & (f)) \
++ { \
++ DBGFN a ; \
++ }
++
++
++// TODO FIX usage of A_PRINTF!
++#define AR_DEBUG_LVL_CHECK(lvl) (debughtc & (lvl))
++#define AR_DEBUG_PRINTBUF(buffer, length, desc) do { \
++ if (debughtc & ATH_DEBUG_DUMP) { \
++ DebugDumpBytes(buffer, length,desc); \
++ } \
++} while(0)
++#define PRINTX_ARG(arg...) arg
++#define AR_DEBUG_PRINTF(flags, args) do { \
++ if (debughtc & (flags)) { \
++ A_PRINTF(KERN_ALERT PRINTX_ARG args); \
++ } \
++} while (0)
++#define AR_DEBUG_ASSERT(test) do { \
++ if (!(test)) { \
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Debug Assert Caught, File %s, Line: %d, Test:%s \n",__FILE__, __LINE__,#test)); \
++ } \
++} while(0)
++extern int debughtc;
++#else
++#define AR_DEBUG_PRINTF(flags, args)
++#define AR_DEBUG_PRINTBUF(buffer, length, desc)
++#define AR_DEBUG_ASSERT(test)
++#define AR_DEBUG_LVL_CHECK(lvl) 0
++#define A_DPRINTF(f, a)
++#endif
++
++#endif /* _DEBUG_LINUX_H_ */
+diff --git a/drivers/ar6000/ar6000/ioctl.c b/drivers/ar6000/ar6000/ioctl.c
+new file mode 100644
+index 0000000..04aa911
+--- /dev/null
++++ b/drivers/ar6000/ar6000/ioctl.c
+@@ -0,0 +1,2532 @@
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "ar6000_drv.h"
++
++static A_UINT8 bcast_mac[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
++static A_UINT8 null_mac[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
++extern USER_RSSI_THOLD rssi_map[12];
++extern unsigned int wmitimeout;
++extern A_WAITQUEUE_HEAD arEvent;
++extern int tspecCompliance;
++extern int bypasswmi;
++
++static int
++ar6000_ioctl_get_roam_tbl(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if(wmi_get_roam_tbl_cmd(ar->arWmi) != A_OK) {
++ return -EIO;
++ }
++
++ return 0;
++}
++
++static int
++ar6000_ioctl_get_roam_data(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++
++ /* currently assume only roam times are required */
++ if(wmi_get_roam_data_cmd(ar->arWmi, ROAM_DATA_TIME) != A_OK) {
++ return -EIO;
++ }
++
++
++ return 0;
++}
++
++static int
++ar6000_ioctl_set_roam_ctrl(struct net_device *dev, char *userdata)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_SET_ROAM_CTRL_CMD cmd;
++ A_UINT8 size = sizeof(cmd);
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++
++ if (copy_from_user(&cmd, userdata, size)) {
++ return -EFAULT;
++ }
++
++ if (cmd.roamCtrlType == WMI_SET_HOST_BIAS) {
++ if (cmd.info.bssBiasInfo.numBss > 1) {
++ size += (cmd.info.bssBiasInfo.numBss - 1) * sizeof(WMI_BSS_BIAS);
++ }
++ }
++
++ if (copy_from_user(&cmd, userdata, size)) {
++ return -EFAULT;
++ }
++
++ if(wmi_set_roam_ctrl_cmd(ar->arWmi, &cmd, size) != A_OK) {
++ return -EIO;
++ }
++
++ return 0;
++}
++
++static int
++ar6000_ioctl_set_powersave_timers(struct net_device *dev, char *userdata)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_POWERSAVE_TIMERS_POLICY_CMD cmd;
++ A_UINT8 size = sizeof(cmd);
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, userdata, size)) {
++ return -EFAULT;
++ }
++
++ if (copy_from_user(&cmd, userdata, size)) {
++ return -EFAULT;
++ }
++
++ if(wmi_set_powersave_timers_cmd(ar->arWmi, &cmd, size) != A_OK) {
++ return -EIO;
++ }
++
++ return 0;
++}
++
++static int
++ar6000_ioctl_set_wmm(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_SET_WMM_CMD cmd;
++ A_STATUS ret;
++
++ if ((dev->flags & IFF_UP) != IFF_UP) {
++ return -EIO;
++ }
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, (char *)((unsigned int*)rq->ifr_data + 1),
++ sizeof(cmd)))
++ {
++ return -EFAULT;
++ }
++
++ if (cmd.status == WMI_WMM_ENABLED) {
++ ar->arWmmEnabled = TRUE;
++ } else {
++ ar->arWmmEnabled = FALSE;
++ }
++
++ ret = wmi_set_wmm_cmd(ar->arWmi, cmd.status);
++
++ switch (ret) {
++ case A_OK:
++ return 0;
++ case A_EBUSY :
++ return -EBUSY;
++ case A_NO_MEMORY:
++ return -ENOMEM;
++ case A_EINVAL:
++ default:
++ return -EFAULT;
++ }
++}
++
++static int
++ar6000_ioctl_set_txop(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_SET_WMM_TXOP_CMD cmd;
++ A_STATUS ret;
++
++ if ((dev->flags & IFF_UP) != IFF_UP) {
++ return -EIO;
++ }
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, (char *)((unsigned int*)rq->ifr_data + 1),
++ sizeof(cmd)))
++ {
++ return -EFAULT;
++ }
++
++ ret = wmi_set_wmm_txop(ar->arWmi, cmd.txopEnable);
++
++ switch (ret) {
++ case A_OK:
++ return 0;
++ case A_EBUSY :
++ return -EBUSY;
++ case A_NO_MEMORY:
++ return -ENOMEM;
++ case A_EINVAL:
++ default:
++ return -EFAULT;
++ }
++}
++
++static int
++ar6000_ioctl_get_rd(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ A_STATUS ret = 0;
++
++ if ((dev->flags & IFF_UP) != IFF_UP || ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if(copy_to_user((char *)((unsigned int*)rq->ifr_data + 1),
++ &ar->arRegCode, sizeof(ar->arRegCode)))
++ ret = -EFAULT;
++
++ return ret;
++}
++
++
++/* Get power mode command */
++static int
++ar6000_ioctl_get_power_mode(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_POWER_MODE_CMD power_mode;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ power_mode.powerMode = wmi_get_power_mode_cmd(ar->arWmi);
++ if (copy_to_user(rq->ifr_data, &power_mode, sizeof(WMI_POWER_MODE_CMD))) {
++ ret = -EFAULT;
++ }
++
++ return ret;
++}
++
++
++static int
++ar6000_ioctl_set_channelParams(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_CHANNEL_PARAMS_CMD cmd, *cmdp;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++
++ if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if (cmd.numChannels > 1) {
++ cmdp = A_MALLOC(130);
++ if (copy_from_user(cmdp, rq->ifr_data,
++ sizeof (*cmdp) +
++ ((cmd.numChannels - 1) * sizeof(A_UINT16))))
++ {
++ kfree(cmdp);
++ return -EFAULT;
++ }
++ } else {
++ cmdp = &cmd;
++ }
++
++ if ((ar->arPhyCapability == WMI_11G_CAPABILITY) &&
++ ((cmdp->phyMode == WMI_11A_MODE) || (cmdp->phyMode == WMI_11AG_MODE)))
++ {
++ ret = -EINVAL;
++ }
++
++ if (!ret &&
++ (wmi_set_channelParams_cmd(ar->arWmi, cmdp->scanParam, cmdp->phyMode,
++ cmdp->numChannels, cmdp->channelList)
++ != A_OK))
++ {
++ ret = -EIO;
++ }
++
++ if (cmd.numChannels > 1) {
++ kfree(cmdp);
++ }
++
++ return ret;
++}
++
++static int
++ar6000_ioctl_set_snr_threshold(struct net_device *dev, struct ifreq *rq)
++{
++
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_SNR_THRESHOLD_PARAMS_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if( wmi_set_snr_threshold_params(ar->arWmi, &cmd) != A_OK ) {
++ ret = -EIO;
++ }
++
++ return ret;
++}
++
++static int
++ar6000_ioctl_set_rssi_threshold(struct net_device *dev, struct ifreq *rq)
++{
++#define SWAP_THOLD(thold1, thold2) do { \
++ USER_RSSI_THOLD tmpThold; \
++ tmpThold.tag = thold1.tag; \
++ tmpThold.rssi = thold1.rssi; \
++ thold1.tag = thold2.tag; \
++ thold1.rssi = thold2.rssi; \
++ thold2.tag = tmpThold.tag; \
++ thold2.rssi = tmpThold.rssi; \
++} while (0)
++
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_RSSI_THRESHOLD_PARAMS_CMD cmd;
++ USER_RSSI_PARAMS rssiParams;
++ A_INT32 i, j;
++
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user((char *)&rssiParams, (char *)((unsigned int *)rq->ifr_data + 1), sizeof(USER_RSSI_PARAMS))) {
++ return -EFAULT;
++ }
++ cmd.weight = rssiParams.weight;
++ cmd.pollTime = rssiParams.pollTime;
++
++ A_MEMCPY(rssi_map, &rssiParams.tholds, sizeof(rssi_map));
++ /*
++ * only 6 elements, so use bubble sorting, in ascending order
++ */
++ for (i = 5; i > 0; i--) {
++ for (j = 0; j < i; j++) { /* above tholds */
++ if (rssi_map[j+1].rssi < rssi_map[j].rssi) {
++ SWAP_THOLD(rssi_map[j+1], rssi_map[j]);
++ } else if (rssi_map[j+1].rssi == rssi_map[j].rssi) {
++ return EFAULT;
++ }
++ }
++ }
++ for (i = 11; i > 6; i--) {
++ for (j = 6; j < i; j++) { /* below tholds */
++ if (rssi_map[j+1].rssi < rssi_map[j].rssi) {
++ SWAP_THOLD(rssi_map[j+1], rssi_map[j]);
++ } else if (rssi_map[j+1].rssi == rssi_map[j].rssi) {
++ return EFAULT;
++ }
++ }
++ }
++
++#ifdef DEBUG
++ for (i = 0; i < 12; i++) {
++ AR_DEBUG2_PRINTF("thold[%d].tag: %d, thold[%d].rssi: %d \n",
++ i, rssi_map[i].tag, i, rssi_map[i].rssi);
++ }
++#endif
++ cmd.thresholdAbove1_Val = rssi_map[0].rssi;
++ cmd.thresholdAbove2_Val = rssi_map[1].rssi;
++ cmd.thresholdAbove3_Val = rssi_map[2].rssi;
++ cmd.thresholdAbove4_Val = rssi_map[3].rssi;
++ cmd.thresholdAbove5_Val = rssi_map[4].rssi;
++ cmd.thresholdAbove6_Val = rssi_map[5].rssi;
++ cmd.thresholdBelow1_Val = rssi_map[6].rssi;
++ cmd.thresholdBelow2_Val = rssi_map[7].rssi;
++ cmd.thresholdBelow3_Val = rssi_map[8].rssi;
++ cmd.thresholdBelow4_Val = rssi_map[9].rssi;
++ cmd.thresholdBelow5_Val = rssi_map[10].rssi;
++ cmd.thresholdBelow6_Val = rssi_map[11].rssi;
++
++ if( wmi_set_rssi_threshold_params(ar->arWmi, &cmd) != A_OK ) {
++ ret = -EIO;
++ }
++
++ return ret;
++}
++
++static int
++ar6000_ioctl_set_lq_threshold(struct net_device *dev, struct ifreq *rq)
++{
++
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_LQ_THRESHOLD_PARAMS_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, (char *)((unsigned int *)rq->ifr_data + 1), sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if( wmi_set_lq_threshold_params(ar->arWmi, &cmd) != A_OK ) {
++ ret = -EIO;
++ }
++
++ return ret;
++}
++
++
++static int
++ar6000_ioctl_set_probedSsid(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_PROBED_SSID_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if (wmi_probedSsid_cmd(ar->arWmi, cmd.entryIndex, cmd.flag, cmd.ssidLength,
++ cmd.ssid) != A_OK)
++ {
++ ret = -EIO;
++ }
++
++ return ret;
++}
++
++static int
++ar6000_ioctl_set_badAp(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_ADD_BAD_AP_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++
++ if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if (cmd.badApIndex > WMI_MAX_BAD_AP_INDEX) {
++ return -EIO;
++ }
++
++ if (A_MEMCMP(cmd.bssid, null_mac, AR6000_ETH_ADDR_LEN) == 0) {
++ /*
++ * This is a delete badAP.
++ */
++ if (wmi_deleteBadAp_cmd(ar->arWmi, cmd.badApIndex) != A_OK) {
++ ret = -EIO;
++ }
++ } else {
++ if (wmi_addBadAp_cmd(ar->arWmi, cmd.badApIndex, cmd.bssid) != A_OK) {
++ ret = -EIO;
++ }
++ }
++
++ return ret;
++}
++
++static int
++ar6000_ioctl_create_qos(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_CREATE_PSTREAM_CMD cmd;
++ A_STATUS ret;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++
++ if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ ret = wmi_verify_tspec_params(&cmd, tspecCompliance);
++ if (ret == A_OK)
++ ret = wmi_create_pstream_cmd(ar->arWmi, &cmd);
++
++ switch (ret) {
++ case A_OK:
++ return 0;
++ case A_EBUSY :
++ return -EBUSY;
++ case A_NO_MEMORY:
++ return -ENOMEM;
++ case A_EINVAL:
++ default:
++ return -EFAULT;
++ }
++}
++
++static int
++ar6000_ioctl_delete_qos(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_DELETE_PSTREAM_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ ret = wmi_delete_pstream_cmd(ar->arWmi, cmd.trafficClass, cmd.tsid);
++
++ switch (ret) {
++ case A_OK:
++ return 0;
++ case A_EBUSY :
++ return -EBUSY;
++ case A_NO_MEMORY:
++ return -ENOMEM;
++ case A_EINVAL:
++ default:
++ return -EFAULT;
++ }
++}
++
++static int
++ar6000_ioctl_get_qos_queue(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ struct ar6000_queuereq qreq;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if( copy_from_user(&qreq, rq->ifr_data,
++ sizeof(struct ar6000_queuereq)))
++ return -EFAULT;
++
++ qreq.activeTsids = wmi_get_mapped_qos_queue(ar->arWmi, qreq.trafficClass);
++
++ if (copy_to_user(rq->ifr_data, &qreq,
++ sizeof(struct ar6000_queuereq)))
++ {
++ ret = -EFAULT;
++ }
++
++ return ret;
++}
++
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++static A_STATUS
++ar6000_ioctl_tcmd_get_rx_report(struct net_device *dev,
++ struct ifreq *rq, A_UINT8 *data, A_UINT32 len)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ A_UINT32 buf[2];
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++ ar->tcmdRxReport = 0;
++ if (wmi_test_cmd(ar->arWmi, data, len) != A_OK) {
++ up(&ar->arSem);
++ return -EIO;
++ }
++
++ wait_event_interruptible_timeout(arEvent, ar->tcmdRxReport != 0, wmitimeout * HZ);
++
++ if (signal_pending(current)) {
++ ret = -EINTR;
++ }
++
++ buf[0] = ar->tcmdRxTotalPkt;
++ buf[1] = ar->tcmdRxRssi;
++ if (!ret && copy_to_user(rq->ifr_data, buf, sizeof(buf))) {
++ ret = -EFAULT;
++ }
++
++ up(&ar->arSem);
++
++ return ret;
++}
++
++void
++ar6000_tcmd_rx_report_event(void *devt, A_UINT8 * results, int len)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
++ TCMD_CONT_RX * rx_rep = (TCMD_CONT_RX *)results;
++
++ ar->tcmdRxTotalPkt = rx_rep->u.report.totalPkt;
++ ar->tcmdRxRssi = rx_rep->u.report.rssiInDBm;
++ ar->tcmdRxReport = 1;
++
++ wake_up(&arEvent);
++}
++#endif /* CONFIG_HOST_TCMD_SUPPORT*/
++
++static int
++ar6000_ioctl_set_error_report_bitmask(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_TARGET_ERROR_REPORT_BITMASK cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ ret = wmi_set_error_report_bitmask(ar->arWmi, cmd.bitmask);
++
++ return (ret==0 ? ret : -EINVAL);
++}
++
++static int
++ar6000_clear_target_stats(struct net_device *dev)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ TARGET_STATS *pStats = &ar->arTargetStats;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ A_MEMZERO(pStats, sizeof(TARGET_STATS));
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ return ret;
++}
++
++static int
++ar6000_ioctl_get_target_stats(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ TARGET_STATS_CMD cmd;
++ TARGET_STATS *pStats = &ar->arTargetStats;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
++ return -EFAULT;
++ }
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++
++ ar->statsUpdatePending = TRUE;
++
++ if(wmi_get_stats_cmd(ar->arWmi) != A_OK) {
++ up(&ar->arSem);
++ return -EIO;
++ }
++
++ wait_event_interruptible_timeout(arEvent, ar->statsUpdatePending == FALSE, wmitimeout * HZ);
++
++ if (signal_pending(current)) {
++ ret = -EINTR;
++ }
++
++ if (!ret && copy_to_user(rq->ifr_data, pStats, sizeof(*pStats))) {
++ ret = -EFAULT;
++ }
++
++ if (cmd.clearStats == 1) {
++ ret = ar6000_clear_target_stats(dev);
++ }
++
++ up(&ar->arSem);
++
++ return ret;
++}
++
++static int
++ar6000_ioctl_set_access_params(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_SET_ACCESS_PARAMS_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if (wmi_set_access_params_cmd(ar->arWmi, cmd.txop, cmd.eCWmin, cmd.eCWmax,
++ cmd.aifsn) == A_OK)
++ {
++ ret = 0;
++ } else {
++ ret = -EINVAL;
++ }
++
++ return (ret);
++}
++
++static int
++ar6000_ioctl_set_disconnect_timeout(struct net_device *dev, struct ifreq *rq)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_DISC_TIMEOUT_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if (wmi_disctimeout_cmd(ar->arWmi, cmd.disconnectTimeout) == A_OK)
++ {
++ ret = 0;
++ } else {
++ ret = -EINVAL;
++ }
++
++ return (ret);
++}
++
++static int
++ar6000_xioctl_set_voice_pkt_size(struct net_device *dev, char * userdata)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_SET_VOICE_PKT_SIZE_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if (wmi_set_voice_pkt_size_cmd(ar->arWmi, cmd.voicePktSize) == A_OK)
++ {
++ ret = 0;
++ } else {
++ ret = -EINVAL;
++ }
++
++
++ return (ret);
++}
++
++static int
++ar6000_xioctl_set_max_sp_len(struct net_device *dev, char * userdata)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_SET_MAX_SP_LEN_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if (wmi_set_max_sp_len_cmd(ar->arWmi, cmd.maxSPLen) == A_OK)
++ {
++ ret = 0;
++ } else {
++ ret = -EINVAL;
++ }
++
++ return (ret);
++}
++
++
++static int
++ar6000_xioctl_set_bt_status_cmd(struct net_device *dev, char * userdata)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_SET_BT_STATUS_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if (wmi_set_bt_status_cmd(ar->arWmi, cmd.streamType, cmd.status) == A_OK)
++ {
++ ret = 0;
++ } else {
++ ret = -EINVAL;
++ }
++
++ return (ret);
++}
++
++static int
++ar6000_xioctl_set_bt_params_cmd(struct net_device *dev, char * userdata)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_SET_BT_PARAMS_CMD cmd;
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
++ return -EFAULT;
++ }
++
++ if (wmi_set_bt_params_cmd(ar->arWmi, &cmd) == A_OK)
++ {
++ ret = 0;
++ } else {
++ ret = -EINVAL;
++ }
++
++ return (ret);
++}
++
++#ifdef CONFIG_HOST_GPIO_SUPPORT
++struct ar6000_gpio_intr_wait_cmd_s gpio_intr_results;
++/* gpio_reg_results and gpio_data_available are protected by arSem */
++static struct ar6000_gpio_register_cmd_s gpio_reg_results;
++static A_BOOL gpio_data_available; /* Requested GPIO data available */
++static A_BOOL gpio_intr_available; /* GPIO interrupt info available */
++static A_BOOL gpio_ack_received; /* GPIO ack was received */
++
++/* Host-side initialization for General Purpose I/O support */
++void ar6000_gpio_init(void)
++{
++ gpio_intr_available = FALSE;
++ gpio_data_available = FALSE;
++ gpio_ack_received = FALSE;
++}
++
++/*
++ * Called when a GPIO interrupt is received from the Target.
++ * intr_values shows which GPIO pins have interrupted.
++ * input_values shows a recent value of GPIO pins.
++ */
++void
++ar6000_gpio_intr_rx(A_UINT32 intr_mask, A_UINT32 input_values)
++{
++ gpio_intr_results.intr_mask = intr_mask;
++ gpio_intr_results.input_values = input_values;
++ *((volatile A_BOOL *)&gpio_intr_available) = TRUE;
++ wake_up(&arEvent);
++}
++
++/*
++ * This is called when a response is received from the Target
++ * for a previous or ar6000_gpio_input_get or ar6000_gpio_register_get
++ * call.
++ */
++void
++ar6000_gpio_data_rx(A_UINT32 reg_id, A_UINT32 value)
++{
++ gpio_reg_results.gpioreg_id = reg_id;
++ gpio_reg_results.value = value;
++ *((volatile A_BOOL *)&gpio_data_available) = TRUE;
++ wake_up(&arEvent);
++}
++
++/*
++ * This is called when an acknowledgement is received from the Target
++ * for a previous or ar6000_gpio_output_set or ar6000_gpio_register_set
++ * call.
++ */
++void
++ar6000_gpio_ack_rx(void)
++{
++ gpio_ack_received = TRUE;
++ wake_up(&arEvent);
++}
++
++A_STATUS
++ar6000_gpio_output_set(struct net_device *dev,
++ A_UINT32 set_mask,
++ A_UINT32 clear_mask,
++ A_UINT32 enable_mask,
++ A_UINT32 disable_mask)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ gpio_ack_received = FALSE;
++ return wmi_gpio_output_set(ar->arWmi,
++ set_mask, clear_mask, enable_mask, disable_mask);
++}
++
++static A_STATUS
++ar6000_gpio_input_get(struct net_device *dev)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ *((volatile A_BOOL *)&gpio_data_available) = FALSE;
++ return wmi_gpio_input_get(ar->arWmi);
++}
++
++static A_STATUS
++ar6000_gpio_register_set(struct net_device *dev,
++ A_UINT32 gpioreg_id,
++ A_UINT32 value)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ gpio_ack_received = FALSE;
++ return wmi_gpio_register_set(ar->arWmi, gpioreg_id, value);
++}
++
++static A_STATUS
++ar6000_gpio_register_get(struct net_device *dev,
++ A_UINT32 gpioreg_id)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ *((volatile A_BOOL *)&gpio_data_available) = FALSE;
++ return wmi_gpio_register_get(ar->arWmi, gpioreg_id);
++}
++
++static A_STATUS
++ar6000_gpio_intr_ack(struct net_device *dev,
++ A_UINT32 ack_mask)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ gpio_intr_available = FALSE;
++ return wmi_gpio_intr_ack(ar->arWmi, ack_mask);
++}
++#endif /* CONFIG_HOST_GPIO_SUPPORT */
++
++int ar6000_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ HIF_DEVICE *hifDevice = ar->arHifDevice;
++ int ret, param, param2;
++ unsigned int address = 0;
++ unsigned int length = 0;
++ unsigned char *buffer;
++ char *userdata;
++ A_UINT32 connectCtrlFlags;
++
++
++ static WMI_SCAN_PARAMS_CMD scParams = {0, 0, 0, 0, 0,
++ WMI_SHORTSCANRATIO_DEFAULT,
++ DEFAULT_SCAN_CTRL_FLAGS,
++ 0};
++ WMI_SET_AKMP_PARAMS_CMD akmpParams;
++ WMI_SET_PMKID_LIST_CMD pmkidInfo;
++
++ if (cmd == AR6000_IOCTL_EXTENDED)
++ {
++ /*
++ * This allows for many more wireless ioctls than would otherwise
++ * be available. Applications embed the actual ioctl command in
++ * the first word of the parameter block, and use the command
++ * AR6000_IOCTL_EXTENDED_CMD on the ioctl call.
++ */
++ get_user(cmd, (int *)rq->ifr_data);
++ userdata = (char *)(((unsigned int *)rq->ifr_data)+1);
++ }
++ else
++ {
++ userdata = (char *)rq->ifr_data;
++ }
++
++ if ((ar->arWlanState == WLAN_DISABLED) &&
++ ((cmd != AR6000_XIOCTRL_WMI_SET_WLAN_STATE) &&
++ (cmd != AR6000_XIOCTL_DIAG_READ) &&
++ (cmd != AR6000_XIOCTL_DIAG_WRITE)))
++ {
++ return -EIO;
++ }
++
++ ret = 0;
++ switch(cmd)
++ {
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++ case AR6000_XIOCTL_TCMD_CONT_TX:
++ {
++ TCMD_CONT_TX txCmd;
++
++ if (ar->tcmdPm == TCMD_PM_SLEEP) {
++ A_PRINTF("Can NOT send tx tcmd when target is asleep! \n");
++ return -EFAULT;
++ }
++
++ if(copy_from_user(&txCmd, userdata, sizeof(TCMD_CONT_TX)))
++ return -EFAULT;
++ wmi_test_cmd(ar->arWmi,(A_UINT8 *)&txCmd, sizeof(TCMD_CONT_TX));
++ }
++ break;
++ case AR6000_XIOCTL_TCMD_CONT_RX:
++ {
++ TCMD_CONT_RX rxCmd;
++
++ if (ar->tcmdPm == TCMD_PM_SLEEP) {
++ A_PRINTF("Can NOT send rx tcmd when target is asleep! \n");
++ return -EFAULT;
++ }
++ if(copy_from_user(&rxCmd, userdata, sizeof(TCMD_CONT_RX)))
++ return -EFAULT;
++ switch(rxCmd.act)
++ {
++ case TCMD_CONT_RX_PROMIS:
++ case TCMD_CONT_RX_FILTER:
++ case TCMD_CONT_RX_SETMAC:
++ wmi_test_cmd(ar->arWmi,(A_UINT8 *)&rxCmd,
++ sizeof(TCMD_CONT_RX));
++ break;
++ case TCMD_CONT_RX_REPORT:
++ ar6000_ioctl_tcmd_get_rx_report(dev, rq,
++ (A_UINT8 *)&rxCmd, sizeof(TCMD_CONT_RX));
++ break;
++ default:
++ A_PRINTF("Unknown Cont Rx mode: %d\n",rxCmd.act);
++ return -EINVAL;
++ }
++ }
++ break;
++ case AR6000_XIOCTL_TCMD_PM:
++ {
++ TCMD_PM pmCmd;
++
++ if(copy_from_user(&pmCmd, userdata, sizeof(TCMD_PM)))
++ return -EFAULT;
++ ar->tcmdPm = pmCmd.mode;
++ wmi_test_cmd(ar->arWmi, (A_UINT8*)&pmCmd, sizeof(TCMD_PM));
++ }
++ break;
++#endif /* CONFIG_HOST_TCMD_SUPPORT */
++
++ case AR6000_XIOCTL_BMI_DONE:
++ ret = BMIDone(hifDevice);
++ break;
++
++ case AR6000_XIOCTL_BMI_READ_MEMORY:
++ get_user(address, (unsigned int *)userdata);
++ get_user(length, (unsigned int *)userdata + 1);
++ AR_DEBUG_PRINTF("Read Memory (address: 0x%x, length: %d)\n",
++ address, length);
++ if ((buffer = (unsigned char *)A_MALLOC(length)) != NULL) {
++ A_MEMZERO(buffer, length);
++ ret = BMIReadMemory(hifDevice, address, buffer, length);
++ if (copy_to_user(rq->ifr_data, buffer, length)) {
++ ret = -EFAULT;
++ }
++ A_FREE(buffer);
++ } else {
++ ret = -ENOMEM;
++ }
++ break;
++
++ case AR6000_XIOCTL_BMI_WRITE_MEMORY:
++ get_user(address, (unsigned int *)userdata);
++ get_user(length, (unsigned int *)userdata + 1);
++ AR_DEBUG_PRINTF("Write Memory (address: 0x%x, length: %d)\n",
++ address, length);
++ if ((buffer = (unsigned char *)A_MALLOC(length)) != NULL) {
++ A_MEMZERO(buffer, length);
++ if (copy_from_user(buffer, &userdata[sizeof(address) +
++ sizeof(length)], length))
++ {
++ ret = -EFAULT;
++ } else {
++ ret = BMIWriteMemory(hifDevice, address, buffer, length);
++ }
++ A_FREE(buffer);
++ } else {
++ ret = -ENOMEM;
++ }
++ break;
++
++ case AR6000_XIOCTL_BMI_TEST:
++ AR_DEBUG_PRINTF("No longer supported\n");
++ ret = -EOPNOTSUPP;
++ break;
++
++ case AR6000_XIOCTL_BMI_EXECUTE:
++ get_user(address, (unsigned int *)userdata);
++ get_user(param, (unsigned int *)userdata + 1);
++ AR_DEBUG_PRINTF("Execute (address: 0x%x, param: %d)\n",
++ address, param);
++ ret = BMIExecute(hifDevice, address, &param);
++ put_user(param, (unsigned int *)rq->ifr_data); /* return value */
++ break;
++
++ case AR6000_XIOCTL_BMI_SET_APP_START:
++ get_user(address, (unsigned int *)userdata);
++ AR_DEBUG_PRINTF("Set App Start (address: 0x%x)\n", address);
++ ret = BMISetAppStart(hifDevice, address);
++ break;
++
++ case AR6000_XIOCTL_BMI_READ_SOC_REGISTER:
++ get_user(address, (unsigned int *)userdata);
++ ret = BMIReadSOCRegister(hifDevice, address, &param);
++ put_user(param, (unsigned int *)rq->ifr_data); /* return value */
++ break;
++
++ case AR6000_XIOCTL_BMI_WRITE_SOC_REGISTER:
++ get_user(address, (unsigned int *)userdata);
++ get_user(param, (unsigned int *)userdata + 1);
++ ret = BMIWriteSOCRegister(hifDevice, address, param);
++ break;
++
++#ifdef HTC_RAW_INTERFACE
++ case AR6000_XIOCTL_HTC_RAW_OPEN:
++ ret = A_OK;
++ if (!arRawIfEnabled(ar)) {
++ /* make sure block size is set in case the target was reset since last
++ * BMI phase (i.e. flashup downloads) */
++ ret = ar6000_SetHTCBlockSize(ar);
++ if (A_FAILED(ret)) {
++ break;
++ }
++ /* Terminate the BMI phase */
++ ret = BMIDone(hifDevice);
++ if (ret == A_OK) {
++ ret = ar6000_htc_raw_open(ar);
++ }
++ }
++ break;
++
++ case AR6000_XIOCTL_HTC_RAW_CLOSE:
++ if (arRawIfEnabled(ar)) {
++ ret = ar6000_htc_raw_close(ar);
++ arRawIfEnabled(ar) = FALSE;
++ } else {
++ ret = A_ERROR;
++ }
++ break;
++
++ case AR6000_XIOCTL_HTC_RAW_READ:
++ if (arRawIfEnabled(ar)) {
++ unsigned int streamID;
++ get_user(streamID, (unsigned int *)userdata);
++ get_user(length, (unsigned int *)userdata + 1);
++ buffer = rq->ifr_data + sizeof(length);
++ ret = ar6000_htc_raw_read(ar, (HTC_RAW_STREAM_ID)streamID,
++ buffer, length);
++ put_user(ret, (unsigned int *)rq->ifr_data);
++ } else {
++ ret = A_ERROR;
++ }
++ break;
++
++ case AR6000_XIOCTL_HTC_RAW_WRITE:
++ if (arRawIfEnabled(ar)) {
++ unsigned int streamID;
++ get_user(streamID, (unsigned int *)userdata);
++ get_user(length, (unsigned int *)userdata + 1);
++ buffer = userdata + sizeof(streamID) + sizeof(length);
++ ret = ar6000_htc_raw_write(ar, (HTC_RAW_STREAM_ID)streamID,
++ buffer, length);
++ put_user(ret, (unsigned int *)rq->ifr_data);
++ } else {
++ ret = A_ERROR;
++ }
++ break;
++#endif /* HTC_RAW_INTERFACE */
++
++ case AR6000_IOCTL_WMI_GETREV:
++ {
++ if (copy_to_user(rq->ifr_data, &ar->arVersion,
++ sizeof(ar->arVersion)))
++ {
++ ret = -EFAULT;
++ }
++ break;
++ }
++ case AR6000_IOCTL_WMI_SETPWR:
++ {
++ WMI_POWER_MODE_CMD pwrModeCmd;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&pwrModeCmd, userdata,
++ sizeof(pwrModeCmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_powermode_cmd(ar->arWmi, pwrModeCmd.powerMode)
++ != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_IBSS_PM_CAPS:
++ {
++ WMI_IBSS_PM_CAPS_CMD ibssPmCaps;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&ibssPmCaps, userdata,
++ sizeof(ibssPmCaps)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_ibsspmcaps_cmd(ar->arWmi, ibssPmCaps.power_saving, ibssPmCaps.ttl,
++ ibssPmCaps.atim_windows, ibssPmCaps.timeout_value) != A_OK)
++ {
++ ret = -EIO;
++ }
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ ar->arIbssPsEnable = ibssPmCaps.power_saving;
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ }
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_PMPARAMS:
++ {
++ WMI_POWER_PARAMS_CMD pmParams;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&pmParams, userdata,
++ sizeof(pmParams)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_pmparams_cmd(ar->arWmi, pmParams.idle_period,
++ pmParams.pspoll_number,
++ pmParams.dtim_policy) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_IOCTL_WMI_SETSCAN:
++ {
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&scParams, userdata,
++ sizeof(scParams)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (CAN_SCAN_IN_CONNECT(scParams.scanCtrlFlags)) {
++ ar->arSkipScan = FALSE;
++ } else {
++ ar->arSkipScan = TRUE;
++ }
++
++ if (wmi_scanparams_cmd(ar->arWmi, scParams.fg_start_period,
++ scParams.fg_end_period,
++ scParams.bg_period,
++ scParams.minact_chdwell_time,
++ scParams.maxact_chdwell_time,
++ scParams.pas_chdwell_time,
++ scParams.shortScanRatio,
++ scParams.scanCtrlFlags,
++ scParams.max_dfsch_act_time) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_IOCTL_WMI_SETLISTENINT:
++ {
++ WMI_LISTEN_INT_CMD listenCmd;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&listenCmd, userdata,
++ sizeof(listenCmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_listeninterval_cmd(ar->arWmi, listenCmd.listenInterval, listenCmd.numBeacons) != A_OK) {
++ ret = -EIO;
++ } else {
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ ar->arListenInterval = param;
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ }
++
++ }
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_BMISS_TIME:
++ {
++ WMI_BMISS_TIME_CMD bmissCmd;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&bmissCmd, userdata,
++ sizeof(bmissCmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_bmisstime_cmd(ar->arWmi, bmissCmd.bmissTime, bmissCmd.numBeacons) != A_OK) {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_IOCTL_WMI_SETBSSFILTER:
++ {
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else {
++
++ get_user(param, (unsigned char *)userdata);
++ get_user(param2, (unsigned int *)(userdata + 1));
++ printk("SETBSSFILTER: filter 0x%x, mask: 0x%x\n", param, param2);
++ if (wmi_bssfilter_cmd(ar->arWmi, param, param2) != A_OK) {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_SNRTHRESHOLD:
++ {
++ ret = ar6000_ioctl_set_snr_threshold(dev, rq);
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_RSSITHRESHOLD:
++ {
++ ret = ar6000_ioctl_set_rssi_threshold(dev, rq);
++ break;
++ }
++ case AR6000_XIOCTL_WMI_CLR_RSSISNR:
++ {
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ }
++ ret = wmi_clr_rssi_snr(ar->arWmi);
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_LQTHRESHOLD:
++ {
++ ret = ar6000_ioctl_set_lq_threshold(dev, rq);
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_LPREAMBLE:
++ {
++ WMI_SET_LPREAMBLE_CMD setLpreambleCmd;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&setLpreambleCmd, userdata,
++ sizeof(setLpreambleCmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_set_lpreamble_cmd(ar->arWmi, setLpreambleCmd.status)
++ != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_RTS:
++ {
++ WMI_SET_RTS_CMD rtsCmd;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&rtsCmd, userdata,
++ sizeof(rtsCmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_set_rts_cmd(ar->arWmi, rtsCmd.threshold)
++ != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_WMM:
++ {
++ ret = ar6000_ioctl_set_wmm(dev, rq);
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_TXOP:
++ {
++ ret = ar6000_ioctl_set_txop(dev, rq);
++ break;
++ }
++ case AR6000_XIOCTL_WMI_GET_RD:
++ {
++ ret = ar6000_ioctl_get_rd(dev, rq);
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_CHANNELPARAMS:
++ {
++ ret = ar6000_ioctl_set_channelParams(dev, rq);
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_PROBEDSSID:
++ {
++ ret = ar6000_ioctl_set_probedSsid(dev, rq);
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_BADAP:
++ {
++ ret = ar6000_ioctl_set_badAp(dev, rq);
++ break;
++ }
++ case AR6000_IOCTL_WMI_CREATE_QOS:
++ {
++ ret = ar6000_ioctl_create_qos(dev, rq);
++ break;
++ }
++ case AR6000_IOCTL_WMI_DELETE_QOS:
++ {
++ ret = ar6000_ioctl_delete_qos(dev, rq);
++ break;
++ }
++ case AR6000_IOCTL_WMI_GET_QOS_QUEUE:
++ {
++ ret = ar6000_ioctl_get_qos_queue(dev, rq);
++ break;
++ }
++ case AR6000_IOCTL_WMI_GET_TARGET_STATS:
++ {
++ ret = ar6000_ioctl_get_target_stats(dev, rq);
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_ERROR_REPORT_BITMASK:
++ {
++ ret = ar6000_ioctl_set_error_report_bitmask(dev, rq);
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_ASSOC_INFO:
++ {
++ WMI_SET_ASSOC_INFO_CMD cmd;
++ A_UINT8 assocInfo[WMI_MAX_ASSOC_INFO_LEN];
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else {
++ get_user(cmd.ieType, userdata);
++ if (cmd.ieType >= WMI_MAX_ASSOC_INFO_TYPE) {
++ ret = -EIO;
++ } else {
++ get_user(cmd.bufferSize, userdata + 1);
++ if (cmd.bufferSize > WMI_MAX_ASSOC_INFO_LEN) {
++ ret = -EFAULT;
++ break;
++ }
++ if (copy_from_user(assocInfo, userdata + 2,
++ cmd.bufferSize))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_associnfo_cmd(ar->arWmi, cmd.ieType,
++ cmd.bufferSize,
++ assocInfo) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ }
++ }
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_ACCESS_PARAMS:
++ {
++ ret = ar6000_ioctl_set_access_params(dev, rq);
++ break;
++ }
++ case AR6000_IOCTL_WMI_SET_DISC_TIMEOUT:
++ {
++ ret = ar6000_ioctl_set_disconnect_timeout(dev, rq);
++ break;
++ }
++ case AR6000_XIOCTL_FORCE_TARGET_RESET:
++ {
++ if (ar->arHtcTarget)
++ {
++// HTCForceReset(htcTarget);
++ }
++ else
++ {
++ AR_DEBUG_PRINTF("ar6000_ioctl cannot attempt reset.\n");
++ }
++ break;
++ }
++ case AR6000_XIOCTL_TARGET_INFO:
++ case AR6000_XIOCTL_CHECK_TARGET_READY: /* backwards compatibility */
++ {
++ /* If we made it to here, then the Target exists and is ready. */
++
++ if (cmd == AR6000_XIOCTL_TARGET_INFO) {
++ if (copy_to_user((A_UINT32 *)rq->ifr_data, &ar->arVersion.target_ver,
++ sizeof(ar->arVersion.target_ver)))
++ {
++ ret = -EFAULT;
++ }
++ if (copy_to_user(((A_UINT32 *)rq->ifr_data)+1, &ar->arTargetType,
++ sizeof(ar->arTargetType)))
++ {
++ ret = -EFAULT;
++ }
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_HB_CHALLENGE_RESP_PARAMS:
++ {
++ WMI_SET_HB_CHALLENGE_RESP_PARAMS_CMD hbparam;
++
++ if (copy_from_user(&hbparam, userdata, sizeof(hbparam)))
++ {
++ ret = -EFAULT;
++ } else {
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ /* Start a cyclic timer with the parameters provided. */
++ if (hbparam.frequency) {
++ ar->arHBChallengeResp.frequency = hbparam.frequency;
++ }
++ if (hbparam.threshold) {
++ ar->arHBChallengeResp.missThres = hbparam.threshold;
++ }
++
++ /* Delete the pending timer and start a new one */
++ if (timer_pending(&ar->arHBChallengeResp.timer)) {
++ A_UNTIMEOUT(&ar->arHBChallengeResp.timer);
++ }
++ A_TIMEOUT_MS(&ar->arHBChallengeResp.timer, ar->arHBChallengeResp.frequency * 1000, 0);
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_GET_HB_CHALLENGE_RESP:
++ {
++ A_UINT32 cookie;
++
++ if (copy_from_user(&cookie, userdata, sizeof(cookie))) {
++ return -EFAULT;
++ }
++
++ /* Send the challenge on the control channel */
++ if (wmi_get_challenge_resp_cmd(ar->arWmi, cookie, APP_HB_CHALLENGE) != A_OK) {
++ return -EIO;
++ }
++ break;
++ }
++#ifdef USER_KEYS
++ case AR6000_XIOCTL_USER_SETKEYS:
++ {
++
++ ar->user_savedkeys_stat = USER_SAVEDKEYS_STAT_RUN;
++
++ if (copy_from_user(&ar->user_key_ctrl, userdata,
++ sizeof(ar->user_key_ctrl)))
++ {
++ return -EFAULT;
++ }
++
++ A_PRINTF("ar6000 USER set key %x\n", ar->user_key_ctrl);
++ break;
++ }
++#endif /* USER_KEYS */
++
++#ifdef CONFIG_HOST_GPIO_SUPPORT
++ case AR6000_XIOCTL_GPIO_OUTPUT_SET:
++ {
++ struct ar6000_gpio_output_set_cmd_s gpio_output_set_cmd;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++
++ if (copy_from_user(&gpio_output_set_cmd, userdata,
++ sizeof(gpio_output_set_cmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ ret = ar6000_gpio_output_set(dev,
++ gpio_output_set_cmd.set_mask,
++ gpio_output_set_cmd.clear_mask,
++ gpio_output_set_cmd.enable_mask,
++ gpio_output_set_cmd.disable_mask);
++ if (ret != A_OK) {
++ ret = EIO;
++ }
++ }
++ up(&ar->arSem);
++ break;
++ }
++ case AR6000_XIOCTL_GPIO_INPUT_GET:
++ {
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++
++ ret = ar6000_gpio_input_get(dev);
++ if (ret != A_OK) {
++ up(&ar->arSem);
++ return -EIO;
++ }
++
++ /* Wait for Target to respond. */
++ wait_event_interruptible(arEvent, gpio_data_available);
++ if (signal_pending(current)) {
++ ret = -EINTR;
++ } else {
++ A_ASSERT(gpio_reg_results.gpioreg_id == GPIO_ID_NONE);
++
++ if (copy_to_user(userdata, &gpio_reg_results.value,
++ sizeof(gpio_reg_results.value)))
++ {
++ ret = -EFAULT;
++ }
++ }
++ up(&ar->arSem);
++ break;
++ }
++ case AR6000_XIOCTL_GPIO_REGISTER_SET:
++ {
++ struct ar6000_gpio_register_cmd_s gpio_register_cmd;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++
++ if (copy_from_user(&gpio_register_cmd, userdata,
++ sizeof(gpio_register_cmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ ret = ar6000_gpio_register_set(dev,
++ gpio_register_cmd.gpioreg_id,
++ gpio_register_cmd.value);
++ if (ret != A_OK) {
++ ret = EIO;
++ }
++
++ /* Wait for acknowledgement from Target */
++ wait_event_interruptible(arEvent, gpio_ack_received);
++ if (signal_pending(current)) {
++ ret = -EINTR;
++ }
++ }
++ up(&ar->arSem);
++ break;
++ }
++ case AR6000_XIOCTL_GPIO_REGISTER_GET:
++ {
++ struct ar6000_gpio_register_cmd_s gpio_register_cmd;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++
++ if (copy_from_user(&gpio_register_cmd, userdata,
++ sizeof(gpio_register_cmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ ret = ar6000_gpio_register_get(dev, gpio_register_cmd.gpioreg_id);
++ if (ret != A_OK) {
++ up(&ar->arSem);
++ return -EIO;
++ }
++
++ /* Wait for Target to respond. */
++ wait_event_interruptible(arEvent, gpio_data_available);
++ if (signal_pending(current)) {
++ ret = -EINTR;
++ } else {
++ A_ASSERT(gpio_register_cmd.gpioreg_id == gpio_reg_results.gpioreg_id);
++ if (copy_to_user(userdata, &gpio_reg_results,
++ sizeof(gpio_reg_results)))
++ {
++ ret = -EFAULT;
++ }
++ }
++ }
++ up(&ar->arSem);
++ break;
++ }
++ case AR6000_XIOCTL_GPIO_INTR_ACK:
++ {
++ struct ar6000_gpio_intr_ack_cmd_s gpio_intr_ack_cmd;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++
++ if (copy_from_user(&gpio_intr_ack_cmd, userdata,
++ sizeof(gpio_intr_ack_cmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ ret = ar6000_gpio_intr_ack(dev, gpio_intr_ack_cmd.ack_mask);
++ if (ret != A_OK) {
++ ret = EIO;
++ }
++ }
++ up(&ar->arSem);
++ break;
++ }
++ case AR6000_XIOCTL_GPIO_INTR_WAIT:
++ {
++ /* Wait for Target to report an interrupt. */
++ dev_hold(dev);
++ rtnl_unlock();
++ wait_event_interruptible(arEvent, gpio_intr_available);
++ rtnl_lock();
++ __dev_put(dev);
++
++ if (signal_pending(current)) {
++ ret = -EINTR;
++ } else {
++ if (copy_to_user(userdata, &gpio_intr_results,
++ sizeof(gpio_intr_results)))
++ {
++ ret = -EFAULT;
++ }
++ }
++ break;
++ }
++#endif /* CONFIG_HOST_GPIO_SUPPORT */
++
++ case AR6000_XIOCTL_DBGLOG_CFG_MODULE:
++ {
++ struct ar6000_dbglog_module_config_s config;
++
++ if (copy_from_user(&config, userdata, sizeof(config))) {
++ return -EFAULT;
++ }
++
++ /* Send the challenge on the control channel */
++ if (wmi_config_debug_module_cmd(ar->arWmi, config.mmask,
++ config.tsr, config.rep,
++ config.size, config.valid) != A_OK)
++ {
++ return -EIO;
++ }
++ break;
++ }
++
++ case AR6000_XIOCTL_DBGLOG_GET_DEBUG_LOGS:
++ {
++ /* Send the challenge on the control channel */
++ if (ar6000_dbglog_get_debug_logs(ar) != A_OK)
++ {
++ return -EIO;
++ }
++ break;
++ }
++
++ case AR6000_XIOCTL_SET_ADHOC_BSSID:
++ {
++ WMI_SET_ADHOC_BSSID_CMD adhocBssid;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&adhocBssid, userdata,
++ sizeof(adhocBssid)))
++ {
++ ret = -EFAULT;
++ } else if (A_MEMCMP(adhocBssid.bssid, bcast_mac,
++ AR6000_ETH_ADDR_LEN) == 0)
++ {
++ ret = -EFAULT;
++ } else {
++
++ A_MEMCPY(ar->arReqBssid, adhocBssid.bssid, sizeof(ar->arReqBssid));
++ }
++ break;
++ }
++
++ case AR6000_XIOCTL_SET_OPT_MODE:
++ {
++ WMI_SET_OPT_MODE_CMD optModeCmd;
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&optModeCmd, userdata,
++ sizeof(optModeCmd)))
++ {
++ ret = -EFAULT;
++ } else if (ar->arConnected && optModeCmd.optMode == SPECIAL_ON) {
++ ret = -EFAULT;
++
++ } else if (wmi_set_opt_mode_cmd(ar->arWmi, optModeCmd.optMode)
++ != A_OK)
++ {
++ ret = -EIO;
++ }
++ break;
++ }
++
++ case AR6000_XIOCTL_OPT_SEND_FRAME:
++ {
++ WMI_OPT_TX_FRAME_CMD optTxFrmCmd;
++ A_UINT8 data[MAX_OPT_DATA_LEN];
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&optTxFrmCmd, userdata,
++ sizeof(optTxFrmCmd)))
++ {
++ ret = -EFAULT;
++ } else if (copy_from_user(data,
++ userdata+sizeof(WMI_OPT_TX_FRAME_CMD)-1,
++ optTxFrmCmd.optIEDataLen))
++ {
++ ret = -EFAULT;
++ } else {
++ ret = wmi_opt_tx_frame_cmd(ar->arWmi,
++ optTxFrmCmd.frmType,
++ optTxFrmCmd.dstAddr,
++ optTxFrmCmd.bssid,
++ optTxFrmCmd.optIEDataLen,
++ data);
++ }
++
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SETRETRYLIMITS:
++ {
++ WMI_SET_RETRY_LIMITS_CMD setRetryParams;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&setRetryParams, userdata,
++ sizeof(setRetryParams)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_set_retry_limits_cmd(ar->arWmi, setRetryParams.frameType,
++ setRetryParams.trafficClass,
++ setRetryParams.maxRetries,
++ setRetryParams.enableNotify) != A_OK)
++ {
++ ret = -EIO;
++ }
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ ar->arMaxRetries = setRetryParams.maxRetries;
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ }
++ break;
++ }
++
++ case AR6000_XIOCTL_SET_ADHOC_BEACON_INTVAL:
++ {
++ WMI_BEACON_INT_CMD bIntvlCmd;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&bIntvlCmd, userdata,
++ sizeof(bIntvlCmd)))
++ {
++ ret = -EFAULT;
++ } else if (wmi_set_adhoc_bconIntvl_cmd(ar->arWmi, bIntvlCmd.beaconInterval)
++ != A_OK)
++ {
++ ret = -EIO;
++ }
++ break;
++ }
++ case IEEE80211_IOCTL_SETAUTHALG:
++ {
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ struct ieee80211req_authalg req;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&req, userdata,
++ sizeof(struct ieee80211req_authalg)))
++ {
++ ret = -EFAULT;
++ } else if (req.auth_alg == AUTH_ALG_OPEN_SYSTEM) {
++ ar->arDot11AuthMode = OPEN_AUTH;
++ ar->arPairwiseCrypto = NONE_CRYPT;
++ ar->arGroupCrypto = NONE_CRYPT;
++ } else if (req.auth_alg == AUTH_ALG_LEAP) {
++ ar->arDot11AuthMode = LEAP_AUTH;
++ } else {
++ ret = -EIO;
++ }
++ break;
++ }
++
++ case AR6000_XIOCTL_SET_VOICE_PKT_SIZE:
++ ret = ar6000_xioctl_set_voice_pkt_size(dev, userdata);
++ break;
++
++ case AR6000_XIOCTL_SET_MAX_SP:
++ ret = ar6000_xioctl_set_max_sp_len(dev, userdata);
++ break;
++
++ case AR6000_XIOCTL_WMI_GET_ROAM_TBL:
++ ret = ar6000_ioctl_get_roam_tbl(dev, rq);
++ break;
++ case AR6000_XIOCTL_WMI_SET_ROAM_CTRL:
++ ret = ar6000_ioctl_set_roam_ctrl(dev, userdata);
++ break;
++ case AR6000_XIOCTRL_WMI_SET_POWERSAVE_TIMERS:
++ ret = ar6000_ioctl_set_powersave_timers(dev, userdata);
++ break;
++ case AR6000_XIOCTRL_WMI_GET_POWER_MODE:
++ ret = ar6000_ioctl_get_power_mode(dev, rq);
++ break;
++ case AR6000_XIOCTRL_WMI_SET_WLAN_STATE:
++ get_user(ar->arWlanState, (unsigned int *)userdata);
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ break;
++ }
++
++ if (ar->arWlanState == WLAN_ENABLED) {
++ /* Enable foreground scanning */
++ if (wmi_scanparams_cmd(ar->arWmi, scParams.fg_start_period,
++ scParams.fg_end_period,
++ scParams.bg_period,
++ scParams.minact_chdwell_time,
++ scParams.maxact_chdwell_time,
++ scParams.pas_chdwell_time,
++ scParams.shortScanRatio,
++ scParams.scanCtrlFlags,
++ scParams.max_dfsch_act_time) != A_OK)
++ {
++ ret = -EIO;
++ }
++ if (ar->arSsidLen) {
++ ar->arConnectPending = TRUE;
++ if (wmi_connect_cmd(ar->arWmi, ar->arNetworkType,
++ ar->arDot11AuthMode, ar->arAuthMode,
++ ar->arPairwiseCrypto,
++ ar->arPairwiseCryptoLen,
++ ar->arGroupCrypto, ar->arGroupCryptoLen,
++ ar->arSsidLen, ar->arSsid,
++ ar->arReqBssid, ar->arChannelHint,
++ ar->arConnectCtrlFlags) != A_OK)
++ {
++ ret = -EIO;
++ ar->arConnectPending = FALSE;
++ }
++ }
++ } else {
++ /* Disconnect from the AP and disable foreground scanning */
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ if (ar->arConnected == TRUE || ar->arConnectPending == TRUE) {
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ wmi_disconnect_cmd(ar->arWmi);
++ } else {
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ }
++
++ if (wmi_scanparams_cmd(ar->arWmi, 0xFFFF, 0, 0, 0, 0, 0, 0, 0xFF, 0) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ case AR6000_XIOCTL_WMI_GET_ROAM_DATA:
++ ret = ar6000_ioctl_get_roam_data(dev, rq);
++ break;
++ case AR6000_XIOCTL_WMI_SET_BT_STATUS:
++ ret = ar6000_xioctl_set_bt_status_cmd(dev, userdata);
++ break;
++ case AR6000_XIOCTL_WMI_SET_BT_PARAMS:
++ ret = ar6000_xioctl_set_bt_params_cmd(dev, userdata);
++ break;
++ case AR6000_XIOCTL_WMI_STARTSCAN:
++ {
++ WMI_START_SCAN_CMD setStartScanCmd;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&setStartScanCmd, userdata,
++ sizeof(setStartScanCmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_startscan_cmd(ar->arWmi, setStartScanCmd.scanType,
++ setStartScanCmd.forceFgScan,
++ setStartScanCmd.isLegacy,
++ setStartScanCmd.homeDwellTime,
++ setStartScanCmd.forceScanInterval) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SETFIXRATES:
++ {
++ WMI_FIX_RATES_CMD setFixRatesCmd;
++ A_STATUS returnStatus;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&setFixRatesCmd, userdata,
++ sizeof(setFixRatesCmd)))
++ {
++ ret = -EFAULT;
++ } else {
++ returnStatus = wmi_set_fixrates_cmd(ar->arWmi, setFixRatesCmd.fixRateMask);
++ if (returnStatus == A_EINVAL)
++ {
++ ret = -EINVAL;
++ }
++ else if(returnStatus != A_OK) {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++
++ case AR6000_XIOCTL_WMI_GETFIXRATES:
++ {
++ WMI_FIX_RATES_CMD getFixRatesCmd;
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++ /* Used copy_from_user/copy_to_user to access user space data */
++ if (copy_from_user(&getFixRatesCmd, userdata, sizeof(getFixRatesCmd))) {
++ ret = -EFAULT;
++ } else {
++ ar->arRateMask = 0xFFFF;
++
++ if (wmi_get_ratemask_cmd(ar->arWmi) != A_OK) {
++ up(&ar->arSem);
++ return -EIO;
++ }
++
++ wait_event_interruptible_timeout(arEvent, ar->arRateMask != 0xFFFF, wmitimeout * HZ);
++
++ if (signal_pending(current)) {
++ ret = -EINTR;
++ }
++
++ if (!ret) {
++ getFixRatesCmd.fixRateMask = ar->arRateMask;
++ }
++
++ if(copy_to_user(userdata, &getFixRatesCmd, sizeof(getFixRatesCmd))) {
++ ret = -EFAULT;
++ }
++
++ up(&ar->arSem);
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_AUTHMODE:
++ {
++ WMI_SET_AUTH_MODE_CMD setAuthMode;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&setAuthMode, userdata,
++ sizeof(setAuthMode)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_set_authmode_cmd(ar->arWmi, setAuthMode.mode) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_REASSOCMODE:
++ {
++ WMI_SET_REASSOC_MODE_CMD setReassocMode;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&setReassocMode, userdata,
++ sizeof(setReassocMode)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_set_reassocmode_cmd(ar->arWmi, setReassocMode.mode) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_XIOCTL_DIAG_READ:
++ {
++ A_UINT32 addr, data;
++ get_user(addr, (unsigned int *)userdata);
++ if (ar6000_ReadRegDiag(ar->arHifDevice, &addr, &data) != A_OK) {
++ ret = -EIO;
++ }
++ put_user(data, (unsigned int *)userdata + 1);
++ break;
++ }
++ case AR6000_XIOCTL_DIAG_WRITE:
++ {
++ A_UINT32 addr, data;
++ get_user(addr, (unsigned int *)userdata);
++ get_user(data, (unsigned int *)userdata + 1);
++ if (ar6000_WriteRegDiag(ar->arHifDevice, &addr, &data) != A_OK) {
++ ret = -EIO;
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_KEEPALIVE:
++ {
++ WMI_SET_KEEPALIVE_CMD setKeepAlive;
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ } else if (copy_from_user(&setKeepAlive, userdata,
++ sizeof(setKeepAlive))){
++ ret = -EFAULT;
++ } else {
++ if (wmi_set_keepalive_cmd(ar->arWmi, setKeepAlive.keepaliveInterval) != A_OK) {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_GET_KEEPALIVE:
++ {
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_GET_KEEPALIVE_CMD getKeepAlive;
++ int ret = 0;
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++ if (copy_from_user(&getKeepAlive, userdata,sizeof(getKeepAlive))) {
++ ret = -EFAULT;
++ } else {
++ getKeepAlive.keepaliveInterval = wmi_get_keepalive_cmd(ar->arWmi);
++ ar->arKeepaliveConfigured = 0xFF;
++ if (wmi_get_keepalive_configured(ar->arWmi) != A_OK){
++ up(&ar->arSem);
++ return -EIO;
++ }
++ wait_event_interruptible_timeout(arEvent, ar->arKeepaliveConfigured != 0xFF, wmitimeout * HZ);
++ if (signal_pending(current)) {
++ ret = -EINTR;
++ }
++
++ if (!ret) {
++ getKeepAlive.configured = ar->arKeepaliveConfigured;
++ }
++ if (copy_to_user(userdata, &getKeepAlive, sizeof(getKeepAlive))) {
++ ret = -EFAULT;
++ }
++ up(&ar->arSem);
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_APPIE:
++ {
++ WMI_SET_APPIE_CMD appIEcmd;
++ A_UINT8 appIeInfo[IEEE80211_APPIE_FRAME_MAX_LEN];
++ A_UINT32 fType,ieLen;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ get_user(fType, (A_UINT32 *)userdata);
++ appIEcmd.mgmtFrmType = fType;
++ if (appIEcmd.mgmtFrmType >= IEEE80211_APPIE_NUM_OF_FRAME) {
++ ret = -EIO;
++ } else {
++ get_user(ieLen, (A_UINT32 *)(userdata + 4));
++ appIEcmd.ieLen = ieLen;
++ if (appIEcmd.ieLen > IEEE80211_APPIE_FRAME_MAX_LEN) {
++ ret = -EIO;
++ break;
++ }
++ if (copy_from_user(appIeInfo, userdata + 8, appIEcmd.ieLen)) {
++ ret = -EFAULT;
++ } else {
++ if (wmi_set_appie_cmd(ar->arWmi, appIEcmd.mgmtFrmType,
++ appIEcmd.ieLen, appIeInfo) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_MGMT_FRM_RX_FILTER:
++ {
++ WMI_BSS_FILTER_CMD cmd;
++ A_UINT32 filterType;
++
++ if (copy_from_user(&filterType, userdata, sizeof(A_UINT32)))
++ {
++ return -EFAULT;
++ }
++ if (filterType & (IEEE80211_FILTER_TYPE_BEACON |
++ IEEE80211_FILTER_TYPE_PROBE_RESP))
++ {
++ cmd.bssFilter = ALL_BSS_FILTER;
++ } else {
++ cmd.bssFilter = NONE_BSS_FILTER;
++ }
++ if (wmi_bssfilter_cmd(ar->arWmi, cmd.bssFilter, 0) != A_OK) {
++ ret = -EIO;
++ }
++
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ ar->arMgmtFilter = filterType;
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_WSC_STATUS:
++ {
++ A_UINT32 wsc_status;
++
++ if (copy_from_user(&wsc_status, userdata, sizeof(A_UINT32)))
++ {
++ return -EFAULT;
++ }
++ if (wmi_set_wsc_status_cmd(ar->arWmi, wsc_status) != A_OK) {
++ ret = -EIO;
++ }
++ break;
++ }
++ case AR6000_XIOCTL_BMI_ROMPATCH_INSTALL:
++ {
++ A_UINT32 ROM_addr;
++ A_UINT32 RAM_addr;
++ A_UINT32 nbytes;
++ A_UINT32 do_activate;
++ A_UINT32 rompatch_id;
++
++ get_user(ROM_addr, (A_UINT32 *)userdata);
++ get_user(RAM_addr, (A_UINT32 *)userdata + 1);
++ get_user(nbytes, (A_UINT32 *)userdata + 2);
++ get_user(do_activate, (A_UINT32 *)userdata + 3);
++ AR_DEBUG_PRINTF("Install rompatch from ROM: 0x%x to RAM: 0x%x length: %d\n",
++ ROM_addr, RAM_addr, nbytes);
++ ret = BMIrompatchInstall(hifDevice, ROM_addr, RAM_addr,
++ nbytes, do_activate, &rompatch_id);
++ if (ret == A_OK) {
++ put_user(rompatch_id, (unsigned int *)rq->ifr_data); /* return value */
++ }
++ break;
++ }
++
++ case AR6000_XIOCTL_BMI_ROMPATCH_UNINSTALL:
++ {
++ A_UINT32 rompatch_id;
++
++ get_user(rompatch_id, (A_UINT32 *)userdata);
++ AR_DEBUG_PRINTF("UNinstall rompatch_id %d\n", rompatch_id);
++ ret = BMIrompatchUninstall(hifDevice, rompatch_id);
++ break;
++ }
++
++ case AR6000_XIOCTL_BMI_ROMPATCH_ACTIVATE:
++ case AR6000_XIOCTL_BMI_ROMPATCH_DEACTIVATE:
++ {
++ A_UINT32 rompatch_count;
++
++ get_user(rompatch_count, (A_UINT32 *)userdata);
++ AR_DEBUG_PRINTF("Change rompatch activation count=%d\n", rompatch_count);
++ length = sizeof(A_UINT32) * rompatch_count;
++ if ((buffer = (unsigned char *)A_MALLOC(length)) != NULL) {
++ A_MEMZERO(buffer, length);
++ if (copy_from_user(buffer, &userdata[sizeof(rompatch_count)], length))
++ {
++ ret = -EFAULT;
++ } else {
++ if (cmd == AR6000_XIOCTL_BMI_ROMPATCH_ACTIVATE) {
++ ret = BMIrompatchActivate(hifDevice, rompatch_count, (A_UINT32 *)buffer);
++ } else {
++ ret = BMIrompatchDeactivate(hifDevice, rompatch_count, (A_UINT32 *)buffer);
++ }
++ }
++ A_FREE(buffer);
++ } else {
++ ret = -ENOMEM;
++ }
++
++ break;
++ }
++
++ case AR6000_XIOCTL_WMI_SET_HOST_SLEEP_MODE:
++ {
++ WMI_SET_HOST_SLEEP_MODE_CMD setHostSleepMode;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&setHostSleepMode, userdata,
++ sizeof(setHostSleepMode)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_set_host_sleep_mode_cmd(ar->arWmi,
++ &setHostSleepMode) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_SET_WOW_MODE:
++ {
++ WMI_SET_WOW_MODE_CMD setWowMode;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&setWowMode, userdata,
++ sizeof(setWowMode)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_set_wow_mode_cmd(ar->arWmi,
++ &setWowMode) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_GET_WOW_LIST:
++ {
++ WMI_GET_WOW_LIST_CMD getWowList;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&getWowList, userdata,
++ sizeof(getWowList)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_get_wow_list_cmd(ar->arWmi,
++ &getWowList) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_XIOCTL_WMI_ADD_WOW_PATTERN:
++ {
++#define WOW_PATTERN_SIZE 64
++#define WOW_MASK_SIZE 64
++
++ WMI_ADD_WOW_PATTERN_CMD cmd;
++ A_UINT8 mask_data[WOW_PATTERN_SIZE]={0};
++ A_UINT8 pattern_data[WOW_PATTERN_SIZE]={0};
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else {
++
++ if(copy_from_user(&cmd, userdata,
++ sizeof(WMI_ADD_WOW_PATTERN_CMD)))
++ return -EFAULT;
++ if (copy_from_user(pattern_data,
++ userdata + 3,
++ cmd.filter_size)){
++ ret = -EFAULT;
++ break;
++ }
++ if (copy_from_user(mask_data,
++ (userdata + 3 + cmd.filter_size),
++ cmd.filter_size)){
++ ret = -EFAULT;
++ break;
++ } else {
++ if (wmi_add_wow_pattern_cmd(ar->arWmi,
++ &cmd, pattern_data, mask_data, cmd.filter_size) != A_OK){
++ ret = -EIO;
++ }
++ }
++ }
++#undef WOW_PATTERN_SIZE
++#undef WOW_MASK_SIZE
++ break;
++ }
++ case AR6000_XIOCTL_WMI_DEL_WOW_PATTERN:
++ {
++ WMI_DEL_WOW_PATTERN_CMD delWowPattern;
++
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&delWowPattern, userdata,
++ sizeof(delWowPattern)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_del_wow_pattern_cmd(ar->arWmi,
++ &delWowPattern) != A_OK)
++ {
++ ret = -EIO;
++ }
++ }
++ break;
++ }
++ case AR6000_XIOCTL_DUMP_HTC_CREDIT_STATE:
++ if (ar->arHtcTarget != NULL) {
++ HTCDumpCreditStates(ar->arHtcTarget);
++ }
++ break;
++ case AR6000_XIOCTL_TRAFFIC_ACTIVITY_CHANGE:
++ if (ar->arHtcTarget != NULL) {
++ struct ar6000_traffic_activity_change data;
++
++ if (copy_from_user(&data, userdata, sizeof(data)))
++ {
++ return -EFAULT;
++ }
++ /* note, this is used for testing (mbox ping testing), indicate activity
++ * change using the stream ID as the traffic class */
++ ar6000_indicate_tx_activity(ar,
++ (A_UINT8)data.StreamID,
++ data.Active ? TRUE : FALSE);
++ }
++ break;
++ case AR6000_XIOCTL_WMI_SET_CONNECT_CTRL_FLAGS:
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&connectCtrlFlags, userdata,
++ sizeof(connectCtrlFlags)))
++ {
++ ret = -EFAULT;
++ } else {
++ ar->arConnectCtrlFlags = connectCtrlFlags;
++ }
++ break;
++ case AR6000_XIOCTL_WMI_SET_AKMP_PARAMS:
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else if (copy_from_user(&akmpParams, userdata,
++ sizeof(WMI_SET_AKMP_PARAMS_CMD)))
++ {
++ ret = -EFAULT;
++ } else {
++ if (wmi_set_akmp_params_cmd(ar->arWmi, &akmpParams) != A_OK) {
++ ret = -EIO;
++ }
++ }
++ break;
++ case AR6000_XIOCTL_WMI_SET_PMKID_LIST:
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else {
++ if (copy_from_user(&pmkidInfo.numPMKID, userdata,
++ sizeof(pmkidInfo.numPMKID)))
++ {
++ ret = -EFAULT;
++ break;
++ }
++ if (copy_from_user(&pmkidInfo.pmkidList,
++ userdata + sizeof(pmkidInfo.numPMKID),
++ pmkidInfo.numPMKID * sizeof(WMI_PMKID)))
++ {
++ ret = -EFAULT;
++ break;
++ }
++ if (wmi_set_pmkid_list_cmd(ar->arWmi, &pmkidInfo) != A_OK) {
++ ret = -EIO;
++ }
++ }
++ break;
++ case AR6000_XIOCTL_WMI_GET_PMKID_LIST:
++ if (ar->arWmiReady == FALSE) {
++ ret = -EIO;
++ } else {
++ if (wmi_get_pmkid_list_cmd(ar->arWmi) != A_OK) {
++ ret = -EIO;
++ }
++ }
++ break;
++ default:
++ ret = -EOPNOTSUPP;
++ }
++ return ret;
++}
++
+diff --git a/drivers/ar6000/ar6000/netbuf.c b/drivers/ar6000/ar6000/netbuf.c
+new file mode 100644
+index 0000000..97b273b
+--- /dev/null
++++ b/drivers/ar6000/ar6000/netbuf.c
+@@ -0,0 +1,225 @@
++
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++#include <linux/kernel.h>
++#include <linux/skbuff.h>
++#include <a_config.h>
++#include "athdefs.h"
++#include "a_types.h"
++#include "a_osapi.h"
++#include "htc_packet.h"
++
++#define AR6000_DATA_OFFSET 64
++
++void a_netbuf_enqueue(A_NETBUF_QUEUE_T *q, void *pkt)
++{
++ skb_queue_tail((struct sk_buff_head *) q, (struct sk_buff *) pkt);
++}
++
++void a_netbuf_prequeue(A_NETBUF_QUEUE_T *q, void *pkt)
++{
++ skb_queue_head((struct sk_buff_head *) q, (struct sk_buff *) pkt);
++}
++
++void *a_netbuf_dequeue(A_NETBUF_QUEUE_T *q)
++{
++ return((void *) skb_dequeue((struct sk_buff_head *) q));
++}
++
++int a_netbuf_queue_size(A_NETBUF_QUEUE_T *q)
++{
++ return(skb_queue_len((struct sk_buff_head *) q));
++}
++
++int a_netbuf_queue_empty(A_NETBUF_QUEUE_T *q)
++{
++ return(skb_queue_empty((struct sk_buff_head *) q));
++}
++
++void a_netbuf_queue_init(A_NETBUF_QUEUE_T *q)
++{
++ skb_queue_head_init((struct sk_buff_head *) q);
++}
++
++void *
++a_netbuf_alloc(int size)
++{
++ struct sk_buff *skb;
++ skb = dev_alloc_skb(AR6000_DATA_OFFSET + sizeof(HTC_PACKET) + size);
++ skb_reserve(skb, AR6000_DATA_OFFSET + sizeof(HTC_PACKET));
++ return ((void *)skb);
++}
++
++/*
++ * Allocate an SKB w.o. any encapsulation requirement.
++ */
++void *
++a_netbuf_alloc_raw(int size)
++{
++ struct sk_buff *skb;
++
++ skb = dev_alloc_skb(size);
++
++ return ((void *)skb);
++}
++
++void
++a_netbuf_free(void *bufPtr)
++{
++ struct sk_buff *skb = (struct sk_buff *)bufPtr;
++
++ dev_kfree_skb(skb);
++}
++
++A_UINT32
++a_netbuf_to_len(void *bufPtr)
++{
++ return (((struct sk_buff *)bufPtr)->len);
++}
++
++void *
++a_netbuf_to_data(void *bufPtr)
++{
++ return (((struct sk_buff *)bufPtr)->data);
++}
++
++/*
++ * Add len # of bytes to the beginning of the network buffer
++ * pointed to by bufPtr
++ */
++A_STATUS
++a_netbuf_push(void *bufPtr, A_INT32 len)
++{
++ skb_push((struct sk_buff *)bufPtr, len);
++
++ return A_OK;
++}
++
++/*
++ * Add len # of bytes to the beginning of the network buffer
++ * pointed to by bufPtr and also fill with data
++ */
++A_STATUS
++a_netbuf_push_data(void *bufPtr, char *srcPtr, A_INT32 len)
++{
++ skb_push((struct sk_buff *) bufPtr, len);
++ A_MEMCPY(((struct sk_buff *)bufPtr)->data, srcPtr, len);
++
++ return A_OK;
++}
++
++/*
++ * Add len # of bytes to the end of the network buffer
++ * pointed to by bufPtr
++ */
++A_STATUS
++a_netbuf_put(void *bufPtr, A_INT32 len)
++{
++ skb_put((struct sk_buff *)bufPtr, len);
++
++ return A_OK;
++}
++
++/*
++ * Add len # of bytes to the end of the network buffer
++ * pointed to by bufPtr and also fill with data
++ */
++A_STATUS
++a_netbuf_put_data(void *bufPtr, char *srcPtr, A_INT32 len)
++{
++ char *start = ((struct sk_buff *)bufPtr)->data +
++ ((struct sk_buff *)bufPtr)->len;
++ skb_put((struct sk_buff *)bufPtr, len);
++ A_MEMCPY(start, srcPtr, len);
++
++ return A_OK;
++}
++
++
++/*
++ * Trim the network buffer pointed to by bufPtr to len # of bytes
++ */
++A_STATUS
++a_netbuf_setlen(void *bufPtr, A_INT32 len)
++{
++ skb_trim((struct sk_buff *)bufPtr, len);
++
++ return A_OK;
++}
++
++/*
++ * Chop of len # of bytes from the end of the buffer.
++ */
++A_STATUS
++a_netbuf_trim(void *bufPtr, A_INT32 len)
++{
++ skb_trim((struct sk_buff *)bufPtr, ((struct sk_buff *)bufPtr)->len - len);
++
++ return A_OK;
++}
++
++/*
++ * Chop of len # of bytes from the end of the buffer and return the data.
++ */
++A_STATUS
++a_netbuf_trim_data(void *bufPtr, char *dstPtr, A_INT32 len)
++{
++ char *start = ((struct sk_buff *)bufPtr)->data +
++ (((struct sk_buff *)bufPtr)->len - len);
++
++ A_MEMCPY(dstPtr, start, len);
++ skb_trim((struct sk_buff *)bufPtr, ((struct sk_buff *)bufPtr)->len - len);
++
++ return A_OK;
++}
++
++
++/*
++ * Returns the number of bytes available to a a_netbuf_push()
++ */
++A_INT32
++a_netbuf_headroom(void *bufPtr)
++{
++ return (skb_headroom((struct sk_buff *)bufPtr));
++}
++
++/*
++ * Removes specified number of bytes from the beginning of the buffer
++ */
++A_STATUS
++a_netbuf_pull(void *bufPtr, A_INT32 len)
++{
++ skb_pull((struct sk_buff *)bufPtr, len);
++
++ return A_OK;
++}
++
++/*
++ * Removes specified number of bytes from the beginning of the buffer
++ * and return the data
++ */
++A_STATUS
++a_netbuf_pull_data(void *bufPtr, char *dstPtr, A_INT32 len)
++{
++ A_MEMCPY(dstPtr, ((struct sk_buff *)bufPtr)->data, len);
++ skb_pull((struct sk_buff *)bufPtr, len);
++
++ return A_OK;
++}
++
+diff --git a/drivers/ar6000/ar6000/osapi_linux.h b/drivers/ar6000/ar6000/osapi_linux.h
+new file mode 100644
+index 0000000..5b64212
+--- /dev/null
++++ b/drivers/ar6000/ar6000/osapi_linux.h
+@@ -0,0 +1,319 @@
++/*
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/os/linux/include/osapi_linux.h#1 $
++ *
++ * This file contains the definitions of the basic atheros data types.
++ * It is used to map the data types in atheros files to a platform specific
++ * type.
++ *
++ * Copyright 2003-2005 Atheros Communications, Inc., All Rights Reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef _OSAPI_LINUX_H_
++#define _OSAPI_LINUX_H_
++
++#ifdef __KERNEL__
++
++#include <linux/version.h>
++#include <linux/types.h>
++#include <linux/kernel.h>
++#include <linux/string.h>
++#include <linux/skbuff.h>
++#include <linux/netdevice.h>
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
++#include <linux/jiffies.h>
++#endif
++#include <linux/timer.h>
++#include <linux/delay.h>
++#include <linux/wait.h>
++#ifdef KERNEL_2_4
++#include <asm/arch/irq.h>
++#include <asm/irq.h>
++#endif
++
++#ifdef __GNUC__
++#define __ATTRIB_PACK __attribute__ ((packed))
++#define __ATTRIB_PRINTF __attribute__ ((format (printf, 1, 2)))
++#define __ATTRIB_NORETURN __attribute__ ((noreturn))
++#ifndef INLINE
++#define INLINE __inline__
++#endif
++#else /* Not GCC */
++#define __ATTRIB_PACK
++#define __ATTRIB_PRINTF
++#define __ATTRIB_NORETURN
++#ifndef INLINE
++#define INLINE __inline
++#endif
++#endif /* End __GNUC__ */
++
++#define PREPACK
++#define POSTPACK __ATTRIB_PACK
++
++/*
++ * Endianes macros
++ */
++#define A_BE2CPU8(x) ntohb(x)
++#define A_BE2CPU16(x) ntohs(x)
++#define A_BE2CPU32(x) ntohl(x)
++
++#define A_LE2CPU8(x) (x)
++#define A_LE2CPU16(x) (x)
++#define A_LE2CPU32(x) (x)
++
++#define A_CPU2BE8(x) htonb(x)
++#define A_CPU2BE16(x) htons(x)
++#define A_CPU2BE32(x) htonl(x)
++
++#define A_MEMCPY(dst, src, len) memcpy((A_UINT8 *)(dst), (src), (len))
++#define A_MEMZERO(addr, len) memset(addr, 0, len)
++#define A_MEMCMP(addr1, addr2, len) memcmp((addr1), (addr2), (len))
++#define A_MALLOC(size) kmalloc((size), GFP_KERNEL)
++#define A_MALLOC_NOWAIT(size) kmalloc((size), GFP_ATOMIC)
++#define A_FREE(addr) kfree(addr)
++#define A_PRINTF(args...) printk(args)
++
++/* Mutual Exclusion */
++typedef spinlock_t A_MUTEX_T;
++#define A_MUTEX_INIT(mutex) spin_lock_init(mutex)
++#define A_MUTEX_LOCK(mutex) spin_lock_bh(mutex)
++#define A_MUTEX_UNLOCK(mutex) spin_unlock_bh(mutex)
++#define A_IS_MUTEX_VALID(mutex) TRUE /* okay to return true, since A_MUTEX_DELETE does nothing */
++#define A_MUTEX_DELETE(mutex) /* spin locks are not kernel resources so nothing to free.. */
++
++/* Get current time in ms adding a constant offset (in ms) */
++#define A_GET_MS(offset) \
++ (jiffies + ((offset) / 1000) * HZ)
++
++/*
++ * Timer Functions
++ */
++#define A_MDELAY(msecs) mdelay(msecs)
++typedef struct timer_list A_TIMER;
++
++#define A_INIT_TIMER(pTimer, pFunction, pArg) do { \
++ init_timer(pTimer); \
++ (pTimer)->function = (pFunction); \
++ (pTimer)->data = (unsigned long)(pArg); \
++} while (0)
++
++/*
++ * Start a Timer that elapses after 'periodMSec' milli-seconds
++ * Support is provided for a one-shot timer. The 'repeatFlag' is
++ * ignored.
++ */
++#define A_TIMEOUT_MS(pTimer, periodMSec, repeatFlag) do { \
++ if (repeatFlag) { \
++ printk("\n" __FILE__ ":%d: Timer Repeat requested\n",__LINE__); \
++ panic("Timer Repeat"); \
++ } \
++ mod_timer((pTimer), jiffies + HZ * (periodMSec) / 1000); \
++} while (0)
++
++/*
++ * Cancel the Timer.
++ */
++#define A_UNTIMEOUT(pTimer) do { \
++ del_timer((pTimer)); \
++} while (0)
++
++#define A_DELETE_TIMER(pTimer) do { \
++} while (0)
++
++/*
++ * Wait Queue related functions
++ */
++typedef wait_queue_head_t A_WAITQUEUE_HEAD;
++#define A_INIT_WAITQUEUE_HEAD(head) init_waitqueue_head(head)
++#ifndef wait_event_interruptible_timeout
++#define __wait_event_interruptible_timeout(wq, condition, ret) \
++do { \
++ wait_queue_t __wait; \
++ init_waitqueue_entry(&__wait, current); \
++ \
++ add_wait_queue(&wq, &__wait); \
++ for (;;) { \
++ set_current_state(TASK_INTERRUPTIBLE); \
++ if (condition) \
++ break; \
++ if (!signal_pending(current)) { \
++ ret = schedule_timeout(ret); \
++ if (!ret) \
++ break; \
++ continue; \
++ } \
++ ret = -ERESTARTSYS; \
++ break; \
++ } \
++ current->state = TASK_RUNNING; \
++ remove_wait_queue(&wq, &__wait); \
++} while (0)
++
++#define wait_event_interruptible_timeout(wq, condition, timeout) \
++({ \
++ long __ret = timeout; \
++ if (!(condition)) \
++ __wait_event_interruptible_timeout(wq, condition, __ret); \
++ __ret; \
++})
++#endif /* wait_event_interruptible_timeout */
++
++#define A_WAIT_EVENT_INTERRUPTIBLE_TIMEOUT(head, condition, timeout) do { \
++ wait_event_interruptible_timeout(head, condition, timeout); \
++} while (0)
++
++#define A_WAKE_UP(head) wake_up(head)
++
++#ifdef DEBUG
++#define A_ASSERT(expr) \
++ if (!(expr)) { \
++ printk(KERN_ALERT "\n" __FILE__ ":%d: Assertion " #expr " failed!\n",__LINE__); \
++ panic(#expr); \
++ }
++
++#else
++#define A_ASSERT(expr)
++#endif /* DEBUG */
++
++/*
++ * Initialization of the network buffer subsystem
++ */
++#define A_NETBUF_INIT()
++
++/*
++ * Network buffer queue support
++ */
++typedef struct sk_buff_head A_NETBUF_QUEUE_T;
++
++#define A_NETBUF_QUEUE_INIT(q) \
++ a_netbuf_queue_init(q)
++
++#define A_NETBUF_ENQUEUE(q, pkt) \
++ a_netbuf_enqueue((q), (pkt))
++#define A_NETBUF_PREQUEUE(q, pkt) \
++ a_netbuf_prequeue((q), (pkt))
++#define A_NETBUF_DEQUEUE(q) \
++ (a_netbuf_dequeue(q))
++#define A_NETBUF_QUEUE_SIZE(q) \
++ a_netbuf_queue_size(q)
++#define A_NETBUF_QUEUE_EMPTY(q) \
++ a_netbuf_queue_empty(q)
++
++/*
++ * Network buffer support
++ */
++#define A_NETBUF_ALLOC(size) \
++ a_netbuf_alloc(size)
++#define A_NETBUF_ALLOC_RAW(size) \
++ a_netbuf_alloc_raw(size)
++#define A_NETBUF_FREE(bufPtr) \
++ a_netbuf_free(bufPtr)
++#define A_NETBUF_DATA(bufPtr) \
++ a_netbuf_to_data(bufPtr)
++#define A_NETBUF_LEN(bufPtr) \
++ a_netbuf_to_len(bufPtr)
++#define A_NETBUF_PUSH(bufPtr, len) \
++ a_netbuf_push(bufPtr, len)
++#define A_NETBUF_PUT(bufPtr, len) \
++ a_netbuf_put(bufPtr, len)
++#define A_NETBUF_TRIM(bufPtr,len) \
++ a_netbuf_trim(bufPtr, len)
++#define A_NETBUF_PULL(bufPtr, len) \
++ a_netbuf_pull(bufPtr, len)
++#define A_NETBUF_HEADROOM(bufPtr)\
++ a_netbuf_headroom(bufPtr)
++#define A_NETBUF_SETLEN(bufPtr,len) \
++ a_netbuf_setlen(bufPtr, len)
++
++/* Add data to end of a buffer */
++#define A_NETBUF_PUT_DATA(bufPtr, srcPtr, len) \
++ a_netbuf_put_data(bufPtr, srcPtr, len)
++
++/* Add data to start of the buffer */
++#define A_NETBUF_PUSH_DATA(bufPtr, srcPtr, len) \
++ a_netbuf_push_data(bufPtr, srcPtr, len)
++
++/* Remove data at start of the buffer */
++#define A_NETBUF_PULL_DATA(bufPtr, dstPtr, len) \
++ a_netbuf_pull_data(bufPtr, dstPtr, len)
++
++/* Remove data from the end of the buffer */
++#define A_NETBUF_TRIM_DATA(bufPtr, dstPtr, len) \
++ a_netbuf_trim_data(bufPtr, dstPtr, len)
++
++/* View data as "size" contiguous bytes of type "t" */
++#define A_NETBUF_VIEW_DATA(bufPtr, t, size) \
++ (t )( ((struct skbuf *)(bufPtr))->data)
++
++/* return the beginning of the headroom for the buffer */
++#define A_NETBUF_HEAD(bufPtr) \
++ ((((struct sk_buff *)(bufPtr))->head))
++
++/*
++ * OS specific network buffer access routines
++ */
++void *a_netbuf_alloc(int size);
++void *a_netbuf_alloc_raw(int size);
++void a_netbuf_free(void *bufPtr);
++void *a_netbuf_to_data(void *bufPtr);
++A_UINT32 a_netbuf_to_len(void *bufPtr);
++A_STATUS a_netbuf_push(void *bufPtr, A_INT32 len);
++A_STATUS a_netbuf_push_data(void *bufPtr, char *srcPtr, A_INT32 len);
++A_STATUS a_netbuf_put(void *bufPtr, A_INT32 len);
++A_STATUS a_netbuf_put_data(void *bufPtr, char *srcPtr, A_INT32 len);
++A_STATUS a_netbuf_pull(void *bufPtr, A_INT32 len);
++A_STATUS a_netbuf_pull_data(void *bufPtr, char *dstPtr, A_INT32 len);
++A_STATUS a_netbuf_trim(void *bufPtr, A_INT32 len);
++A_STATUS a_netbuf_trim_data(void *bufPtr, char *dstPtr, A_INT32 len);
++A_STATUS a_netbuf_setlen(void *bufPtr, A_INT32 len);
++A_INT32 a_netbuf_headroom(void *bufPtr);
++void a_netbuf_enqueue(A_NETBUF_QUEUE_T *q, void *pkt);
++void a_netbuf_prequeue(A_NETBUF_QUEUE_T *q, void *pkt);
++void *a_netbuf_dequeue(A_NETBUF_QUEUE_T *q);
++int a_netbuf_queue_size(A_NETBUF_QUEUE_T *q);
++int a_netbuf_queue_empty(A_NETBUF_QUEUE_T *q);
++int a_netbuf_queue_empty(A_NETBUF_QUEUE_T *q);
++void a_netbuf_queue_init(A_NETBUF_QUEUE_T *q);
++
++/*
++ * Kernel v.s User space functions
++ */
++A_UINT32 a_copy_to_user(void *to, const void *from, A_UINT32 n);
++A_UINT32 a_copy_from_user(void *to, const void *from, A_UINT32 n);
++
++#else /* __KERNEL__ */
++
++#ifdef __GNUC__
++#define __ATTRIB_PACK __attribute__ ((packed))
++#define __ATTRIB_PRINTF __attribute__ ((format (printf, 1, 2)))
++#define __ATTRIB_NORETURN __attribute__ ((noreturn))
++#ifndef INLINE
++#define INLINE __inline__
++#endif
++#else /* Not GCC */
++#define __ATTRIB_PACK
++#define __ATTRIB_PRINTF
++#define __ATTRIB_NORETURN
++#ifndef INLINE
++#define INLINE __inline
++#endif
++#endif /* End __GNUC__ */
++
++#define PREPACK
++#define POSTPACK __ATTRIB_PACK
++
++#endif /* __KERNEL__ */
++
++#endif /* _OSAPI_LINUX_H_ */
+diff --git a/drivers/ar6000/ar6000/wireless_ext.c b/drivers/ar6000/ar6000/wireless_ext.c
+new file mode 100644
+index 0000000..af78ae0
+--- /dev/null
++++ b/drivers/ar6000/ar6000/wireless_ext.c
+@@ -0,0 +1,1979 @@
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "ar6000_drv.h"
++
++static A_UINT8 bcast_mac[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
++static void ar6000_set_quality(struct iw_quality *iq, A_INT8 rssi);
++extern unsigned int wmitimeout;
++extern A_WAITQUEUE_HEAD arEvent;
++extern wait_queue_head_t ar6000_scan_queue;
++
++/*
++ * Encode a WPA or RSN information element as a custom
++ * element using the hostap format.
++ */
++static u_int
++encode_ie(void *buf, size_t bufsize,
++ const u_int8_t *ie, size_t ielen,
++ const char *leader, size_t leader_len)
++{
++ u_int8_t *p;
++ int i;
++
++ if (bufsize < leader_len)
++ return 0;
++ p = buf;
++ memcpy(p, leader, leader_len);
++ bufsize -= leader_len;
++ p += leader_len;
++ for (i = 0; i < ielen && bufsize > 2; i++)
++ p += sprintf(p, "%02x", ie[i]);
++ return (i == ielen ? p - (u_int8_t *)buf : 0);
++}
++
++void
++ar6000_scan_node(void *arg, bss_t *ni)
++{
++ struct iw_event iwe;
++#if WIRELESS_EXT > 14
++ char buf[64*2 + 30];
++#endif
++ struct ar_giwscan_param *param;
++ A_CHAR *current_ev;
++ A_CHAR *end_buf;
++ struct ieee80211_common_ie *cie;
++ struct iw_request_info info;
++
++ info.cmd = 0;
++ info.flags = 0;
++
++ param = (struct ar_giwscan_param *)arg;
++
++ if (param->current_ev >= param->end_buf) {
++ return;
++ }
++ if ((param->firstPass == TRUE) &&
++ ((ni->ni_cie.ie_wpa == NULL) && (ni->ni_cie.ie_rsn == NULL))) {
++ /*
++ * Only forward wpa bss's in first pass
++ */
++ return;
++ }
++
++ if ((param->firstPass == FALSE) &&
++ ((ni->ni_cie.ie_wpa != NULL) || (ni->ni_cie.ie_rsn != NULL))) {
++ /*
++ * Only forward non-wpa bss's in 2nd pass
++ */
++ return;
++ }
++
++ current_ev = param->current_ev;
++ end_buf = param->end_buf;
++
++ cie = &ni->ni_cie;
++
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = SIOCGIWAP;
++ iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
++ A_MEMCPY(iwe.u.ap_addr.sa_data, ni->ni_macaddr, 6);
++ current_ev = iwe_stream_add_event(&info, current_ev, end_buf, &iwe,
++ IW_EV_ADDR_LEN);
++
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = SIOCGIWESSID;
++ iwe.u.data.flags = 1;
++ iwe.u.data.length = cie->ie_ssid[1];
++ current_ev = iwe_stream_add_point(&info, current_ev, end_buf, &iwe,
++ &cie->ie_ssid[2]);
++
++ if (cie->ie_capInfo & (IEEE80211_CAPINFO_ESS|IEEE80211_CAPINFO_IBSS)) {
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = SIOCGIWMODE;
++ iwe.u.mode = cie->ie_capInfo & IEEE80211_CAPINFO_ESS ?
++ IW_MODE_MASTER : IW_MODE_ADHOC;
++ current_ev = iwe_stream_add_event(&info, current_ev, end_buf, &iwe,
++ IW_EV_UINT_LEN);
++ }
++
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = SIOCGIWFREQ;
++ iwe.u.freq.m = cie->ie_chan * 100000;
++ iwe.u.freq.e = 1;
++ current_ev = iwe_stream_add_event(&info, current_ev, end_buf, &iwe,
++ IW_EV_FREQ_LEN);
++
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = IWEVQUAL;
++ ar6000_set_quality(&iwe.u.qual, ni->ni_snr);
++ current_ev = iwe_stream_add_event(&info, current_ev, end_buf, &iwe,
++ IW_EV_QUAL_LEN);
++
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = SIOCGIWENCODE;
++ if (cie->ie_capInfo & IEEE80211_CAPINFO_PRIVACY) {
++ iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
++ } else {
++ iwe.u.data.flags = IW_ENCODE_DISABLED;
++ }
++ iwe.u.data.length = 0;
++ current_ev = iwe_stream_add_point(&info, current_ev, end_buf, &iwe, "");
++
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = IWEVCUSTOM;
++ snprintf(buf, sizeof(buf), "bcn_int=%d", cie->ie_beaconInt);
++ iwe.u.data.length = strlen(buf);
++ current_ev = iwe_stream_add_point(&info, current_ev, end_buf, &iwe, buf);
++
++ if (cie->ie_wpa != NULL) {
++ static const char wpa_leader[] = "wpa_ie=";
++
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = IWEVCUSTOM;
++ iwe.u.data.length = encode_ie(buf, sizeof(buf), cie->ie_wpa,
++ cie->ie_wpa[1]+2,
++ wpa_leader, sizeof(wpa_leader)-1);
++
++ if (iwe.u.data.length != 0) {
++ current_ev = iwe_stream_add_point(&info, current_ev, end_buf, &iwe,
++ buf);
++ }
++ }
++
++ if (cie->ie_rsn != NULL && cie->ie_rsn[0] == IEEE80211_ELEMID_RSN) {
++ static const char rsn_leader[] = "rsn_ie=";
++
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = IWEVCUSTOM;
++ iwe.u.data.length = encode_ie(buf, sizeof(buf), cie->ie_rsn,
++ cie->ie_rsn[1]+2,
++ rsn_leader, sizeof(rsn_leader)-1);
++
++ if (iwe.u.data.length != 0) {
++ current_ev = iwe_stream_add_point(&info, current_ev, end_buf, &iwe,
++ buf);
++ }
++ }
++
++ if (cie->ie_wmm != NULL) {
++ static const char wmm_leader[] = "wmm_ie=";
++
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = IWEVCUSTOM;
++ iwe.u.data.length = encode_ie(buf, sizeof(buf), cie->ie_wmm,
++ cie->ie_wmm[1]+2,
++ wmm_leader, sizeof(wmm_leader)-1);
++ if (iwe.u.data.length != 0) {
++ current_ev = iwe_stream_add_point(&info, current_ev, end_buf, &iwe,
++ buf);
++ }
++ }
++
++ if (cie->ie_ath != NULL) {
++ static const char ath_leader[] = "ath_ie=";
++
++ A_MEMZERO(&iwe, sizeof(iwe));
++ iwe.cmd = IWEVCUSTOM;
++ iwe.u.data.length = encode_ie(buf, sizeof(buf), cie->ie_ath,
++ cie->ie_ath[1]+2,
++ ath_leader, sizeof(ath_leader)-1);
++ if (iwe.u.data.length != 0) {
++ current_ev = iwe_stream_add_point(&info, current_ev, end_buf, &iwe,
++ buf);
++ }
++ }
++
++ param->current_ev = current_ev;
++}
++
++int
++ar6000_ioctl_giwscan(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *data, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ struct ar_giwscan_param param;
++ int i;
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ param.current_ev = extra;
++ param.end_buf = extra + IW_SCAN_MAX_DATA;
++ param.firstPass = TRUE;
++
++ /*
++ * Do two passes to insure WPA scan candidates
++ * are sorted to the front. This is a hack to deal with
++ * the wireless extensions capping scan results at
++ * IW_SCAN_MAX_DATA bytes. In densely populated environments
++ * it's easy to overflow this buffer (especially with WPA/RSN
++ * information elements). Note this sorting hack does not
++ * guarantee we won't overflow anyway.
++ */
++ for (i = 0; i < 2; i++) {
++ /*
++ * Translate data to WE format.
++ */
++ wmi_iterate_nodes(ar->arWmi, ar6000_scan_node, &param);
++ param.firstPass = FALSE;
++ if (param.current_ev >= param.end_buf) {
++ data->length = param.current_ev - extra;
++ return -E2BIG;
++ }
++ }
++
++ data->length = param.current_ev - extra;
++ return 0;
++}
++
++extern int reconnect_flag;
++/* SIOCSIWESSID */
++static int
++ar6000_ioctl_siwessid(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *data, char *ssid)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ A_STATUS status;
++ A_UINT8 arNetworkType;
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ /*
++ * iwconfig passes a string with length excluding any trailing NUL.
++ * FIXME: we should be able to set an ESSID of 32 bytes, yet things fall
++ * over badly if we do. So we limit the ESSID to 31 bytes.
++ */
++ if (data->flags && (!data->length || data->length >= sizeof(ar->arSsid))) {
++ /*
++ * ssid is invalid
++ */
++ return -EINVAL;
++ }
++ /* Added for bug 25178, return an IOCTL error instead of target returning
++ Illegal parameter error when either the BSSID or channel is missing
++ and we cannot scan during connect.
++ */
++ if (data->flags) {
++ if (ar->arSkipScan == TRUE &&
++ (ar->arChannelHint == 0 ||
++ (!ar->arReqBssid[0] && !ar->arReqBssid[1] && !ar->arReqBssid[2] &&
++ !ar->arReqBssid[3] && !ar->arReqBssid[4] && !ar->arReqBssid[5])))
++ {
++ return -EINVAL;
++ }
++ }
++
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++
++ if (ar->arTxPending[WMI_CONTROL_PRI]) {
++ /*
++ * sleep until the command queue drains
++ */
++ wait_event_interruptible_timeout(arEvent,
++ ar->arTxPending[WMI_CONTROL_PRI] == 0, wmitimeout * HZ);
++ if (signal_pending(current)) {
++ return -EINTR;
++ }
++ }
++
++ if (!data->flags) {
++ arNetworkType = ar->arNetworkType;
++ ar6000_init_profile_info(ar);
++ ar->arNetworkType = arNetworkType;
++ }
++
++ /*
++ * The original logic here prevented a disconnect if issuing an "essid off"
++ * if no ESSID was set, presumably to prevent sending multiple disconnects
++ * to the WMI.
++ *
++ * Unfortunately, this also meant that no disconnect was sent when we were
++ * already connected, but the profile has been changed since (which also
++ * clears the ESSID as a reminder that the WMI needs updating.)
++ *
++ * The "1 ||" makes sure we always disconnect or reconnect. The WMI doesn't
++ * seem to mind being sent multiple disconnects.
++ */
++ if (1 || (ar->arSsidLen) || (!data->flags))
++ {
++ if ((!data->flags) ||
++ (A_MEMCMP(ar->arSsid, ssid, ar->arSsidLen) != 0) ||
++ (ar->arSsidLen != (data->length)))
++ {
++ /*
++ * SSID set previously or essid off has been issued.
++ *
++ * Disconnect Command is issued in two cases after wmi is ready
++ * (1) ssid is different from the previous setting
++ * (2) essid off has been issued
++ *
++ */
++ if (ar->arWmiReady == TRUE) {
++ reconnect_flag = 0;
++ status = wmi_disconnect_cmd(ar->arWmi);
++ A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
++ ar->arSsidLen = 0;
++ if (ar->arSkipScan == FALSE) {
++ A_MEMZERO(ar->arReqBssid, sizeof(ar->arReqBssid));
++ }
++ if (!data->flags) {
++ up(&ar->arSem);
++ return 0;
++ }
++ } else {
++ up(&ar->arSem);
++ }
++ }
++ else
++ {
++ /*
++ * SSID is same, so we assume profile hasn't changed.
++ * If the interface is up and wmi is ready, we issue
++ * a reconnect cmd. Issue a reconnect only we are already
++ * connected.
++ */
++ if((ar->arConnected == TRUE) && (ar->arWmiReady == TRUE))
++ {
++ reconnect_flag = TRUE;
++ status = wmi_reconnect_cmd(ar->arWmi,ar->arReqBssid,
++ ar->arChannelHint);
++ up(&ar->arSem);
++ if (status != A_OK) {
++ return -EIO;
++ }
++ return 0;
++ }
++ else{
++ /*
++ * Dont return if connect is pending.
++ */
++ if(!(ar->arConnectPending)) {
++ up(&ar->arSem);
++ return 0;
++ }
++ }
++ }
++ }
++
++ ar->arSsidLen = data->length;
++ A_MEMCPY(ar->arSsid, ssid, ar->arSsidLen);
++
++ /* The ssid length check prevents second "essid off" from the user,
++ to be treated as a connect cmd. The second "essid off" is ignored.
++ */
++ if((ar->arWmiReady == TRUE) && (ar->arSsidLen > 0) )
++ {
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++ if (SHARED_AUTH == ar->arDot11AuthMode) {
++ ar6000_install_static_wep_keys(ar);
++ }
++ AR_DEBUG_PRINTF("Connect called with authmode %d dot11 auth %d"\
++ " PW crypto %d PW crypto Len %d GRP crypto %d"\
++ " GRP crypto Len %d\n",
++ ar->arAuthMode, ar->arDot11AuthMode,
++ ar->arPairwiseCrypto, ar->arPairwiseCryptoLen,
++ ar->arGroupCrypto, ar->arGroupCryptoLen);
++ reconnect_flag = 0;
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++ status = wmi_connect_cmd(ar->arWmi, ar->arNetworkType,
++ ar->arDot11AuthMode, ar->arAuthMode,
++ ar->arPairwiseCrypto, ar->arPairwiseCryptoLen,
++ ar->arGroupCrypto,ar->arGroupCryptoLen,
++ ar->arSsidLen, ar->arSsid,
++ ar->arReqBssid, ar->arChannelHint,
++ ar->arConnectCtrlFlags);
++
++
++ up(&ar->arSem);
++
++ if (status != A_OK) {
++ return -EIO;
++ }
++ ar->arConnectPending = TRUE;
++ }else{
++ up(&ar->arSem);
++ }
++ return 0;
++}
++
++/* SIOCGIWESSID */
++static int
++ar6000_ioctl_giwessid(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *data, char *essid)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ data->flags = 1;
++ data->length = ar->arSsidLen;
++ A_MEMCPY(essid, ar->arSsid, ar->arSsidLen);
++
++ return 0;
++}
++
++
++void ar6000_install_static_wep_keys(AR_SOFTC_T *ar)
++{
++ A_UINT8 index;
++ A_UINT8 keyUsage;
++
++ for (index = WMI_MIN_KEY_INDEX; index <= WMI_MAX_KEY_INDEX; index++) {
++ if (ar->arWepKeyList[index].arKeyLen) {
++ keyUsage = GROUP_USAGE;
++ if (index == ar->arDefTxKeyIndex) {
++ keyUsage |= TX_USAGE;
++ }
++ wmi_addKey_cmd(ar->arWmi,
++ index,
++ WEP_CRYPT,
++ keyUsage,
++ ar->arWepKeyList[index].arKeyLen,
++ NULL,
++ ar->arWepKeyList[index].arKey, KEY_OP_INIT_VAL,
++ NO_SYNC_WMIFLAG);
++ }
++ }
++}
++
++int
++ar6000_ioctl_delkey(struct net_device *dev, struct iw_request_info *info,
++ void *w, char *extra)
++{
++ return 0;
++}
++
++int
++ar6000_ioctl_setmlme(struct net_device *dev, struct iw_request_info *info,
++ void *w, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ struct ieee80211req_mlme *mlme = (struct ieee80211req_mlme *)extra;
++
++ if ((ar->arWmiReady == FALSE) || (ar->arConnected != TRUE))
++ return -EIO;
++
++ switch (mlme->im_op) {
++ case IEEE80211_MLME_DISASSOC:
++ case IEEE80211_MLME_DEAUTH:
++ /* Not Supported */
++ break;
++ default:
++ break;
++ }
++ return 0;
++}
++
++
++int
++ar6000_ioctl_setwmmparams(struct net_device *dev, struct iw_request_info *info,
++ void *w, char *extra)
++{
++ return -EIO; /* for now */
++}
++
++int
++ar6000_ioctl_getwmmparams(struct net_device *dev, struct iw_request_info *info,
++ void *w, char *extra)
++{
++ return -EIO; /* for now */
++}
++
++int ar6000_ioctl_setoptie(struct net_device *dev, struct iw_request_info *info,
++ struct iw_point *data, char *extra)
++{
++ /* The target generates the WPA/RSN IE */
++ return 0;
++}
++
++int
++ar6000_ioctl_setauthalg(struct net_device *dev, struct iw_request_info *info,
++ void *w, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ struct ieee80211req_authalg *req = (struct ieee80211req_authalg *)extra;
++ int ret = 0;
++
++
++ AR6000_SPIN_LOCK(&ar->arLock, 0);
++
++ if (req->auth_alg == AUTH_ALG_OPEN_SYSTEM) {
++ ar->arDot11AuthMode = OPEN_AUTH;
++ } else if (req->auth_alg == AUTH_ALG_LEAP) {
++ ar->arDot11AuthMode = LEAP_AUTH;
++ ar->arPairwiseCrypto = WEP_CRYPT;
++ ar->arGroupCrypto = WEP_CRYPT;
++ } else {
++ ret = -EIO;
++ }
++
++ AR6000_SPIN_UNLOCK(&ar->arLock, 0);
++
++ return ret;
++}
++static int
++ar6000_ioctl_addpmkid(struct net_device *dev, struct iw_request_info *info,
++ void *w, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ struct ieee80211req_addpmkid *req = (struct ieee80211req_addpmkid *)extra;
++ A_STATUS status;
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ AR_DEBUG_PRINTF("Add pmkid for %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x en=%d\n",
++ req->pi_bssid[0], req->pi_bssid[1], req->pi_bssid[2],
++ req->pi_bssid[3], req->pi_bssid[4], req->pi_bssid[5],
++ req->pi_enable);
++
++ status = wmi_setPmkid_cmd(ar->arWmi, req->pi_bssid, req->pi_pmkid,
++ req->pi_enable);
++
++ if (status != A_OK) {
++ return -EIO;
++ }
++
++ return 0;
++}
++
++/*
++ * SIOCSIWRATE
++ */
++int
++ar6000_ioctl_siwrate(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_param *rrq, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ A_UINT32 kbps;
++
++ if (rrq->fixed) {
++ kbps = rrq->value / 1000; /* rrq->value is in bps */
++ } else {
++ kbps = -1; /* -1 indicates auto rate */
++ }
++ if(kbps != -1 && wmi_validate_bitrate(ar->arWmi, kbps) == A_EINVAL)
++ {
++ AR_DEBUG_PRINTF("BitRate is not Valid %d\n", kbps);
++ return -EINVAL;
++ }
++ ar->arBitRate = kbps;
++ if(ar->arWmiReady == TRUE)
++ {
++ if (wmi_set_bitrate_cmd(ar->arWmi, kbps) != A_OK) {
++ return -EINVAL;
++ }
++ }
++ return 0;
++}
++
++/*
++ * SIOCGIWRATE
++ */
++int
++ar6000_ioctl_giwrate(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_param *rrq, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ int ret = 0;
++
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++ if(ar->arWmiReady == TRUE)
++ {
++ ar->arBitRate = 0xFFFF;
++ if (wmi_get_bitrate_cmd(ar->arWmi) != A_OK) {
++ up(&ar->arSem);
++ return -EIO;
++ }
++ wait_event_interruptible_timeout(arEvent, ar->arBitRate != 0xFFFF, wmitimeout * HZ);
++ if (signal_pending(current)) {
++ ret = -EINTR;
++ }
++ }
++ /* If the interface is down or wmi is not ready or the target is not
++ connected - return the value stored in the device structure */
++ if (!ret) {
++ if (ar->arBitRate == -1) {
++ rrq->fixed = TRUE;
++ rrq->value = 0;
++ } else {
++ rrq->value = ar->arBitRate * 1000;
++ }
++ }
++
++ up(&ar->arSem);
++
++ return ret;
++}
++
++/*
++ * SIOCSIWTXPOW
++ */
++static int
++ar6000_ioctl_siwtxpow(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_param *rrq, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ A_UINT8 dbM;
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ if (ar->arRadioSwitch == WLAN_ENABLED
++ && rrq->disabled) {
++ if (wmi_switch_radio(ar->arWmi, WLAN_DISABLED) < 0)
++ return -EIO;
++ ar->arRadioSwitch = WLAN_DISABLED;
++ } else if (ar->arRadioSwitch == WLAN_DISABLED
++ && !rrq->disabled) {
++ if (wmi_switch_radio(ar->arWmi, WLAN_ENABLED) < 0)
++ return -EIO;
++ ar->arRadioSwitch = WLAN_ENABLED;
++ }
++
++ if (rrq->fixed) {
++ if (rrq->flags != IW_TXPOW_DBM) {
++ return -EOPNOTSUPP;
++ }
++ ar->arTxPwr= dbM = rrq->value;
++ ar->arTxPwrSet = TRUE;
++ } else {
++ ar->arTxPwr = dbM = 0;
++ ar->arTxPwrSet = FALSE;
++ }
++ if(ar->arWmiReady == TRUE)
++ {
++ AR_DEBUG_PRINTF("Set tx pwr cmd %d dbM\n", dbM);
++ wmi_set_txPwr_cmd(ar->arWmi, dbM);
++ }
++ return 0;
++}
++
++/*
++ * SIOCGIWTXPOW
++ */
++int
++ar6000_ioctl_giwtxpow(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_param *rrq, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ int ret = 0;
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ if (ar->arRadioSwitch == WLAN_DISABLED) {
++ rrq->disabled = 1;
++ return 0;
++ }
++
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++ if((ar->arWmiReady == TRUE) && (ar->arConnected == TRUE))
++ {
++ ar->arTxPwr = 0;
++
++ if (wmi_get_txPwr_cmd(ar->arWmi) != A_OK) {
++ up(&ar->arSem);
++ return -EIO;
++ }
++
++ wait_event_interruptible_timeout(arEvent, ar->arTxPwr != 0, wmitimeout * HZ);
++
++ if (signal_pending(current)) {
++ ret = -EINTR;
++ }
++ }
++ /* If the interace is down or wmi is not ready or target is not connected
++ then return value stored in the device structure */
++
++ if (!ret) {
++ if (ar->arTxPwrSet == TRUE) {
++ rrq->fixed = TRUE;
++ }
++ rrq->value = ar->arTxPwr;
++ rrq->flags = IW_TXPOW_DBM;
++ }
++
++ up(&ar->arSem);
++
++ return ret;
++}
++
++/*
++ * SIOCSIWRETRY
++ * since iwconfig only provides us with one max retry value, we use it
++ * to apply to data frames of the BE traffic class.
++ */
++static int
++ar6000_ioctl_siwretry(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_param *rrq, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ if (rrq->disabled) {
++ return -EOPNOTSUPP;
++ }
++
++ if ((rrq->flags & IW_RETRY_TYPE) != IW_RETRY_LIMIT) {
++ return -EOPNOTSUPP;
++ }
++
++ if ( !(rrq->value >= WMI_MIN_RETRIES) || !(rrq->value <= WMI_MAX_RETRIES)) {
++ return - EINVAL;
++ }
++ if(ar->arWmiReady == TRUE)
++ {
++ if (wmi_set_retry_limits_cmd(ar->arWmi, DATA_FRAMETYPE, WMM_AC_BE,
++ rrq->value, 0) != A_OK){
++ return -EINVAL;
++ }
++ }
++ ar->arMaxRetries = rrq->value;
++ return 0;
++}
++
++/*
++ * SIOCGIWRETRY
++ */
++static int
++ar6000_ioctl_giwretry(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_param *rrq, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ rrq->disabled = 0;
++ switch (rrq->flags & IW_RETRY_TYPE) {
++ case IW_RETRY_LIFETIME:
++ return -EOPNOTSUPP;
++ break;
++ case IW_RETRY_LIMIT:
++ rrq->flags = IW_RETRY_LIMIT;
++ switch (rrq->flags & IW_RETRY_MODIFIER) {
++ case IW_RETRY_MIN:
++ rrq->flags |= IW_RETRY_MIN;
++ rrq->value = WMI_MIN_RETRIES;
++ break;
++ case IW_RETRY_MAX:
++ rrq->flags |= IW_RETRY_MAX;
++ rrq->value = ar->arMaxRetries;
++ break;
++ }
++ break;
++ }
++ return 0;
++}
++
++/*
++ * SIOCSIWENCODE
++ */
++static int
++ar6000_ioctl_siwencode(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *erq, char *keybuf)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ int index;
++ A_INT32 auth = ar->arDot11AuthMode;
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ index = erq->flags & IW_ENCODE_INDEX;
++
++ if (index && (((index - 1) < WMI_MIN_KEY_INDEX) ||
++ ((index - 1) > WMI_MAX_KEY_INDEX)))
++ {
++ return -EIO;
++ }
++
++ if (erq->flags & IW_ENCODE_DISABLED) {
++ /*
++ * Encryption disabled
++ */
++ if (index) {
++ /*
++ * If key index was specified then clear the specified key
++ */
++ index--;
++ A_MEMZERO(ar->arWepKeyList[index].arKey,
++ sizeof(ar->arWepKeyList[index].arKey));
++ ar->arWepKeyList[index].arKeyLen = 0;
++ }
++ ar->arDot11AuthMode = OPEN_AUTH;
++ ar->arPairwiseCrypto = NONE_CRYPT;
++ ar->arGroupCrypto = NONE_CRYPT;
++ ar->arAuthMode = NONE_AUTH;
++ } else {
++ /*
++ * Enabling WEP encryption
++ */
++ if (index) {
++ index--; /* keyindex is off base 1 in iwconfig */
++ }
++
++ if (erq->flags & IW_ENCODE_OPEN) {
++ auth = OPEN_AUTH;
++ } else if (erq->flags & IW_ENCODE_RESTRICTED) {
++ auth = SHARED_AUTH;
++ }
++
++ if (erq->length) {
++ if (!IEEE80211_IS_VALID_WEP_CIPHER_LEN(erq->length)) {
++ return -EIO;
++ }
++
++ A_MEMZERO(ar->arWepKeyList[index].arKey,
++ sizeof(ar->arWepKeyList[index].arKey));
++ A_MEMCPY(ar->arWepKeyList[index].arKey, keybuf, erq->length);
++ ar->arWepKeyList[index].arKeyLen = erq->length;
++ } else {
++ if (ar->arWepKeyList[index].arKeyLen == 0) {
++ return -EIO;
++ }
++ ar->arDefTxKeyIndex = index;
++ }
++
++ ar->arPairwiseCrypto = WEP_CRYPT;
++ ar->arGroupCrypto = WEP_CRYPT;
++ ar->arDot11AuthMode = auth;
++ ar->arAuthMode = NONE_AUTH;
++ }
++
++ /*
++ * profile has changed. Erase ssid to signal change
++ */
++ A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
++ ar->arSsidLen = 0;
++
++ return 0;
++}
++
++static int
++ar6000_ioctl_giwencode(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *erq, char *key)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ A_UINT8 keyIndex;
++ struct ar_wep_key *wk;
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ if (ar->arPairwiseCrypto == NONE_CRYPT) {
++ erq->length = 0;
++ erq->flags = IW_ENCODE_DISABLED;
++ } else {
++ /* get the keyIndex */
++ keyIndex = erq->flags & IW_ENCODE_INDEX;
++ if (0 == keyIndex) {
++ keyIndex = ar->arDefTxKeyIndex;
++ } else if ((keyIndex - 1 < WMI_MIN_KEY_INDEX) ||
++ (keyIndex - 1 > WMI_MAX_KEY_INDEX))
++ {
++ keyIndex = WMI_MIN_KEY_INDEX;
++ } else {
++ keyIndex--;
++ }
++ erq->flags = keyIndex + 1;
++ erq->flags |= IW_ENCODE_ENABLED;
++ wk = &ar->arWepKeyList[keyIndex];
++ if (erq->length > wk->arKeyLen) {
++ erq->length = wk->arKeyLen;
++ }
++ if (wk->arKeyLen) {
++ A_MEMCPY(key, wk->arKey, erq->length);
++ }
++ if (ar->arDot11AuthMode == OPEN_AUTH) {
++ erq->flags |= IW_ENCODE_OPEN;
++ } else if (ar->arDot11AuthMode == SHARED_AUTH) {
++ erq->flags |= IW_ENCODE_RESTRICTED;
++ }
++ }
++
++ return 0;
++}
++
++static int ar6000_ioctl_siwpower(struct net_device *dev,
++ struct iw_request_info *info,
++ union iwreq_data *wrqu, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ WMI_POWER_MODE power_mode;
++
++ if (wrqu->power.disabled)
++ power_mode = MAX_PERF_POWER;
++ else
++ power_mode = REC_POWER;
++
++ if (wmi_powermode_cmd(ar->arWmi, power_mode) < 0)
++ return -EIO;
++
++ return 0;
++}
++
++static int ar6000_ioctl_giwpower(struct net_device *dev,
++ struct iw_request_info *info,
++ union iwreq_data *wrqu, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ /*
++ * FIXME:
++ * https://docs.openmoko.org/trac/ticket/2267
++ * When starting wpa_supplicant the kernel oopses.
++ * The following condition avoids the oops.
++ * Remove this comment to bless this solution.
++ */
++ if (ar->arWlanState == WLAN_DISABLED || ar->arWmiReady == FALSE)
++ return -EIO;
++
++ return wmi_get_power_mode_cmd(ar->arWmi);
++}
++
++static int ar6000_ioctl_siwgenie(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *dwrq,
++ char *extra)
++{
++ /* The target does that for us */
++ return 0;
++}
++
++static int ar6000_ioctl_giwgenie(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *dwrq,
++ char *extra)
++{
++ return 0;
++}
++
++static int ar6000_ioctl_siwauth(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_param *param,
++ char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ int reset = 0;
++
++ switch (param->flags & IW_AUTH_INDEX) {
++ case IW_AUTH_WPA_VERSION:
++ if (param->value & IW_AUTH_WPA_VERSION_DISABLED) {
++ ar->arAuthMode = NONE_AUTH;
++ }
++ if (param->value & IW_AUTH_WPA_VERSION_WPA) {
++ ar->arAuthMode = WPA_AUTH;
++ }
++ if (param->value & IW_AUTH_WPA_VERSION_WPA2) {
++ ar->arAuthMode = WPA2_AUTH;
++ }
++
++ reset = 1;
++ break;
++ case IW_AUTH_CIPHER_PAIRWISE:
++ if (param->value & IW_AUTH_CIPHER_NONE) {
++ ar->arPairwiseCrypto = NONE_CRYPT;
++ }
++ if (param->value & IW_AUTH_CIPHER_WEP40) {
++ ar->arPairwiseCrypto = WEP_CRYPT;
++ }
++ if (param->value & IW_AUTH_CIPHER_TKIP) {
++ ar->arPairwiseCrypto = TKIP_CRYPT;
++ }
++ if (param->value & IW_AUTH_CIPHER_CCMP) {
++ ar->arPairwiseCrypto = AES_CRYPT;
++ }
++
++ reset = 1;
++ break;
++ case IW_AUTH_CIPHER_GROUP:
++ if (param->value & IW_AUTH_CIPHER_NONE) {
++ ar->arGroupCrypto = NONE_CRYPT;
++ }
++ if (param->value & IW_AUTH_CIPHER_WEP40) {
++ ar->arGroupCrypto = WEP_CRYPT;
++ }
++ if (param->value & IW_AUTH_CIPHER_TKIP) {
++ ar->arGroupCrypto = TKIP_CRYPT;
++ }
++ if (param->value & IW_AUTH_CIPHER_CCMP) {
++ ar->arGroupCrypto = AES_CRYPT;
++ }
++
++ reset = 1;
++ break;
++ case IW_AUTH_KEY_MGMT:
++ if (param->value & IW_AUTH_KEY_MGMT_PSK) {
++ if (ar->arAuthMode == WPA_AUTH) {
++ ar->arAuthMode = WPA_PSK_AUTH;
++ } else if (ar->arAuthMode == WPA2_AUTH) {
++ ar->arAuthMode = WPA2_PSK_AUTH;
++ }
++
++ reset = 1;
++ }
++ break;
++
++ case IW_AUTH_TKIP_COUNTERMEASURES:
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ wmi_set_tkip_countermeasures_cmd(ar->arWmi, param->value);
++ break;
++
++ case IW_AUTH_DROP_UNENCRYPTED:
++ break;
++
++ case IW_AUTH_80211_AUTH_ALG:
++ if (param->value & IW_AUTH_ALG_OPEN_SYSTEM) {
++ ar->arDot11AuthMode = OPEN_AUTH;
++ }
++ if (param->value & IW_AUTH_ALG_SHARED_KEY) {
++ ar->arDot11AuthMode = SHARED_AUTH;
++ }
++ if (param->value & IW_AUTH_ALG_LEAP) {
++ ar->arDot11AuthMode = LEAP_AUTH;
++ ar->arPairwiseCrypto = WEP_CRYPT;
++ ar->arGroupCrypto = WEP_CRYPT;
++ }
++
++ reset = 1;
++ break;
++
++ case IW_AUTH_WPA_ENABLED:
++ reset = 1;
++ break;
++
++ case IW_AUTH_RX_UNENCRYPTED_EAPOL:
++ break;
++
++ case IW_AUTH_PRIVACY_INVOKED:
++ break;
++
++ default:
++ printk("%s(): Unknown flag 0x%x\n", __FUNCTION__, param->flags);
++ return -EOPNOTSUPP;
++ }
++
++ if (reset) {
++ A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
++ ar->arSsidLen = 0;
++ }
++
++ return 0;
++}
++
++static int ar6000_ioctl_giwauth(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_param *dwrq,
++ char *extra)
++{
++ return 0;
++}
++
++static int ar6000_ioctl_siwencodeext(struct net_device *dev,
++ struct iw_request_info *info,
++ union iwreq_data *wrqu,
++ char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ struct iw_point *encoding = &wrqu->encoding;
++ struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
++ int alg = ext->alg, idx;
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ /* Determine and validate the key index */
++ idx = (encoding->flags & IW_ENCODE_INDEX) - 1;
++ if (idx) {
++ if (idx < 0 || idx > 3)
++ return -EINVAL;
++ }
++
++ if ((alg == IW_ENCODE_ALG_TKIP) || (alg == IW_ENCODE_ALG_CCMP)) {
++ struct ieee80211req_key ik;
++ KEY_USAGE key_usage;
++ CRYPTO_TYPE key_type = NONE_CRYPT;
++ int status;
++
++ ar->user_saved_keys.keyOk = FALSE;
++
++ if (alg == IW_ENCODE_ALG_TKIP) {
++ key_type = TKIP_CRYPT;
++ ik.ik_type = IEEE80211_CIPHER_TKIP;
++ } else {
++ key_type = AES_CRYPT;
++ ik.ik_type = IEEE80211_CIPHER_AES_CCM;
++ }
++
++ ik.ik_keyix = idx;
++ ik.ik_keylen = ext->key_len;
++ ik.ik_flags = IEEE80211_KEY_RECV;
++ if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
++ ik.ik_flags |= IEEE80211_KEY_XMIT
++ | IEEE80211_KEY_DEFAULT;
++ }
++
++ if (ext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) {
++ memcpy(&ik.ik_keyrsc, ext->rx_seq, 8);
++ }
++
++ memcpy(ik.ik_keydata, ext->key, ext->key_len);
++
++ ar->user_saved_keys.keyType = key_type;
++ if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {
++ key_usage = GROUP_USAGE;
++ memset(ik.ik_macaddr, 0, ETH_ALEN);
++ memcpy(&ar->user_saved_keys.bcast_ik, &ik,
++ sizeof(struct ieee80211req_key));
++ } else {
++ key_usage = PAIRWISE_USAGE;
++ memcpy(ik.ik_macaddr, ext->addr.sa_data, ETH_ALEN);
++ memcpy(&ar->user_saved_keys.ucast_ik, &ik,
++ sizeof(struct ieee80211req_key));
++ }
++
++ status = wmi_addKey_cmd(ar->arWmi, ik.ik_keyix, key_type,
++ key_usage, ik.ik_keylen,
++ (A_UINT8 *)&ik.ik_keyrsc,
++ ik.ik_keydata,
++ KEY_OP_INIT_VAL, SYNC_BEFORE_WMIFLAG);
++
++ if (status < 0)
++ return -EIO;
++
++ ar->user_saved_keys.keyOk = TRUE;
++
++ return 0;
++
++ } else {
++ /* WEP falls back to SIWENCODE */
++ return -EOPNOTSUPP;
++ }
++
++ return 0;
++}
++
++
++static int ar6000_ioctl_giwencodeext(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *dwrq,
++ char *extra)
++{
++ return 0;
++}
++
++
++static int
++ar6000_ioctl_setparam(struct net_device *dev,
++ struct iw_request_info *info,
++ void *erq, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ int *i = (int *)extra;
++ int param = i[0];
++ int value = i[1];
++ int ret = 0;
++ A_BOOL profChanged = FALSE;
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ switch (param) {
++ case IEEE80211_PARAM_WPA:
++ switch (value) {
++ case WPA_MODE_WPA1:
++ ar->arAuthMode = WPA_AUTH;
++ profChanged = TRUE;
++ break;
++ case WPA_MODE_WPA2:
++ ar->arAuthMode = WPA2_AUTH;
++ profChanged = TRUE;
++ break;
++ case WPA_MODE_NONE:
++ ar->arAuthMode = NONE_AUTH;
++ profChanged = TRUE;
++ break;
++ default:
++ printk("IEEE80211_PARAM_WPA: Unknown value %d\n", value);
++ }
++ break;
++ case IEEE80211_PARAM_AUTHMODE:
++ switch(value) {
++ case IEEE80211_AUTH_WPA_PSK:
++ if (WPA_AUTH == ar->arAuthMode) {
++ ar->arAuthMode = WPA_PSK_AUTH;
++ profChanged = TRUE;
++ } else if (WPA2_AUTH == ar->arAuthMode) {
++ ar->arAuthMode = WPA2_PSK_AUTH;
++ profChanged = TRUE;
++ } else {
++ AR_DEBUG_PRINTF("Error - Setting PSK mode when WPA "\
++ "param was set to %d\n",
++ ar->arAuthMode);
++ ret = -1;
++ }
++ break;
++ case IEEE80211_AUTH_WPA_CCKM:
++ if (WPA2_AUTH == ar->arAuthMode) {
++ ar->arAuthMode = WPA2_AUTH_CCKM;
++ } else {
++ ar->arAuthMode = WPA_AUTH_CCKM;
++ }
++ break;
++ default:
++ break;
++ }
++ break;
++ case IEEE80211_PARAM_UCASTCIPHER:
++ switch (value) {
++ case IEEE80211_CIPHER_AES_CCM:
++ ar->arPairwiseCrypto = AES_CRYPT;
++ profChanged = TRUE;
++ break;
++ case IEEE80211_CIPHER_TKIP:
++ ar->arPairwiseCrypto = TKIP_CRYPT;
++ profChanged = TRUE;
++ break;
++ case IEEE80211_CIPHER_WEP:
++ ar->arPairwiseCrypto = WEP_CRYPT;
++ profChanged = TRUE;
++ break;
++ case IEEE80211_CIPHER_NONE:
++ ar->arPairwiseCrypto = NONE_CRYPT;
++ profChanged = TRUE;
++ break;
++ }
++ break;
++ case IEEE80211_PARAM_UCASTKEYLEN:
++ if (!IEEE80211_IS_VALID_WEP_CIPHER_LEN(value)) {
++ ret = -EIO;
++ } else {
++ ar->arPairwiseCryptoLen = value;
++ }
++ break;
++ case IEEE80211_PARAM_MCASTCIPHER:
++ switch (value) {
++ case IEEE80211_CIPHER_AES_CCM:
++ ar->arGroupCrypto = AES_CRYPT;
++ profChanged = TRUE;
++ break;
++ case IEEE80211_CIPHER_TKIP:
++ ar->arGroupCrypto = TKIP_CRYPT;
++ profChanged = TRUE;
++ break;
++ case IEEE80211_CIPHER_WEP:
++ ar->arGroupCrypto = WEP_CRYPT;
++ profChanged = TRUE;
++ break;
++ case IEEE80211_CIPHER_NONE:
++ ar->arGroupCrypto = NONE_CRYPT;
++ profChanged = TRUE;
++ break;
++ }
++ break;
++ case IEEE80211_PARAM_MCASTKEYLEN:
++ if (!IEEE80211_IS_VALID_WEP_CIPHER_LEN(value)) {
++ ret = -EIO;
++ } else {
++ ar->arGroupCryptoLen = value;
++ }
++ break;
++ case IEEE80211_PARAM_COUNTERMEASURES:
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++ wmi_set_tkip_countermeasures_cmd(ar->arWmi, value);
++ break;
++ default:
++ break;
++ }
++
++ if (profChanged == TRUE) {
++ /*
++ * profile has changed. Erase ssid to signal change
++ */
++ A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
++ ar->arSsidLen = 0;
++ }
++
++ return ret;
++}
++
++int
++ar6000_ioctl_getparam(struct net_device *dev, struct iw_request_info *info,
++ void *w, char *extra)
++{
++ return -EIO; /* for now */
++}
++
++int
++ar6000_ioctl_setkey(struct net_device *dev, struct iw_request_info *info,
++ void *w, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ struct ieee80211req_key *ik = (struct ieee80211req_key *)extra;
++ KEY_USAGE keyUsage;
++ A_STATUS status;
++ CRYPTO_TYPE keyType = NONE_CRYPT;
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ ar->user_saved_keys.keyOk = FALSE;
++
++ if ( 0 == memcmp(ik->ik_macaddr, "\x00\x00\x00\x00\x00\x00",
++ IEEE80211_ADDR_LEN)) {
++ keyUsage = GROUP_USAGE;
++ A_MEMCPY(&ar->user_saved_keys.bcast_ik, ik,
++ sizeof(struct ieee80211req_key));
++ } else {
++ keyUsage = PAIRWISE_USAGE;
++ A_MEMCPY(&ar->user_saved_keys.ucast_ik, ik,
++ sizeof(struct ieee80211req_key));
++ }
++
++ switch (ik->ik_type) {
++ case IEEE80211_CIPHER_WEP:
++ keyType = WEP_CRYPT;
++ break;
++ case IEEE80211_CIPHER_TKIP:
++ keyType = TKIP_CRYPT;
++ break;
++ case IEEE80211_CIPHER_AES_CCM:
++ keyType = AES_CRYPT;
++ break;
++ default:
++ break;
++ }
++ ar->user_saved_keys.keyType = keyType;
++
++ if (IEEE80211_CIPHER_CCKM_KRK != ik->ik_type) {
++ if (NONE_CRYPT == keyType) {
++ return -EIO;
++ }
++
++ status = wmi_addKey_cmd(ar->arWmi, ik->ik_keyix, keyType, keyUsage,
++ ik->ik_keylen, (A_UINT8 *)&ik->ik_keyrsc,
++ ik->ik_keydata, KEY_OP_INIT_VAL,
++ SYNC_BEFORE_WMIFLAG);
++
++ if (status != A_OK) {
++ return -EIO;
++ }
++ } else {
++ status = wmi_add_krk_cmd(ar->arWmi, ik->ik_keydata);
++ }
++
++ ar->user_saved_keys.keyOk = TRUE;
++
++ return 0;
++}
++
++
++/*
++ * SIOCGIWNAME
++ */
++int
++ar6000_ioctl_giwname(struct net_device *dev,
++ struct iw_request_info *info,
++ char *name, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ switch (ar->arPhyCapability) {
++ case (WMI_11A_CAPABILITY):
++ strncpy(name, "AR6000 802.11a", IFNAMSIZ);
++ break;
++ case (WMI_11G_CAPABILITY):
++ strncpy(name, "AR6000 802.11g", IFNAMSIZ);
++ break;
++ case (WMI_11AG_CAPABILITY):
++ strncpy(name, "AR6000 802.11ag", IFNAMSIZ);
++ break;
++ default:
++ strncpy(name, "AR6000 802.11", IFNAMSIZ);
++ break;
++ }
++
++ return 0;
++}
++
++/*
++ * SIOCSIWFREQ
++ */
++int
++ar6000_ioctl_siwfreq(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_freq *freq, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ /*
++ * We support limiting the channels via wmiconfig.
++ *
++ * We use this command to configure the channel hint for the connect cmd
++ * so it is possible the target will end up connecting to a different
++ * channel.
++ */
++ if (freq->e > 1) {
++ return -EINVAL;
++ } else if (freq->e == 1) {
++ ar->arChannelHint = freq->m / 100000;
++ } else {
++ ar->arChannelHint = wlan_ieee2freq(freq->m);
++ }
++
++ A_PRINTF("channel hint set to %d\n", ar->arChannelHint);
++ return 0;
++}
++
++/*
++ * SIOCGIWFREQ
++ */
++int
++ar6000_ioctl_giwfreq(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_freq *freq, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ if (ar->arConnected != TRUE) {
++ return -EINVAL;
++ }
++
++ freq->m = ar->arBssChannel * 100000;
++ freq->e = 1;
++
++ return 0;
++}
++
++/*
++ * SIOCSIWMODE
++ */
++int
++ar6000_ioctl_siwmode(struct net_device *dev,
++ struct iw_request_info *info,
++ __u32 *mode, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ switch (*mode) {
++ case IW_MODE_INFRA:
++ ar->arNetworkType = INFRA_NETWORK;
++ break;
++ case IW_MODE_ADHOC:
++ ar->arNetworkType = ADHOC_NETWORK;
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
++/*
++ * SIOCGIWMODE
++ */
++int
++ar6000_ioctl_giwmode(struct net_device *dev,
++ struct iw_request_info *info,
++ __u32 *mode, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ switch (ar->arNetworkType) {
++ case INFRA_NETWORK:
++ *mode = IW_MODE_INFRA;
++ break;
++ case ADHOC_NETWORK:
++ *mode = IW_MODE_ADHOC;
++ break;
++ default:
++ return -EIO;
++ }
++ return 0;
++}
++
++/*
++ * SIOCSIWSENS
++ */
++int
++ar6000_ioctl_siwsens(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_param *sens, char *extra)
++{
++ return 0;
++}
++
++/*
++ * SIOCGIWSENS
++ */
++int
++ar6000_ioctl_giwsens(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_param *sens, char *extra)
++{
++ sens->value = 0;
++ sens->fixed = 1;
++
++ return 0;
++}
++
++/*
++ * SIOCGIWRANGE
++ */
++int
++ar6000_ioctl_giwrange(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *data, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ struct iw_range *range = (struct iw_range *) extra;
++ int i, ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ if (down_interruptible(&ar->arSem)) {
++ return -ERESTARTSYS;
++ }
++ ar->arNumChannels = -1;
++ A_MEMZERO(ar->arChannelList, sizeof (ar->arChannelList));
++
++ if (wmi_get_channelList_cmd(ar->arWmi) != A_OK) {
++ up(&ar->arSem);
++ return -EIO;
++ }
++
++ wait_event_interruptible_timeout(arEvent, ar->arNumChannels != -1, wmitimeout * HZ);
++
++ if (signal_pending(current)) {
++ up(&ar->arSem);
++ return -EINTR;
++ }
++
++ data->length = sizeof(struct iw_range);
++ A_MEMZERO(range, sizeof(struct iw_range));
++
++ range->txpower_capa = IW_TXPOW_DBM;
++
++ range->min_pmp = 1 * 1024;
++ range->max_pmp = 65535 * 1024;
++ range->min_pmt = 1 * 1024;
++ range->max_pmt = 1000 * 1024;
++ range->pmp_flags = IW_POWER_PERIOD;
++ range->pmt_flags = IW_POWER_TIMEOUT;
++ range->pm_capa = 0;
++
++ range->we_version_compiled = WIRELESS_EXT;
++ range->we_version_source = 13;
++
++ range->retry_capa = IW_RETRY_LIMIT;
++ range->retry_flags = IW_RETRY_LIMIT;
++ range->min_retry = 0;
++ range->max_retry = 255;
++
++ range->num_frequency = range->num_channels = ar->arNumChannels;
++ for (i = 0; i < ar->arNumChannels; i++) {
++ range->freq[i].i = wlan_freq2ieee(ar->arChannelList[i]);
++ range->freq[i].m = ar->arChannelList[i] * 100000;
++ range->freq[i].e = 1;
++ /*
++ * Linux supports max of 32 channels, bail out once you
++ * reach the max.
++ */
++ if (i == IW_MAX_FREQUENCIES) {
++ break;
++ }
++ }
++
++ /* Max quality is max field value minus noise floor */
++ range->max_qual.qual = 0xff - 161;
++
++ /*
++ * In order to use dBm measurements, 'level' must be lower
++ * than any possible measurement (see iw_print_stats() in
++ * wireless tools). It's unclear how this is meant to be
++ * done, but setting zero in these values forces dBm and
++ * the actual numbers are not used.
++ */
++ range->max_qual.level = 0;
++ range->max_qual.noise = 0;
++
++ range->sensitivity = 3;
++
++ range->max_encoding_tokens = 4;
++ /* XXX query driver to find out supported key sizes */
++ range->num_encoding_sizes = 3;
++ range->encoding_size[0] = 5; /* 40-bit */
++ range->encoding_size[1] = 13; /* 104-bit */
++ range->encoding_size[2] = 16; /* 128-bit */
++
++ range->num_bitrates = 0;
++
++ /* estimated maximum TCP throughput values (bps) */
++ range->throughput = 22000000;
++
++ range->min_rts = 0;
++ range->max_rts = 2347;
++ range->min_frag = 256;
++ range->max_frag = 2346;
++
++ up(&ar->arSem);
++
++ return ret;
++}
++
++
++/*
++ * SIOCSIWAP
++ * This ioctl is used to set the desired bssid for the connect command.
++ */
++int
++ar6000_ioctl_siwap(struct net_device *dev,
++ struct iw_request_info *info,
++ struct sockaddr *ap_addr, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ if (ap_addr->sa_family != ARPHRD_ETHER) {
++ return -EIO;
++ }
++
++ if (A_MEMCMP(&ap_addr->sa_data, bcast_mac, AR6000_ETH_ADDR_LEN) == 0) {
++ A_MEMZERO(ar->arReqBssid, sizeof(ar->arReqBssid));
++ } else {
++ A_MEMCPY(ar->arReqBssid, &ap_addr->sa_data, sizeof(ar->arReqBssid));
++ }
++
++ return 0;
++}
++
++/*
++ * SIOCGIWAP
++ */
++int
++ar6000_ioctl_giwap(struct net_device *dev,
++ struct iw_request_info *info,
++ struct sockaddr *ap_addr, char *extra)
++{
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ if (ar->arConnected != TRUE) {
++ return -EINVAL;
++ }
++
++ A_MEMCPY(&ap_addr->sa_data, ar->arBssid, sizeof(ar->arBssid));
++ ap_addr->sa_family = ARPHRD_ETHER;
++
++ return 0;
++}
++
++/*
++ * SIOCGIWAPLIST
++ */
++int
++ar6000_ioctl_iwaplist(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *data, char *extra)
++{
++ return -EIO; /* for now */
++}
++
++/*
++ * SIOCSIWSCAN
++ */
++int
++ar6000_ioctl_siwscan(struct net_device *dev,
++ struct iw_request_info *info,
++ struct iw_point *data, char *extra)
++{
++#define ACT_DWELLTIME_DEFAULT 105
++#define HOME_TXDRAIN_TIME 100
++#define SCAN_INT HOME_TXDRAIN_TIME + ACT_DWELLTIME_DEFAULT
++ AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
++ int ret = 0;
++
++ if (ar->arWmiReady == FALSE) {
++ return -EIO;
++ }
++
++ if (ar->arWlanState == WLAN_DISABLED) {
++ return -EIO;
++ }
++
++ /* We ask for everything from the target */
++ if (wmi_bssfilter_cmd(ar->arWmi, ALL_BSS_FILTER, 0) != A_OK) {
++ printk("Couldn't set filtering\n");
++ ret = -EIO;
++ }
++
++ if (wmi_startscan_cmd(ar->arWmi, WMI_LONG_SCAN, FALSE, FALSE, \
++ HOME_TXDRAIN_TIME, SCAN_INT) != A_OK) {
++ ret = -EIO;
++ }
++
++ ar->scan_complete = 0;
++ wait_event_interruptible_timeout(ar6000_scan_queue, ar->scan_complete,
++ 5 * HZ);
++
++ if (wmi_bssfilter_cmd(ar->arWmi, NONE_BSS_FILTER, 0) != A_OK) {
++ printk("Couldn't set filtering\n");
++ ret = -EIO;
++ }
++
++ return ret;
++#undef ACT_DWELLTIME_DEFAULT
++#undef HOME_TXDRAIN_TIME
++#undef SCAN_INT
++}
++
++
++/*
++ * Units are in db above the noise floor. That means the
++ * rssi values reported in the tx/rx descriptors in the
++ * driver are the SNR expressed in db.
++ *
++ * If you assume that the noise floor is -95, which is an
++ * excellent assumption 99.5 % of the time, then you can
++ * derive the absolute signal level (i.e. -95 + rssi).
++ * There are some other slight factors to take into account
++ * depending on whether the rssi measurement is from 11b,
++ * 11g, or 11a. These differences are at most 2db and
++ * can be documented.
++ *
++ * NB: various calculations are based on the orinoco/wavelan
++ * drivers for compatibility
++ */
++static void
++ar6000_set_quality(struct iw_quality *iq, A_INT8 rssi)
++{
++ if (rssi < 0) {
++ iq->qual = 0;
++ } else {
++ iq->qual = rssi;
++ }
++
++ /* NB: max is 94 because noise is hardcoded to 161 */
++ if (iq->qual > 94)
++ iq->qual = 94;
++
++ iq->noise = 161; /* -95dBm */
++ iq->level = iq->noise + iq->qual;
++ iq->updated = 7;
++}
++
++
++/* Structures to export the Wireless Handlers */
++static const iw_handler ath_handlers[] = {
++ (iw_handler) NULL, /* SIOCSIWCOMMIT */
++ (iw_handler) ar6000_ioctl_giwname, /* SIOCGIWNAME */
++ (iw_handler) NULL, /* SIOCSIWNWID */
++ (iw_handler) NULL, /* SIOCGIWNWID */
++ (iw_handler) ar6000_ioctl_siwfreq, /* SIOCSIWFREQ */
++ (iw_handler) ar6000_ioctl_giwfreq, /* SIOCGIWFREQ */
++ (iw_handler) ar6000_ioctl_siwmode, /* SIOCSIWMODE */
++ (iw_handler) ar6000_ioctl_giwmode, /* SIOCGIWMODE */
++ (iw_handler) ar6000_ioctl_siwsens, /* SIOCSIWSENS */
++ (iw_handler) ar6000_ioctl_giwsens, /* SIOCGIWSENS */
++ (iw_handler) NULL /* not _used */, /* SIOCSIWRANGE */
++ (iw_handler) ar6000_ioctl_giwrange, /* SIOCGIWRANGE */
++ (iw_handler) NULL /* not used */, /* SIOCSIWPRIV */
++ (iw_handler) NULL /* kernel code */, /* SIOCGIWPRIV */
++ (iw_handler) NULL /* not used */, /* SIOCSIWSTATS */
++ (iw_handler) NULL /* kernel code */, /* SIOCGIWSTATS */
++ (iw_handler) NULL, /* SIOCSIWSPY */
++ (iw_handler) NULL, /* SIOCGIWSPY */
++ (iw_handler) NULL, /* SIOCSIWTHRSPY */
++ (iw_handler) NULL, /* SIOCGIWTHRSPY */
++ (iw_handler) ar6000_ioctl_siwap, /* SIOCSIWAP */
++ (iw_handler) ar6000_ioctl_giwap, /* SIOCGIWAP */
++ (iw_handler) NULL, /* -- hole -- */
++ (iw_handler) ar6000_ioctl_iwaplist, /* SIOCGIWAPLIST */
++ (iw_handler) ar6000_ioctl_siwscan, /* SIOCSIWSCAN */
++ (iw_handler) ar6000_ioctl_giwscan, /* SIOCGIWSCAN */
++ (iw_handler) ar6000_ioctl_siwessid, /* SIOCSIWESSID */
++ (iw_handler) ar6000_ioctl_giwessid, /* SIOCGIWESSID */
++ (iw_handler) NULL, /* SIOCSIWNICKN */
++ (iw_handler) NULL, /* SIOCGIWNICKN */
++ (iw_handler) NULL, /* -- hole -- */
++ (iw_handler) NULL, /* -- hole -- */
++ (iw_handler) ar6000_ioctl_siwrate, /* SIOCSIWRATE */
++ (iw_handler) ar6000_ioctl_giwrate, /* SIOCGIWRATE */
++ (iw_handler) NULL, /* SIOCSIWRTS */
++ (iw_handler) NULL, /* SIOCGIWRTS */
++ (iw_handler) NULL, /* SIOCSIWFRAG */
++ (iw_handler) NULL, /* SIOCGIWFRAG */
++ (iw_handler) ar6000_ioctl_siwtxpow, /* SIOCSIWTXPOW */
++ (iw_handler) ar6000_ioctl_giwtxpow, /* SIOCGIWTXPOW */
++ (iw_handler) ar6000_ioctl_siwretry, /* SIOCSIWRETRY */
++ (iw_handler) ar6000_ioctl_giwretry, /* SIOCGIWRETRY */
++ (iw_handler) ar6000_ioctl_siwencode, /* SIOCSIWENCODE */
++ (iw_handler) ar6000_ioctl_giwencode, /* SIOCGIWENCODE */
++ (iw_handler) ar6000_ioctl_siwpower, /* SIOCSIWPOWER */
++ (iw_handler) ar6000_ioctl_giwpower, /* SIOCGIWPOWER */
++ (iw_handler) NULL, /* -- hole -- */
++ (iw_handler) NULL, /* -- hole -- */
++ (iw_handler) ar6000_ioctl_siwgenie, /* SIOCSIWGENIE */
++ (iw_handler) ar6000_ioctl_giwgenie, /* SIOCGIWGENIE */
++ (iw_handler) ar6000_ioctl_siwauth, /* SIOCSIWAUTH */
++ (iw_handler) ar6000_ioctl_giwauth, /* SIOCGIWAUTH */
++ (iw_handler) ar6000_ioctl_siwencodeext,/* SIOCSIWENCODEEXT */
++ (iw_handler) ar6000_ioctl_giwencodeext,/* SIOCGIWENCODEEXT */
++ (iw_handler) NULL, /* SIOCSIWPMKSA */
++};
++
++static const iw_handler ath_priv_handlers[] = {
++ (iw_handler) ar6000_ioctl_setparam, /* SIOCWFIRSTPRIV+0 */
++ (iw_handler) ar6000_ioctl_getparam, /* SIOCWFIRSTPRIV+1 */
++ (iw_handler) ar6000_ioctl_setkey, /* SIOCWFIRSTPRIV+2 */
++ (iw_handler) ar6000_ioctl_setwmmparams, /* SIOCWFIRSTPRIV+3 */
++ (iw_handler) ar6000_ioctl_delkey, /* SIOCWFIRSTPRIV+4 */
++ (iw_handler) ar6000_ioctl_getwmmparams, /* SIOCWFIRSTPRIV+5 */
++ (iw_handler) ar6000_ioctl_setoptie, /* SIOCWFIRSTPRIV+6 */
++ (iw_handler) ar6000_ioctl_setmlme, /* SIOCWFIRSTPRIV+7 */
++ (iw_handler) ar6000_ioctl_addpmkid, /* SIOCWFIRSTPRIV+8 */
++};
++
++#define IW_PRIV_TYPE_KEY \
++ (IW_PRIV_TYPE_BYTE | sizeof(struct ieee80211req_key))
++#define IW_PRIV_TYPE_DELKEY \
++ (IW_PRIV_TYPE_BYTE | sizeof(struct ieee80211req_del_key))
++#define IW_PRIV_TYPE_MLME \
++ (IW_PRIV_TYPE_BYTE | sizeof(struct ieee80211req_mlme))
++#define IW_PRIV_TYPE_ADDPMKID \
++ (IW_PRIV_TYPE_BYTE | sizeof(struct ieee80211req_addpmkid))
++
++static const struct iw_priv_args ar6000_priv_args[] = {
++ { IEEE80211_IOCTL_SETKEY,
++ IW_PRIV_TYPE_KEY | IW_PRIV_SIZE_FIXED, 0, "setkey"},
++ { IEEE80211_IOCTL_DELKEY,
++ IW_PRIV_TYPE_DELKEY | IW_PRIV_SIZE_FIXED, 0, "delkey"},
++ { IEEE80211_IOCTL_SETPARAM,
++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "setparam"},
++ { IEEE80211_IOCTL_GETPARAM,
++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getparam"},
++ { IEEE80211_IOCTL_SETWMMPARAMS,
++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 4, 0, "setwmmparams"},
++ { IEEE80211_IOCTL_GETWMMPARAMS,
++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
++ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getwmmparams"},
++ { IEEE80211_IOCTL_SETOPTIE,
++ IW_PRIV_TYPE_BYTE, 0, "setie"},
++ { IEEE80211_IOCTL_SETMLME,
++ IW_PRIV_TYPE_MLME, 0, "setmlme"},
++ { IEEE80211_IOCTL_ADDPMKID,
++ IW_PRIV_TYPE_ADDPMKID | IW_PRIV_SIZE_FIXED, 0, "addpmkid"},
++};
++
++void ar6000_ioctl_iwsetup(struct iw_handler_def *def)
++{
++ def->private_args = (struct iw_priv_args *)ar6000_priv_args;
++ def->num_private_args = ARRAY_SIZE(ar6000_priv_args);
++}
++
++struct iw_handler_def ath_iw_handler_def = {
++ .standard = (iw_handler *)ath_handlers,
++ .num_standard = ARRAY_SIZE(ath_handlers),
++ .private = (iw_handler *)ath_priv_handlers,
++ .num_private = ARRAY_SIZE(ath_priv_handlers),
++};
++
++
+diff --git a/drivers/ar6000/bmi/bmi.c b/drivers/ar6000/bmi/bmi.c
+new file mode 100644
+index 0000000..d7b610c
+--- /dev/null
++++ b/drivers/ar6000/bmi/bmi.c
+@@ -0,0 +1,657 @@
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "hif.h"
++#include "bmi.h"
++#include "htc_api.h"
++#include "bmi_internal.h"
++
++/*
++Although we had envisioned BMI to run on top of HTC, this is not what the
++final implementation boiled down to on dragon. Its a part of BSP and does
++not use the HTC protocol either. On the host side, however, we were still
++living with the original idea. I think the time has come to accept the truth
++and separate it from HTC which has been carrying BMI's burden all this while.
++It shall make HTC state machine relatively simpler
++*/
++
++/* APIs visible to the driver */
++void
++BMIInit(void)
++{
++ bmiDone = FALSE;
++}
++
++A_STATUS
++BMIDone(HIF_DEVICE *device)
++{
++ A_STATUS status;
++ A_UINT32 cid;
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF (ATH_DEBUG_BMI, ("BMIDone skipped\n"));
++ return A_OK;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Done: Enter (device: 0x%p)\n", device));
++ bmiDone = TRUE;
++ cid = BMI_DONE;
++
++ status = bmiBufferSend(device, (A_UCHAR *)&cid, sizeof(cid));
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Done: Exit\n"));
++
++ return A_OK;
++}
++
++A_STATUS
++BMIGetTargetInfo(HIF_DEVICE *device, struct bmi_target_info *targ_info)
++{
++ A_STATUS status;
++ A_UINT32 cid;
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Get Target Info: Enter (device: 0x%p)\n", device));
++ cid = BMI_GET_TARGET_INFO;
++
++ status = bmiBufferSend(device, (A_UCHAR *)&cid, sizeof(cid));
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++
++ status = bmiBufferReceive(device, (A_UCHAR *)&targ_info->target_ver,
++ sizeof(targ_info->target_ver));
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read Target Version from the device\n"));
++ return A_ERROR;
++ }
++
++ if (targ_info->target_ver == TARGET_VERSION_SENTINAL) {
++ /* Determine how many bytes are in the Target's targ_info */
++ status = bmiBufferReceive(device, (A_UCHAR *)&targ_info->target_info_byte_count,
++ sizeof(targ_info->target_info_byte_count));
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read Target Info Byte Count from the device\n"));
++ return A_ERROR;
++ }
++
++ /*
++ * The Target's targ_info doesn't match the Host's targ_info.
++ * We need to do some backwards compatibility work to make this OK.
++ */
++ A_ASSERT(targ_info->target_info_byte_count == sizeof(*targ_info));
++
++ /* Read the remainder of the targ_info */
++ status = bmiBufferReceive(device,
++ ((A_UCHAR *)targ_info)+sizeof(targ_info->target_info_byte_count),
++ sizeof(*targ_info)-sizeof(targ_info->target_info_byte_count));
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read Target Info (%d bytes) from the device\n",
++ targ_info->target_info_byte_count));
++ return A_ERROR;
++ }
++ } else {
++ /*
++ * Target must be an AR6001 whose firmware does not
++ * support BMI_GET_TARGET_INFO. Construct the data
++ * that it would have sent.
++ */
++ targ_info->target_info_byte_count = sizeof(targ_info);
++ targ_info->target_type = TARGET_TYPE_AR6001;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Get Target Info: Exit (ver: 0x%x type: 0x%x)\n",
++ targ_info->target_ver, targ_info->target_type));
++ printk("BMI Get Target Info: Exit (ver: 0x%x type: 0x%x)\n",
++ targ_info->target_ver, targ_info->target_type);
++
++ return A_OK;
++}
++
++A_STATUS
++BMIReadMemory(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UCHAR *buffer,
++ A_UINT32 length)
++{
++ A_UINT32 cid;
++ A_STATUS status;
++ A_UINT32 offset;
++ A_UINT32 remaining, rxlen;
++ static A_UCHAR data[BMI_DATASZ_MAX + sizeof(cid) + sizeof(address) + sizeof(length)];
++ memset (&data, 0, BMI_DATASZ_MAX + sizeof(cid) + sizeof(address) + sizeof(length));
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
++ ("BMI Read Memory: Enter (device: 0x%p, address: 0x%x, length: %d)\n",
++ device, address, length));
++
++ cid = BMI_READ_MEMORY;
++
++ remaining = length;
++
++ while (remaining)
++ {
++ rxlen = (remaining < BMI_DATASZ_MAX) ? remaining : BMI_DATASZ_MAX;
++ offset = 0;
++ A_MEMCPY(&data[offset], &cid, sizeof(cid));
++ offset += sizeof(cid);
++ A_MEMCPY(&data[offset], &address, sizeof(address));
++ offset += sizeof(address);
++ A_MEMCPY(&data[offset], &rxlen, sizeof(rxlen));
++ offset += sizeof(length);
++
++ status = bmiBufferSend(device, data, offset);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++ status = bmiBufferReceive(device, data, rxlen);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read from the device\n"));
++ return A_ERROR;
++ }
++ A_MEMCPY(&buffer[length - remaining], data, rxlen);
++ remaining -= rxlen; address += rxlen;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Read Memory: Exit\n"));
++ return A_OK;
++}
++
++A_STATUS
++BMIWriteMemory(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UCHAR *buffer,
++ A_UINT32 length)
++{
++ A_UINT32 cid;
++ A_STATUS status;
++ A_UINT32 offset;
++ A_UINT32 remaining, txlen;
++ const A_UINT32 header = sizeof(cid) + sizeof(address) + sizeof(length);
++ static A_UCHAR data[BMI_DATASZ_MAX + sizeof(cid) + sizeof(address) + sizeof(length)];
++ memset (&data, 0, header);
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
++ ("BMI Write Memory: Enter (device: 0x%p, address: 0x%x, length: %d)\n",
++ device, address, length));
++
++ cid = BMI_WRITE_MEMORY;
++
++ remaining = length;
++ while (remaining)
++ {
++ txlen = (remaining < (BMI_DATASZ_MAX - header)) ?
++ remaining : (BMI_DATASZ_MAX - header);
++ offset = 0;
++ A_MEMCPY(&data[offset], &cid, sizeof(cid));
++ offset += sizeof(cid);
++ A_MEMCPY(&data[offset], &address, sizeof(address));
++ offset += sizeof(address);
++ A_MEMCPY(&data[offset], &txlen, sizeof(txlen));
++ offset += sizeof(txlen);
++ A_MEMCPY(&data[offset], &buffer[length - remaining], txlen);
++ offset += txlen;
++ status = bmiBufferSend(device, data, offset);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++ remaining -= txlen; address += txlen;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Write Memory: Exit\n"));
++
++ return A_OK;
++}
++
++A_STATUS
++BMIExecute(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UINT32 *param)
++{
++ A_UINT32 cid;
++ A_STATUS status;
++ A_UINT32 offset;
++ static A_UCHAR data[sizeof(cid) + sizeof(address) + sizeof(*param)];
++ memset (&data, 0, sizeof(cid) + sizeof(address) + sizeof(*param));
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
++ ("BMI Execute: Enter (device: 0x%p, address: 0x%x, param: %d)\n",
++ device, address, *param));
++
++ cid = BMI_EXECUTE;
++
++ offset = 0;
++ A_MEMCPY(&data[offset], &cid, sizeof(cid));
++ offset += sizeof(cid);
++ A_MEMCPY(&data[offset], &address, sizeof(address));
++ offset += sizeof(address);
++ A_MEMCPY(&data[offset], param, sizeof(*param));
++ offset += sizeof(*param);
++ status = bmiBufferSend(device, data, offset);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++
++ status = bmiBufferReceive(device, data, sizeof(*param));
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read from the device\n"));
++ return A_ERROR;
++ }
++
++ A_MEMCPY(param, data, sizeof(*param));
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Execute: Exit (param: %d)\n", *param));
++ return A_OK;
++}
++
++A_STATUS
++BMISetAppStart(HIF_DEVICE *device,
++ A_UINT32 address)
++{
++ A_UINT32 cid;
++ A_STATUS status;
++ A_UINT32 offset;
++ static A_UCHAR data[sizeof(cid) + sizeof(address)];
++ memset (&data, 0, sizeof(cid) + sizeof(address));
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
++ ("BMI Set App Start: Enter (device: 0x%p, address: 0x%x)\n",
++ device, address));
++
++ cid = BMI_SET_APP_START;
++
++ offset = 0;
++ A_MEMCPY(&data[offset], &cid, sizeof(cid));
++ offset += sizeof(cid);
++ A_MEMCPY(&data[offset], &address, sizeof(address));
++ offset += sizeof(address);
++ status = bmiBufferSend(device, data, offset);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Set App Start: Exit\n"));
++ return A_OK;
++}
++
++A_STATUS
++BMIReadSOCRegister(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UINT32 *param)
++{
++ A_UINT32 cid;
++ A_STATUS status;
++ A_UINT32 offset;
++ static A_UCHAR data[sizeof(cid) + sizeof(address)];
++ memset (&data, 0, sizeof(cid) + sizeof(address));
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
++ ("BMI Read SOC Register: Enter (device: 0x%p, address: 0x%x)\n",
++ device, address));
++
++ cid = BMI_READ_SOC_REGISTER;
++
++ offset = 0;
++ A_MEMCPY(&data[offset], &cid, sizeof(cid));
++ offset += sizeof(cid);
++ A_MEMCPY(&data[offset], &address, sizeof(address));
++ offset += sizeof(address);
++
++ status = bmiBufferSend(device, data, offset);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++
++ status = bmiBufferReceive(device, data, sizeof(*param));
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read from the device\n"));
++ return A_ERROR;
++ }
++ A_MEMCPY(param, data, sizeof(*param));
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Read SOC Register: Exit (value: %d)\n", *param));
++ return A_OK;
++}
++
++A_STATUS
++BMIWriteSOCRegister(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UINT32 param)
++{
++ A_UINT32 cid;
++ A_STATUS status;
++ A_UINT32 offset;
++ static A_UCHAR data[sizeof(cid) + sizeof(address) + sizeof(param)];
++
++ memset (&data, 0, sizeof(cid) + sizeof(address) + sizeof(param));
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
++ ("BMI Write SOC Register: Enter (device: 0x%p, address: 0x%x, param: %d)\n",
++ device, address, param));
++
++ cid = BMI_WRITE_SOC_REGISTER;
++
++ offset = 0;
++ A_MEMCPY(&data[offset], &cid, sizeof(cid));
++ offset += sizeof(cid);
++ A_MEMCPY(&data[offset], &address, sizeof(address));
++ offset += sizeof(address);
++ A_MEMCPY(&data[offset], &param, sizeof(param));
++ offset += sizeof(param);
++ status = bmiBufferSend(device, data, offset);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Read SOC Register: Exit\n"));
++ return A_OK;
++}
++
++A_STATUS
++BMIrompatchInstall(HIF_DEVICE *device,
++ A_UINT32 ROM_addr,
++ A_UINT32 RAM_addr,
++ A_UINT32 nbytes,
++ A_UINT32 do_activate,
++ A_UINT32 *rompatch_id)
++{
++ A_UINT32 cid;
++ A_STATUS status;
++ A_UINT32 offset;
++ static A_UCHAR data[sizeof(cid) + sizeof(ROM_addr) + sizeof(RAM_addr) +
++ sizeof(nbytes) + sizeof(do_activate)];
++
++ memset (&data, 0, sizeof(cid) + sizeof(ROM_addr) + sizeof(RAM_addr) +
++ sizeof(nbytes) + sizeof(do_activate));
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
++ ("BMI rompatch Install: Enter (device: 0x%p, ROMaddr: 0x%x, RAMaddr: 0x%x length: %d activate: %d)\n",
++ device, ROM_addr, RAM_addr, nbytes, do_activate));
++
++ cid = BMI_ROMPATCH_INSTALL;
++
++ offset = 0;
++ A_MEMCPY(&data[offset], &cid, sizeof(cid));
++ offset += sizeof(cid);
++ A_MEMCPY(&data[offset], &ROM_addr, sizeof(ROM_addr));
++ offset += sizeof(ROM_addr);
++ A_MEMCPY(&data[offset], &RAM_addr, sizeof(RAM_addr));
++ offset += sizeof(RAM_addr);
++ A_MEMCPY(&data[offset], &nbytes, sizeof(nbytes));
++ offset += sizeof(nbytes);
++ A_MEMCPY(&data[offset], &do_activate, sizeof(do_activate));
++ offset += sizeof(do_activate);
++ status = bmiBufferSend(device, data, offset);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++
++ status = bmiBufferReceive(device, (A_UCHAR *)rompatch_id, sizeof(*rompatch_id));
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read from the device\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI rompatch Install: (rompatch_id=%d)\n", *rompatch_id));
++ return A_OK;
++}
++
++A_STATUS
++BMIrompatchUninstall(HIF_DEVICE *device,
++ A_UINT32 rompatch_id)
++{
++ A_UINT32 cid;
++ A_STATUS status;
++ A_UINT32 offset;
++ static A_UCHAR data[sizeof(cid) + sizeof(rompatch_id)];
++ memset (&data, 0, sizeof(cid) + sizeof(rompatch_id));
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
++ ("BMI rompatch Uninstall: Enter (device: 0x%p, rompatch_id: %d)\n",
++ device, rompatch_id));
++
++ cid = BMI_ROMPATCH_UNINSTALL;
++
++ offset = 0;
++ A_MEMCPY(&data[offset], &cid, sizeof(cid));
++ offset += sizeof(cid);
++ A_MEMCPY(&data[offset], &rompatch_id, sizeof(rompatch_id));
++ offset += sizeof(rompatch_id);
++ status = bmiBufferSend(device, data, offset);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI rompatch UNinstall: (rompatch_id=0x%x)\n", rompatch_id));
++ return A_OK;
++}
++
++static A_STATUS
++_BMIrompatchChangeActivation(HIF_DEVICE *device,
++ A_UINT32 rompatch_count,
++ A_UINT32 *rompatch_list,
++ A_UINT32 do_activate)
++{
++ A_UINT32 cid;
++ A_STATUS status;
++ A_UINT32 offset;
++ static A_UCHAR data[BMI_DATASZ_MAX + sizeof(cid) + sizeof(rompatch_count)];
++ A_UINT32 length;
++
++ memset (&data, 0, BMI_DATASZ_MAX + sizeof(cid) + sizeof(rompatch_count));
++
++ if (bmiDone) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
++ ("BMI Change rompatch Activation: Enter (device: 0x%p, count: %d)\n",
++ device, rompatch_count));
++
++ cid = do_activate ? BMI_ROMPATCH_ACTIVATE : BMI_ROMPATCH_DEACTIVATE;
++
++ offset = 0;
++ A_MEMCPY(&data[offset], &cid, sizeof(cid));
++ offset += sizeof(cid);
++ A_MEMCPY(&data[offset], &rompatch_count, sizeof(rompatch_count));
++ offset += sizeof(rompatch_count);
++ length = rompatch_count * sizeof(*rompatch_list);
++ A_MEMCPY(&data[offset], rompatch_list, length);
++ offset += length;
++ status = bmiBufferSend(device, data, offset);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
++ return A_ERROR;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Change rompatch Activation: Exit\n"));
++
++ return A_OK;
++}
++
++A_STATUS
++BMIrompatchActivate(HIF_DEVICE *device,
++ A_UINT32 rompatch_count,
++ A_UINT32 *rompatch_list)
++{
++ return _BMIrompatchChangeActivation(device, rompatch_count, rompatch_list, 1);
++}
++
++A_STATUS
++BMIrompatchDeactivate(HIF_DEVICE *device,
++ A_UINT32 rompatch_count,
++ A_UINT32 *rompatch_list)
++{
++ return _BMIrompatchChangeActivation(device, rompatch_count, rompatch_list, 0);
++}
++
++/* BMI Access routines */
++A_STATUS
++bmiBufferSend(HIF_DEVICE *device,
++ A_UCHAR *buffer,
++ A_UINT32 length)
++{
++ A_STATUS status;
++ A_UINT32 timeout;
++ A_UINT32 address;
++ static A_UINT32 cmdCredits;
++ A_UINT32 mboxAddress[HTC_MAILBOX_NUM_MAX];
++
++ HIFConfigureDevice(device, HIF_DEVICE_GET_MBOX_ADDR,
++ &mboxAddress, sizeof(mboxAddress));
++
++ cmdCredits = 0;
++ timeout = BMI_COMMUNICATION_TIMEOUT;
++
++ while(timeout-- && !cmdCredits) {
++ /* Read the counter register to get the command credits */
++ address = COUNT_DEC_ADDRESS + (HTC_MAILBOX_NUM_MAX + ENDPOINT1) * 4;
++ /* hit the credit counter with a 4-byte access, the first byte read will hit the counter and cause
++ * a decrement, while the remaining 3 bytes has no effect. The rationale behind this is to
++ * make all HIF accesses 4-byte aligned */
++ status = HIFReadWrite(device, address, (A_UINT8 *)&cmdCredits, 4,
++ HIF_RD_SYNC_BYTE_INC, NULL);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to decrement the command credit count register\n"));
++ return A_ERROR;
++ }
++ /* the counter is only 8=bits, ignore anything in the upper 3 bytes */
++ cmdCredits &= 0xFF;
++ }
++
++ if (cmdCredits) {
++ address = mboxAddress[ENDPOINT1];
++ status = HIFReadWrite(device, address, buffer, length,
++ HIF_WR_SYNC_BYTE_INC, NULL);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to send the BMI data to the device\n"));
++ return A_ERROR;
++ }
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("BMI Communication timeout\n"));
++ return A_ERROR;
++ }
++
++ return status;
++}
++
++A_STATUS
++bmiBufferReceive(HIF_DEVICE *device,
++ A_UCHAR *buffer,
++ A_UINT32 length)
++{
++ A_STATUS status;
++ A_UINT32 address;
++ A_UINT32 timeout;
++ static A_UINT32 cmdCredits;
++ A_UINT32 mboxAddress[HTC_MAILBOX_NUM_MAX];
++
++ HIFConfigureDevice(device, HIF_DEVICE_GET_MBOX_ADDR,
++ &mboxAddress, sizeof(mboxAddress));
++
++ cmdCredits = 0;
++ timeout = BMI_COMMUNICATION_TIMEOUT;
++ while(timeout-- && !cmdCredits) {
++ /* Read the counter register to get the command credits */
++ address = COUNT_ADDRESS + (HTC_MAILBOX_NUM_MAX + ENDPOINT1) * 1;
++ /* read the counter using a 4-byte read. Since the counter is NOT auto-decrementing,
++ * we can read this counter multiple times using a non-incrementing address mode.
++ * The rationale here is to make all HIF accesses a multiple of 4 bytes */
++ status = HIFReadWrite(device, address, (A_UINT8 *)&cmdCredits, sizeof(cmdCredits),
++ HIF_RD_SYNC_BYTE_FIX, NULL);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read the command credit count register\n"));
++ return A_ERROR;
++ }
++ /* we did a 4-byte read to the same count register so mask off upper bytes */
++ cmdCredits &= 0xFF;
++ status = A_ERROR;
++ }
++
++ if (cmdCredits) {
++ address = mboxAddress[ENDPOINT1];
++ status = HIFReadWrite(device, address, buffer, length,
++ HIF_RD_SYNC_BYTE_INC, NULL);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read the BMI data from the device\n"));
++ return A_ERROR;
++ }
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Communication timeout\n"));
++ return A_ERROR;
++ }
++
++ return status;
++}
+diff --git a/drivers/ar6000/bmi/bmi_internal.h b/drivers/ar6000/bmi/bmi_internal.h
+new file mode 100644
+index 0000000..1e21354
+--- /dev/null
++++ b/drivers/ar6000/bmi/bmi_internal.h
+@@ -0,0 +1,45 @@
++#ifndef BMI_INTERNAL_H
++#define BMI_INTERNAL_H
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "a_config.h"
++#include "athdefs.h"
++#include "a_types.h"
++#include "a_osapi.h"
++#include "a_debug.h"
++#include "AR6Khwreg.h"
++#include "bmi_msg.h"
++
++#define BMI_COMMUNICATION_TIMEOUT 100000
++
++/* ------ Global Variable Declarations ------- */
++A_BOOL bmiDone;
++
++A_STATUS
++bmiBufferSend(HIF_DEVICE *device,
++ A_UCHAR *buffer,
++ A_UINT32 length);
++
++A_STATUS
++bmiBufferReceive(HIF_DEVICE *device,
++ A_UCHAR *buffer,
++ A_UINT32 length);
++
++#endif
+diff --git a/drivers/ar6000/hif/hif.c b/drivers/ar6000/hif/hif.c
+new file mode 100644
+index 0000000..d04486c
+--- /dev/null
++++ b/drivers/ar6000/hif/hif.c
+@@ -0,0 +1,824 @@
++/*
++ * @file: hif.c
++ *
++ * @abstract: HIF layer reference implementation for Atheros SDIO stack
++ *
++ * @notice: Copyright (c) 2004-2006 Atheros Communications Inc.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "hif_internal.h"
++
++/* ------ Static Variables ------ */
++
++/* ------ Global Variable Declarations ------- */
++SD_PNP_INFO Ids[] = {
++ {
++ .SDIO_ManufacturerID = MANUFACTURER_ID_AR6001_BASE | 0xB,
++ .SDIO_ManufacturerCode = MANUFACTURER_CODE,
++ .SDIO_FunctionClass = FUNCTION_CLASS,
++ .SDIO_FunctionNo = 1
++ },
++ {
++ .SDIO_ManufacturerID = MANUFACTURER_ID_AR6001_BASE | 0xA,
++ .SDIO_ManufacturerCode = MANUFACTURER_CODE,
++ .SDIO_FunctionClass = FUNCTION_CLASS,
++ .SDIO_FunctionNo = 1
++ },
++ {
++ .SDIO_ManufacturerID = MANUFACTURER_ID_AR6001_BASE | 0x9,
++ .SDIO_ManufacturerCode = MANUFACTURER_CODE,
++ .SDIO_FunctionClass = FUNCTION_CLASS,
++ .SDIO_FunctionNo = 1
++ },
++ {
++ .SDIO_ManufacturerID = MANUFACTURER_ID_AR6001_BASE | 0x8,
++ .SDIO_ManufacturerCode = MANUFACTURER_CODE,
++ .SDIO_FunctionClass = FUNCTION_CLASS,
++ .SDIO_FunctionNo = 1
++ },
++ {
++ .SDIO_ManufacturerID = MANUFACTURER_ID_AR6002_BASE | 0x0,
++ .SDIO_ManufacturerCode = MANUFACTURER_CODE,
++ .SDIO_FunctionClass = FUNCTION_CLASS,
++ .SDIO_FunctionNo = 1
++ },
++ {
++ .SDIO_ManufacturerID = MANUFACTURER_ID_AR6002_BASE | 0x1,
++ .SDIO_ManufacturerCode = MANUFACTURER_CODE,
++ .SDIO_FunctionClass = FUNCTION_CLASS,
++ .SDIO_FunctionNo = 1
++ },
++ {
++ } //list is null termintaed
++};
++
++TARGET_FUNCTION_CONTEXT FunctionContext = {
++ .function.Version = CT_SDIO_STACK_VERSION_CODE,
++ .function.pName = "sdio_wlan",
++ .function.MaxDevices = 1,
++ .function.NumDevices = 0,
++ .function.pIds = Ids,
++ .function.pProbe = hifDeviceInserted,
++ .function.pRemove = hifDeviceRemoved,
++ .function.pSuspend = NULL,
++ .function.pResume = NULL,
++ .function.pWake = NULL,
++ .function.pContext = &FunctionContext,
++};
++
++HIF_DEVICE hifDevice[HIF_MAX_DEVICES];
++HTC_CALLBACKS htcCallbacks;
++BUS_REQUEST busRequest[BUS_REQUEST_MAX_NUM];
++static BUS_REQUEST *s_busRequestFreeQueue = NULL;
++OS_CRITICALSECTION lock;
++extern A_UINT32 onebitmode;
++extern A_UINT32 busspeedlow;
++
++#ifdef DEBUG
++extern A_UINT32 debughif;
++#define ATH_DEBUG_ERROR 1
++#define ATH_DEBUG_WARN 2
++#define ATH_DEBUG_TRACE 3
++#define _AR_DEBUG_PRINTX_ARG(arg...) arg
++#define AR_DEBUG_PRINTF(lvl, args)\
++ {if (lvl <= debughif)\
++ A_PRINTF(KERN_ALERT _AR_DEBUG_PRINTX_ARG args);\
++ }
++#else
++#define AR_DEBUG_PRINTF(lvl, args)
++#endif
++
++static BUS_REQUEST *hifAllocateBusRequest(void);
++static void hifFreeBusRequest(BUS_REQUEST *busrequest);
++static THREAD_RETURN insert_helper_func(POSKERNEL_HELPER pHelper);
++static void ResetAllCards(void);
++
++/* ------ Functions ------ */
++int HIFInit(HTC_CALLBACKS *callbacks)
++{
++ SDIO_STATUS status;
++ DBG_ASSERT(callbacks != NULL);
++
++ /* Store the callback and event handlers */
++ htcCallbacks.deviceInsertedHandler = callbacks->deviceInsertedHandler;
++ htcCallbacks.deviceRemovedHandler = callbacks->deviceRemovedHandler;
++ htcCallbacks.deviceSuspendHandler = callbacks->deviceSuspendHandler;
++ htcCallbacks.deviceResumeHandler = callbacks->deviceResumeHandler;
++ htcCallbacks.deviceWakeupHandler = callbacks->deviceWakeupHandler;
++ htcCallbacks.rwCompletionHandler = callbacks->rwCompletionHandler;
++ htcCallbacks.dsrHandler = callbacks->dsrHandler;
++
++ CriticalSectionInit(&lock);
++
++ /* Register with bus driver core */
++ status = SDIO_RegisterFunction(&FunctionContext.function);
++ DBG_ASSERT(SDIO_SUCCESS(status));
++
++ return(0);
++}
++
++A_STATUS
++HIFReadWrite(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UCHAR *buffer,
++ A_UINT32 length,
++ A_UINT32 request,
++ void *context)
++{
++ A_UINT8 rw;
++ A_UINT8 mode;
++ A_UINT8 funcNo;
++ A_UINT8 opcode;
++ A_UINT16 count;
++ SDREQUEST *sdrequest;
++ SDIO_STATUS sdiostatus;
++ BUS_REQUEST *busrequest;
++ A_STATUS status = A_OK;
++
++ DBG_ASSERT(device != NULL);
++ DBG_ASSERT(device->handle != NULL);
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Device: %p\n", device));
++
++ do {
++ busrequest = hifAllocateBusRequest();
++ if (busrequest == NULL) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR, ("HIF Unable to allocate bus request\n"));
++ status = A_NO_RESOURCE;
++ break;
++ }
++
++ sdrequest = busrequest->request;
++ busrequest->context = context;
++
++ sdrequest->pDataBuffer = buffer;
++ if (request & HIF_SYNCHRONOUS) {
++ sdrequest->Flags = SDREQ_FLAGS_RESP_SDIO_R5 | SDREQ_FLAGS_DATA_TRANS;
++ sdrequest->pCompleteContext = NULL;
++ sdrequest->pCompletion = NULL;
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Execution mode: Synchronous\n"));
++ } else if (request & HIF_ASYNCHRONOUS) {
++ sdrequest->Flags = SDREQ_FLAGS_RESP_SDIO_R5 | SDREQ_FLAGS_DATA_TRANS |
++ SDREQ_FLAGS_TRANS_ASYNC;
++ sdrequest->pCompleteContext = busrequest;
++ sdrequest->pCompletion = hifRWCompletionHandler;
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Execution mode: Asynchronous\n"));
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Invalid execution mode: 0x%08x\n", request));
++ status = A_EINVAL;
++ break;
++ }
++
++ if (request & HIF_EXTENDED_IO) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Command type: CMD53\n"));
++ sdrequest->Command = CMD53;
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Invalid command type: 0x%08x\n", request));
++ status = A_EINVAL;
++ break;
++ }
++
++ if (request & HIF_BLOCK_BASIS) {
++ mode = CMD53_BLOCK_BASIS;
++ sdrequest->BlockLen = HIF_MBOX_BLOCK_SIZE;
++ sdrequest->BlockCount = length / HIF_MBOX_BLOCK_SIZE;
++ count = sdrequest->BlockCount;
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
++ ("Block mode (BlockLen: %d, BlockCount: %d)\n",
++ sdrequest->BlockLen, sdrequest->BlockCount));
++ } else if (request & HIF_BYTE_BASIS) {
++ mode = CMD53_BYTE_BASIS;
++ sdrequest->BlockLen = length;
++ sdrequest->BlockCount = 1;
++ count = sdrequest->BlockLen;
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
++ ("Byte mode (BlockLen: %d, BlockCount: %d)\n",
++ sdrequest->BlockLen, sdrequest->BlockCount));
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Invalid data mode: 0x%08x\n", request));
++ status = A_EINVAL;
++ break;
++ }
++
++#if 0
++ /* useful for checking register accesses */
++ if (length & 0x3) {
++ A_PRINTF(KERN_ALERT"HIF (%s) is not a multiple of 4 bytes, addr:0x%X, len:%d\n",
++ request & HIF_WRITE ? "write":"read", address, length);
++ }
++#endif
++
++ if ((address >= HIF_MBOX_START_ADDR(0)) &&
++ (address <= HIF_MBOX_END_ADDR(3)))
++ {
++
++ DBG_ASSERT(length <= HIF_MBOX_WIDTH);
++
++ /*
++ * Mailbox write. Adjust the address so that the last byte
++ * falls on the EOM address.
++ */
++ address += (HIF_MBOX_WIDTH - length);
++ }
++
++
++
++ if (request & HIF_WRITE) {
++ rw = CMD53_WRITE;
++ sdrequest->Flags |= SDREQ_FLAGS_DATA_WRITE;
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Direction: Write\n"));
++ } else if (request & HIF_READ) {
++ rw = CMD53_READ;
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Direction: Read\n"));
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Invalid direction: 0x%08x\n", request));
++ status = A_EINVAL;
++ break;
++ }
++
++ if (request & HIF_FIXED_ADDRESS) {
++ opcode = CMD53_FIXED_ADDRESS;
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Address mode: Fixed\n"));
++ } else if (request & HIF_INCREMENTAL_ADDRESS) {
++ opcode = CMD53_INCR_ADDRESS;
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Address mode: Incremental\n"));
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Invalid address mode: 0x%08x\n", request));
++ status = A_EINVAL;
++ break;
++ }
++
++ funcNo = SDDEVICE_GET_SDIO_FUNCNO(device->handle);
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Function number: %d\n", funcNo));
++ SDIO_SET_CMD53_ARG(sdrequest->Argument, rw, funcNo,
++ mode, opcode, address, count);
++
++ /* Send the command out */
++ sdiostatus = SDDEVICE_CALL_REQUEST_FUNC(device->handle, sdrequest);
++
++ if (!SDIO_SUCCESS(sdiostatus)) {
++ status = A_ERROR;
++ }
++
++ } while (FALSE);
++
++ if (A_FAILED(status) || (request & HIF_SYNCHRONOUS)) {
++ if (busrequest != NULL) {
++ hifFreeBusRequest(busrequest);
++ }
++ }
++
++ if (A_FAILED(status) && (request & HIF_ASYNCHRONOUS)) {
++ /* call back async handler on failure */
++ htcCallbacks.rwCompletionHandler(context, status);
++ }
++
++ return status;
++}
++
++A_STATUS
++HIFConfigureDevice(HIF_DEVICE *device, HIF_DEVICE_CONFIG_OPCODE opcode,
++ void *config, A_UINT32 configLen)
++{
++ A_UINT32 count;
++
++ switch(opcode) {
++ case HIF_DEVICE_GET_MBOX_BLOCK_SIZE:
++ ((A_UINT32 *)config)[0] = HIF_MBOX0_BLOCK_SIZE;
++ ((A_UINT32 *)config)[1] = HIF_MBOX1_BLOCK_SIZE;
++ ((A_UINT32 *)config)[2] = HIF_MBOX2_BLOCK_SIZE;
++ ((A_UINT32 *)config)[3] = HIF_MBOX3_BLOCK_SIZE;
++ break;
++
++ case HIF_DEVICE_GET_MBOX_ADDR:
++ for (count = 0; count < 4; count ++) {
++ ((A_UINT32 *)config)[count] = HIF_MBOX_START_ADDR(count);
++ }
++ break;
++ case HIF_DEVICE_GET_IRQ_PROC_MODE:
++ /* the SDIO stack allows the interrupts to be processed either way, ASYNC or SYNC */
++ *((HIF_DEVICE_IRQ_PROCESSING_MODE *)config) = HIF_DEVICE_IRQ_ASYNC_SYNC;
++ break;
++ default:
++ AR_DEBUG_PRINTF(ATH_DEBUG_WARN,
++ ("Unsupported configuration opcode: %d\n", opcode));
++ return A_ERROR;
++ }
++
++ return A_OK;
++}
++
++void
++HIFShutDownDevice(HIF_DEVICE *device)
++{
++ A_UINT8 data;
++ A_UINT32 count;
++ SDIO_STATUS status;
++ SDCONFIG_BUS_MODE_DATA busSettings;
++ SDCONFIG_FUNC_ENABLE_DISABLE_DATA fData;
++
++ if (device != NULL) {
++ DBG_ASSERT(device->handle != NULL);
++
++ /* Remove the allocated current if any */
++ status = SDLIB_IssueConfig(device->handle,
++ SDCONFIG_FUNC_FREE_SLOT_CURRENT, NULL, 0);
++ DBG_ASSERT(SDIO_SUCCESS(status));
++
++ /* Disable the card */
++ fData.EnableFlags = SDCONFIG_DISABLE_FUNC;
++ fData.TimeOut = 1;
++ status = SDLIB_IssueConfig(device->handle, SDCONFIG_FUNC_ENABLE_DISABLE,
++ &fData, sizeof(fData));
++ DBG_ASSERT(SDIO_SUCCESS(status));
++
++ /* Perform a soft I/O reset */
++ data = SDIO_IO_RESET;
++ status = SDLIB_IssueCMD52(device->handle, 0, SDIO_IO_ABORT_REG,
++ &data, 1, 1);
++ DBG_ASSERT(SDIO_SUCCESS(status));
++
++ /*
++ * WAR - Codetelligence driver does not seem to shutdown correctly in 1
++ * bit mode. By default it configures the HC in the 4 bit. Its later in
++ * our driver that we switch to 1 bit mode. If we try to shutdown, the
++ * driver hangs so we revert to 4 bit mode, to be transparent to the
++ * underlying bus driver.
++ */
++ if (onebitmode) {
++ ZERO_OBJECT(busSettings);
++ busSettings.BusModeFlags = SDDEVICE_GET_BUSMODE_FLAGS(device->handle);
++ SDCONFIG_SET_BUS_WIDTH(busSettings.BusModeFlags,
++ SDCONFIG_BUS_WIDTH_4_BIT);
++
++ /* Issue config request to change the bus width to 4 bit */
++ status = SDLIB_IssueConfig(device->handle, SDCONFIG_BUS_MODE_CTRL,
++ &busSettings,
++ sizeof(SDCONFIG_BUS_MODE_DATA));
++ DBG_ASSERT(SDIO_SUCCESS(status));
++ }
++
++ /* Free the bus requests */
++ for (count = 0; count < BUS_REQUEST_MAX_NUM; count ++) {
++ SDDeviceFreeRequest(device->handle, busRequest[count].request);
++ }
++ /* Clean up the queue */
++ s_busRequestFreeQueue = NULL;
++ } else {
++ /* since we are unloading the driver anyways, reset all cards in case the SDIO card
++ * is externally powered and we are unloading the SDIO stack. This avoids the problem when
++ * the SDIO stack is reloaded and attempts are made to re-enumerate a card that is already
++ * enumerated */
++ ResetAllCards();
++ /* Unregister with bus driver core */
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
++ ("Unregistering with the bus driver\n"));
++ status = SDIO_UnregisterFunction(&FunctionContext.function);
++ DBG_ASSERT(SDIO_SUCCESS(status));
++ }
++}
++
++void
++hifRWCompletionHandler(SDREQUEST *request)
++{
++ A_STATUS status;
++ void *context;
++ BUS_REQUEST *busrequest;
++
++ if (SDIO_SUCCESS(request->Status)) {
++ status = A_OK;
++ } else {
++ status = A_ERROR;
++ }
++
++ DBG_ASSERT(status == A_OK);
++ busrequest = (BUS_REQUEST *) request->pCompleteContext;
++ context = (void *) busrequest->context;
++ /* free the request before calling the callback, in case the
++ * callback submits another request, this guarantees that
++ * there is at least 1 free request available everytime the callback
++ * is invoked */
++ hifFreeBusRequest(busrequest);
++ htcCallbacks.rwCompletionHandler(context, status);
++}
++
++void
++hifIRQHandler(void *context)
++{
++ A_STATUS status;
++ HIF_DEVICE *device;
++
++ device = (HIF_DEVICE *)context;
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Device: %p\n", device));
++ status = htcCallbacks.dsrHandler(device->htc_handle);
++ DBG_ASSERT(status == A_OK);
++}
++
++BOOL
++hifDeviceInserted(SDFUNCTION *function, SDDEVICE *handle)
++{
++ BOOL enabled;
++ A_UINT8 data;
++ A_UINT32 count;
++ HIF_DEVICE *device;
++ SDIO_STATUS status;
++ A_UINT16 maxBlocks;
++ A_UINT16 maxBlockSize;
++ SDCONFIG_BUS_MODE_DATA busSettings;
++ SDCONFIG_FUNC_ENABLE_DISABLE_DATA fData;
++ TARGET_FUNCTION_CONTEXT *functionContext;
++ SDCONFIG_FUNC_SLOT_CURRENT_DATA slotCurrent;
++ SD_BUSCLOCK_RATE currentBusClock;
++
++ DBG_ASSERT(function != NULL);
++ DBG_ASSERT(handle != NULL);
++
++ device = addHifDevice(handle);
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Device: %p\n", device));
++ functionContext = (TARGET_FUNCTION_CONTEXT *)function->pContext;
++
++ /*
++ * Issue commands to get the manufacturer ID and stuff and compare it
++ * against the rev Id derived from the ID registered during the
++ * initialization process. Report the device only in the case there
++ * is a match. In the case od SDIO, the bus driver has already queried
++ * these details so we just need to use their data structures to get the
++ * relevant values. Infact, the driver has already matched it against
++ * the Ids that we registered with it so we dont need to the step here.
++ */
++
++ /* Configure the SDIO Bus Width */
++ if (onebitmode) {
++ data = SDIO_BUS_WIDTH_1_BIT;
++ status = SDLIB_IssueCMD52(handle, 0, SDIO_BUS_IF_REG, &data, 1, 1);
++ if (!SDIO_SUCCESS(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Unable to set the bus width to 1 bit\n"));
++ return FALSE;
++ }
++ }
++
++ /* Get current bus flags */
++ ZERO_OBJECT(busSettings);
++
++ busSettings.BusModeFlags = SDDEVICE_GET_BUSMODE_FLAGS(handle);
++ if (onebitmode) {
++ SDCONFIG_SET_BUS_WIDTH(busSettings.BusModeFlags,
++ SDCONFIG_BUS_WIDTH_1_BIT);
++ }
++
++ /* get the current operating clock, the bus driver sets us up based
++ * on what our CIS reports and what the host controller can handle
++ * we can use this to determine whether we want to drop our clock rate
++ * down */
++ currentBusClock = SDDEVICE_GET_OPER_CLOCK(handle);
++ busSettings.ClockRate = currentBusClock;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
++ ("HIF currently running at: %d \n",currentBusClock));
++
++ /* see if HIF wants to run at a lower clock speed, we may already be
++ * at that lower clock speed */
++ if (currentBusClock > (SDIO_CLOCK_FREQUENCY_DEFAULT >> busspeedlow)) {
++ busSettings.ClockRate = SDIO_CLOCK_FREQUENCY_DEFAULT >> busspeedlow;
++ AR_DEBUG_PRINTF(ATH_DEBUG_WARN,
++ ("HIF overriding clock to %d \n",busSettings.ClockRate));
++ }
++
++ /* Issue config request to override clock rate */
++ status = SDLIB_IssueConfig(handle, SDCONFIG_FUNC_CHANGE_BUS_MODE, &busSettings,
++ sizeof(SDCONFIG_BUS_MODE_DATA));
++ if (!SDIO_SUCCESS(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Unable to configure the host clock\n"));
++ return FALSE;
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
++ ("Configured clock: %d, Maximum clock: %d\n",
++ busSettings.ActualClockRate,
++ SDDEVICE_GET_MAX_CLOCK(handle)));
++ }
++
++ /*
++ * Check if the target supports block mode. This result of this check
++ * can be used to implement the HIFReadWrite API.
++ */
++ if (SDDEVICE_GET_SDIO_FUNC_MAXBLKSIZE(handle)) {
++ /* Limit block size to operational block limit or card function
++ capability */
++ maxBlockSize = min(SDDEVICE_GET_OPER_BLOCK_LEN(handle),
++ SDDEVICE_GET_SDIO_FUNC_MAXBLKSIZE(handle));
++
++ /* check if the card support multi-block transfers */
++ if (!(SDDEVICE_GET_SDIOCARD_CAPS(handle) & SDIO_CAPS_MULTI_BLOCK)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Byte basis only\n"));
++
++ /* Limit block size to max byte basis */
++ maxBlockSize = min(maxBlockSize,
++ (A_UINT16)SDIO_MAX_LENGTH_BYTE_BASIS);
++ maxBlocks = 1;
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Multi-block capable\n"));
++ maxBlocks = SDDEVICE_GET_OPER_BLOCKS(handle);
++ status = SDLIB_SetFunctionBlockSize(handle, HIF_MBOX_BLOCK_SIZE);
++ if (!SDIO_SUCCESS(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Failed to set block size. Err:%d\n", status));
++ return FALSE;
++ }
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
++ ("Bytes Per Block: %d bytes, Block Count:%d \n",
++ maxBlockSize, maxBlocks));
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Function does not support Block Mode!\n"));
++ return FALSE;
++ }
++
++ /* Allocate the slot current */
++ status = SDLIB_GetDefaultOpCurrent(handle, &slotCurrent.SlotCurrent);
++ if (SDIO_SUCCESS(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Allocating Slot current: %d mA\n",
++ slotCurrent.SlotCurrent));
++ status = SDLIB_IssueConfig(handle, SDCONFIG_FUNC_ALLOC_SLOT_CURRENT,
++ &slotCurrent, sizeof(slotCurrent));
++ if (!SDIO_SUCCESS(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Failed to allocate slot current %d\n", status));
++ return FALSE;
++ }
++ }
++
++ /* Enable the dragon function */
++ count = 0;
++ enabled = FALSE;
++ fData.TimeOut = 1;
++ fData.EnableFlags = SDCONFIG_ENABLE_FUNC;
++ while ((count++ < SDWLAN_ENABLE_DISABLE_TIMEOUT) && !enabled)
++ {
++ /* Enable dragon */
++ status = SDLIB_IssueConfig(handle, SDCONFIG_FUNC_ENABLE_DISABLE,
++ &fData, sizeof(fData));
++ if (!SDIO_SUCCESS(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
++ ("Attempting to enable the card again\n"));
++ continue;
++ }
++
++ /* Mark the status as enabled */
++ enabled = TRUE;
++ }
++
++ /* Check if we were succesful in enabling the target */
++ if (!enabled) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
++ ("Failed to communicate with the target\n"));
++ return FALSE;
++ }
++
++ /* Allocate the bus requests to be used later */
++ A_MEMZERO(busRequest, sizeof(busRequest));
++ for (count = 0; count < BUS_REQUEST_MAX_NUM; count ++) {
++ if ((busRequest[count].request = SDDeviceAllocRequest(handle)) == NULL){
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERROR, ("Unable to allocate memory\n"));
++ /* TODO: Free the memory that has already been allocated */
++ return FALSE;
++ }
++ hifFreeBusRequest(&busRequest[count]);
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
++ ("0x%08x = busRequest[%d].request = 0x%08x\n",
++ (unsigned int) &busRequest[count], count,
++ (unsigned int) busRequest[count].request));
++ }
++
++ /* Schedule a worker to handle device inserted, this is a temporary workaround
++ * to fix a deadlock if the device fails to intialize in the insertion handler
++ * The failure causes the instance to shutdown the HIF layer and unregister the
++ * function driver within the busdriver probe context which can deadlock
++ *
++ * NOTE: we cannot use the default work queue because that would block
++ * SD bus request processing for all synchronous I/O. We must use a kernel
++ * thread that is creating using the helper library.
++ * */
++
++ if (SDIO_SUCCESS(SDLIB_OSCreateHelper(&device->insert_helper,
++ insert_helper_func,
++ device))) {
++ device->helper_started = TRUE;
++ }
++
++ return TRUE;
++}
++
++static THREAD_RETURN insert_helper_func(POSKERNEL_HELPER pHelper)
++{
++
++ /*
++ * Adding a wait of around a second before we issue the very first
++ * command to dragon. During the process of loading/unloading the
++ * driver repeatedly it was observed that we get a data timeout
++ * while accessing function 1 registers in the chip. The theory at
++ * this point is that some initialization delay in dragon is
++ * causing the SDIO state in dragon core to be not ready even after
++ * the ready bit indicates that function 1 is ready. Accomodating
++ * for this behavior by adding some delay in the driver before it
++ * issues the first command after switching on dragon. Need to
++ * investigate this a bit more - TODO
++ */
++
++ A_MDELAY(1000);
++ /* Inform HTC */
++ if ((htcCallbacks.deviceInsertedHandler(SD_GET_OS_HELPER_CONTEXT(pHelper))) != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Device rejected\n"));
++ }
++
++ return 0;
++}
++
++void
++HIFAckInterrupt(HIF_DEVICE *device)
++{
++ SDIO_STATUS status;
++ DBG_ASSERT(device != NULL);
++ DBG_ASSERT(device->handle != NULL);
++
++ /* Acknowledge our function IRQ */
++ status = SDLIB_IssueConfig(device->handle, SDCONFIG_FUNC_ACK_IRQ,
++ NULL, 0);
++ DBG_ASSERT(SDIO_SUCCESS(status));
++}
++
++void
++HIFUnMaskInterrupt(HIF_DEVICE *device)
++{
++ SDIO_STATUS status;
++
++ DBG_ASSERT(device != NULL);
++ DBG_ASSERT(device->handle != NULL);
++
++ /* Register the IRQ Handler */
++ SDDEVICE_SET_IRQ_HANDLER(device->handle, hifIRQHandler, device);
++
++ /* Unmask our function IRQ */
++ status = SDLIB_IssueConfig(device->handle, SDCONFIG_FUNC_UNMASK_IRQ,
++ NULL, 0);
++ DBG_ASSERT(SDIO_SUCCESS(status));
++}
++
++void HIFMaskInterrupt(HIF_DEVICE *device)
++{
++ SDIO_STATUS status;
++ DBG_ASSERT(device != NULL);
++ DBG_ASSERT(device->handle != NULL);
++
++ /* Mask our function IRQ */
++ status = SDLIB_IssueConfig(device->handle, SDCONFIG_FUNC_MASK_IRQ,
++ NULL, 0);
++ DBG_ASSERT(SDIO_SUCCESS(status));
++
++ /* Unregister the IRQ Handler */
++ SDDEVICE_SET_IRQ_HANDLER(device->handle, NULL, NULL);
++}
++
++static BUS_REQUEST *hifAllocateBusRequest(void)
++{
++ BUS_REQUEST *busrequest;
++
++ /* Acquire lock */
++ CriticalSectionAcquire(&lock);
++
++ /* Remove first in list */
++ if((busrequest = s_busRequestFreeQueue) != NULL)
++ {
++ s_busRequestFreeQueue = busrequest->next;
++ }
++
++ /* Release lock */
++ CriticalSectionRelease(&lock);
++
++ return busrequest;
++}
++
++static void
++hifFreeBusRequest(BUS_REQUEST *busrequest)
++{
++ DBG_ASSERT(busrequest != NULL);
++
++ /* Acquire lock */
++ CriticalSectionAcquire(&lock);
++
++ /* Insert first in list */
++ busrequest->next = s_busRequestFreeQueue;
++ s_busRequestFreeQueue = busrequest;
++
++ /* Release lock */
++ CriticalSectionRelease(&lock);
++}
++
++void
++hifDeviceRemoved(SDFUNCTION *function, SDDEVICE *handle)
++{
++ A_STATUS status;
++ HIF_DEVICE *device;
++ DBG_ASSERT(function != NULL);
++ DBG_ASSERT(handle != NULL);
++
++ device = getHifDevice(handle);
++ status = htcCallbacks.deviceRemovedHandler(device->htc_handle, A_OK);
++
++ /* cleanup the helper thread */
++ if (device->helper_started) {
++ SDLIB_OSDeleteHelper(&device->insert_helper);
++ device->helper_started = FALSE;
++ }
++
++ delHifDevice(handle);
++ DBG_ASSERT(status == A_OK);
++}
++
++HIF_DEVICE *
++addHifDevice(SDDEVICE *handle)
++{
++ DBG_ASSERT(handle != NULL);
++ hifDevice[0].handle = handle;
++ return &hifDevice[0];
++}
++
++HIF_DEVICE *
++getHifDevice(SDDEVICE *handle)
++{
++ DBG_ASSERT(handle != NULL);
++ return &hifDevice[0];
++}
++
++void
++delHifDevice(SDDEVICE *handle)
++{
++ DBG_ASSERT(handle != NULL);
++ hifDevice[0].handle = NULL;
++}
++
++struct device*
++HIFGetOSDevice(HIF_DEVICE *device)
++{
++ return &device->handle->Device->dev;
++}
++
++static void ResetAllCards(void)
++{
++ UINT8 data;
++ SDIO_STATUS status;
++ int i;
++
++ data = SDIO_IO_RESET;
++
++ /* set the I/O CARD reset bit:
++ * NOTE: we are exploiting a "feature" of the SDIO core that resets the core when you
++ * set the RES bit in the SDIO_IO_ABORT register. This bit however "normally" resets the
++ * I/O functions leaving the SDIO core in the same state (as per SDIO spec).
++ * In this design, this reset can be used to reset the SDIO core itself */
++ for (i = 0; i < HIF_MAX_DEVICES; i++) {
++ if (hifDevice[i].handle != NULL) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
++ ("Issuing I/O Card reset for instance: %d \n",i));
++ /* set the I/O Card reset bit */
++ status = SDLIB_IssueCMD52(hifDevice[i].handle,
++ 0, /* function 0 space */
++ SDIO_IO_ABORT_REG,
++ &data,
++ 1, /* 1 byte */
++ TRUE); /* write */
++ }
++ }
++
++}
++
++void HIFSetHandle(void *hif_handle, void *handle)
++{
++ HIF_DEVICE *device = (HIF_DEVICE *) hif_handle;
++
++ device->htc_handle = handle;
++
++ return;
++}
+diff --git a/drivers/ar6000/hif/hif2.c b/drivers/ar6000/hif/hif2.c
+new file mode 100644
+index 0000000..386d96e
+--- /dev/null
++++ b/drivers/ar6000/hif/hif2.c
+@@ -0,0 +1,768 @@
++/*
++ * hif2.c - HIF layer re-implementation for the Linux SDIO stack
++ *
++ * Copyright (C) 2008, 2009 by OpenMoko, Inc.
++ * Written by Werner Almesberger <werner@openmoko.org>
++ * All Rights Reserved
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Based on:
++ *
++ * @abstract: HIF layer reference implementation for Atheros SDIO stack
++ * @notice: Copyright (c) 2004-2006 Atheros Communications Inc.
++ */
++
++
++#include <linux/kernel.h>
++#include <linux/kthread.h>
++#include <linux/list.h>
++#include <linux/wait.h>
++#include <linux/spinlock.h>
++#include <linux/mutex.h>
++#include <linux/sched.h>
++#include <linux/mmc/sdio_func.h>
++#include <linux/mmc/sdio.h>
++#include <linux/mmc/sdio_ids.h>
++
++#include "athdefs.h"
++#include "a_types.h"
++#include "hif.h"
++
++
++/* @@@ Hack - this wants cleaning up */
++
++#ifdef CONFIG_MACH_NEO1973_GTA02
++
++#include <mach/gta02-pm-wlan.h>
++
++#else /* CONFIG_MACH_NEO1973_GTA02 */
++
++#define gta02_wlan_query_rfkill_lock() 1
++#define gta02_wlan_set_rfkill_cb(cb, hif) ((void) cb)
++#define gta02_wlan_query_rfkill_unlock()
++#define gta02_wlan_clear_rfkill_cb()
++
++#endif /* !CONFIG_MACH_NEO1973_GTA02 */
++
++
++/*
++ * KNOWN BUGS:
++ *
++ * - HIF_DEVICE_IRQ_ASYNC_SYNC doesn't work yet (gets MMC errors)
++ * - latency can reach hundreds of ms, probably because of scheduling delays
++ * - packets go through about three queues before finally hitting the network
++ */
++
++/*
++ * Differences from Atheros' HIFs:
++ *
++ * - synchronous and asynchronous requests may get reordered with respect to
++ * each other, e.g., if HIFReadWrite returns for an asynchronous request and
++ * then HIFReadWrite is called for a synchronous request, the synchronous
++ * request may be executed before the asynchronous request.
++ *
++ * - request queue locking seems unnecessarily complex in the Atheros HIFs.
++ *
++ * - Atheros mask interrupts by calling sdio_claim_irq/sdio_release_irq, which
++ * can cause quite a bit of overhead. This HIF has its own light-weight
++ * interrupt masking.
++ *
++ * - Atheros call deviceInsertedHandler from a thread spawned off the probe or
++ * device insertion function. The original explanation for the Atheros SDIO
++ * stack said that this is done because a delay is needed to let the chip
++ * complete initialization. There is indeed a one second delay in the thread.
++ *
++ * The Atheros Linux SDIO HIF removes the delay and only retains the thread.
++ * Experimentally removing the thread didn't show any conflicts, so let's get
++ * rid of it for good.
++ *
++ * - The Atheros SDIO stack with Samuel's driver sets SDIO_CCCR_POWER in
++ * SDIO_POWER_EMPC. Atheros' Linux SDIO code apparently doesn't. We don't
++ * either, and this seems to work fine.
++ * @@@ Need to check this with Atheros.
++ */
++
++
++#define MBOXES 4
++
++#define HIF_MBOX_BLOCK_SIZE 128
++#define HIF_MBOX_BASE_ADDR 0x800
++#define HIF_MBOX_WIDTH 0x800
++#define HIF_MBOX_START_ADDR(mbox) \
++ (HIF_MBOX_BASE_ADDR+(mbox)*HIF_MBOX_WIDTH)
++
++
++struct hif_device {
++ void *htc_handle;
++ struct sdio_func *func;
++
++ /*
++ * @@@ our sweet little bit of bogosity - the mechanism that lets us
++ * use the SDIO stack from softirqs. This really wants to use skbs.
++ */
++ struct list_head queue;
++ spinlock_t queue_lock;
++ struct task_struct *io_task;
++ wait_queue_head_t wait;
++
++ /*
++ * activate_lock protects "active" and the activation/deactivation
++ * process itself.
++ *
++ * Relation to other locks: The SDIO function can be claimed while
++ * activate_lock is being held, but trying to acquire activate_lock
++ * while having ownership of the SDIO function could cause a deadlock.
++ */
++ int active;
++ struct mutex activate_lock;
++};
++
++struct hif_request {
++ struct list_head list;
++ struct sdio_func *func;
++ int (*read)(struct sdio_func *func,
++ void *dst, unsigned int addr, int count);
++ int (*write)(struct sdio_func *func,
++ unsigned int addr, void *src, int count);
++ void *buf;
++ unsigned long addr;
++ int len;
++ A_STATUS (*completion)(void *context, A_STATUS status);
++ void *context;
++};
++
++
++static HTC_CALLBACKS htcCallbacks;
++
++/*
++ * shutdown_lock prevents recursion through HIFShutDownDevice
++ */
++static DEFINE_MUTEX(shutdown_lock);
++
++
++/* ----- Request processing ------------------------------------------------ */
++
++
++static A_STATUS process_request(struct hif_request *req)
++{
++ int ret;
++ A_STATUS status;
++
++ dev_dbg(&req->func->dev, "process_request(req %p)\n", req);
++ sdio_claim_host(req->func);
++ if (req->read) {
++ ret = req->read(req->func, req->buf, req->addr, req->len);
++ } else {
++ ret = req->write(req->func, req->addr, req->buf, req->len);
++ }
++ sdio_release_host(req->func);
++ status = ret ? A_ERROR : A_OK;
++ if (req->completion)
++ req->completion(req->context, status);
++ kfree(req);
++ return status;
++}
++
++
++static void enqueue_request(struct hif_device *hif, struct hif_request *req)
++{
++ unsigned long flags;
++
++ dev_dbg(&req->func->dev, "enqueue_request(req %p)\n", req);
++ spin_lock_irqsave(&hif->queue_lock, flags);
++ list_add_tail(&req->list, &hif->queue);
++ spin_unlock_irqrestore(&hif->queue_lock, flags);
++ wake_up(&hif->wait);
++}
++
++
++static struct hif_request *dequeue_request(struct hif_device *hif)
++{
++ struct hif_request *req;
++ unsigned long flags;
++
++ spin_lock_irqsave(&hif->queue_lock, flags);
++ if (list_empty(&hif->queue))
++ req = NULL;
++ else {
++ req = list_first_entry(&hif->queue,
++ struct hif_request, list);
++ list_del(&req->list);
++ }
++ spin_unlock_irqrestore(&hif->queue_lock, flags);
++ return req;
++}
++
++
++static void wait_queue_empty(struct hif_device *hif)
++{
++ unsigned long flags;
++ int empty;
++
++ while (1) {
++ spin_lock_irqsave(&hif->queue_lock, flags);
++ empty = list_empty(&hif->queue);
++ spin_unlock_irqrestore(&hif->queue_lock, flags);
++ if (empty)
++ break;
++ else
++ yield();
++ }
++}
++
++
++static int io(void *data)
++{
++ struct hif_device *hif = data;
++ struct sched_param param = { .sched_priority = 2 };
++ /* one priority level slower than ksdioirqd (which is at 1) */
++ DEFINE_WAIT(wait);
++ struct hif_request *req;
++
++ sched_setscheduler(current, SCHED_FIFO, &param);
++
++ while (1) {
++ while (1) {
++ /*
++ * Since we never use signals here, one might think
++ * that this ought to be TASK_UNINTERRUPTIBLE. However,
++ * such a task would increase the load average and,
++ * worse, it would trigger the softlockup check.
++ */
++ prepare_to_wait(&hif->wait, &wait, TASK_INTERRUPTIBLE);
++ if (kthread_should_stop()) {
++ finish_wait(&hif->wait, &wait);
++ return 0;
++ }
++ req = dequeue_request(hif);
++ if (req)
++ break;
++ schedule();
++ }
++ finish_wait(&hif->wait, &wait);
++
++ (void) process_request(req);
++ }
++ return 0;
++}
++
++
++A_STATUS HIFReadWrite(HIF_DEVICE *hif, A_UINT32 address, A_UCHAR *buffer,
++ A_UINT32 length, A_UINT32 request, void *context)
++{
++ struct device *dev = HIFGetOSDevice(hif);
++ struct hif_request *req;
++
++ dev_dbg(dev, "HIFReadWrite(device %p, address 0x%x, buffer %p, "
++ "length %d, request 0x%x, context %p)\n",
++ hif, address, buffer, length, request, context);
++
++ BUG_ON(!(request & (HIF_SYNCHRONOUS | HIF_ASYNCHRONOUS)));
++ BUG_ON(!(request & (HIF_BYTE_BASIS | HIF_BLOCK_BASIS)));
++ BUG_ON(!(request & (HIF_READ | HIF_WRITE)));
++ BUG_ON(!(request & HIF_EXTENDED_IO));
++
++ if (address >= HIF_MBOX_START_ADDR(0) &&
++ address < HIF_MBOX_START_ADDR(MBOXES+1)) {
++ BUG_ON(length > HIF_MBOX_WIDTH);
++ /* Adjust the address so that the last byte falls on the EOM
++ address. */
++ address += HIF_MBOX_WIDTH-length;
++ }
++
++ req = kzalloc(sizeof(*req), GFP_ATOMIC);
++ if (!req) {
++ if (request & HIF_ASYNCHRONOUS)
++ htcCallbacks.rwCompletionHandler(context, A_ERROR);
++ return A_ERROR;
++ }
++
++ req->func = hif->func;
++ req->addr = address;
++ req->buf = buffer;
++ req->len = length;
++
++ if (request & HIF_READ) {
++ if (request & HIF_FIXED_ADDRESS)
++ req->read = sdio_readsb;
++ else
++ req->read = sdio_memcpy_fromio;
++ } else {
++ if (request & HIF_FIXED_ADDRESS)
++ req->write = sdio_writesb;
++ else
++ req->write = sdio_memcpy_toio;
++ }
++
++ if (!(request & HIF_ASYNCHRONOUS))
++ return process_request(req);
++
++ req->completion = htcCallbacks.rwCompletionHandler;
++ req->context = context;
++ enqueue_request(hif, req);
++
++ return A_OK;
++}
++
++
++/* ----- Interrupt handling ------------------------------------------------ */
++
++/*
++ * Volatile ought to be good enough to make gcc do the right thing on S3C24xx.
++ * No need to use atomic or put barriers, keeping the code more readable.
++ *
++ * Warning: this story changes if going SMP/SMT.
++ */
++
++static volatile int masked = 1;
++static volatile int pending;
++static volatile int in_interrupt;
++
++
++static void ar6000_do_irq(struct sdio_func *func)
++{
++ HIF_DEVICE *hif = sdio_get_drvdata(func);
++ struct device *dev = HIFGetOSDevice(hif);
++ A_STATUS status;
++
++ dev_dbg(dev, "ar6000_do_irq -> %p\n", htcCallbacks.dsrHandler);
++
++ status = htcCallbacks.dsrHandler(hif->htc_handle);
++ BUG_ON(status != A_OK);
++}
++
++
++static void sdio_ar6000_irq(struct sdio_func *func)
++{
++ HIF_DEVICE *hif = sdio_get_drvdata(func);
++ struct device *dev = HIFGetOSDevice(hif);
++
++ dev_dbg(dev, "sdio_ar6000_irq\n");
++
++ in_interrupt = 1;
++ if (masked) {
++ in_interrupt = 0;
++ pending++;
++ return;
++ }
++ /*
++ * @@@ This is ugly. If we don't drop the lock, we'll deadlock when
++ * the handler tries to do SDIO. So there are four choices:
++ *
++ * 1) Break the call chain by calling the callback from a workqueue.
++ * Ugh.
++ * 2) Make process_request aware that we already have the lock.
++ * 3) Drop the lock. Which is ugly but should be safe as long as we're
++ * making sure the device doesn't go away.
++ * 4) Change the AR6k driver such that it only issues asynchronous
++ * quests when called from an interrupt.
++ *
++ * Solution 2) is probably the best for now. Will try it later.
++ */
++ sdio_release_host(func);
++ ar6000_do_irq(func);
++ sdio_claim_host(func);
++ in_interrupt = 0;
++}
++
++
++void HIFAckInterrupt(HIF_DEVICE *hif)
++{
++ struct device *dev = HIFGetOSDevice(hif);
++
++ dev_dbg(dev, "HIFAckInterrupt\n");
++ /* do nothing */
++}
++
++
++void HIFUnMaskInterrupt(HIF_DEVICE *hif)
++{
++ struct device *dev = HIFGetOSDevice(hif);
++
++ dev_dbg(dev, "HIFUnMaskInterrupt\n");
++ do {
++ masked = 1;
++ if (pending) {
++ pending = 0;
++ ar6000_do_irq(hif->func);
++ /* We may take an interrupt before unmasking and thus
++ get it pending. In this case, we just loop back. */
++ }
++ masked = 0;
++ }
++ while (pending);
++}
++
++
++void HIFMaskInterrupt(HIF_DEVICE *hif)
++{
++ struct device *dev = HIFGetOSDevice(hif);
++
++ dev_dbg(dev, "HIFMaskInterrupt\n");
++ /*
++ * Since sdio_ar6000_irq can also be called from a process context, we
++ * may conceivably end up racing with it. Thus, we need to wait until
++ * we can be sure that no concurrent interrupt processing is going on
++ * before we return.
++ *
++ * Note: this may be a bit on the paranoid side - the callers may
++ * actually be nice enough to disable scheduling. Check later.
++ */
++ masked = 1;
++ while (in_interrupt)
++ yield();
++}
++
++
++/* ----- HIF API glue functions -------------------------------------------- */
++
++
++struct device *HIFGetOSDevice(HIF_DEVICE *hif)
++{
++ return &hif->func->dev;
++}
++
++
++void HIFSetHandle(void *hif_handle, void *handle)
++{
++ HIF_DEVICE *hif = (HIF_DEVICE *) hif_handle;
++
++ hif->htc_handle = handle;
++}
++
++
++/* ----- Device configuration (HIF side) ----------------------------------- */
++
++
++A_STATUS HIFConfigureDevice(HIF_DEVICE *hif,
++ HIF_DEVICE_CONFIG_OPCODE opcode, void *config, A_UINT32 configLen)
++{
++ struct device *dev = HIFGetOSDevice(hif);
++ HIF_DEVICE_IRQ_PROCESSING_MODE *ipm_cfg = config;
++ A_UINT32 *mbs_cfg = config;
++ int i;
++
++ dev_dbg(dev, "HIFConfigureDevice\n");
++
++ switch (opcode) {
++ case HIF_DEVICE_GET_MBOX_BLOCK_SIZE:
++ for (i = 0; i != MBOXES; i++)
++ mbs_cfg[i] = HIF_MBOX_BLOCK_SIZE;
++ break;
++ case HIF_DEVICE_GET_MBOX_ADDR:
++ for (i = 0; i != MBOXES; i++)
++ mbs_cfg[i] = HIF_MBOX_START_ADDR(i);
++ break;
++ case HIF_DEVICE_GET_IRQ_PROC_MODE:
++ *ipm_cfg = HIF_DEVICE_IRQ_SYNC_ONLY;
++// *ipm_cfg = HIF_DEVICE_IRQ_ASYNC_SYNC;
++ break;
++ default:
++ return A_ERROR;
++ }
++ return A_OK;
++}
++
++
++/* ----- Device probe and removal (Linux side) ----------------------------- */
++
++
++static int ar6000_do_activate(struct hif_device *hif)
++{
++ struct sdio_func *func = hif->func;
++ struct device *dev = &func->dev;
++ int ret;
++
++ dev_dbg(dev, "ar6000_do_activate\n");
++
++ sdio_claim_host(func);
++ sdio_enable_func(func);
++
++ INIT_LIST_HEAD(&hif->queue);
++ init_waitqueue_head(&hif->wait);
++ spin_lock_init(&hif->queue_lock);
++
++ ret = sdio_set_block_size(func, HIF_MBOX_BLOCK_SIZE);
++ if (ret < 0) {
++ dev_err(dev, "sdio_set_block_size returns %d\n", ret);
++ goto out_enabled;
++ }
++ ret = sdio_claim_irq(func, sdio_ar6000_irq);
++ if (ret) {
++ dev_err(dev, "sdio_claim_irq returns %d\n", ret);
++ goto out_enabled;
++ }
++ /* Set SDIO_BUS_CD_DISABLE in SDIO_CCCR_IF ? */
++#if 0
++ sdio_f0_writeb(func, SDIO_CCCR_CAP_E4MI, SDIO_CCCR_CAPS, &ret);
++ if (ret) {
++ dev_err(dev, "sdio_f0_writeb(SDIO_CCCR_CAPS) returns %d\n",
++ ret);
++ goto out_got_irq;
++ }
++#else
++ if (0) /* avoid warning */
++ goto out_got_irq;
++#endif
++
++ sdio_release_host(func);
++
++ hif->io_task = kthread_run(io, hif, "ar6000_io");
++ ret = IS_ERR(hif->io_task);
++ if (ret) {
++ dev_err(dev, "kthread_run(ar6000_io): %d\n", ret);
++ goto out_func_ready;
++ }
++
++ ret = htcCallbacks.deviceInsertedHandler(hif);
++ if (ret == A_OK)
++ return 0;
++
++ dev_err(dev, "deviceInsertedHandler: %d\n", ret);
++
++ ret = kthread_stop(hif->io_task);
++ if (ret)
++ dev_err(dev, "kthread_stop (ar6000_io): %d\n", ret);
++
++out_func_ready:
++ sdio_claim_host(func);
++
++out_got_irq:
++ sdio_release_irq(func);
++
++out_enabled:
++ sdio_disable_func(func);
++ sdio_release_host(func);
++
++ return ret;
++}
++
++
++static void ar6000_do_deactivate(struct hif_device *hif)
++{
++ struct sdio_func *func = hif->func;
++ struct device *dev = &func->dev;
++ int ret;
++
++ dev_dbg(dev, "ar6000_do_deactivate\n");
++ if (!hif->active)
++ return;
++
++ if (mutex_trylock(&shutdown_lock)) {
++ /*
++ * Funny, Atheros' HIF does this call, but this just puts us in
++ * a recursion through HTCShutDown/HIFShutDown if unloading the
++ * module.
++ *
++ * However, we need it for suspend/resume. See the comment at
++ * HIFShutDown, below.
++ */
++ ret = htcCallbacks.deviceRemovedHandler(hif->htc_handle, A_OK);
++ if (ret != A_OK)
++ dev_err(dev, "deviceRemovedHandler: %d\n", ret);
++ mutex_unlock(&shutdown_lock);
++ }
++ wait_queue_empty(hif);
++ ret = kthread_stop(hif->io_task);
++ if (ret)
++ dev_err(dev, "kthread_stop (ar6000_io): %d\n", ret);
++ sdio_claim_host(func);
++ sdio_release_irq(func);
++ sdio_disable_func(func);
++ sdio_release_host(func);
++}
++
++
++static int ar6000_activate(struct hif_device *hif)
++{
++ int ret = 0;
++
++ dev_dbg(&hif->func->dev, "ar6000_activate\n");
++ mutex_lock(&hif->activate_lock);
++ if (!hif->active) {
++ ret = ar6000_do_activate(hif);
++ if (ret) {
++ printk(KERN_ERR "%s: Failed to activate %d\n",
++ __func__, ret);
++ goto out;
++ }
++ hif->active = 1;
++ }
++out:
++ mutex_unlock(&hif->activate_lock);
++ return ret;
++}
++
++
++static void ar6000_deactivate(struct hif_device *hif)
++{
++ dev_dbg(&hif->func->dev, "ar6000_deactivate\n");
++ mutex_lock(&hif->activate_lock);
++ if (hif->active) {
++ ar6000_do_deactivate(hif);
++ hif->active = 0;
++ }
++ mutex_unlock(&hif->activate_lock);
++}
++
++
++static int ar6000_rfkill_cb(void *data, int on)
++{
++ struct hif_device *hif = data;
++ struct sdio_func *func = hif->func;
++ struct device *dev = &func->dev;
++
++ dev_dbg(dev, "ar6000_rfkill_cb: on %d\n", on);
++ if (on)
++ return ar6000_activate(hif);
++ ar6000_deactivate(hif);
++ return 0;
++}
++
++
++static int sdio_ar6000_probe(struct sdio_func *func,
++ const struct sdio_device_id *id)
++{
++ struct device *dev = &func->dev;
++ struct hif_device *hif;
++ int ret = 0;
++
++ dev_dbg(dev, "sdio_ar6000_probe\n");
++ BUG_ON(!htcCallbacks.deviceInsertedHandler);
++
++ hif = kzalloc(sizeof(*hif), GFP_KERNEL);
++ if (!hif)
++ return -ENOMEM;
++
++ sdio_set_drvdata(func, hif);
++ hif->func = func;
++ mutex_init(&hif->activate_lock);
++ hif->active = 0;
++
++ if (gta02_wlan_query_rfkill_lock())
++ ret = ar6000_activate(hif);
++ if (!ret) {
++ gta02_wlan_set_rfkill_cb(ar6000_rfkill_cb, hif);
++ return 0;
++ }
++ gta02_wlan_query_rfkill_unlock();
++ sdio_set_drvdata(func, NULL);
++ kfree(hif);
++ return ret;
++}
++
++
++static void sdio_ar6000_remove(struct sdio_func *func)
++{
++ struct device *dev = &func->dev;
++ HIF_DEVICE *hif = sdio_get_drvdata(func);
++
++ dev_dbg(dev, "sdio_ar6000_remove\n");
++ gta02_wlan_clear_rfkill_cb();
++ ar6000_deactivate(hif);
++ sdio_set_drvdata(func, NULL);
++ kfree(hif);
++}
++
++
++/* ----- Device registration/unregistration (called by HIF) ---------------- */
++
++
++#define ATHEROS_SDIO_DEVICE(id, offset) \
++ SDIO_DEVICE(SDIO_VENDOR_ID_ATHEROS, SDIO_DEVICE_ID_ATHEROS_##id | (offset))
++
++static const struct sdio_device_id sdio_ar6000_ids[] = {
++ { ATHEROS_SDIO_DEVICE(AR6002, 0) },
++ { ATHEROS_SDIO_DEVICE(AR6002, 0x1) },
++ { ATHEROS_SDIO_DEVICE(AR6001, 0x8) },
++ { ATHEROS_SDIO_DEVICE(AR6001, 0x9) },
++ { ATHEROS_SDIO_DEVICE(AR6001, 0xa) },
++ { ATHEROS_SDIO_DEVICE(AR6001, 0xb) },
++ { /* end: all zeroes */ },
++};
++
++MODULE_DEVICE_TABLE(sdio, sdio_ar6000_ids);
++
++
++static struct sdio_driver sdio_ar6000_driver = {
++ .probe = sdio_ar6000_probe,
++ .remove = sdio_ar6000_remove,
++ .name = "sdio_ar6000",
++ .id_table = sdio_ar6000_ids,
++};
++
++
++int HIFInit(HTC_CALLBACKS *callbacks)
++{
++ int ret;
++
++ BUG_ON(!callbacks);
++
++ printk(KERN_DEBUG "HIFInit\n");
++ htcCallbacks = *callbacks;
++
++ ret = sdio_register_driver(&sdio_ar6000_driver);
++ if (ret) {
++ printk(KERN_ERR
++ "sdio_register_driver(sdio_ar6000_driver): %d\n", ret);
++ return A_ERROR;
++ }
++
++ return 0;
++}
++
++
++/*
++ * We have four possible call chains here:
++ *
++ * System shutdown/reboot:
++ *
++ * kernel_restart_prepare ...> device_shutdown ... > s3cmci_shutdown ->
++ * mmc_remove_host ..> sdio_bus_remove -> sdio_ar6000_remove ->
++ * ar6000_deactivate -> ar6000_do_deactivate ->
++ * deviceRemovedHandler (HTCTargetRemovedHandler) -> HIFShutDownDevice
++ *
++ * This is roughly the same sequence as suspend, described below.
++ *
++ * Module removal:
++ *
++ * sys_delete_module -> ar6000_cleanup_module -> HTCShutDown ->
++ * HIFShutDownDevice -> sdio_unregister_driver ...> sdio_bus_remove ->
++ * sdio_ar6000_remove -> ar6000_deactivate -> ar6000_do_deactivate
++ *
++ * In this case, HIFShutDownDevice must call sdio_unregister_driver to
++ * notify the driver about its removal. ar6000_do_deactivate must not call
++ * deviceRemovedHandler, because that would loop back into HIFShutDownDevice.
++ *
++ * Suspend:
++ *
++ * device_suspend ...> s3cmci_suspend ...> sdio_bus_remove ->
++ * sdio_ar6000_remove -> ar6000_deactivate -> ar6000_do_deactivate ->
++ * deviceRemovedHandler (HTCTargetRemovedHandler) -> HIFShutDownDevice
++ *
++ * We must call deviceRemovedHandler to inform the ar6k stack that the device
++ * has been removed. Since HTCTargetRemovedHandler calls back into
++ * HIFShutDownDevice, we must also prevent the call to
++ * sdio_unregister_driver, or we'd end up recursing into the SDIO stack,
++ * eventually deadlocking somewhere.
++ *
++ * rfkill:
++ *
++ * rfkill_state_store -> rfkill_toggle_radio -> gta02_wlan_toggle_radio ->
++ * ar6000_rfkill_cb -> ar6000_deactivate -> ar6000_do_deactivate ->
++ * deviceRemovedHandler (HTCTargetRemovedHandler) -> HIFShutDownDevice
++ *
++ * This is similar to suspend - only the entry point changes.
++ */
++
++void HIFShutDownDevice(HIF_DEVICE *hif)
++{
++ /* Beware, HTCShutDown calls us with hif == NULL ! */
++ if (mutex_trylock(&shutdown_lock)) {
++ sdio_unregister_driver(&sdio_ar6000_driver);
++ mutex_unlock(&shutdown_lock);
++ }
++}
+diff --git a/drivers/ar6000/hif/hif_internal.h b/drivers/ar6000/hif/hif_internal.h
+new file mode 100644
+index 0000000..d8fc101
+--- /dev/null
++++ b/drivers/ar6000/hif/hif_internal.h
+@@ -0,0 +1,102 @@
++/*
++ * @file: hif_internal.h
++ *
++ * @abstract: internal header file for hif layer
++ *
++ * @notice: Copyright (c) 2004-2006 Atheros Communications Inc.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include <linux/sdio/ctsystem.h>
++#include <linux/sdio/sdio_busdriver.h>
++#include <linux/sdio/_sdio_defs.h>
++#include <linux/sdio/sdio_lib.h>
++#include "a_config.h"
++#include "athdefs.h"
++#include "a_types.h"
++#include "a_osapi.h"
++#include "hif.h"
++
++#define MANUFACTURER_ID_AR6001_BASE 0x100
++#define MANUFACTURER_ID_AR6002_BASE 0x200
++#define FUNCTION_CLASS 0x0
++#define MANUFACTURER_CODE 0x271
++
++#define BUS_REQUEST_MAX_NUM 64
++
++#define SDIO_CLOCK_FREQUENCY_DEFAULT 25000000
++#define SDWLAN_ENABLE_DISABLE_TIMEOUT 20
++#define FLAGS_CARD_ENAB 0x02
++#define FLAGS_CARD_IRQ_UNMSK 0x04
++
++#define HIF_MBOX_BLOCK_SIZE 128
++#define HIF_MBOX_BASE_ADDR 0x800
++#define HIF_MBOX_WIDTH 0x800
++#define HIF_MBOX0_BLOCK_SIZE 1
++#define HIF_MBOX1_BLOCK_SIZE HIF_MBOX_BLOCK_SIZE
++#define HIF_MBOX2_BLOCK_SIZE HIF_MBOX_BLOCK_SIZE
++#define HIF_MBOX3_BLOCK_SIZE HIF_MBOX_BLOCK_SIZE
++
++#define HIF_MBOX_START_ADDR(mbox) \
++ HIF_MBOX_BASE_ADDR + mbox * HIF_MBOX_WIDTH
++
++#define HIF_MBOX_END_ADDR(mbox) \
++ HIF_MBOX_START_ADDR(mbox) + HIF_MBOX_WIDTH - 1
++
++struct hif_device {
++ SDDEVICE *handle;
++ void *htc_handle;
++ OSKERNEL_HELPER insert_helper;
++ BOOL helper_started;
++};
++
++typedef struct target_function_context {
++ SDFUNCTION function; /* function description of the bus driver */
++ OS_SEMAPHORE instanceSem; /* instance lock. Unused */
++ SDLIST instanceList; /* list of instances. Unused */
++} TARGET_FUNCTION_CONTEXT;
++
++typedef struct bus_request {
++ struct bus_request *next;
++ SDREQUEST *request;
++ void *context;
++} BUS_REQUEST;
++
++BOOL
++hifDeviceInserted(SDFUNCTION *function, SDDEVICE *device);
++
++void
++hifDeviceRemoved(SDFUNCTION *function, SDDEVICE *device);
++
++SDREQUEST *
++hifAllocateDeviceRequest(SDDEVICE *device);
++
++void
++hifFreeDeviceRequest(SDREQUEST *request);
++
++void
++hifRWCompletionHandler(SDREQUEST *request);
++
++void
++hifIRQHandler(void *context);
++
++HIF_DEVICE *
++addHifDevice(SDDEVICE *handle);
++
++HIF_DEVICE *
++getHifDevice(SDDEVICE *handle);
++
++void
++delHifDevice(SDDEVICE *handle);
+diff --git a/drivers/ar6000/htc/ar6k.c b/drivers/ar6000/htc/ar6k.c
+new file mode 100644
+index 0000000..72472ab
+--- /dev/null
++++ b/drivers/ar6000/htc/ar6k.c
+@@ -0,0 +1,991 @@
++/*
++ * AR6K device layer that handles register level I/O
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++#include "a_config.h"
++#include "athdefs.h"
++#include "a_types.h"
++#include "AR6Khwreg.h"
++#include "a_osapi.h"
++#include "a_debug.h"
++#include "hif.h"
++#include "htc_packet.h"
++#include "ar6k.h"
++
++#define MAILBOX_FOR_BLOCK_SIZE 1
++
++extern A_UINT32 resetok;
++
++static A_STATUS DevEnableInterrupts(AR6K_DEVICE *pDev);
++static A_STATUS DevDisableInterrupts(AR6K_DEVICE *pDev);
++
++#define LOCK_AR6K(p) A_MUTEX_LOCK(&(p)->Lock);
++#define UNLOCK_AR6K(p) A_MUTEX_UNLOCK(&(p)->Lock);
++
++void AR6KFreeIOPacket(AR6K_DEVICE *pDev, HTC_PACKET *pPacket)
++{
++ LOCK_AR6K(pDev);
++ HTC_PACKET_ENQUEUE(&pDev->RegisterIOList,pPacket);
++ UNLOCK_AR6K(pDev);
++}
++
++HTC_PACKET *AR6KAllocIOPacket(AR6K_DEVICE *pDev)
++{
++ HTC_PACKET *pPacket;
++
++ LOCK_AR6K(pDev);
++ pPacket = HTC_PACKET_DEQUEUE(&pDev->RegisterIOList);
++ UNLOCK_AR6K(pDev);
++
++ return pPacket;
++}
++
++A_STATUS DevSetup(AR6K_DEVICE *pDev)
++{
++ A_UINT32 mailboxaddrs[AR6K_MAILBOXES];
++ A_UINT32 blocksizes[AR6K_MAILBOXES];
++ A_STATUS status = A_OK;
++ int i;
++
++ AR_DEBUG_ASSERT(AR6K_IRQ_PROC_REGS_SIZE == 16);
++ AR_DEBUG_ASSERT(AR6K_IRQ_ENABLE_REGS_SIZE == 4);
++
++ do {
++ /* give a handle to HIF for this target */
++ HIFSetHandle(pDev->HIFDevice, (void *)pDev);
++ /* initialize our free list of IO packets */
++ INIT_HTC_PACKET_QUEUE(&pDev->RegisterIOList);
++ A_MUTEX_INIT(&pDev->Lock);
++
++ /* get the addresses for all 4 mailboxes */
++ status = HIFConfigureDevice(pDev->HIFDevice, HIF_DEVICE_GET_MBOX_ADDR,
++ mailboxaddrs, sizeof(mailboxaddrs));
++
++ if (status != A_OK) {
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ /* carve up register I/O packets (these are for ASYNC register I/O ) */
++ for (i = 0; i < AR6K_MAX_REG_IO_BUFFERS; i++) {
++ HTC_PACKET *pIOPacket;
++ pIOPacket = &pDev->RegIOBuffers[i].HtcPacket;
++ SET_HTC_PACKET_INFO_RX_REFILL(pIOPacket,
++ pDev,
++ pDev->RegIOBuffers[i].Buffer,
++ AR6K_REG_IO_BUFFER_SIZE,
++ 0); /* don't care */
++ AR6KFreeIOPacket(pDev,pIOPacket);
++ }
++
++ /* get the address of the mailbox we are using */
++ pDev->MailboxAddress = mailboxaddrs[HTC_MAILBOX];
++
++ /* get the block sizes */
++ status = HIFConfigureDevice(pDev->HIFDevice, HIF_DEVICE_GET_MBOX_BLOCK_SIZE,
++ blocksizes, sizeof(blocksizes));
++
++ if (status != A_OK) {
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ /* note: we actually get the block size of a mailbox other than 0, for SDIO the block
++ * size on mailbox 0 is artificially set to 1. So we use the block size that is set
++ * for the other 3 mailboxes */
++ pDev->BlockSize = blocksizes[MAILBOX_FOR_BLOCK_SIZE];
++ /* must be a power of 2 */
++ AR_DEBUG_ASSERT((pDev->BlockSize & (pDev->BlockSize - 1)) == 0);
++
++ /* assemble mask, used for padding to a block */
++ pDev->BlockMask = pDev->BlockSize - 1;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("BlockSize: %d, MailboxAddress:0x%X \n",
++ pDev->BlockSize, pDev->MailboxAddress));
++
++ pDev->GetPendingEventsFunc = NULL;
++ /* see if the HIF layer implements the get pending events function */
++ HIFConfigureDevice(pDev->HIFDevice,
++ HIF_DEVICE_GET_PENDING_EVENTS_FUNC,
++ &pDev->GetPendingEventsFunc,
++ sizeof(pDev->GetPendingEventsFunc));
++
++ /* assume we can process HIF interrupt events asynchronously */
++ pDev->HifIRQProcessingMode = HIF_DEVICE_IRQ_ASYNC_SYNC;
++
++ /* see if the HIF layer overrides this assumption */
++ HIFConfigureDevice(pDev->HIFDevice,
++ HIF_DEVICE_GET_IRQ_PROC_MODE,
++ &pDev->HifIRQProcessingMode,
++ sizeof(pDev->HifIRQProcessingMode));
++
++ switch (pDev->HifIRQProcessingMode) {
++ case HIF_DEVICE_IRQ_SYNC_ONLY:
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("HIF Interrupt processing is SYNC ONLY\n"));
++ break;
++ case HIF_DEVICE_IRQ_ASYNC_SYNC:
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("HIF Interrupt processing is ASYNC and SYNC\n"));
++ break;
++ default:
++ AR_DEBUG_ASSERT(FALSE);
++ }
++
++ pDev->HifMaskUmaskRecvEvent = NULL;
++
++ /* see if the HIF layer implements the mask/unmask recv events function */
++ HIFConfigureDevice(pDev->HIFDevice,
++ HIF_DEVICE_GET_RECV_EVENT_MASK_UNMASK_FUNC,
++ &pDev->HifMaskUmaskRecvEvent,
++ sizeof(pDev->HifMaskUmaskRecvEvent));
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("HIF special overrides : 0x%X , 0x%X\n",
++ (A_UINT32)pDev->GetPendingEventsFunc, (A_UINT32)pDev->HifMaskUmaskRecvEvent));
++
++ status = DevDisableInterrupts(pDev);
++
++ } while (FALSE);
++
++ if (A_FAILED(status)) {
++ /* make sure handle is cleared */
++ HIFSetHandle(pDev->HIFDevice, NULL);
++ }
++
++ return status;
++
++}
++
++static A_STATUS DevEnableInterrupts(AR6K_DEVICE *pDev)
++{
++ A_STATUS status;
++ AR6K_IRQ_ENABLE_REGISTERS regs;
++
++ LOCK_AR6K(pDev);
++
++ /* Enable all the interrupts except for the dragon interrupt */
++ pDev->IrqEnableRegisters.int_status_enable = INT_STATUS_ENABLE_ERROR_SET(0x01) |
++ INT_STATUS_ENABLE_CPU_SET(0x01) |
++ INT_STATUS_ENABLE_COUNTER_SET(0x01);
++
++ if (NULL == pDev->GetPendingEventsFunc) {
++ pDev->IrqEnableRegisters.int_status_enable |= INT_STATUS_ENABLE_MBOX_DATA_SET(0x01);
++ } else {
++ /* The HIF layer provided us with a pending events function which means that
++ * the detection of pending mbox messages is handled in the HIF layer.
++ * This is the case for the SPI2 interface.
++ * In the normal case we enable MBOX interrupts, for the case
++ * with HIFs that offer this mechanism, we keep these interrupts
++ * masked */
++ pDev->IrqEnableRegisters.int_status_enable &= ~INT_STATUS_ENABLE_MBOX_DATA_SET(0x01);
++ }
++
++
++ /* Set up the CPU Interrupt Status Register */
++ pDev->IrqEnableRegisters.cpu_int_status_enable = CPU_INT_STATUS_ENABLE_BIT_SET(0x00);
++
++ /* Set up the Error Interrupt Status Register */
++ pDev->IrqEnableRegisters.error_status_enable =
++ ERROR_STATUS_ENABLE_RX_UNDERFLOW_SET(0x01) |
++ ERROR_STATUS_ENABLE_TX_OVERFLOW_SET(0x01);
++
++ /* Set up the Counter Interrupt Status Register (only for debug interrupt to catch fatal errors) */
++ pDev->IrqEnableRegisters.counter_int_status_enable =
++ COUNTER_INT_STATUS_ENABLE_BIT_SET(AR6K_TARGET_DEBUG_INTR_MASK);
++
++ /* copy into our temp area */
++ A_MEMCPY(&regs,&pDev->IrqEnableRegisters,AR6K_IRQ_ENABLE_REGS_SIZE);
++
++ UNLOCK_AR6K(pDev);
++
++ /* always synchronous */
++ status = HIFReadWrite(pDev->HIFDevice,
++ INT_STATUS_ENABLE_ADDRESS,
++ &regs.int_status_enable,
++ AR6K_IRQ_ENABLE_REGS_SIZE,
++ HIF_WR_SYNC_BYTE_INC,
++ NULL);
++
++ if (status != A_OK) {
++ /* Can't write it for some reason */
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("Failed to update interrupt control registers err: %d\n", status));
++
++ }
++
++ return status;
++}
++
++static A_STATUS DevDisableInterrupts(AR6K_DEVICE *pDev)
++{
++ AR6K_IRQ_ENABLE_REGISTERS regs;
++
++ LOCK_AR6K(pDev);
++ /* Disable all interrupts */
++ pDev->IrqEnableRegisters.int_status_enable = 0;
++ pDev->IrqEnableRegisters.cpu_int_status_enable = 0;
++ pDev->IrqEnableRegisters.error_status_enable = 0;
++ pDev->IrqEnableRegisters.counter_int_status_enable = 0;
++ /* copy into our temp area */
++ A_MEMCPY(&regs,&pDev->IrqEnableRegisters,AR6K_IRQ_ENABLE_REGS_SIZE);
++
++ UNLOCK_AR6K(pDev);
++
++ /* always synchronous */
++ return HIFReadWrite(pDev->HIFDevice,
++ INT_STATUS_ENABLE_ADDRESS,
++ &regs.int_status_enable,
++ AR6K_IRQ_ENABLE_REGS_SIZE,
++ HIF_WR_SYNC_BYTE_INC,
++ NULL);
++}
++
++/* enable device interrupts */
++A_STATUS DevUnmaskInterrupts(AR6K_DEVICE *pDev)
++{
++ /* Unmask the host controller interrupts */
++ HIFUnMaskInterrupt(pDev->HIFDevice);
++
++ return DevEnableInterrupts(pDev);
++}
++
++/* disable all device interrupts */
++A_STATUS DevMaskInterrupts(AR6K_DEVICE *pDev)
++{
++ A_STATUS status;
++
++ status = DevDisableInterrupts(pDev);
++
++ if (A_SUCCESS(status)) {
++ /* Disable the interrupt at the HIF layer */
++ HIFMaskInterrupt(pDev->HIFDevice);
++ }
++
++ return status;
++}
++
++/* callback when our fetch to enable/disable completes */
++static void DevDoEnableDisableRecvAsyncHandler(void *Context, HTC_PACKET *pPacket)
++{
++ AR6K_DEVICE *pDev = (AR6K_DEVICE *)Context;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("+DevDoEnableDisableRecvAsyncHandler: (dev: 0x%X)\n", (A_UINT32)pDev));
++
++ if (A_FAILED(pPacket->Status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ (" Failed to disable receiver, status:%d \n", pPacket->Status));
++ }
++ /* free this IO packet */
++ AR6KFreeIOPacket(pDev,pPacket);
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("-DevDoEnableDisableRecvAsyncHandler \n"));
++}
++
++/* disable packet reception (used in case the host runs out of buffers)
++ * this is the "override" method when the HIF reports another methods to
++ * disable recv events */
++static A_STATUS DevDoEnableDisableRecvOverride(AR6K_DEVICE *pDev, A_BOOL EnableRecv, A_BOOL AsyncMode)
++{
++ A_STATUS status = A_OK;
++ HTC_PACKET *pIOPacket = NULL;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("DevDoEnableDisableRecvOverride: Enable:%d Mode:%d\n",
++ EnableRecv,AsyncMode));
++
++ do {
++
++ if (AsyncMode) {
++
++ pIOPacket = AR6KAllocIOPacket(pDev);
++
++ if (NULL == pIOPacket) {
++ status = A_NO_MEMORY;
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ /* stick in our completion routine when the I/O operation completes */
++ pIOPacket->Completion = DevDoEnableDisableRecvAsyncHandler;
++ pIOPacket->pContext = pDev;
++
++ /* call the HIF layer override and do this asynchronously */
++ status = pDev->HifMaskUmaskRecvEvent(pDev->HIFDevice,
++ EnableRecv ? HIF_UNMASK_RECV : HIF_MASK_RECV,
++ pIOPacket);
++ break;
++ }
++
++ /* if we get here we are doing it synchronously */
++ status = pDev->HifMaskUmaskRecvEvent(pDev->HIFDevice,
++ EnableRecv ? HIF_UNMASK_RECV : HIF_MASK_RECV,
++ NULL);
++
++ } while (FALSE);
++
++ if (A_FAILED(status) && (pIOPacket != NULL)) {
++ AR6KFreeIOPacket(pDev,pIOPacket);
++ }
++
++ return status;
++}
++
++/* disable packet reception (used in case the host runs out of buffers)
++ * this is the "normal" method using the interrupt enable registers through
++ * the host I/F */
++static A_STATUS DevDoEnableDisableRecvNormal(AR6K_DEVICE *pDev, A_BOOL EnableRecv, A_BOOL AsyncMode)
++{
++ A_STATUS status = A_OK;
++ HTC_PACKET *pIOPacket = NULL;
++ AR6K_IRQ_ENABLE_REGISTERS regs;
++
++ /* take the lock to protect interrupt enable shadows */
++ LOCK_AR6K(pDev);
++
++ if (EnableRecv) {
++ pDev->IrqEnableRegisters.int_status_enable |= INT_STATUS_ENABLE_MBOX_DATA_SET(0x01);
++ } else {
++ pDev->IrqEnableRegisters.int_status_enable &= ~INT_STATUS_ENABLE_MBOX_DATA_SET(0x01);
++ }
++
++ /* copy into our temp area */
++ A_MEMCPY(&regs,&pDev->IrqEnableRegisters,AR6K_IRQ_ENABLE_REGS_SIZE);
++ UNLOCK_AR6K(pDev);
++
++ do {
++
++ if (AsyncMode) {
++
++ pIOPacket = AR6KAllocIOPacket(pDev);
++
++ if (NULL == pIOPacket) {
++ status = A_NO_MEMORY;
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ /* copy values to write to our async I/O buffer */
++ A_MEMCPY(pIOPacket->pBuffer,&regs,AR6K_IRQ_ENABLE_REGS_SIZE);
++
++ /* stick in our completion routine when the I/O operation completes */
++ pIOPacket->Completion = DevDoEnableDisableRecvAsyncHandler;
++ pIOPacket->pContext = pDev;
++
++ /* write it out asynchronously */
++ HIFReadWrite(pDev->HIFDevice,
++ INT_STATUS_ENABLE_ADDRESS,
++ pIOPacket->pBuffer,
++ AR6K_IRQ_ENABLE_REGS_SIZE,
++ HIF_WR_ASYNC_BYTE_INC,
++ pIOPacket);
++ break;
++ }
++
++ /* if we get here we are doing it synchronously */
++
++ status = HIFReadWrite(pDev->HIFDevice,
++ INT_STATUS_ENABLE_ADDRESS,
++ &regs.int_status_enable,
++ AR6K_IRQ_ENABLE_REGS_SIZE,
++ HIF_WR_SYNC_BYTE_INC,
++ NULL);
++
++ } while (FALSE);
++
++ if (A_FAILED(status) && (pIOPacket != NULL)) {
++ AR6KFreeIOPacket(pDev,pIOPacket);
++ }
++
++ return status;
++}
++
++
++A_STATUS DevStopRecv(AR6K_DEVICE *pDev, A_BOOL AsyncMode)
++{
++ if (NULL == pDev->HifMaskUmaskRecvEvent) {
++ return DevDoEnableDisableRecvNormal(pDev,FALSE,AsyncMode);
++ } else {
++ return DevDoEnableDisableRecvOverride(pDev,FALSE,AsyncMode);
++ }
++}
++
++A_STATUS DevEnableRecv(AR6K_DEVICE *pDev, A_BOOL AsyncMode)
++{
++ if (NULL == pDev->HifMaskUmaskRecvEvent) {
++ return DevDoEnableDisableRecvNormal(pDev,TRUE,AsyncMode);
++ } else {
++ return DevDoEnableDisableRecvOverride(pDev,TRUE,AsyncMode);
++ }
++}
++
++void DevDumpRegisters(AR6K_IRQ_PROC_REGISTERS *pIrqProcRegs,
++ AR6K_IRQ_ENABLE_REGISTERS *pIrqEnableRegs)
++{
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP, ("\n<------- Register Table -------->\n"));
++
++ if (pIrqProcRegs != NULL) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
++ ("Int Status: 0x%x\n",pIrqProcRegs->host_int_status));
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
++ ("CPU Int Status: 0x%x\n",pIrqProcRegs->cpu_int_status));
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
++ ("Error Int Status: 0x%x\n",pIrqProcRegs->error_int_status));
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
++ ("Counter Int Status: 0x%x\n",pIrqProcRegs->counter_int_status));
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
++ ("Mbox Frame: 0x%x\n",pIrqProcRegs->mbox_frame));
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
++ ("Rx Lookahead Valid: 0x%x\n",pIrqProcRegs->rx_lookahead_valid));
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
++ ("Rx Lookahead 0: 0x%x\n",pIrqProcRegs->rx_lookahead[0]));
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
++ ("Rx Lookahead 1: 0x%x\n",pIrqProcRegs->rx_lookahead[1]));
++ }
++
++ if (pIrqEnableRegs != NULL) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
++ ("Int Status Enable: 0x%x\n",pIrqEnableRegs->int_status_enable));
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
++ ("Counter Int Status Enable: 0x%x\n",pIrqEnableRegs->counter_int_status_enable));
++ AR_DEBUG_PRINTF(ATH_DEBUG_DUMP, ("<------------------------------->\n"));
++ }
++}
++
++
++#ifdef MBOXHW_UNIT_TEST
++
++
++/* This is a mailbox hardware unit test that must be called in a schedulable context
++ * This test is very simple, it will send a list of buffers with a counting pattern
++ * and the target will invert the data and send the message back
++ *
++ * the unit test has the following constraints:
++ *
++ * The target has at least 8 buffers of 256 bytes each. The host will send
++ * the following pattern of buffers in rapid succession :
++ *
++ * 1 buffer - 128 bytes
++ * 1 buffer - 256 bytes
++ * 1 buffer - 512 bytes
++ * 1 buffer - 1024 bytes
++ *
++ * The host will send the buffers to one mailbox and wait for buffers to be reflected
++ * back from the same mailbox. The target sends the buffers FIFO order.
++ * Once the final buffer has been received for a mailbox, the next mailbox is tested.
++ *
++ *
++ * Note: To simplifythe test , we assume that the chosen buffer sizes
++ * will fall on a nice block pad
++ *
++ * It is expected that higher-order tests will be written to stress the mailboxes using
++ * a message-based protocol (with some performance timming) that can create more
++ * randomness in the packets sent over mailboxes.
++ *
++ * */
++
++#define A_ROUND_UP_PWR2(x, align) (((int) (x) + ((align)-1)) & ~((align)-1))
++
++#define BUFFER_BLOCK_PAD 128
++
++#if 0
++#define BUFFER1 128
++#define BUFFER2 256
++#define BUFFER3 512
++#define BUFFER4 1024
++#endif
++
++#if 1
++#define BUFFER1 80
++#define BUFFER2 200
++#define BUFFER3 444
++#define BUFFER4 800
++#endif
++
++#define TOTAL_BYTES (A_ROUND_UP_PWR2(BUFFER1,BUFFER_BLOCK_PAD) + \
++ A_ROUND_UP_PWR2(BUFFER2,BUFFER_BLOCK_PAD) + \
++ A_ROUND_UP_PWR2(BUFFER3,BUFFER_BLOCK_PAD) + \
++ A_ROUND_UP_PWR2(BUFFER4,BUFFER_BLOCK_PAD) )
++
++#define TEST_BYTES (BUFFER1 + BUFFER2 + BUFFER3 + BUFFER4)
++
++#define TEST_CREDITS_RECV_TIMEOUT 100
++
++static A_UINT8 g_Buffer[TOTAL_BYTES];
++static A_UINT32 g_MailboxAddrs[AR6K_MAILBOXES];
++static A_UINT32 g_BlockSizes[AR6K_MAILBOXES];
++
++#define BUFFER_PROC_LIST_DEPTH 4
++
++typedef struct _BUFFER_PROC_LIST{
++ A_UINT8 *pBuffer;
++ A_UINT32 length;
++}BUFFER_PROC_LIST;
++
++
++#define PUSH_BUFF_PROC_ENTRY(pList,len,pCurrpos) \
++{ \
++ (pList)->pBuffer = (pCurrpos); \
++ (pList)->length = (len); \
++ (pCurrpos) += (len); \
++ (pList)++; \
++}
++
++/* a simple and crude way to send different "message" sizes */
++static void AssembleBufferList(BUFFER_PROC_LIST *pList)
++{
++ A_UINT8 *pBuffer = g_Buffer;
++
++#if BUFFER_PROC_LIST_DEPTH < 4
++#error "Buffer processing list depth is not deep enough!!"
++#endif
++
++ PUSH_BUFF_PROC_ENTRY(pList,BUFFER1,pBuffer);
++ PUSH_BUFF_PROC_ENTRY(pList,BUFFER2,pBuffer);
++ PUSH_BUFF_PROC_ENTRY(pList,BUFFER3,pBuffer);
++ PUSH_BUFF_PROC_ENTRY(pList,BUFFER4,pBuffer);
++
++}
++
++#define FILL_ZERO TRUE
++#define FILL_COUNTING FALSE
++static void InitBuffers(A_BOOL Zero)
++{
++ A_UINT16 *pBuffer16 = (A_UINT16 *)g_Buffer;
++ int i;
++
++ /* fill buffer with 16 bit counting pattern or zeros */
++ for (i = 0; i < (TOTAL_BYTES / 2) ; i++) {
++ if (!Zero) {
++ pBuffer16[i] = (A_UINT16)i;
++ } else {
++ pBuffer16[i] = 0;
++ }
++ }
++}
++
++
++static A_BOOL CheckOneBuffer(A_UINT16 *pBuffer16, int Length)
++{
++ int i;
++ A_UINT16 startCount;
++ A_BOOL success = TRUE;
++
++ /* get the starting count */
++ startCount = pBuffer16[0];
++ /* invert it, this is the expected value */
++ startCount = ~startCount;
++ /* scan the buffer and verify */
++ for (i = 0; i < (Length / 2) ; i++,startCount++) {
++ /* target will invert all the data */
++ if ((A_UINT16)pBuffer16[i] != (A_UINT16)~startCount) {
++ success = FALSE;
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Invalid Data Got:0x%X, Expecting:0x%X (offset:%d, total:%d) \n",
++ pBuffer16[i], ((A_UINT16)~startCount), i, Length));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("0x%X 0x%X 0x%X 0x%X \n",
++ pBuffer16[i], pBuffer16[i + 1], pBuffer16[i + 2],pBuffer16[i+3]));
++ break;
++ }
++ }
++
++ return success;
++}
++
++static A_BOOL CheckBuffers(void)
++{
++ int i;
++ A_BOOL success = TRUE;
++ BUFFER_PROC_LIST checkList[BUFFER_PROC_LIST_DEPTH];
++
++ /* assemble the list */
++ AssembleBufferList(checkList);
++
++ /* scan the buffers and verify */
++ for (i = 0; i < BUFFER_PROC_LIST_DEPTH ; i++) {
++ success = CheckOneBuffer((A_UINT16 *)checkList[i].pBuffer, checkList[i].length);
++ if (!success) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Buffer : 0x%X, Length:%d failed verify \n",
++ (A_UINT32)checkList[i].pBuffer, checkList[i].length));
++ break;
++ }
++ }
++
++ return success;
++}
++
++ /* find the end marker for the last buffer we will be sending */
++static A_UINT16 GetEndMarker(void)
++{
++ A_UINT8 *pBuffer;
++ BUFFER_PROC_LIST checkList[BUFFER_PROC_LIST_DEPTH];
++
++ /* fill up buffers with the normal counting pattern */
++ InitBuffers(FILL_COUNTING);
++
++ /* assemble the list we will be sending down */
++ AssembleBufferList(checkList);
++ /* point to the last 2 bytes of the last buffer */
++ pBuffer = &(checkList[BUFFER_PROC_LIST_DEPTH - 1].pBuffer[(checkList[BUFFER_PROC_LIST_DEPTH - 1].length) - 2]);
++
++ /* the last count in the last buffer is the marker */
++ return (A_UINT16)pBuffer[0] | ((A_UINT16)pBuffer[1] << 8);
++}
++
++#define ATH_PRINT_OUT_ZONE ATH_DEBUG_ERR
++
++/* send the ordered buffers to the target */
++static A_STATUS SendBuffers(AR6K_DEVICE *pDev, int mbox)
++{
++ A_STATUS status = A_OK;
++ A_UINT32 request = HIF_WR_SYNC_BLOCK_INC;
++ BUFFER_PROC_LIST sendList[BUFFER_PROC_LIST_DEPTH];
++ int i;
++ int totalBytes = 0;
++ int paddedLength;
++ int totalwPadding = 0;
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Sending buffers on mailbox : %d \n",mbox));
++
++ /* fill buffer with counting pattern */
++ InitBuffers(FILL_COUNTING);
++
++ /* assemble the order in which we send */
++ AssembleBufferList(sendList);
++
++ for (i = 0; i < BUFFER_PROC_LIST_DEPTH; i++) {
++
++ /* we are doing block transfers, so we need to pad everything to a block size */
++ paddedLength = (sendList[i].length + (g_BlockSizes[mbox] - 1)) &
++ (~(g_BlockSizes[mbox] - 1));
++
++ /* send each buffer synchronously */
++ status = HIFReadWrite(pDev->HIFDevice,
++ g_MailboxAddrs[mbox],
++ sendList[i].pBuffer,
++ paddedLength,
++ request,
++ NULL);
++ if (status != A_OK) {
++ break;
++ }
++ totalBytes += sendList[i].length;
++ totalwPadding += paddedLength;
++ }
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Sent %d bytes (%d padded bytes) to mailbox : %d \n",totalBytes,totalwPadding,mbox));
++
++ return status;
++}
++
++/* poll the mailbox credit counter until we get a credit or timeout */
++static A_STATUS GetCredits(AR6K_DEVICE *pDev, int mbox, int *pCredits)
++{
++ A_STATUS status = A_OK;
++ int timeout = TEST_CREDITS_RECV_TIMEOUT;
++ A_UINT8 credits = 0;
++ A_UINT32 address;
++
++ while (TRUE) {
++
++ /* Read the counter register to get credits, this auto-decrements */
++ address = COUNT_DEC_ADDRESS + (AR6K_MAILBOXES + mbox) * 4;
++ status = HIFReadWrite(pDev->HIFDevice, address, &credits, sizeof(credits),
++ HIF_RD_SYNC_BYTE_FIX, NULL);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("Unable to decrement the command credit count register (mbox=%d)\n",mbox));
++ status = A_ERROR;
++ break;
++ }
++
++ if (credits) {
++ break;
++ }
++
++ timeout--;
++
++ if (timeout <= 0) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ (" Timeout reading credit registers (mbox=%d, address:0x%X) \n",mbox,address));
++ status = A_ERROR;
++ break;
++ }
++
++ /* delay a little, target may not be ready */
++ msleep(1000);
++
++ }
++
++ if (status == A_OK) {
++ *pCredits = credits;
++ }
++
++ return status;
++}
++
++
++/* wait for the buffers to come back */
++static A_STATUS RecvBuffers(AR6K_DEVICE *pDev, int mbox)
++{
++ A_STATUS status = A_OK;
++ A_UINT32 request = HIF_RD_SYNC_BLOCK_INC;
++ BUFFER_PROC_LIST recvList[BUFFER_PROC_LIST_DEPTH];
++ int curBuffer;
++ int credits;
++ int i;
++ int totalBytes = 0;
++ int paddedLength;
++ int totalwPadding = 0;
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Waiting for buffers on mailbox : %d \n",mbox));
++
++ /* zero the buffers */
++ InitBuffers(FILL_ZERO);
++
++ /* assemble the order in which we should receive */
++ AssembleBufferList(recvList);
++
++ curBuffer = 0;
++
++ while (curBuffer < BUFFER_PROC_LIST_DEPTH) {
++
++ /* get number of buffers that have been completed, this blocks
++ * until we get at least 1 credit or it times out */
++ status = GetCredits(pDev, mbox, &credits);
++
++ if (status != A_OK) {
++ break;
++ }
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Got %d messages on mailbox : %d \n",credits, mbox));
++
++ /* get all the buffers that are sitting on the queue */
++ for (i = 0; i < credits; i++) {
++ AR_DEBUG_ASSERT(curBuffer < BUFFER_PROC_LIST_DEPTH);
++ /* recv the current buffer synchronously, the buffers should come back in
++ * order... with padding applied by the target */
++ paddedLength = (recvList[curBuffer].length + (g_BlockSizes[mbox] - 1)) &
++ (~(g_BlockSizes[mbox] - 1));
++
++ status = HIFReadWrite(pDev->HIFDevice,
++ g_MailboxAddrs[mbox],
++ recvList[curBuffer].pBuffer,
++ paddedLength,
++ request,
++ NULL);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to read %d bytes on mailbox:%d : address:0x%X \n",
++ recvList[curBuffer].length, mbox, g_MailboxAddrs[mbox]));
++ break;
++ }
++
++ totalwPadding += paddedLength;
++ totalBytes += recvList[curBuffer].length;
++ curBuffer++;
++ }
++
++ if (status != A_OK) {
++ break;
++ }
++ /* go back and get some more */
++ credits = 0;
++ }
++
++ if (totalBytes != TEST_BYTES) {
++ AR_DEBUG_ASSERT(FALSE);
++ } else {
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Got all buffers on mbox:%d total recv :%d (w/Padding : %d) \n",
++ mbox, totalBytes, totalwPadding));
++ }
++
++ return status;
++
++
++}
++
++static A_STATUS DoOneMboxHWTest(AR6K_DEVICE *pDev, int mbox)
++{
++ A_STATUS status;
++
++ do {
++ /* send out buffers */
++ status = SendBuffers(pDev,mbox);
++
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Sending buffers Failed : %d mbox:%d\n",status,mbox));
++ break;
++ }
++
++ /* go get them, this will block */
++ status = RecvBuffers(pDev, mbox);
++
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Recv buffers Failed : %d mbox:%d\n",status,mbox));
++ break;
++ }
++
++ /* check the returned data patterns */
++ if (!CheckBuffers()) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Buffer Verify Failed : mbox:%d\n",mbox));
++ status = A_ERROR;
++ break;
++ }
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, (" Send/Recv success! mailbox : %d \n",mbox));
++
++ } while (FALSE);
++
++ return status;
++}
++
++/* here is where the test starts */
++A_STATUS DoMboxHWTest(AR6K_DEVICE *pDev)
++{
++ int i;
++ A_STATUS status;
++ int credits = 0;
++ A_UINT8 params[4];
++ int numBufs;
++ int bufferSize;
++ A_UINT16 temp;
++
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, (" DoMboxHWTest START - \n"));
++
++ do {
++ /* get the addresses for all 4 mailboxes */
++ status = HIFConfigureDevice(pDev->HIFDevice, HIF_DEVICE_GET_MBOX_ADDR,
++ g_MailboxAddrs, sizeof(g_MailboxAddrs));
++
++ if (status != A_OK) {
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ /* get the block sizes */
++ status = HIFConfigureDevice(pDev->HIFDevice, HIF_DEVICE_GET_MBOX_BLOCK_SIZE,
++ g_BlockSizes, sizeof(g_BlockSizes));
++
++ if (status != A_OK) {
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ /* note, the HIF layer usually reports mbox 0 to have a block size of
++ * 1, but our test wants to run in block-mode for all mailboxes, so we treat all mailboxes
++ * the same. */
++ g_BlockSizes[0] = g_BlockSizes[1];
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Block Size to use: %d \n",g_BlockSizes[0]));
++
++ if (g_BlockSizes[1] > BUFFER_BLOCK_PAD) {
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("%d Block size is too large for buffer pad %d\n",
++ g_BlockSizes[1], BUFFER_BLOCK_PAD));
++ break;
++ }
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Waiting for target.... \n"));
++
++ /* the target lets us know it is ready by giving us 1 credit on
++ * mailbox 0 */
++ status = GetCredits(pDev, 0, &credits);
++
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to wait for target ready \n"));
++ break;
++ }
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Target is ready ...\n"));
++
++ /* read the first 4 scratch registers */
++ status = HIFReadWrite(pDev->HIFDevice,
++ SCRATCH_ADDRESS,
++ params,
++ 4,
++ HIF_RD_SYNC_BYTE_INC,
++ NULL);
++
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to wait get parameters \n"));
++ break;
++ }
++
++ numBufs = params[0];
++ bufferSize = (int)(((A_UINT16)params[2] << 8) | (A_UINT16)params[1]);
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE,
++ ("Target parameters: bufs per mailbox:%d, buffer size:%d bytes (total space: %d, minimum required space (w/padding): %d) \n",
++ numBufs, bufferSize, (numBufs * bufferSize), TOTAL_BYTES));
++
++ if ((numBufs * bufferSize) < TOTAL_BYTES) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Not Enough buffer space to run test! need:%d, got:%d \n",
++ TOTAL_BYTES, (numBufs*bufferSize)));
++ status = A_ERROR;
++ break;
++ }
++
++ temp = GetEndMarker();
++
++ status = HIFReadWrite(pDev->HIFDevice,
++ SCRATCH_ADDRESS + 4,
++ (A_UINT8 *)&temp,
++ 2,
++ HIF_WR_SYNC_BYTE_INC,
++ NULL);
++
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to write end marker \n"));
++ break;
++ }
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("End Marker: 0x%X \n",temp));
++
++ temp = (A_UINT16)g_BlockSizes[1];
++ /* convert to a mask */
++ temp = temp - 1;
++ status = HIFReadWrite(pDev->HIFDevice,
++ SCRATCH_ADDRESS + 6,
++ (A_UINT8 *)&temp,
++ 2,
++ HIF_WR_SYNC_BYTE_INC,
++ NULL);
++
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to write block mask \n"));
++ break;
++ }
++
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Set Block Mask: 0x%X \n",temp));
++
++ /* execute the test on each mailbox */
++ for (i = 0; i < AR6K_MAILBOXES; i++) {
++ status = DoOneMboxHWTest(pDev, i);
++ if (status != A_OK) {
++ break;
++ }
++ }
++
++ } while (FALSE);
++
++ if (status == A_OK) {
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, (" DoMboxHWTest DONE - SUCCESS! - \n"));
++ } else {
++ AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, (" DoMboxHWTest DONE - FAILED! - \n"));
++ }
++ /* don't let HTC_Start continue, the target is actually not running any HTC code */
++ return A_ERROR;
++}
++#endif
++
++
++
+diff --git a/drivers/ar6000/htc/ar6k.h b/drivers/ar6000/htc/ar6k.h
+new file mode 100644
+index 0000000..301ab34
+--- /dev/null
++++ b/drivers/ar6000/htc/ar6k.h
+@@ -0,0 +1,191 @@
++/*
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef AR6K_H_
++#define AR6K_H_
++
++#define AR6K_MAILBOXES 4
++
++/* HTC runs over mailbox 0 */
++#define HTC_MAILBOX 0
++
++#define AR6K_TARGET_DEBUG_INTR_MASK 0x01
++
++#define OTHER_INTS_ENABLED (INT_STATUS_ENABLE_ERROR_MASK | \
++ INT_STATUS_ENABLE_CPU_MASK | \
++ INT_STATUS_ENABLE_COUNTER_MASK)
++
++//#define MBOXHW_UNIT_TEST 1
++
++#include "athstartpack.h"
++typedef PREPACK struct _AR6K_IRQ_PROC_REGISTERS {
++ A_UINT8 host_int_status;
++ A_UINT8 cpu_int_status;
++ A_UINT8 error_int_status;
++ A_UINT8 counter_int_status;
++ A_UINT8 mbox_frame;
++ A_UINT8 rx_lookahead_valid;
++ A_UINT8 hole[2];
++ A_UINT32 rx_lookahead[2];
++} POSTPACK AR6K_IRQ_PROC_REGISTERS;
++
++#define AR6K_IRQ_PROC_REGS_SIZE sizeof(AR6K_IRQ_PROC_REGISTERS)
++
++
++
++typedef PREPACK struct _AR6K_IRQ_ENABLE_REGISTERS {
++ A_UINT8 int_status_enable;
++ A_UINT8 cpu_int_status_enable;
++ A_UINT8 error_status_enable;
++ A_UINT8 counter_int_status_enable;
++} POSTPACK AR6K_IRQ_ENABLE_REGISTERS;
++
++#include "athendpack.h"
++
++#define AR6K_IRQ_ENABLE_REGS_SIZE sizeof(AR6K_IRQ_ENABLE_REGISTERS)
++
++#define AR6K_REG_IO_BUFFER_SIZE 32
++#define AR6K_MAX_REG_IO_BUFFERS 8
++
++/* buffers for ASYNC I/O */
++typedef struct AR6K_ASYNC_REG_IO_BUFFER {
++ HTC_PACKET HtcPacket; /* we use an HTC packet as a wrapper for our async register-based I/O */
++ A_UINT8 Buffer[AR6K_REG_IO_BUFFER_SIZE];
++} AR6K_ASYNC_REG_IO_BUFFER;
++
++typedef struct _AR6K_DEVICE {
++ A_MUTEX_T Lock;
++ AR6K_IRQ_PROC_REGISTERS IrqProcRegisters;
++ AR6K_IRQ_ENABLE_REGISTERS IrqEnableRegisters;
++ void *HIFDevice;
++ A_UINT32 BlockSize;
++ A_UINT32 BlockMask;
++ A_UINT32 MailboxAddress;
++ HIF_PENDING_EVENTS_FUNC GetPendingEventsFunc;
++ void *HTCContext;
++ HTC_PACKET_QUEUE RegisterIOList;
++ AR6K_ASYNC_REG_IO_BUFFER RegIOBuffers[AR6K_MAX_REG_IO_BUFFERS];
++ void (*TargetFailureCallback)(void *Context);
++ A_STATUS (*MessagePendingCallback)(void *Context, A_UINT32 LookAhead, A_BOOL *pAsyncProc);
++ HIF_DEVICE_IRQ_PROCESSING_MODE HifIRQProcessingMode;
++ HIF_MASK_UNMASK_RECV_EVENT HifMaskUmaskRecvEvent;
++} AR6K_DEVICE;
++
++#define IS_DEV_IRQ_PROCESSING_ASYNC_ALLOWED(pDev) ((pDev)->HifIRQProcessingMode != HIF_DEVICE_IRQ_SYNC_ONLY)
++
++A_STATUS DevSetup(AR6K_DEVICE *pDev);
++A_STATUS DevUnmaskInterrupts(AR6K_DEVICE *pDev);
++A_STATUS DevMaskInterrupts(AR6K_DEVICE *pDev);
++A_STATUS DevPollMboxMsgRecv(AR6K_DEVICE *pDev,
++ A_UINT32 *pLookAhead,
++ int TimeoutMS);
++A_STATUS DevRWCompletionHandler(void *context, A_STATUS status);
++A_STATUS DevDsrHandler(void *context);
++A_STATUS DevCheckPendingRecvMsgsAsync(void *context);
++void DevDumpRegisters(AR6K_IRQ_PROC_REGISTERS *pIrqProcRegs,
++ AR6K_IRQ_ENABLE_REGISTERS *pIrqEnableRegs);
++
++#define DEV_STOP_RECV_ASYNC TRUE
++#define DEV_STOP_RECV_SYNC FALSE
++#define DEV_ENABLE_RECV_ASYNC TRUE
++#define DEV_ENABLE_RECV_SYNC FALSE
++A_STATUS DevStopRecv(AR6K_DEVICE *pDev, A_BOOL ASyncMode);
++A_STATUS DevEnableRecv(AR6K_DEVICE *pDev, A_BOOL ASyncMode);
++
++static INLINE A_STATUS DevSendPacket(AR6K_DEVICE *pDev, HTC_PACKET *pPacket, A_UINT32 SendLength) {
++ A_UINT32 paddedLength;
++ A_BOOL sync = (pPacket->Completion == NULL) ? TRUE : FALSE;
++ A_STATUS status;
++
++ /* adjust the length to be a multiple of block size if appropriate */
++ paddedLength = (SendLength + (pDev->BlockMask)) &
++ (~(pDev->BlockMask));
++#if 0 // BufferLength may not be set in , fix this...
++ if (paddedLength > pPacket->BufferLength) {
++ AR_DEBUG_ASSERT(FALSE);
++ if (pPacket->Completion != NULL) {
++ COMPLETE_HTC_PACKET(pPacket,A_EINVAL);
++ }
++ return A_EINVAL;
++ }
++#endif
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
++ ("DevSendPacket, Padded Length: %d Mbox:0x%X (mode:%s)\n",
++ paddedLength,
++ pDev->MailboxAddress,
++ sync ? "SYNC" : "ASYNC"));
++
++ status = HIFReadWrite(pDev->HIFDevice,
++ pDev->MailboxAddress,
++ pPacket->pBuffer,
++ paddedLength, /* the padded length */
++ sync ? HIF_WR_SYNC_BLOCK_INC : HIF_WR_ASYNC_BLOCK_INC,
++ sync ? NULL : pPacket); /* pass the packet as the context to the HIF request */
++
++ if (sync) {
++ pPacket->Status = status;
++ }
++
++ return status;
++}
++
++static INLINE A_STATUS DevRecvPacket(AR6K_DEVICE *pDev, HTC_PACKET *pPacket, A_UINT32 RecvLength) {
++ A_UINT32 paddedLength;
++ A_STATUS status;
++ A_BOOL sync = (pPacket->Completion == NULL) ? TRUE : FALSE;
++
++ /* adjust the length to be a multiple of block size if appropriate */
++ paddedLength = (RecvLength + (pDev->BlockMask)) &
++ (~(pDev->BlockMask));
++ if (paddedLength > pPacket->BufferLength) {
++ AR_DEBUG_ASSERT(FALSE);
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("DevRecvPacket, Not enough space for padlen:%d recvlen:%d bufferlen:%d \n",
++ paddedLength,RecvLength,pPacket->BufferLength));
++ if (pPacket->Completion != NULL) {
++ COMPLETE_HTC_PACKET(pPacket,A_EINVAL);
++ }
++ return A_EINVAL;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,
++ ("DevRecvPacket, Padded Length: %d Mbox:0x%X (mode:%s)\n",
++ paddedLength,
++ pDev->MailboxAddress,
++ sync ? "SYNC" : "ASYNC"));
++
++ status = HIFReadWrite(pDev->HIFDevice,
++ pDev->MailboxAddress,
++ pPacket->pBuffer,
++ paddedLength,
++ sync ? HIF_RD_SYNC_BLOCK_INC : HIF_RD_ASYNC_BLOCK_INC,
++ sync ? NULL : pPacket); /* pass the packet as the context to the HIF request */
++
++ if (sync) {
++ pPacket->Status = status;
++ }
++
++ return status;
++}
++
++#ifdef MBOXHW_UNIT_TEST
++A_STATUS DoMboxHWTest(AR6K_DEVICE *pDev);
++#endif
++
++#endif /*AR6K_H_*/
+diff --git a/drivers/ar6000/htc/ar6k_events.c b/drivers/ar6000/htc/ar6k_events.c
+new file mode 100644
+index 0000000..91b29af
+--- /dev/null
++++ b/drivers/ar6000/htc/ar6k_events.c
+@@ -0,0 +1,638 @@
++/*
++ * AR6K Driver layer event handling (i.e. interrupts, message polling)
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++#include "a_config.h"
++#include "athdefs.h"
++#include "a_types.h"
++#include "AR6Khwreg.h"
++#include "a_osapi.h"
++#include "a_debug.h"
++#include "hif.h"
++#include "htc_packet.h"
++#include "ar6k.h"
++
++extern void AR6KFreeIOPacket(AR6K_DEVICE *pDev, HTC_PACKET *pPacket);
++extern HTC_PACKET *AR6KAllocIOPacket(AR6K_DEVICE *pDev);
++
++static A_STATUS DevServiceDebugInterrupt(AR6K_DEVICE *pDev);
++
++#define DELAY_PER_INTERVAL_MS 10 /* 10 MS delay per polling interval */
++
++/* completion routine for ALL HIF layer async I/O */
++A_STATUS DevRWCompletionHandler(void *context, A_STATUS status)
++{
++ HTC_PACKET *pPacket = (HTC_PACKET *)context;
++
++ COMPLETE_HTC_PACKET(pPacket,status);
++
++ return A_OK;
++}
++
++/* mailbox recv message polling */
++A_STATUS DevPollMboxMsgRecv(AR6K_DEVICE *pDev,
++ A_UINT32 *pLookAhead,
++ int TimeoutMS)
++{
++ A_STATUS status = A_OK;
++ int timeout = TimeoutMS/DELAY_PER_INTERVAL_MS;
++
++ AR_DEBUG_ASSERT(timeout > 0);
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("+DevPollMboxMsgRecv \n"));
++
++ while (TRUE) {
++
++ if (pDev->GetPendingEventsFunc != NULL)
++ {
++
++ HIF_PENDING_EVENTS_INFO events;
++
++ /* the HIF layer uses a special mechanism to get events, do this
++ * synchronously */
++ status = pDev->GetPendingEventsFunc(pDev->HIFDevice,
++ &events,
++ NULL);
++ if (A_FAILED(status))
++ {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Failed to get pending events \n"));
++ break;
++ }
++
++ if (events.Events & HIF_RECV_MSG_AVAIL)
++ {
++ /* there is a message available, the lookahead should be valid now */
++ *pLookAhead = events.LookAhead;
++
++ break;
++ }
++ }
++ else
++ {
++
++ /* this is the standard HIF way.... */
++ /* load the register table */
++ status = HIFReadWrite(pDev->HIFDevice,
++ HOST_INT_STATUS_ADDRESS,
++ (A_UINT8 *)&pDev->IrqProcRegisters,
++ AR6K_IRQ_PROC_REGS_SIZE,
++ HIF_RD_SYNC_BYTE_INC,
++ NULL);
++
++ if (A_FAILED(status))
++ {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Failed to read register table \n"));
++ break;
++ }
++
++ /* check for MBOX data and valid lookahead */
++ if (pDev->IrqProcRegisters.host_int_status & (1 << HTC_MAILBOX))
++ {
++ if (pDev->IrqProcRegisters.rx_lookahead_valid & (1 << HTC_MAILBOX))
++ {
++ /* mailbox has a message and the look ahead is valid */
++ *pLookAhead = pDev->IrqProcRegisters.rx_lookahead[HTC_MAILBOX];
++ break;
++ }
++ }
++
++ }
++
++ timeout--;
++
++ if (timeout <= 0)
++ {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, (" Timeout waiting for recv message \n"));
++ status = A_ERROR;
++
++ /* check if the target asserted */
++ if ( pDev->IrqProcRegisters.counter_int_status & AR6K_TARGET_DEBUG_INTR_MASK) {
++ /* target signaled an assert, process this pending interrupt
++ * this will call the target failure handler */
++ DevServiceDebugInterrupt(pDev);
++ }
++
++ break;
++ }
++
++ /* delay a little */
++ msleep(DELAY_PER_INTERVAL_MS);
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,(" Retry Mbox Poll : %d \n",timeout));
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("-DevPollMboxMsgRecv \n"));
++
++ return status;
++}
++
++static A_STATUS DevServiceCPUInterrupt(AR6K_DEVICE *pDev)
++{
++ A_STATUS status;
++ A_UINT8 cpu_int_status;
++ A_UINT8 regBuffer[4];
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ, ("CPU Interrupt\n"));
++ cpu_int_status = pDev->IrqProcRegisters.cpu_int_status &
++ pDev->IrqEnableRegisters.cpu_int_status_enable;
++ AR_DEBUG_ASSERT(cpu_int_status);
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,
++ ("Valid interrupt source(s) in CPU_INT_STATUS: 0x%x\n",
++ cpu_int_status));
++
++ /* Clear the interrupt */
++ pDev->IrqProcRegisters.cpu_int_status &= ~cpu_int_status; /* W1C */
++
++ /* set up the register transfer buffer to hit the register 4 times , this is done
++ * to make the access 4-byte aligned to mitigate issues with host bus interconnects that
++ * restrict bus transfer lengths to be a multiple of 4-bytes */
++
++ /* set W1C value to clear the interrupt, this hits the register first */
++ regBuffer[0] = cpu_int_status;
++ /* the remaining 4 values are set to zero which have no-effect */
++ regBuffer[1] = 0;
++ regBuffer[2] = 0;
++ regBuffer[3] = 0;
++
++ status = HIFReadWrite(pDev->HIFDevice,
++ CPU_INT_STATUS_ADDRESS,
++ regBuffer,
++ 4,
++ HIF_WR_SYNC_BYTE_FIX,
++ NULL);
++
++ AR_DEBUG_ASSERT(status == A_OK);
++ return status;
++}
++
++
++static A_STATUS DevServiceErrorInterrupt(AR6K_DEVICE *pDev)
++{
++ A_STATUS status;
++ A_UINT8 error_int_status;
++ A_UINT8 regBuffer[4];
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ, ("Error Interrupt\n"));
++ error_int_status = pDev->IrqProcRegisters.error_int_status & 0x0F;
++ AR_DEBUG_ASSERT(error_int_status);
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,
++ ("Valid interrupt source(s) in ERROR_INT_STATUS: 0x%x\n",
++ error_int_status));
++
++ if (ERROR_INT_STATUS_WAKEUP_GET(error_int_status)) {
++ /* Wakeup */
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ, ("Error : Wakeup\n"));
++ }
++
++ if (ERROR_INT_STATUS_RX_UNDERFLOW_GET(error_int_status)) {
++ /* Rx Underflow */
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Error : Rx Underflow\n"));
++ }
++
++ if (ERROR_INT_STATUS_TX_OVERFLOW_GET(error_int_status)) {
++ /* Tx Overflow */
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Error : Tx Overflow\n"));
++ }
++
++ /* Clear the interrupt */
++ pDev->IrqProcRegisters.error_int_status &= ~error_int_status; /* W1C */
++
++ /* set up the register transfer buffer to hit the register 4 times , this is done
++ * to make the access 4-byte aligned to mitigate issues with host bus interconnects that
++ * restrict bus transfer lengths to be a multiple of 4-bytes */
++
++ /* set W1C value to clear the interrupt, this hits the register first */
++ regBuffer[0] = error_int_status;
++ /* the remaining 4 values are set to zero which have no-effect */
++ regBuffer[1] = 0;
++ regBuffer[2] = 0;
++ regBuffer[3] = 0;
++
++ status = HIFReadWrite(pDev->HIFDevice,
++ ERROR_INT_STATUS_ADDRESS,
++ regBuffer,
++ 4,
++ HIF_WR_SYNC_BYTE_FIX,
++ NULL);
++
++ AR_DEBUG_ASSERT(status == A_OK);
++ return status;
++}
++
++static A_STATUS DevServiceDebugInterrupt(AR6K_DEVICE *pDev)
++{
++ A_UINT32 dummy;
++ A_STATUS status;
++
++ /* Send a target failure event to the application */
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Target debug interrupt\n"));
++
++ if (pDev->TargetFailureCallback != NULL) {
++ pDev->TargetFailureCallback(pDev->HTCContext);
++ }
++
++ /* clear the interrupt , the debug error interrupt is
++ * counter 0 */
++ /* read counter to clear interrupt */
++ status = HIFReadWrite(pDev->HIFDevice,
++ COUNT_DEC_ADDRESS,
++ (A_UINT8 *)&dummy,
++ 4,
++ HIF_RD_SYNC_BYTE_INC,
++ NULL);
++
++ AR_DEBUG_ASSERT(status == A_OK);
++ return status;
++}
++
++static A_STATUS DevServiceCounterInterrupt(AR6K_DEVICE *pDev)
++{
++ A_UINT8 counter_int_status;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ, ("Counter Interrupt\n"));
++
++ counter_int_status = pDev->IrqProcRegisters.counter_int_status &
++ pDev->IrqEnableRegisters.counter_int_status_enable;
++
++ AR_DEBUG_ASSERT(counter_int_status);
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,
++ ("Valid interrupt source(s) in COUNTER_INT_STATUS: 0x%x\n",
++ counter_int_status));
++
++ /* Check if the debug interrupt is pending */
++ if (counter_int_status & AR6K_TARGET_DEBUG_INTR_MASK) {
++ return DevServiceDebugInterrupt(pDev);
++ }
++
++ return A_OK;
++}
++
++/* callback when our fetch to get interrupt status registers completes */
++static void DevGetEventAsyncHandler(void *Context, HTC_PACKET *pPacket)
++{
++ AR6K_DEVICE *pDev = (AR6K_DEVICE *)Context;
++ A_UINT32 lookAhead = 0;
++ A_BOOL otherInts = FALSE;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("+DevGetEventAsyncHandler: (dev: 0x%X)\n", (A_UINT32)pDev));
++
++ do {
++
++ if (A_FAILED(pPacket->Status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ (" GetEvents I/O request failed, status:%d \n", pPacket->Status));
++ /* bail out, don't unmask HIF interrupt */
++ break;
++ }
++
++ if (pDev->GetPendingEventsFunc != NULL) {
++ /* the HIF layer collected the information for us */
++ HIF_PENDING_EVENTS_INFO *pEvents = (HIF_PENDING_EVENTS_INFO *)pPacket->pBuffer;
++ if (pEvents->Events & HIF_RECV_MSG_AVAIL) {
++ lookAhead = pEvents->LookAhead;
++ if (0 == lookAhead) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" DevGetEventAsyncHandler1, lookAhead is zero! \n"));
++ }
++ }
++ if (pEvents->Events & HIF_OTHER_EVENTS) {
++ otherInts = TRUE;
++ }
++ } else {
++ /* standard interrupt table handling.... */
++ AR6K_IRQ_PROC_REGISTERS *pReg = (AR6K_IRQ_PROC_REGISTERS *)pPacket->pBuffer;
++ A_UINT8 host_int_status;
++
++ host_int_status = pReg->host_int_status & pDev->IrqEnableRegisters.int_status_enable;
++
++ if (host_int_status & (1 << HTC_MAILBOX)) {
++ host_int_status &= ~(1 << HTC_MAILBOX);
++ if (pReg->rx_lookahead_valid & (1 << HTC_MAILBOX)) {
++ /* mailbox has a message and the look ahead is valid */
++ lookAhead = pReg->rx_lookahead[HTC_MAILBOX];
++ if (0 == lookAhead) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" DevGetEventAsyncHandler2, lookAhead is zero! \n"));
++ }
++ }
++ }
++
++ if (host_int_status) {
++ /* there are other interrupts to handle */
++ otherInts = TRUE;
++ }
++ }
++
++ if (otherInts || (lookAhead == 0)) {
++ /* if there are other interrupts to process, we cannot do this in the async handler so
++ * ack the interrupt which will cause our sync handler to run again
++ * if however there are no more messages, we can now ack the interrupt */
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,
++ (" Acking interrupt from DevGetEventAsyncHandler (otherints:%d, lookahead:0x%X)\n",
++ otherInts, lookAhead));
++ HIFAckInterrupt(pDev->HIFDevice);
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,
++ (" DevGetEventAsyncHandler : detected another message, lookahead :0x%X \n",
++ lookAhead));
++ /* lookahead is non-zero and there are no other interrupts to service,
++ * go get the next message */
++ pDev->MessagePendingCallback(pDev->HTCContext, lookAhead, NULL);
++ }
++
++ } while (FALSE);
++
++ /* free this IO packet */
++ AR6KFreeIOPacket(pDev,pPacket);
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("-DevGetEventAsyncHandler \n"));
++}
++
++/* called by the HTC layer when it wants us to check if the device has any more pending
++ * recv messages, this starts off a series of async requests to read interrupt registers */
++A_STATUS DevCheckPendingRecvMsgsAsync(void *context)
++{
++ AR6K_DEVICE *pDev = (AR6K_DEVICE *)context;
++ A_STATUS status = A_OK;
++ HTC_PACKET *pIOPacket;
++
++ /* this is called in an ASYNC only context, we may NOT block, sleep or call any apis that can
++ * cause us to switch contexts */
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("+DevCheckPendingRecvMsgsAsync: (dev: 0x%X)\n", (A_UINT32)pDev));
++
++ do {
++
++ if (HIF_DEVICE_IRQ_SYNC_ONLY == pDev->HifIRQProcessingMode) {
++ /* break the async processing chain right here, no need to continue.
++ * The DevDsrHandler() will handle things in a loop when things are driven
++ * synchronously */
++ break;
++ }
++ /* first allocate one of our HTC packets we created for async I/O
++ * we reuse HTC packet definitions so that we can use the completion mechanism
++ * in DevRWCompletionHandler() */
++ pIOPacket = AR6KAllocIOPacket(pDev);
++
++ if (NULL == pIOPacket) {
++ /* there should be only 1 asynchronous request out at a time to read these registers
++ * so this should actually never happen */
++ status = A_NO_MEMORY;
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ /* stick in our completion routine when the I/O operation completes */
++ pIOPacket->Completion = DevGetEventAsyncHandler;
++ pIOPacket->pContext = pDev;
++
++ if (pDev->GetPendingEventsFunc) {
++ /* HIF layer has it's own mechanism, pass the IO to it.. */
++ status = pDev->GetPendingEventsFunc(pDev->HIFDevice,
++ (HIF_PENDING_EVENTS_INFO *)pIOPacket->pBuffer,
++ pIOPacket);
++
++ } else {
++ /* standard way, read the interrupt register table asynchronously again */
++ status = HIFReadWrite(pDev->HIFDevice,
++ HOST_INT_STATUS_ADDRESS,
++ pIOPacket->pBuffer,
++ AR6K_IRQ_PROC_REGS_SIZE,
++ HIF_RD_ASYNC_BYTE_INC,
++ pIOPacket);
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,(" Async IO issued to get interrupt status...\n"));
++ } while (FALSE);
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("-DevCheckPendingRecvMsgsAsync \n"));
++
++ return status;
++}
++
++/* process pending interrupts synchronously */
++static A_STATUS ProcessPendingIRQs(AR6K_DEVICE *pDev, A_BOOL *pDone, A_BOOL *pASyncProcessing)
++{
++ A_STATUS status = A_OK;
++ A_UINT8 host_int_status = 0;
++ A_UINT32 lookAhead = 0;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("+ProcessPendingIRQs: (dev: 0x%X)\n", (A_UINT32)pDev));
++
++ /*** NOTE: the HIF implementation guarantees that the context of this call allows
++ * us to perform SYNCHRONOUS I/O, that is we can block, sleep or call any API that
++ * can block or switch thread/task ontexts.
++ * This is a fully schedulable context.
++ * */
++ do {
++
++ if (pDev->GetPendingEventsFunc != NULL) {
++ HIF_PENDING_EVENTS_INFO events;
++
++ /* the HIF layer uses a special mechanism to get events
++ * get this synchronously */
++ status = pDev->GetPendingEventsFunc(pDev->HIFDevice,
++ &events,
++ NULL);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ if (events.Events & HIF_RECV_MSG_AVAIL) {
++ lookAhead = events.LookAhead;
++ if (0 == lookAhead) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" ProcessPendingIRQs1 lookAhead is zero! \n"));
++ }
++ }
++
++ if (!(events.Events & HIF_OTHER_EVENTS) ||
++ !(pDev->IrqEnableRegisters.int_status_enable & OTHER_INTS_ENABLED)) {
++ /* no need to read the register table, no other interesting interrupts.
++ * Some interfaces (like SPI) can shadow interrupt sources without
++ * requiring the host to do a full table read */
++ break;
++ }
++
++ /* otherwise fall through and read the register table */
++ }
++
++ /*
++ * Read the first 28 bytes of the HTC register table. This will yield us
++ * the value of different int status registers and the lookahead
++ * registers.
++ * length = sizeof(int_status) + sizeof(cpu_int_status) +
++ * sizeof(error_int_status) + sizeof(counter_int_status) +
++ * sizeof(mbox_frame) + sizeof(rx_lookahead_valid) +
++ * sizeof(hole) + sizeof(rx_lookahead) +
++ * sizeof(int_status_enable) + sizeof(cpu_int_status_enable) +
++ * sizeof(error_status_enable) +
++ * sizeof(counter_int_status_enable);
++ *
++ */
++ status = HIFReadWrite(pDev->HIFDevice,
++ HOST_INT_STATUS_ADDRESS,
++ (A_UINT8 *)&pDev->IrqProcRegisters,
++ AR6K_IRQ_PROC_REGS_SIZE,
++ HIF_RD_SYNC_BYTE_INC,
++ NULL);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_IRQ)) {
++ DevDumpRegisters(&pDev->IrqProcRegisters,
++ &pDev->IrqEnableRegisters);
++ }
++
++ /* Update only those registers that are enabled */
++ host_int_status = pDev->IrqProcRegisters.host_int_status &
++ pDev->IrqEnableRegisters.int_status_enable;
++
++ if (NULL == pDev->GetPendingEventsFunc) {
++ /* only look at mailbox status if the HIF layer did not provide this function,
++ * on some HIF interfaces reading the RX lookahead is not valid to do */
++ if (host_int_status & (1 << HTC_MAILBOX)) {
++ /* mask out pending mailbox value, we use "lookAhead" as the real flag for
++ * mailbox processing below */
++ host_int_status &= ~(1 << HTC_MAILBOX);
++ if (pDev->IrqProcRegisters.rx_lookahead_valid & (1 << HTC_MAILBOX)) {
++ /* mailbox has a message and the look ahead is valid */
++ lookAhead = pDev->IrqProcRegisters.rx_lookahead[HTC_MAILBOX];
++ if (0 == lookAhead) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" ProcessPendingIRQs2, lookAhead is zero! \n"));
++ }
++ }
++ }
++ } else {
++ /* not valid to check if the HIF has another mechanism for reading mailbox pending status*/
++ host_int_status &= ~(1 << HTC_MAILBOX);
++ }
++
++ } while (FALSE);
++
++
++ do {
++
++ /* did the interrupt status fetches succeed? */
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ if ((0 == host_int_status) && (0 == lookAhead)) {
++ /* nothing to process, the caller can use this to break out of a loop */
++ *pDone = TRUE;
++ break;
++ }
++
++ if (lookAhead != 0) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("Pending mailbox message, LookAhead: 0x%X\n",lookAhead));
++ /* Mailbox Interrupt, the HTC layer may issue async requests to empty the
++ * mailbox...
++ * When emptying the recv mailbox we use the async handler above called from the
++ * completion routine of the callers read request. This can improve performance
++ * by reducing context switching when we rapidly pull packets */
++ status = pDev->MessagePendingCallback(pDev->HTCContext, lookAhead, pASyncProcessing);
++ if (A_FAILED(status)) {
++ break;
++ }
++ }
++
++ /* now handle the rest of them */
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,
++ (" Valid interrupt source(s) for OTHER interrupts: 0x%x\n",
++ host_int_status));
++
++ if (HOST_INT_STATUS_CPU_GET(host_int_status)) {
++ /* CPU Interrupt */
++ status = DevServiceCPUInterrupt(pDev);
++ if (A_FAILED(status)){
++ break;
++ }
++ }
++
++ if (HOST_INT_STATUS_ERROR_GET(host_int_status)) {
++ /* Error Interrupt */
++ status = DevServiceErrorInterrupt(pDev);
++ if (A_FAILED(status)){
++ break;
++ }
++ }
++
++ if (HOST_INT_STATUS_COUNTER_GET(host_int_status)) {
++ /* Counter Interrupt */
++ status = DevServiceCounterInterrupt(pDev);
++ if (A_FAILED(status)){
++ break;
++ }
++ }
++
++ } while (FALSE);
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("-ProcessPendingIRQs: (done:%d, async:%d) status=%d \n",
++ *pDone, *pASyncProcessing, status));
++
++ return status;
++}
++
++
++/* Synchronousinterrupt handler, this handler kicks off all interrupt processing.*/
++A_STATUS DevDsrHandler(void *context)
++{
++ AR6K_DEVICE *pDev = (AR6K_DEVICE *)context;
++ A_STATUS status = A_OK;
++ A_BOOL done = FALSE;
++ A_BOOL asyncProc = FALSE;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("+DevDsrHandler: (dev: 0x%X)\n", (A_UINT32)pDev));
++
++
++ while (!done) {
++ status = ProcessPendingIRQs(pDev, &done, &asyncProc);
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ if (HIF_DEVICE_IRQ_SYNC_ONLY == pDev->HifIRQProcessingMode) {
++ /* the HIF layer does not allow async IRQ processing, override the asyncProc flag */
++ asyncProc = FALSE;
++ /* this will cause us to re-enter ProcessPendingIRQ() and re-read interrupt status registers.
++ * this has a nice side effect of blocking us until all async read requests are completed.
++ * This behavior is required on some HIF implementations that do not allow ASYNC
++ * processing in interrupt handlers (like Windows CE) */
++ }
++
++ if (asyncProc) {
++ /* the function performed some async I/O for performance, we
++ need to exit the ISR immediately, the check below will prevent the interrupt from being
++ Ack'd while we handle it asynchronously */
++ break;
++ }
++
++ }
++
++ if (A_SUCCESS(status) && !asyncProc) {
++ /* Ack the interrupt only if :
++ * 1. we did not get any errors in processing interrupts
++ * 2. there are no outstanding async processing requests */
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,(" Acking interrupt from DevDsrHandler \n"));
++ HIFAckInterrupt(pDev->HIFDevice);
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("-DevDsrHandler \n"));
++ return A_OK;
++}
++
++
+diff --git a/drivers/ar6000/htc/htc.c b/drivers/ar6000/htc/htc.c
+new file mode 100644
+index 0000000..d52ed94
+--- /dev/null
++++ b/drivers/ar6000/htc/htc.c
+@@ -0,0 +1,508 @@
++/*
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "htc_internal.h"
++
++
++static HTC_INIT_INFO HTCInitInfo = {NULL,NULL,NULL};
++static A_BOOL HTCInitialized = FALSE;
++
++static A_STATUS HTCTargetInsertedHandler(void *hif_handle);
++static A_STATUS HTCTargetRemovedHandler(void *handle, A_STATUS status);
++static void HTCReportFailure(void *Context);
++
++/* Initializes the HTC layer */
++A_STATUS HTCInit(HTC_INIT_INFO *pInitInfo)
++{
++ HTC_CALLBACKS htcCallbacks;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCInit: Enter\n"));
++ if (HTCInitialized) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCInit: Exit\n"));
++ return A_OK;
++ }
++
++ A_MEMCPY(&HTCInitInfo,pInitInfo,sizeof(HTC_INIT_INFO));
++
++ A_MEMZERO(&htcCallbacks, sizeof(HTC_CALLBACKS));
++
++ /* setup HIF layer callbacks */
++ htcCallbacks.deviceInsertedHandler = HTCTargetInsertedHandler;
++ htcCallbacks.deviceRemovedHandler = HTCTargetRemovedHandler;
++ /* the device layer handles these */
++ htcCallbacks.rwCompletionHandler = DevRWCompletionHandler;
++ htcCallbacks.dsrHandler = DevDsrHandler;
++ HIFInit(&htcCallbacks);
++ HTCInitialized = TRUE;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCInit: Exit\n"));
++ return A_OK;
++}
++
++void HTCFreeControlBuffer(HTC_TARGET *target, HTC_PACKET *pPacket, HTC_PACKET_QUEUE *pList)
++{
++ LOCK_HTC(target);
++ HTC_PACKET_ENQUEUE(pList,pPacket);
++ UNLOCK_HTC(target);
++}
++
++HTC_PACKET *HTCAllocControlBuffer(HTC_TARGET *target, HTC_PACKET_QUEUE *pList)
++{
++ HTC_PACKET *pPacket;
++
++ LOCK_HTC(target);
++ pPacket = HTC_PACKET_DEQUEUE(pList);
++ UNLOCK_HTC(target);
++
++ return pPacket;
++}
++
++/* cleanup the HTC instance */
++static void HTCCleanup(HTC_TARGET *target)
++{
++ if (A_IS_MUTEX_VALID(&target->HTCLock)) {
++ A_MUTEX_DELETE(&target->HTCLock);
++ }
++
++ if (A_IS_MUTEX_VALID(&target->HTCRxLock)) {
++ A_MUTEX_DELETE(&target->HTCRxLock);
++ }
++
++ if (A_IS_MUTEX_VALID(&target->HTCTxLock)) {
++ A_MUTEX_DELETE(&target->HTCTxLock);
++ }
++ /* free our instance */
++ A_FREE(target);
++}
++
++/* registered target arrival callback from the HIF layer */
++static A_STATUS HTCTargetInsertedHandler(void *hif_handle)
++{
++ HTC_TARGET *target = NULL;
++ A_STATUS status;
++ int i;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("htcTargetInserted - Enter\n"));
++
++ do {
++
++ /* allocate target memory */
++ if ((target = (HTC_TARGET *)A_MALLOC(sizeof(HTC_TARGET))) == NULL) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to allocate memory\n"));
++ status = A_ERROR;
++ break;
++ }
++
++ A_MEMZERO(target, sizeof(HTC_TARGET));
++ A_MUTEX_INIT(&target->HTCLock);
++ A_MUTEX_INIT(&target->HTCRxLock);
++ A_MUTEX_INIT(&target->HTCTxLock);
++ INIT_HTC_PACKET_QUEUE(&target->ControlBufferTXFreeList);
++ INIT_HTC_PACKET_QUEUE(&target->ControlBufferRXFreeList);
++
++ /* give device layer the hif device handle */
++ target->Device.HIFDevice = hif_handle;
++ /* give the device layer our context (for event processing)
++ * the device layer will register it's own context with HIF
++ * so we need to set this so we can fetch it in the target remove handler */
++ target->Device.HTCContext = target;
++ /* set device layer target failure callback */
++ target->Device.TargetFailureCallback = HTCReportFailure;
++ /* set device layer recv message pending callback */
++ target->Device.MessagePendingCallback = HTCRecvMessagePendingHandler;
++ target->EpWaitingForBuffers = ENDPOINT_MAX;
++
++ /* setup device layer */
++ status = DevSetup(&target->Device);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ /* carve up buffers/packets for control messages */
++ for (i = 0; i < NUM_CONTROL_RX_BUFFERS; i++) {
++ HTC_PACKET *pControlPacket;
++ pControlPacket = &target->HTCControlBuffers[i].HtcPacket;
++ SET_HTC_PACKET_INFO_RX_REFILL(pControlPacket,
++ target,
++ target->HTCControlBuffers[i].Buffer,
++ HTC_CONTROL_BUFFER_SIZE,
++ ENDPOINT_0);
++ HTC_FREE_CONTROL_RX(target,pControlPacket);
++ }
++
++ for (;i < NUM_CONTROL_BUFFERS;i++) {
++ HTC_PACKET *pControlPacket;
++ pControlPacket = &target->HTCControlBuffers[i].HtcPacket;
++ INIT_HTC_PACKET_INFO(pControlPacket,
++ target->HTCControlBuffers[i].Buffer,
++ HTC_CONTROL_BUFFER_SIZE);
++ HTC_FREE_CONTROL_TX(target,pControlPacket);
++ }
++
++ } while (FALSE);
++
++ if (A_SUCCESS(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, (" calling AddInstance callback \n"));
++ /* announce ourselves */
++ HTCInitInfo.AddInstance((HTC_HANDLE)target);
++ } else {
++ if (target != NULL) {
++ HTCCleanup(target);
++ }
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("htcTargetInserted - Exit\n"));
++
++ return status;
++}
++
++/* registered removal callback from the HIF layer */
++static A_STATUS HTCTargetRemovedHandler(void *handle, A_STATUS status)
++{
++ HTC_TARGET *target;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+HTCTargetRemovedHandler handle:0x%X \n",(A_UINT32)handle));
++
++ if (NULL == handle) {
++ /* this could be NULL in the event that target initialization failed */
++ return A_OK;
++ }
++
++ target = ((AR6K_DEVICE *)handle)->HTCContext;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, (" removing target:0x%X instance:0x%X ... \n",
++ (A_UINT32)target, (A_UINT32)target->pInstanceContext));
++
++ if (target->pInstanceContext != NULL) {
++ /* let upper layer know, it needs to call HTCStop() */
++ HTCInitInfo.DeleteInstance(target->pInstanceContext);
++ }
++
++ HIFShutDownDevice(target->Device.HIFDevice);
++
++ HTCCleanup(target);
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-HTCTargetRemovedHandler \n"));
++ return A_OK;
++}
++
++/* get the low level HIF device for the caller , the caller may wish to do low level
++ * HIF requests */
++void *HTCGetHifDevice(HTC_HANDLE HTCHandle)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ return target->Device.HIFDevice;
++}
++
++/* set the instance block for this HTC handle, so that on removal, the blob can be
++ * returned to the caller */
++void HTCSetInstance(HTC_HANDLE HTCHandle, void *Instance)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++
++ target->pInstanceContext = Instance;
++}
++
++/* wait for the target to arrive (sends HTC Ready message)
++ * this operation is fully synchronous and the message is polled for */
++A_STATUS HTCWaitTarget(HTC_HANDLE HTCHandle)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ A_STATUS status;
++ HTC_PACKET *pPacket = NULL;
++ HTC_READY_MSG *pRdyMsg;
++ HTC_SERVICE_CONNECT_REQ connect;
++ HTC_SERVICE_CONNECT_RESP resp;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCWaitTarget - Enter (target:0x%X) \n", (A_UINT32)target));
++
++ do {
++
++#ifdef MBOXHW_UNIT_TEST
++
++ status = DoMboxHWTest(&target->Device);
++
++ if (status != A_OK) {
++ break;
++ }
++
++#endif
++
++ /* we should be getting 1 control message that the target is ready */
++ status = HTCWaitforControlMessage(target, &pPacket);
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, (" Target Not Available!!\n"));
++ break;
++ }
++
++ /* we controlled the buffer creation so it has to be properly aligned */
++ pRdyMsg = (HTC_READY_MSG *)pPacket->pBuffer;
++
++ if ((pRdyMsg->MessageID != HTC_MSG_READY_ID) ||
++ (pPacket->ActualLength < sizeof(HTC_READY_MSG))) {
++ /* this message is not valid */
++ AR_DEBUG_ASSERT(FALSE);
++ status = A_EPROTO;
++ break;
++ }
++
++ if (pRdyMsg->CreditCount == 0 || pRdyMsg->CreditSize == 0) {
++ /* this message is not valid */
++ AR_DEBUG_ASSERT(FALSE);
++ status = A_EPROTO;
++ break;
++ }
++
++ target->TargetCredits = pRdyMsg->CreditCount;
++ target->TargetCreditSize = pRdyMsg->CreditSize;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, (" Target Ready: credits: %d credit size: %d\n",
++ target->TargetCredits, target->TargetCreditSize));
++
++ /* setup our pseudo HTC control endpoint connection */
++ A_MEMZERO(&connect,sizeof(connect));
++ A_MEMZERO(&resp,sizeof(resp));
++ connect.EpCallbacks.pContext = target;
++ connect.EpCallbacks.EpTxComplete = HTCControlTxComplete;
++ connect.EpCallbacks.EpRecv = HTCControlRecv;
++ connect.EpCallbacks.EpRecvRefill = NULL; /* not needed */
++ connect.EpCallbacks.EpSendFull = NULL; /* not needed */
++ connect.EpCallbacks.EpSendAvail = NULL; /* not needed */
++ connect.MaxSendQueueDepth = NUM_CONTROL_BUFFERS;
++ connect.ServiceID = HTC_CTRL_RSVD_SVC;
++
++ /* connect fake service */
++ status = HTCConnectService((HTC_HANDLE)target,
++ &connect,
++ &resp);
++
++ if (!A_FAILED(status)) {
++ break;
++ }
++
++ } while (FALSE);
++
++ if (pPacket != NULL) {
++ HTC_FREE_CONTROL_RX(target,pPacket);
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCWaitTarget - Exit\n"));
++
++ return status;
++}
++
++
++
++/* Start HTC, enable interrupts and let the target know host has finished setup */
++A_STATUS HTCStart(HTC_HANDLE HTCHandle)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ HTC_PACKET *pPacket;
++ A_STATUS status;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCStart Enter\n"));
++
++ /* now that we are starting, push control receive buffers into the
++ * HTC control endpoint */
++
++ while (1) {
++ pPacket = HTC_ALLOC_CONTROL_RX(target);
++ if (NULL == pPacket) {
++ break;
++ }
++ HTCAddReceivePkt((HTC_HANDLE)target,pPacket);
++ }
++
++ do {
++
++ AR_DEBUG_ASSERT(target->InitCredits != NULL);
++ AR_DEBUG_ASSERT(target->EpCreditDistributionListHead != NULL);
++ AR_DEBUG_ASSERT(target->EpCreditDistributionListHead->pNext != NULL);
++
++ /* call init credits callback to do the distribution ,
++ * NOTE: the first entry in the distribution list is ENDPOINT_0, so
++ * we pass the start of the list after this one. */
++ target->InitCredits(target->pCredDistContext,
++ target->EpCreditDistributionListHead->pNext,
++ target->TargetCredits);
++
++ if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_TRC)) {
++ DumpCreditDistStates(target);
++ }
++
++ /* the caller is done connecting to services, so we can indicate to the
++ * target that the setup phase is complete */
++ status = HTCSendSetupComplete(target);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ /* unmask interrupts */
++ status = DevUnmaskInterrupts(&target->Device);
++
++ if (A_FAILED(status)) {
++ HTCStop(target);
++ }
++
++ } while (FALSE);
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCStart Exit\n"));
++ return status;
++}
++
++
++/* stop HTC communications, i.e. stop interrupt reception, and flush all queued buffers */
++void HTCStop(HTC_HANDLE HTCHandle)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+HTCStop \n"));
++
++ /* mark that we are shutting down .. */
++ target->HTCStateFlags |= HTC_STATE_STOPPING;
++
++ /* Masking interrupts is a synchronous operation, when this function returns
++ * all pending HIF I/O has completed, we can safely flush the queues */
++ DevMaskInterrupts(&target->Device);
++
++ /* flush all send packets */
++ HTCFlushSendPkts(target);
++ /* flush all recv buffers */
++ HTCFlushRecvBuffers(target);
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-HTCStop \n"));
++}
++
++/* undo what was done in HTCInit() */
++void HTCShutDown(void)
++{
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+HTCShutDown: \n"));
++ HTCInitialized = FALSE;
++ /* undo HTCInit */
++ HIFShutDownDevice(NULL);
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-HTCShutDown: \n"));
++}
++
++void HTCDumpCreditStates(HTC_HANDLE HTCHandle)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++
++ LOCK_HTC_TX(target);
++
++ DumpCreditDistStates(target);
++
++ UNLOCK_HTC_TX(target);
++}
++
++/* report a target failure from the device, this is a callback from the device layer
++ * which uses a mechanism to report errors from the target (i.e. special interrupts) */
++static void HTCReportFailure(void *Context)
++{
++ HTC_TARGET *target = (HTC_TARGET *)Context;
++
++ target->TargetFailure = TRUE;
++
++ if ((target->pInstanceContext != NULL) && (HTCInitInfo.TargetFailure != NULL)) {
++ /* let upper layer know, it needs to call HTCStop() */
++ HTCInitInfo.TargetFailure(target->pInstanceContext, A_ERROR);
++ }
++}
++
++void DebugDumpBytes(A_UCHAR *buffer, A_UINT16 length, char *pDescription)
++{
++ A_CHAR stream[60];
++ A_UINT32 i;
++ A_UINT16 offset, count;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, ("<---------Dumping %d Bytes : %s ------>\n", length, pDescription));
++
++ count = 0;
++ offset = 0;
++ for(i = 0; i < length; i++) {
++ sprintf(stream + offset, "%2.2X ", buffer[i]);
++ count ++;
++ offset += 3;
++
++ if(count == 16) {
++ count = 0;
++ offset = 0;
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, ("[H]: %s\n", stream));
++ A_MEMZERO(stream, 60);
++ }
++ }
++
++ if(offset != 0) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, ("[H]: %s\n", stream));
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, ("<------------------------------------------------->\n"));
++}
++
++A_BOOL HTCGetEndpointStatistics(HTC_HANDLE HTCHandle,
++ HTC_ENDPOINT_ID Endpoint,
++ HTC_ENDPOINT_STAT_ACTION Action,
++ HTC_ENDPOINT_STATS *pStats)
++{
++
++#ifdef HTC_EP_STAT_PROFILING
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ A_BOOL clearStats = FALSE;
++ A_BOOL sample = FALSE;
++
++ switch (Action) {
++ case HTC_EP_STAT_SAMPLE :
++ sample = TRUE;
++ break;
++ case HTC_EP_STAT_SAMPLE_AND_CLEAR :
++ sample = TRUE;
++ clearStats = TRUE;
++ break;
++ case HTC_EP_STAT_CLEAR :
++ clearStats = TRUE;
++ break;
++ default:
++ break;
++ }
++
++ A_ASSERT(Endpoint < ENDPOINT_MAX);
++
++ /* lock out TX and RX while we sample and/or clear */
++ LOCK_HTC_TX(target);
++ LOCK_HTC_RX(target);
++
++ if (sample) {
++ A_ASSERT(pStats != NULL);
++ /* return the stats to the caller */
++ A_MEMCPY(pStats, &target->EndPoint[Endpoint].EndPointStats, sizeof(HTC_ENDPOINT_STATS));
++ }
++
++ if (clearStats) {
++ /* reset stats */
++ A_MEMZERO(&target->EndPoint[Endpoint].EndPointStats, sizeof(HTC_ENDPOINT_STATS));
++ }
++
++ UNLOCK_HTC_RX(target);
++ UNLOCK_HTC_TX(target);
++
++ return TRUE;
++#else
++ return FALSE;
++#endif
++}
+diff --git a/drivers/ar6000/htc/htc_debug.h b/drivers/ar6000/htc/htc_debug.h
+new file mode 100644
+index 0000000..08080be
+--- /dev/null
++++ b/drivers/ar6000/htc/htc_debug.h
+@@ -0,0 +1,65 @@
++#ifndef HTC_DEBUG_H_
++#define HTC_DEBUG_H_
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++/* ------- Debug related stuff ------- */
++enum {
++ ATH_DEBUG_SEND = 0x0001,
++ ATH_DEBUG_RECV = 0x0002,
++ ATH_DEBUG_SYNC = 0x0004,
++ ATH_DEBUG_DUMP = 0x0008,
++ ATH_DEBUG_IRQ = 0x0010,
++ ATH_DEBUG_TRC = 0x0020,
++ ATH_DEBUG_WARN = 0x0040,
++ ATH_DEBUG_ERR = 0x0080,
++ ATH_DEBUG_ANY = 0xFFFF,
++};
++
++#ifdef DEBUG
++
++// TODO FIX usage of A_PRINTF!
++#define AR_DEBUG_LVL_CHECK(lvl) (debughtc & (lvl))
++#define AR_DEBUG_PRINTBUF(buffer, length, desc) do { \
++ if (debughtc & ATH_DEBUG_DUMP) { \
++ DebugDumpBytes(buffer, length,desc); \
++ } \
++} while(0)
++#define PRINTX_ARG(arg...) arg
++#define AR_DEBUG_PRINTF(flags, args) do { \
++ if (debughtc & (flags)) { \
++ A_PRINTF(KERN_ALERT PRINTX_ARG args); \
++ } \
++} while (0)
++#define AR_DEBUG_ASSERT(test) do { \
++ if (!(test)) { \
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Debug Assert Caught, File %s, Line: %d, Test:%s \n",__FILE__, __LINE__,#test)); \
++ } \
++} while(0)
++extern int debughtc;
++#else
++#define AR_DEBUG_PRINTF(flags, args)
++#define AR_DEBUG_PRINTBUF(buffer, length, desc)
++#define AR_DEBUG_ASSERT(test)
++#define AR_DEBUG_LVL_CHECK(lvl) 0
++#endif
++
++void DebugDumpBytes(A_UCHAR *buffer, A_UINT16 length, char *pDescription);
++
++#endif /*HTC_DEBUG_H_*/
+diff --git a/drivers/ar6000/htc/htc_internal.h b/drivers/ar6000/htc/htc_internal.h
+new file mode 100644
+index 0000000..ebb8ac1
+--- /dev/null
++++ b/drivers/ar6000/htc/htc_internal.h
+@@ -0,0 +1,168 @@
++/*
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef _HTC_INTERNAL_H_
++#define _HTC_INTERNAL_H_
++
++/* for debugging, uncomment this to capture the last frame header, on frame header
++ * processing errors, the last frame header is dump for comparison */
++//#define HTC_CAPTURE_LAST_FRAME
++
++//#define HTC_EP_STAT_PROFILING
++
++#ifdef __cplusplus
++extern "C" {
++#endif /* __cplusplus */
++
++/* Header files */
++#include "a_config.h"
++#include "athdefs.h"
++#include "a_types.h"
++#include "a_osapi.h"
++#include "a_debug.h"
++#include "htc.h"
++#include "htc_api.h"
++#include "bmi_msg.h"
++#include "hif.h"
++#include "ar6k.h"
++
++/* HTC operational parameters */
++#define HTC_TARGET_RESPONSE_TIMEOUT 2000 /* in ms */
++#define HTC_TARGET_DEBUG_INTR_MASK 0x01
++#define HTC_TARGET_CREDIT_INTR_MASK 0xF0
++
++typedef struct _HTC_ENDPOINT {
++ HTC_SERVICE_ID ServiceID; /* service ID this endpoint is bound to
++ non-zero value means this endpoint is in use */
++ HTC_PACKET_QUEUE TxQueue; /* HTC frame buffer TX queue */
++ HTC_PACKET_QUEUE RxBuffers; /* HTC frame buffer RX list */
++ HTC_ENDPOINT_CREDIT_DIST CreditDist; /* credit distribution structure (exposed to driver layer) */
++ HTC_EP_CALLBACKS EpCallBacks; /* callbacks associated with this endpoint */
++ int MaxTxQueueDepth; /* max depth of the TX queue before we need to
++ call driver's full handler */
++ int CurrentTxQueueDepth; /* current TX queue depth */
++ int MaxMsgLength; /* max length of endpoint message */
++#ifdef HTC_EP_STAT_PROFILING
++ HTC_ENDPOINT_STATS EndPointStats; /* endpoint statistics */
++#endif
++} HTC_ENDPOINT;
++
++#ifdef HTC_EP_STAT_PROFILING
++#define INC_HTC_EP_STAT(p,stat,count) (p)->EndPointStats.stat += (count);
++#else
++#define INC_HTC_EP_STAT(p,stat,count)
++#endif
++
++#define HTC_SERVICE_TX_PACKET_TAG HTC_TX_PACKET_TAG_INTERNAL
++
++#define NUM_CONTROL_BUFFERS 8
++#define NUM_CONTROL_TX_BUFFERS 2
++#define NUM_CONTROL_RX_BUFFERS (NUM_CONTROL_BUFFERS - NUM_CONTROL_TX_BUFFERS)
++
++#define HTC_CONTROL_BUFFER_SIZE (HTC_MAX_CONTROL_MESSAGE_LENGTH + HTC_HDR_LENGTH)
++
++typedef struct HTC_CONTROL_BUFFER {
++ HTC_PACKET HtcPacket;
++ A_UINT8 Buffer[HTC_CONTROL_BUFFER_SIZE];
++} HTC_CONTROL_BUFFER;
++
++/* our HTC target state */
++typedef struct _HTC_TARGET {
++ HTC_ENDPOINT EndPoint[ENDPOINT_MAX];
++ HTC_CONTROL_BUFFER HTCControlBuffers[NUM_CONTROL_BUFFERS];
++ HTC_ENDPOINT_CREDIT_DIST *EpCreditDistributionListHead;
++ HTC_PACKET_QUEUE ControlBufferTXFreeList;
++ HTC_PACKET_QUEUE ControlBufferRXFreeList;
++ HTC_CREDIT_DIST_CALLBACK DistributeCredits;
++ HTC_CREDIT_INIT_CALLBACK InitCredits;
++ void *pCredDistContext;
++ int TargetCredits;
++ int TargetCreditSize;
++ A_MUTEX_T HTCLock;
++ A_MUTEX_T HTCRxLock;
++ A_MUTEX_T HTCTxLock;
++ AR6K_DEVICE Device; /* AR6K - specific state */
++ A_UINT32 HTCStateFlags;
++ HTC_ENDPOINT_ID EpWaitingForBuffers;
++ A_BOOL TargetFailure;
++ void *pInstanceContext;
++#define HTC_STATE_WAIT_BUFFERS (1 << 0)
++#define HTC_STATE_STOPPING (1 << 1)
++#ifdef HTC_CAPTURE_LAST_FRAME
++ HTC_FRAME_HDR LastFrameHdr; /* useful for debugging */
++ A_UINT8 LastTrailer[256];
++ A_UINT8 LastTrailerLength;
++#endif
++} HTC_TARGET;
++
++#define HTC_STOPPING(t) ((t)->HTCStateFlags & HTC_STATE_STOPPING)
++#define LOCK_HTC(t) A_MUTEX_LOCK(&(t)->HTCLock);
++#define UNLOCK_HTC(t) A_MUTEX_UNLOCK(&(t)->HTCLock);
++#define LOCK_HTC_RX(t) A_MUTEX_LOCK(&(t)->HTCRxLock);
++#define UNLOCK_HTC_RX(t) A_MUTEX_UNLOCK(&(t)->HTCRxLock);
++#define LOCK_HTC_TX(t) A_MUTEX_LOCK(&(t)->HTCTxLock);
++#define UNLOCK_HTC_TX(t) A_MUTEX_UNLOCK(&(t)->HTCTxLock);
++
++#define GET_HTC_TARGET_FROM_HANDLE(hnd) ((HTC_TARGET *)(hnd))
++#define HTC_RECYCLE_RX_PKT(target,p) \
++{ \
++ HTC_PACKET_RESET_RX(pPacket); \
++ HTCAddReceivePkt((HTC_HANDLE)(target),(p)); \
++}
++
++/* internal HTC functions */
++void HTCControlTxComplete(void *Context, HTC_PACKET *pPacket);
++void HTCControlRecv(void *Context, HTC_PACKET *pPacket);
++A_STATUS HTCWaitforControlMessage(HTC_TARGET *target, HTC_PACKET **ppControlPacket);
++HTC_PACKET *HTCAllocControlBuffer(HTC_TARGET *target, HTC_PACKET_QUEUE *pList);
++void HTCFreeControlBuffer(HTC_TARGET *target, HTC_PACKET *pPacket, HTC_PACKET_QUEUE *pList);
++A_STATUS HTCIssueSend(HTC_TARGET *target, HTC_PACKET *pPacket, A_UINT8 Flags);
++A_STATUS HTCIssueRecv(HTC_TARGET *target, HTC_PACKET *pPacket);
++void HTCRecvCompleteHandler(void *Context, HTC_PACKET *pPacket);
++A_STATUS HTCRecvMessagePendingHandler(void *Context, A_UINT32 LookAhead, A_BOOL *pAsyncProc);
++void HTCProcessCreditRpt(HTC_TARGET *target, HTC_CREDIT_REPORT *pRpt, int NumEntries, HTC_ENDPOINT_ID FromEndpoint);
++A_STATUS HTCSendSetupComplete(HTC_TARGET *target);
++void HTCFlushRecvBuffers(HTC_TARGET *target);
++void HTCFlushSendPkts(HTC_TARGET *target);
++void DumpCreditDist(HTC_ENDPOINT_CREDIT_DIST *pEPDist);
++void DumpCreditDistStates(HTC_TARGET *target);
++void DebugDumpBytes(A_UCHAR *buffer, A_UINT16 length, char *pDescription);
++
++static INLINE HTC_PACKET *HTC_ALLOC_CONTROL_TX(HTC_TARGET *target) {
++ HTC_PACKET *pPacket = HTCAllocControlBuffer(target,&target->ControlBufferTXFreeList);
++ if (pPacket != NULL) {
++ /* set payload pointer area with some headroom */
++ pPacket->pBuffer = pPacket->pBufferStart + HTC_HDR_LENGTH;
++ }
++ return pPacket;
++}
++
++#define HTC_FREE_CONTROL_TX(t,p) HTCFreeControlBuffer((t),(p),&(t)->ControlBufferTXFreeList)
++#define HTC_ALLOC_CONTROL_RX(t) HTCAllocControlBuffer((t),&(t)->ControlBufferRXFreeList)
++#define HTC_FREE_CONTROL_RX(t,p) \
++{ \
++ HTC_PACKET_RESET_RX(p); \
++ HTCFreeControlBuffer((t),(p),&(t)->ControlBufferRXFreeList); \
++}
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _HTC_INTERNAL_H_ */
+diff --git a/drivers/ar6000/htc/htc_recv.c b/drivers/ar6000/htc/htc_recv.c
+new file mode 100644
+index 0000000..4be2b08
+--- /dev/null
++++ b/drivers/ar6000/htc/htc_recv.c
+@@ -0,0 +1,703 @@
++/*
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "htc_internal.h"
++
++#define HTCIssueRecv(t, p) \
++ DevRecvPacket(&(t)->Device, \
++ (p), \
++ (p)->ActualLength)
++
++#define DO_RCV_COMPLETION(t,p,e) \
++{ \
++ if ((p)->ActualLength > 0) { \
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV, (" completing packet 0x%X (%d bytes) on ep : %d \n", \
++ (A_UINT32)(p), (p)->ActualLength, (p)->Endpoint)); \
++ (e)->EpCallBacks.EpRecv((e)->EpCallBacks.pContext, \
++ (p)); \
++ } else { \
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV, (" recycling empty packet \n")); \
++ HTC_RECYCLE_RX_PKT((t), (p)); \
++ } \
++}
++
++#ifdef HTC_EP_STAT_PROFILING
++#define HTC_RX_STAT_PROFILE(t,ep,lookAhead) \
++{ \
++ LOCK_HTC_RX((t)); \
++ INC_HTC_EP_STAT((ep), RxReceived, 1); \
++ if ((lookAhead) != 0) { \
++ INC_HTC_EP_STAT((ep), RxLookAheads, 1); \
++ } \
++ UNLOCK_HTC_RX((t)); \
++}
++#else
++#define HTC_RX_STAT_PROFILE(t,ep,lookAhead)
++#endif
++
++static INLINE A_STATUS HTCProcessTrailer(HTC_TARGET *target,
++ A_UINT8 *pBuffer,
++ int Length,
++ A_UINT32 *pNextLookAhead,
++ HTC_ENDPOINT_ID FromEndpoint)
++{
++ HTC_RECORD_HDR *pRecord;
++ A_UINT8 *pRecordBuf;
++ HTC_LOOKAHEAD_REPORT *pLookAhead;
++ A_UINT8 *pOrigBuffer;
++ int origLength;
++ A_STATUS status;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("+HTCProcessTrailer (length:%d) \n", Length));
++
++ if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_RECV)) {
++ AR_DEBUG_PRINTBUF(pBuffer,Length,"Recv Trailer");
++ }
++
++ pOrigBuffer = pBuffer;
++ origLength = Length;
++ status = A_OK;
++
++ while (Length > 0) {
++
++ if (Length < sizeof(HTC_RECORD_HDR)) {
++ status = A_EPROTO;
++ break;
++ }
++ /* these are byte aligned structs */
++ pRecord = (HTC_RECORD_HDR *)pBuffer;
++ Length -= sizeof(HTC_RECORD_HDR);
++ pBuffer += sizeof(HTC_RECORD_HDR);
++
++ if (pRecord->Length > Length) {
++ /* no room left in buffer for record */
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ (" invalid record length: %d (id:%d) buffer has: %d bytes left \n",
++ pRecord->Length, pRecord->RecordID, Length));
++ status = A_EPROTO;
++ break;
++ }
++ /* start of record follows the header */
++ pRecordBuf = pBuffer;
++
++ switch (pRecord->RecordID) {
++ case HTC_RECORD_CREDITS:
++ AR_DEBUG_ASSERT(pRecord->Length >= sizeof(HTC_CREDIT_REPORT));
++ HTCProcessCreditRpt(target,
++ (HTC_CREDIT_REPORT *)pRecordBuf,
++ pRecord->Length / (sizeof(HTC_CREDIT_REPORT)),
++ FromEndpoint);
++ break;
++ case HTC_RECORD_LOOKAHEAD:
++ AR_DEBUG_ASSERT(pRecord->Length >= sizeof(HTC_LOOKAHEAD_REPORT));
++ pLookAhead = (HTC_LOOKAHEAD_REPORT *)pRecordBuf;
++ if ((pLookAhead->PreValid == ((~pLookAhead->PostValid) & 0xFF)) &&
++ (pNextLookAhead != NULL)) {
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,
++ (" LookAhead Report Found (pre valid:0x%X, post valid:0x%X) \n",
++ pLookAhead->PreValid,
++ pLookAhead->PostValid));
++
++ /* look ahead bytes are valid, copy them over */
++ ((A_UINT8 *)pNextLookAhead)[0] = pLookAhead->LookAhead[0];
++ ((A_UINT8 *)pNextLookAhead)[1] = pLookAhead->LookAhead[1];
++ ((A_UINT8 *)pNextLookAhead)[2] = pLookAhead->LookAhead[2];
++ ((A_UINT8 *)pNextLookAhead)[3] = pLookAhead->LookAhead[3];
++
++ if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_RECV)) {
++ DebugDumpBytes((A_UINT8 *)pNextLookAhead,4,"Next Look Ahead");
++ }
++ }
++ break;
++ default:
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, (" unhandled record: id:%d length:%d \n",
++ pRecord->RecordID, pRecord->Length));
++ break;
++ }
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ /* advance buffer past this record for next time around */
++ pBuffer += pRecord->Length;
++ Length -= pRecord->Length;
++ }
++
++ if (A_FAILED(status)) {
++ DebugDumpBytes(pOrigBuffer,origLength,"BAD Recv Trailer");
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("-HTCProcessTrailer \n"));
++ return status;
++
++}
++
++/* process a received message (i.e. strip off header, process any trailer data)
++ * note : locks must be released when this function is called */
++static A_STATUS HTCProcessRecvHeader(HTC_TARGET *target, HTC_PACKET *pPacket, A_UINT32 *pNextLookAhead)
++{
++ A_UINT8 temp;
++ A_UINT8 *pBuf;
++ A_STATUS status = A_OK;
++ A_UINT16 payloadLen;
++ A_UINT32 lookAhead;
++
++ pBuf = pPacket->pBuffer;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("+HTCProcessRecvHeader \n"));
++
++ if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_RECV)) {
++ AR_DEBUG_PRINTBUF(pBuf,pPacket->ActualLength,"HTC Recv PKT");
++ }
++
++ do {
++ /* note, we cannot assume the alignment of pBuffer, so we use the safe macros to
++ * retrieve 16 bit fields */
++ payloadLen = A_GET_UINT16_FIELD(pBuf, HTC_FRAME_HDR, PayloadLen);
++
++ ((A_UINT8 *)&lookAhead)[0] = pBuf[0];
++ ((A_UINT8 *)&lookAhead)[1] = pBuf[1];
++ ((A_UINT8 *)&lookAhead)[2] = pBuf[2];
++ ((A_UINT8 *)&lookAhead)[3] = pBuf[3];
++
++ if (lookAhead != pPacket->HTCReserved) {
++ /* somehow the lookahead that gave us the full read length did not
++ * reflect the actual header in the pending message */
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("HTCProcessRecvHeader, lookahead mismatch! \n"));
++ DebugDumpBytes((A_UINT8 *)&pPacket->HTCReserved,4,"Expected Message LookAhead");
++ DebugDumpBytes(pBuf,sizeof(HTC_FRAME_HDR),"Current Frame Header");
++#ifdef HTC_CAPTURE_LAST_FRAME
++ DebugDumpBytes((A_UINT8 *)&target->LastFrameHdr,sizeof(HTC_FRAME_HDR),"Last Frame Header");
++ if (target->LastTrailerLength != 0) {
++ DebugDumpBytes(target->LastTrailer,
++ target->LastTrailerLength,
++ "Last trailer");
++ }
++#endif
++ status = A_EPROTO;
++ break;
++ }
++
++ /* get flags */
++ temp = A_GET_UINT8_FIELD(pBuf, HTC_FRAME_HDR, Flags);
++
++ if (temp & HTC_FLAGS_RECV_TRAILER) {
++ /* this packet has a trailer */
++
++ /* extract the trailer length in control byte 0 */
++ temp = A_GET_UINT8_FIELD(pBuf, HTC_FRAME_HDR, ControlBytes[0]);
++
++ if ((temp < sizeof(HTC_RECORD_HDR)) || (temp > payloadLen)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("HTCProcessRecvHeader, invalid header (payloadlength should be :%d, CB[0] is:%d) \n",
++ payloadLen, temp));
++ status = A_EPROTO;
++ break;
++ }
++
++ /* process trailer data that follows HDR + application payload */
++ status = HTCProcessTrailer(target,
++ (pBuf + HTC_HDR_LENGTH + payloadLen - temp),
++ temp,
++ pNextLookAhead,
++ pPacket->Endpoint);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++#ifdef HTC_CAPTURE_LAST_FRAME
++ A_MEMCPY(target->LastTrailer, (pBuf + HTC_HDR_LENGTH + payloadLen - temp), temp);
++ target->LastTrailerLength = temp;
++#endif
++ /* trim length by trailer bytes */
++ pPacket->ActualLength -= temp;
++ }
++#ifdef HTC_CAPTURE_LAST_FRAME
++ else {
++ target->LastTrailerLength = 0;
++ }
++#endif
++
++ /* if we get to this point, the packet is good */
++ /* remove header and adjust length */
++ pPacket->pBuffer += HTC_HDR_LENGTH;
++ pPacket->ActualLength -= HTC_HDR_LENGTH;
++
++ } while (FALSE);
++
++ if (A_FAILED(status)) {
++ /* dump the whole packet */
++ DebugDumpBytes(pBuf,pPacket->ActualLength,"BAD HTC Recv PKT");
++ } else {
++#ifdef HTC_CAPTURE_LAST_FRAME
++ A_MEMCPY(&target->LastFrameHdr,pBuf,sizeof(HTC_FRAME_HDR));
++#endif
++ if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_RECV)) {
++ if (pPacket->ActualLength > 0) {
++ AR_DEBUG_PRINTBUF(pPacket->pBuffer,pPacket->ActualLength,"HTC - Application Msg");
++ }
++ }
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("-HTCProcessRecvHeader \n"));
++ return status;
++}
++
++/* asynchronous completion handler for recv packet fetching, when the device layer
++ * completes a read request, it will call this completion handler */
++void HTCRecvCompleteHandler(void *Context, HTC_PACKET *pPacket)
++{
++ HTC_TARGET *target = (HTC_TARGET *)Context;
++ HTC_ENDPOINT *pEndpoint;
++ A_UINT32 nextLookAhead = 0;
++ A_STATUS status;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("+HTCRecvCompleteHandler (status:%d, ep:%d) \n",
++ pPacket->Status, pPacket->Endpoint));
++
++ AR_DEBUG_ASSERT(pPacket->Endpoint < ENDPOINT_MAX);
++ pEndpoint = &target->EndPoint[pPacket->Endpoint];
++ pPacket->Completion = NULL;
++
++ /* get completion status */
++ status = pPacket->Status;
++
++ do {
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("HTCRecvCompleteHandler: request failed (status:%d, ep:%d) \n",
++ pPacket->Status, pPacket->Endpoint));
++ break;
++ }
++ /* process the header for any trailer data */
++ status = HTCProcessRecvHeader(target,pPacket,&nextLookAhead);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++ /* was there a lookahead for the next packet? */
++ if (nextLookAhead != 0) {
++ A_STATUS nextStatus;
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,
++ ("HTCRecvCompleteHandler - next look ahead was non-zero : 0x%X \n",
++ nextLookAhead));
++ /* we have another packet, get the next packet fetch started (pipelined) before
++ * we call into the endpoint's callback, this will start another async request */
++ nextStatus = HTCRecvMessagePendingHandler(target,nextLookAhead,NULL);
++ if (A_EPROTO == nextStatus) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("Next look ahead from recv header was INVALID\n"));
++ DebugDumpBytes((A_UINT8 *)&nextLookAhead,
++ 4,
++ "BAD lookahead from lookahead report");
++ }
++ } else {
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,
++ ("HTCRecvCompleteHandler - rechecking for more messages...\n"));
++ /* if we did not get anything on the look-ahead,
++ * call device layer to asynchronously re-check for messages. If we can keep the async
++ * processing going we get better performance. If there is a pending message we will keep processing
++ * messages asynchronously which should pipeline things nicely */
++ DevCheckPendingRecvMsgsAsync(&target->Device);
++ }
++
++ HTC_RX_STAT_PROFILE(target,pEndpoint,nextLookAhead);
++ DO_RCV_COMPLETION(target,pPacket,pEndpoint);
++
++ } while (FALSE);
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("HTCRecvCompleteHandler , message fetch failed (status = %d) \n",
++ status));
++ /* recyle this packet */
++ HTC_RECYCLE_RX_PKT(target, pPacket);
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("-HTCRecvCompleteHandler\n"));
++}
++
++/* synchronously wait for a control message from the target,
++ * This function is used at initialization time ONLY. At init messages
++ * on ENDPOINT 0 are expected. */
++A_STATUS HTCWaitforControlMessage(HTC_TARGET *target, HTC_PACKET **ppControlPacket)
++{
++ A_STATUS status;
++ A_UINT32 lookAhead;
++ HTC_PACKET *pPacket = NULL;
++ HTC_FRAME_HDR *pHdr;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("+HTCWaitforControlMessage \n"));
++
++ do {
++
++ *ppControlPacket = NULL;
++
++ /* call the polling function to see if we have a message */
++ status = DevPollMboxMsgRecv(&target->Device,
++ &lookAhead,
++ HTC_TARGET_RESPONSE_TIMEOUT);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,
++ ("HTCWaitforControlMessage : lookAhead : 0x%X \n", lookAhead));
++
++ /* check the lookahead */
++ pHdr = (HTC_FRAME_HDR *)&lookAhead;
++
++ if (pHdr->EndpointID != ENDPOINT_0) {
++ /* unexpected endpoint number, should be zero */
++ AR_DEBUG_ASSERT(FALSE);
++ status = A_EPROTO;
++ break;
++ }
++
++ if (A_FAILED(status)) {
++ /* bad message */
++ AR_DEBUG_ASSERT(FALSE);
++ status = A_EPROTO;
++ break;
++ }
++
++ pPacket = HTC_ALLOC_CONTROL_RX(target);
++
++ if (pPacket == NULL) {
++ AR_DEBUG_ASSERT(FALSE);
++ status = A_NO_MEMORY;
++ break;
++ }
++
++ pPacket->HTCReserved = lookAhead;
++ pPacket->ActualLength = pHdr->PayloadLen + HTC_HDR_LENGTH;
++
++ if (pPacket->ActualLength > pPacket->BufferLength) {
++ AR_DEBUG_ASSERT(FALSE);
++ status = A_EPROTO;
++ break;
++ }
++
++ /* we want synchronous operation */
++ pPacket->Completion = NULL;
++
++ /* get the message from the device, this will block */
++ status = HTCIssueRecv(target, pPacket);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ /* process receive header */
++ status = HTCProcessRecvHeader(target,pPacket,NULL);
++
++ pPacket->Status = status;
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("HTCWaitforControlMessage, HTCProcessRecvHeader failed (status = %d) \n",
++ status));
++ break;
++ }
++
++ /* give the caller this control message packet, they are responsible to free */
++ *ppControlPacket = pPacket;
++
++ } while (FALSE);
++
++ if (A_FAILED(status)) {
++ if (pPacket != NULL) {
++ /* cleanup buffer on error */
++ HTC_FREE_CONTROL_RX(target,pPacket);
++ }
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("-HTCWaitforControlMessage \n"));
++
++ return status;
++}
++
++/* callback when device layer or lookahead report parsing detects a pending message */
++A_STATUS HTCRecvMessagePendingHandler(void *Context, A_UINT32 LookAhead, A_BOOL *pAsyncProc)
++{
++ HTC_TARGET *target = (HTC_TARGET *)Context;
++ A_STATUS status = A_OK;
++ HTC_PACKET *pPacket = NULL;
++ HTC_FRAME_HDR *pHdr;
++ HTC_ENDPOINT *pEndpoint;
++ A_BOOL asyncProc = FALSE;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("+HTCRecvMessagePendingHandler LookAhead:0x%X \n",LookAhead));
++
++ if (IS_DEV_IRQ_PROCESSING_ASYNC_ALLOWED(&target->Device)) {
++ /* We use async mode to get the packets if the device layer supports it.
++ * The device layer interfaces with HIF in which HIF may have restrictions on
++ * how interrupts are processed */
++ asyncProc = TRUE;
++ }
++
++ if (pAsyncProc != NULL) {
++ /* indicate to caller how we decided to process this */
++ *pAsyncProc = asyncProc;
++ }
++
++ while (TRUE) {
++
++ pHdr = (HTC_FRAME_HDR *)&LookAhead;
++
++ if (pHdr->EndpointID >= ENDPOINT_MAX) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Invalid Endpoint in look-ahead: %d \n",pHdr->EndpointID));
++ /* invalid endpoint */
++ status = A_EPROTO;
++ break;
++ }
++
++ if (pHdr->PayloadLen > HTC_MAX_PAYLOAD_LENGTH) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Payload length %d exceeds max HTC : %d !\n",
++ pHdr->PayloadLen, HTC_MAX_PAYLOAD_LENGTH));
++ status = A_EPROTO;
++ break;
++ }
++
++ pEndpoint = &target->EndPoint[pHdr->EndpointID];
++
++ if (0 == pEndpoint->ServiceID) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Endpoint %d is not connected !\n",pHdr->EndpointID));
++ /* endpoint isn't even connected */
++ status = A_EPROTO;
++ break;
++ }
++
++ /* lock RX to get a buffer */
++ LOCK_HTC_RX(target);
++
++ /* get a packet from the endpoint recv queue */
++ pPacket = HTC_PACKET_DEQUEUE(&pEndpoint->RxBuffers);
++
++ if (NULL == pPacket) {
++ /* check for refill handler */
++ if (pEndpoint->EpCallBacks.EpRecvRefill != NULL) {
++ UNLOCK_HTC_RX(target);
++ /* call the re-fill handler */
++ pEndpoint->EpCallBacks.EpRecvRefill(pEndpoint->EpCallBacks.pContext,
++ pHdr->EndpointID);
++ LOCK_HTC_RX(target);
++ /* check if we have more buffers */
++ pPacket = HTC_PACKET_DEQUEUE(&pEndpoint->RxBuffers);
++ /* fall through */
++ }
++ }
++
++ if (NULL == pPacket) {
++ /* this is not an error, we simply need to mark that we are waiting for buffers.*/
++ target->HTCStateFlags |= HTC_STATE_WAIT_BUFFERS;
++ target->EpWaitingForBuffers = pHdr->EndpointID;
++ status = A_NO_MEMORY;
++ }
++
++ UNLOCK_HTC_RX(target);
++
++ if (A_FAILED(status)) {
++ /* no buffers */
++ break;
++ }
++
++ AR_DEBUG_ASSERT(pPacket->Endpoint == pHdr->EndpointID);
++
++ /* make sure this message can fit in the endpoint buffer */
++ if ((pHdr->PayloadLen + HTC_HDR_LENGTH) > pPacket->BufferLength) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("Payload Length Error : header reports payload of: %d, endpoint buffer size: %d \n",
++ pHdr->PayloadLen, pPacket->BufferLength));
++ status = A_EPROTO;
++ break;
++ }
++
++ pPacket->HTCReserved = LookAhead; /* set expected look ahead */
++ /* set the amount of data to fetch */
++ pPacket->ActualLength = pHdr->PayloadLen + HTC_HDR_LENGTH;
++
++ if (asyncProc) {
++ /* we use async mode to get the packet if the device layer supports it
++ * set our callback and context */
++ pPacket->Completion = HTCRecvCompleteHandler;
++ pPacket->pContext = target;
++ } else {
++ /* fully synchronous */
++ pPacket->Completion = NULL;
++ }
++
++ /* go fetch the packet */
++ status = HTCIssueRecv(target, pPacket);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ if (asyncProc) {
++ /* we did this asynchronously so we can get out of the loop, the asynch processing
++ * creates a chain of requests to continue processing pending messages in the
++ * context of callbacks */
++ break;
++ }
++
++ /* in the sync case, we process the packet, check lookaheads and then repeat */
++
++ LookAhead = 0;
++ status = HTCProcessRecvHeader(target,pPacket,&LookAhead);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ HTC_RX_STAT_PROFILE(target,pEndpoint,LookAhead);
++ DO_RCV_COMPLETION(target,pPacket,pEndpoint);
++
++ pPacket = NULL;
++
++ if (0 == LookAhead) {
++ break;
++ }
++
++ }
++
++ if (A_NO_MEMORY == status) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ (" Endpoint :%d has no buffers, blocking receiver to prevent overrun.. \n",
++ pHdr->EndpointID));
++ /* try to stop receive at the device layer */
++ DevStopRecv(&target->Device, asyncProc ? DEV_STOP_RECV_ASYNC : DEV_STOP_RECV_SYNC);
++ status = A_OK;
++ } else if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("Failed to get pending message : LookAhead Value: 0x%X (status = %d) \n",
++ LookAhead, status));
++ if (pPacket != NULL) {
++ /* clean up packet on error */
++ HTC_RECYCLE_RX_PKT(target, pPacket);
++ }
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("-HTCRecvMessagePendingHandler \n"));
++
++ return status;
++}
++
++/* Makes a buffer available to the HTC module */
++A_STATUS HTCAddReceivePkt(HTC_HANDLE HTCHandle, HTC_PACKET *pPacket)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ HTC_ENDPOINT *pEndpoint;
++ A_BOOL unblockRecv = FALSE;
++ A_STATUS status = A_OK;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
++ ("+- HTCAddReceivePkt: endPointId: %d, buffer: 0x%X, length: %d\n",
++ pPacket->Endpoint, (A_UINT32)pPacket->pBuffer, pPacket->BufferLength));
++
++ do {
++
++ if (HTC_STOPPING(target)) {
++ status = A_ECANCELED;
++ break;
++ }
++
++ AR_DEBUG_ASSERT(pPacket->Endpoint < ENDPOINT_MAX);
++
++ pEndpoint = &target->EndPoint[pPacket->Endpoint];
++
++ LOCK_HTC_RX(target);
++
++ /* store receive packet */
++ HTC_PACKET_ENQUEUE(&pEndpoint->RxBuffers, pPacket);
++
++ /* check if we are blocked waiting for a new buffer */
++ if (target->HTCStateFlags & HTC_STATE_WAIT_BUFFERS) {
++ if (target->EpWaitingForBuffers == pPacket->Endpoint) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV,(" receiver was blocked on ep:%d, unblocking.. \n",
++ target->EpWaitingForBuffers));
++ target->HTCStateFlags &= ~HTC_STATE_WAIT_BUFFERS;
++ target->EpWaitingForBuffers = ENDPOINT_MAX;
++ unblockRecv = TRUE;
++ }
++ }
++
++ UNLOCK_HTC_RX(target);
++
++ if (unblockRecv && !HTC_STOPPING(target)) {
++ /* TODO : implement a buffer threshold count? */
++ DevEnableRecv(&target->Device,DEV_ENABLE_RECV_SYNC);
++ }
++
++ } while (FALSE);
++
++ return status;
++}
++
++static void HTCFlushEndpointRX(HTC_TARGET *target, HTC_ENDPOINT *pEndpoint)
++{
++ HTC_PACKET *pPacket;
++
++ LOCK_HTC_RX(target);
++
++ while (1) {
++ pPacket = HTC_PACKET_DEQUEUE(&pEndpoint->RxBuffers);
++ if (NULL == pPacket) {
++ break;
++ }
++ UNLOCK_HTC_RX(target);
++ pPacket->Status = A_ECANCELED;
++ pPacket->ActualLength = 0;
++ AR_DEBUG_PRINTF(ATH_DEBUG_RECV, (" Flushing RX packet:0x%X, length:%d, ep:%d \n",
++ (A_UINT32)pPacket, pPacket->BufferLength, pPacket->Endpoint));
++ /* give the packet back */
++ pEndpoint->EpCallBacks.EpRecv(pEndpoint->EpCallBacks.pContext,
++ pPacket);
++ LOCK_HTC_RX(target);
++ }
++
++ UNLOCK_HTC_RX(target);
++
++
++}
++
++void HTCFlushRecvBuffers(HTC_TARGET *target)
++{
++ HTC_ENDPOINT *pEndpoint;
++ int i;
++
++ /* NOTE: no need to flush endpoint 0, these buffers were
++ * allocated as part of the HTC struct */
++ for (i = ENDPOINT_1; i < ENDPOINT_MAX; i++) {
++ pEndpoint = &target->EndPoint[i];
++ if (pEndpoint->ServiceID == 0) {
++ /* not in use.. */
++ continue;
++ }
++ HTCFlushEndpointRX(target,pEndpoint);
++ }
++
++
++}
++
++
+diff --git a/drivers/ar6000/htc/htc_send.c b/drivers/ar6000/htc/htc_send.c
+new file mode 100644
+index 0000000..cf0dabe
+--- /dev/null
++++ b/drivers/ar6000/htc/htc_send.c
+@@ -0,0 +1,538 @@
++/*
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "htc_internal.h"
++
++#define DO_EP_TX_COMPLETION(ep,p) \
++{ \
++ (p)->Completion = NULL; \
++ (ep)->EpCallBacks.EpTxComplete((ep)->EpCallBacks.pContext,(p)); \
++}
++
++
++/* call the distribute credits callback with the distribution */
++#define DO_DISTRIBUTION(t,reason,description,pList) \
++{ \
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, \
++ (" calling distribute function (%s) (dfn:0x%X, ctxt:0x%X, dist:0x%X) \n", \
++ (description), \
++ (A_UINT32)(t)->DistributeCredits, \
++ (A_UINT32)(t)->pCredDistContext, \
++ (A_UINT32)pList)); \
++ (t)->DistributeCredits((t)->pCredDistContext, \
++ (pList), \
++ (reason)); \
++}
++
++/* our internal send packet completion handler when packets are submited to the AR6K device
++ * layer */
++static void HTCSendPktCompletionHandler(void *Context, HTC_PACKET *pPacket)
++{
++ HTC_TARGET *target = (HTC_TARGET *)Context;
++ HTC_ENDPOINT *pEndpoint = &target->EndPoint[pPacket->Endpoint];
++
++
++ if (A_FAILED(pPacket->Status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("HTCSendPktCompletionHandler: request failed (status:%d, ep:%d) \n",
++ pPacket->Status, pPacket->Endpoint));
++ }
++ /* first, fixup the head room we allocated */
++ pPacket->pBuffer += HTC_HDR_LENGTH;
++ /* do completion */
++ DO_EP_TX_COMPLETION(pEndpoint,pPacket);
++}
++
++A_STATUS HTCIssueSend(HTC_TARGET *target, HTC_PACKET *pPacket, A_UINT8 SendFlags)
++{
++ A_STATUS status;
++ A_UINT8 *pHdrBuf;
++ A_BOOL sync = FALSE;
++
++ /* caller always provides headrooom */
++ pPacket->pBuffer -= HTC_HDR_LENGTH;
++ pHdrBuf = pPacket->pBuffer;
++ /* setup frame header */
++ A_SET_UINT16_FIELD(pHdrBuf,HTC_FRAME_HDR,PayloadLen,(A_UINT16)pPacket->ActualLength);
++ A_SET_UINT8_FIELD(pHdrBuf,HTC_FRAME_HDR,Flags,SendFlags);
++ A_SET_UINT8_FIELD(pHdrBuf,HTC_FRAME_HDR,EndpointID, (A_UINT8)pPacket->Endpoint);
++
++ if (pPacket->Completion == NULL) {
++ /* mark that this request was synchronously issued */
++ sync = TRUE;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
++ ("+-HTCIssueSend: transmit length : %d (%s) \n",
++ pPacket->ActualLength + HTC_HDR_LENGTH,
++ sync ? "SYNC" : "ASYNC" ));
++
++ /* send message to device */
++ status = DevSendPacket(&target->Device,
++ pPacket,
++ pPacket->ActualLength + HTC_HDR_LENGTH);
++
++ if (sync) {
++ /* use local sync variable. If this was issued asynchronously, pPacket is no longer
++ * safe to access. */
++ pPacket->pBuffer += HTC_HDR_LENGTH;
++ }
++
++ /* if this request was asynchronous, the packet completion routine will be invoked by
++ * the device layer when the HIF layer completes the request */
++
++ return status;
++}
++
++/* try to send the current packet or a packet at the head of the TX queue,
++ * if there are no credits, the packet remains in the queue. */
++static void HTCTrySend(HTC_TARGET *target,
++ HTC_PACKET *pPacketToSend,
++ HTC_ENDPOINT_ID ep)
++{
++ HTC_PACKET *pPacket;
++ HTC_ENDPOINT *pEndpoint;
++ int creditsRequired;
++ A_UINT8 sendFlags;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("+HTCTrySend (pPkt:0x%X)\n",(A_UINT32)pPacketToSend));
++
++ pEndpoint = &target->EndPoint[ep];
++
++ LOCK_HTC_TX(target);
++
++ if (pPacketToSend != NULL) {
++ /* caller supplied us a packet to queue to the tail of the HTC TX queue before
++ * we check the tx queue */
++ HTC_PACKET_ENQUEUE(&pEndpoint->TxQueue,pPacketToSend);
++ pEndpoint->CurrentTxQueueDepth++;
++ }
++
++ /* now drain the TX queue for transmission as long as we have enough
++ * credits */
++
++ while (1) {
++
++ if (HTC_QUEUE_EMPTY(&pEndpoint->TxQueue)) {
++ /* nothing in the queue */
++ break;
++ }
++
++ sendFlags = 0;
++
++ /* get packet at head, but don't remove it */
++ pPacket = HTC_GET_PKT_AT_HEAD(&pEndpoint->TxQueue);
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,(" Got head packet:0x%X , Queue Depth: %d\n",
++ (A_UINT32)pPacket, pEndpoint->CurrentTxQueueDepth));
++
++ /* figure out how many credits this message requires */
++ creditsRequired = pPacket->ActualLength + HTC_HDR_LENGTH;
++ creditsRequired += target->TargetCreditSize - 1;
++ creditsRequired /= target->TargetCreditSize;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,(" Creds Required:%d Got:%d\n",
++ creditsRequired, pEndpoint->CreditDist.TxCredits));
++
++ if (pEndpoint->CreditDist.TxCredits < creditsRequired) {
++
++ /* not enough credits */
++
++ if (pPacket->Endpoint == ENDPOINT_0) {
++ /* leave it in the queue */
++ break;
++ }
++ /* invoke the registered distribution function only if this is not
++ * endpoint 0, we let the driver layer provide more credits if it can.
++ * We pass the credit distribution list starting at the endpoint in question
++ * */
++
++ /* set how many credits we need */
++ pEndpoint->CreditDist.TxCreditsSeek =
++ creditsRequired - pEndpoint->CreditDist.TxCredits;
++ DO_DISTRIBUTION(target,
++ HTC_CREDIT_DIST_SEEK_CREDITS,
++ "Seek Credits",
++ &pEndpoint->CreditDist);
++
++ pEndpoint->CreditDist.TxCreditsSeek = 0;
++
++ if (pEndpoint->CreditDist.TxCredits < creditsRequired) {
++ /* still not enough credits to send, leave packet in the queue */
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
++ (" Not enough credits for ep %d leaving packet in queue..\n",
++ pPacket->Endpoint));
++ break;
++ }
++
++ }
++
++ pEndpoint->CreditDist.TxCredits -= creditsRequired;
++ INC_HTC_EP_STAT(pEndpoint, TxCreditsConsummed, creditsRequired);
++
++ /* check if we need credits */
++ if (pEndpoint->CreditDist.TxCredits < pEndpoint->CreditDist.TxCreditsPerMaxMsg) {
++ sendFlags |= HTC_FLAGS_NEED_CREDIT_UPDATE;
++ INC_HTC_EP_STAT(pEndpoint, TxCreditLowIndications, 1);
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,(" Host Needs Credits \n"));
++ }
++
++ /* now we can fully dequeue */
++ pPacket = HTC_PACKET_DEQUEUE(&pEndpoint->TxQueue);
++ pEndpoint->CurrentTxQueueDepth--;
++
++ INC_HTC_EP_STAT(pEndpoint, TxIssued, 1);
++
++ UNLOCK_HTC_TX(target);
++
++ HTCIssueSend(target, pPacket, sendFlags);
++
++ LOCK_HTC_TX(target);
++
++ /* go back and check for more messages */
++ }
++
++ if (pEndpoint->CurrentTxQueueDepth >= pEndpoint->MaxTxQueueDepth) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, (" Endpoint %d, TX queue is full, Depth:%d, Max:%d \n",
++ ep, pEndpoint->CurrentTxQueueDepth, pEndpoint->MaxTxQueueDepth));
++ UNLOCK_HTC_TX(target);
++ /* queue is now full, let caller know */
++ if (pEndpoint->EpCallBacks.EpSendFull != NULL) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, (" Calling driver's send full callback.... \n"));
++ pEndpoint->EpCallBacks.EpSendFull(pEndpoint->EpCallBacks.pContext, ep);
++ }
++ } else {
++ UNLOCK_HTC_TX(target);
++ /* queue is now available for new packet, let caller know */
++ if (pEndpoint->EpCallBacks.EpSendAvail)
++ pEndpoint->EpCallBacks.EpSendAvail(pEndpoint->EpCallBacks.pContext, ep);
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("-HTCTrySend: \n"));
++}
++
++/* HTC API - HTCSendPkt */
++A_STATUS HTCSendPkt(HTC_HANDLE HTCHandle, HTC_PACKET *pPacket)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ HTC_ENDPOINT *pEndpoint;
++ HTC_ENDPOINT_ID ep;
++ A_STATUS status = A_OK;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
++ ("+HTCSendPkt: Enter endPointId: %d, buffer: 0x%X, length: %d \n",
++ pPacket->Endpoint, (A_UINT32)pPacket->pBuffer, pPacket->ActualLength));
++
++ ep = pPacket->Endpoint;
++ AR_DEBUG_ASSERT(ep < ENDPOINT_MAX);
++ pEndpoint = &target->EndPoint[ep];
++
++ do {
++
++ if (HTC_STOPPING(target)) {
++ status = A_ECANCELED;
++ pPacket->Status = status;
++ DO_EP_TX_COMPLETION(pEndpoint,pPacket);
++ break;
++ }
++ /* everything sent through this interface is asynchronous */
++ /* fill in HTC completion routines */
++ pPacket->Completion = HTCSendPktCompletionHandler;
++ pPacket->pContext = target;
++
++ HTCTrySend(target, pPacket, ep);
++
++ } while (FALSE);
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, ("-HTCSendPkt \n"));
++
++ return status;
++}
++
++
++/* check TX queues to drain because of credit distribution update */
++static INLINE void HTCCheckEndpointTxQueues(HTC_TARGET *target)
++{
++ HTC_ENDPOINT *pEndpoint;
++ HTC_ENDPOINT_CREDIT_DIST *pDistItem;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, ("+HTCCheckEndpointTxQueues \n"));
++ pDistItem = target->EpCreditDistributionListHead;
++
++ /* run through the credit distribution list to see
++ * if there are packets queued
++ * NOTE: no locks need to be taken since the distribution list
++ * is not dynamic (cannot be re-ordered) and we are not modifying any state */
++ while (pDistItem != NULL) {
++ pEndpoint = (HTC_ENDPOINT *)pDistItem->pHTCReserved;
++
++ if (pEndpoint->CurrentTxQueueDepth > 0) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, (" Ep %d has %d credits and %d Packets in TX Queue \n",
++ pDistItem->Endpoint, pEndpoint->CreditDist.TxCredits, pEndpoint->CurrentTxQueueDepth));
++ /* try to start the stalled queue, this list is ordered by priority.
++ * Highest priority queue get's processed first, if there are credits available the
++ * highest priority queue will get a chance to reclaim credits from lower priority
++ * ones */
++ HTCTrySend(target, NULL, pDistItem->Endpoint);
++ }
++
++ pDistItem = pDistItem->pNext;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, ("-HTCCheckEndpointTxQueues \n"));
++}
++
++/* process credit reports and call distribution function */
++void HTCProcessCreditRpt(HTC_TARGET *target, HTC_CREDIT_REPORT *pRpt, int NumEntries, HTC_ENDPOINT_ID FromEndpoint)
++{
++ int i;
++ HTC_ENDPOINT *pEndpoint;
++ int totalCredits = 0;
++ A_BOOL doDist = FALSE;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, ("+HTCProcessCreditRpt, Credit Report Entries:%d \n", NumEntries));
++
++ /* lock out TX while we update credits */
++ LOCK_HTC_TX(target);
++
++ for (i = 0; i < NumEntries; i++, pRpt++) {
++ if (pRpt->EndpointID >= ENDPOINT_MAX) {
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ pEndpoint = &target->EndPoint[pRpt->EndpointID];
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, (" Endpoint %d got %d credits \n",
++ pRpt->EndpointID, pRpt->Credits));
++
++
++#ifdef HTC_EP_STAT_PROFILING
++
++ INC_HTC_EP_STAT(pEndpoint, TxCreditRpts, 1);
++ INC_HTC_EP_STAT(pEndpoint, TxCreditsReturned, pRpt->Credits);
++
++ if (FromEndpoint == pRpt->EndpointID) {
++ /* this credit report arrived on the same endpoint indicating it arrived in an RX
++ * packet */
++ INC_HTC_EP_STAT(pEndpoint, TxCreditsFromRx, pRpt->Credits);
++ INC_HTC_EP_STAT(pEndpoint, TxCreditRptsFromRx, 1);
++ } else if (FromEndpoint == ENDPOINT_0) {
++ /* this credit arrived on endpoint 0 as a NULL message */
++ INC_HTC_EP_STAT(pEndpoint, TxCreditsFromEp0, pRpt->Credits);
++ INC_HTC_EP_STAT(pEndpoint, TxCreditRptsFromEp0, 1);
++ } else {
++ /* arrived on another endpoint */
++ INC_HTC_EP_STAT(pEndpoint, TxCreditsFromOther, pRpt->Credits);
++ INC_HTC_EP_STAT(pEndpoint, TxCreditRptsFromOther, 1);
++ }
++
++#endif
++
++ if (ENDPOINT_0 == pRpt->EndpointID) {
++ /* always give endpoint 0 credits back */
++ pEndpoint->CreditDist.TxCredits += pRpt->Credits;
++ } else {
++ /* for all other endpoints, update credits to distribute, the distribution function
++ * will handle giving out credits back to the endpoints */
++ pEndpoint->CreditDist.TxCreditsToDist += pRpt->Credits;
++ /* flag that we have to do the distribution */
++ doDist = TRUE;
++ }
++
++ totalCredits += pRpt->Credits;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, (" Report indicated %d credits to distribute \n", totalCredits));
++
++ if (doDist) {
++ /* this was a credit return based on a completed send operations
++ * note, this is done with the lock held */
++ DO_DISTRIBUTION(target,
++ HTC_CREDIT_DIST_SEND_COMPLETE,
++ "Send Complete",
++ target->EpCreditDistributionListHead->pNext);
++ }
++
++ UNLOCK_HTC_TX(target);
++
++ if (totalCredits) {
++ HTCCheckEndpointTxQueues(target);
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_SEND, ("-HTCProcessCreditRpt \n"));
++}
++
++/* flush endpoint TX queue */
++static void HTCFlushEndpointTX(HTC_TARGET *target, HTC_ENDPOINT *pEndpoint, HTC_TX_TAG Tag)
++{
++ HTC_PACKET *pPacket;
++ HTC_PACKET_QUEUE discardQueue;
++
++ /* initialize the discard queue */
++ INIT_HTC_PACKET_QUEUE(&discardQueue);
++
++ LOCK_HTC_TX(target);
++
++ /* interate from the front of the TX queue and flush out packets */
++ ITERATE_OVER_LIST_ALLOW_REMOVE(&pEndpoint->TxQueue, pPacket, HTC_PACKET, ListLink) {
++
++ /* check for removal */
++ if ((HTC_TX_PACKET_TAG_ALL == Tag) || (Tag == pPacket->PktInfo.AsTx.Tag)) {
++ /* remove from queue */
++ HTC_PACKET_REMOVE(pPacket);
++ /* add it to the discard pile */
++ HTC_PACKET_ENQUEUE(&discardQueue, pPacket);
++ pEndpoint->CurrentTxQueueDepth--;
++ }
++
++ } ITERATE_END;
++
++ UNLOCK_HTC_TX(target);
++
++ /* empty the discard queue */
++ while (1) {
++ pPacket = HTC_PACKET_DEQUEUE(&discardQueue);
++ if (NULL == pPacket) {
++ break;
++ }
++ pPacket->Status = A_ECANCELED;
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, (" Flushing TX packet:0x%X, length:%d, ep:%d tag:0x%X \n",
++ (A_UINT32)pPacket, pPacket->ActualLength, pPacket->Endpoint, pPacket->PktInfo.AsTx.Tag));
++ DO_EP_TX_COMPLETION(pEndpoint,pPacket);
++ }
++
++}
++
++void DumpCreditDist(HTC_ENDPOINT_CREDIT_DIST *pEPDist)
++{
++#ifdef DEBUG
++ HTC_ENDPOINT *pEndpoint = (HTC_ENDPOINT *)pEPDist->pHTCReserved;
++#endif
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, ("--- EP : %d ServiceID: 0x%X --------------\n",
++ pEPDist->Endpoint, pEPDist->ServiceID));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" this:0x%X next:0x%X prev:0x%X\n",
++ (A_UINT32)pEPDist, (A_UINT32)pEPDist->pNext, (A_UINT32)pEPDist->pPrev));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" DistFlags : 0x%X \n", pEPDist->DistFlags));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditsNorm : %d \n", pEPDist->TxCreditsNorm));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditsMin : %d \n", pEPDist->TxCreditsMin));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCredits : %d \n", pEPDist->TxCredits));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditsAssigned : %d \n", pEPDist->TxCreditsAssigned));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditsSeek : %d \n", pEPDist->TxCreditsSeek));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditSize : %d \n", pEPDist->TxCreditSize));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditsPerMaxMsg : %d \n", pEPDist->TxCreditsPerMaxMsg));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditsToDist : %d \n", pEPDist->TxCreditsToDist));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxQueueDepth : %d \n", pEndpoint->CurrentTxQueueDepth));
++ AR_DEBUG_PRINTF(ATH_DEBUG_ANY, ("----------------------------------------------------\n"));
++}
++
++void DumpCreditDistStates(HTC_TARGET *target)
++{
++ HTC_ENDPOINT_CREDIT_DIST *pEPList = target->EpCreditDistributionListHead;
++
++ while (pEPList != NULL) {
++ DumpCreditDist(pEPList);
++ pEPList = pEPList->pNext;
++ }
++
++ if (target->DistributeCredits != NULL) {
++ DO_DISTRIBUTION(target,
++ HTC_DUMP_CREDIT_STATE,
++ "Dump State",
++ NULL);
++ }
++}
++
++/* flush all send packets from all endpoint queues */
++void HTCFlushSendPkts(HTC_TARGET *target)
++{
++ HTC_ENDPOINT *pEndpoint;
++ int i;
++
++ DumpCreditDistStates(target);
++
++ for (i = ENDPOINT_0; i < ENDPOINT_MAX; i++) {
++ pEndpoint = &target->EndPoint[i];
++ if (pEndpoint->ServiceID == 0) {
++ /* not in use.. */
++ continue;
++ }
++ HTCFlushEndpointTX(target,pEndpoint,HTC_TX_PACKET_TAG_ALL);
++ }
++
++}
++
++/* HTC API to flush an endpoint's TX queue*/
++void HTCFlushEndpoint(HTC_HANDLE HTCHandle, HTC_ENDPOINT_ID Endpoint, HTC_TX_TAG Tag)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ HTC_ENDPOINT *pEndpoint = &target->EndPoint[Endpoint];
++
++ if (pEndpoint->ServiceID == 0) {
++ AR_DEBUG_ASSERT(FALSE);
++ /* not in use.. */
++ return;
++ }
++
++ HTCFlushEndpointTX(target, pEndpoint, Tag);
++}
++
++/* HTC API to indicate activity to the credit distribution function */
++void HTCIndicateActivityChange(HTC_HANDLE HTCHandle,
++ HTC_ENDPOINT_ID Endpoint,
++ A_BOOL Active)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ HTC_ENDPOINT *pEndpoint = &target->EndPoint[Endpoint];
++ A_BOOL doDist = FALSE;
++
++ if (pEndpoint->ServiceID == 0) {
++ AR_DEBUG_ASSERT(FALSE);
++ /* not in use.. */
++ return;
++ }
++
++ LOCK_HTC_TX(target);
++
++ if (Active) {
++ if (!(pEndpoint->CreditDist.DistFlags & HTC_EP_ACTIVE)) {
++ /* mark active now */
++ pEndpoint->CreditDist.DistFlags |= HTC_EP_ACTIVE;
++ doDist = TRUE;
++ }
++ } else {
++ if (pEndpoint->CreditDist.DistFlags & HTC_EP_ACTIVE) {
++ /* mark inactive now */
++ pEndpoint->CreditDist.DistFlags &= ~HTC_EP_ACTIVE;
++ doDist = TRUE;
++ }
++ }
++
++ if (doDist) {
++ /* do distribution again based on activity change
++ * note, this is done with the lock held */
++ DO_DISTRIBUTION(target,
++ HTC_CREDIT_DIST_ACTIVITY_CHANGE,
++ "Activity Change",
++ target->EpCreditDistributionListHead->pNext);
++ }
++
++ UNLOCK_HTC_TX(target);
++
++}
+diff --git a/drivers/ar6000/htc/htc_services.c b/drivers/ar6000/htc/htc_services.c
+new file mode 100644
+index 0000000..e5d50d1
+--- /dev/null
++++ b/drivers/ar6000/htc/htc_services.c
+@@ -0,0 +1,403 @@
++/*
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "htc_internal.h"
++
++void HTCControlTxComplete(void *Context, HTC_PACKET *pPacket)
++{
++ /* not implemented
++ * we do not send control TX frames during normal runtime, only during setup */
++ AR_DEBUG_ASSERT(FALSE);
++}
++
++ /* callback when a control message arrives on this endpoint */
++void HTCControlRecv(void *Context, HTC_PACKET *pPacket)
++{
++ AR_DEBUG_ASSERT(pPacket->Endpoint == ENDPOINT_0);
++
++ /* the only control messages we are expecting are NULL messages (credit resports), which should
++ * never get here */
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ ("HTCControlRecv, got message with length:%d \n",
++ pPacket->ActualLength + HTC_HDR_LENGTH));
++
++ /* dump header and message */
++ DebugDumpBytes(pPacket->pBuffer - HTC_HDR_LENGTH,
++ pPacket->ActualLength + HTC_HDR_LENGTH,
++ "Unexpected ENDPOINT 0 Message");
++
++ HTC_RECYCLE_RX_PKT((HTC_TARGET*)Context,pPacket);
++}
++
++A_STATUS HTCSendSetupComplete(HTC_TARGET *target)
++{
++ HTC_PACKET *pSendPacket = NULL;
++ A_STATUS status;
++ HTC_SETUP_COMPLETE_MSG *pSetupComplete;
++
++ do {
++ /* allocate a packet to send to the target */
++ pSendPacket = HTC_ALLOC_CONTROL_TX(target);
++
++ if (NULL == pSendPacket) {
++ status = A_NO_MEMORY;
++ break;
++ }
++
++ /* assemble setup complete message */
++ pSetupComplete = (HTC_SETUP_COMPLETE_MSG *)pSendPacket->pBuffer;
++ A_MEMZERO(pSetupComplete,sizeof(HTC_SETUP_COMPLETE_MSG));
++ pSetupComplete->MessageID = HTC_MSG_SETUP_COMPLETE_ID;
++
++ SET_HTC_PACKET_INFO_TX(pSendPacket,
++ NULL,
++ (A_UINT8 *)pSetupComplete,
++ sizeof(HTC_SETUP_COMPLETE_MSG),
++ ENDPOINT_0,
++ HTC_SERVICE_TX_PACKET_TAG);
++
++ /* we want synchronous operation */
++ pSendPacket->Completion = NULL;
++ /* send the message */
++ status = HTCIssueSend(target,pSendPacket,0);
++
++ } while (FALSE);
++
++ if (pSendPacket != NULL) {
++ HTC_FREE_CONTROL_TX(target,pSendPacket);
++ }
++
++ return status;
++}
++
++
++A_STATUS HTCConnectService(HTC_HANDLE HTCHandle,
++ HTC_SERVICE_CONNECT_REQ *pConnectReq,
++ HTC_SERVICE_CONNECT_RESP *pConnectResp)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ A_STATUS status = A_OK;
++ HTC_PACKET *pRecvPacket = NULL;
++ HTC_PACKET *pSendPacket = NULL;
++ HTC_CONNECT_SERVICE_RESPONSE_MSG *pResponseMsg;
++ HTC_CONNECT_SERVICE_MSG *pConnectMsg;
++ HTC_ENDPOINT_ID assignedEndpoint = ENDPOINT_MAX;
++ HTC_ENDPOINT *pEndpoint;
++ int maxMsgSize = 0;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+HTCConnectService, target:0x%X SvcID:0x%X \n",
++ (A_UINT32)target, pConnectReq->ServiceID));
++
++ do {
++
++ AR_DEBUG_ASSERT(pConnectReq->ServiceID != 0);
++
++ if (HTC_CTRL_RSVD_SVC == pConnectReq->ServiceID) {
++ /* special case for pseudo control service */
++ assignedEndpoint = ENDPOINT_0;
++ maxMsgSize = HTC_MAX_CONTROL_MESSAGE_LENGTH;
++ } else {
++ /* allocate a packet to send to the target */
++ pSendPacket = HTC_ALLOC_CONTROL_TX(target);
++
++ if (NULL == pSendPacket) {
++ AR_DEBUG_ASSERT(FALSE);
++ status = A_NO_MEMORY;
++ break;
++ }
++ /* assemble connect service message */
++ pConnectMsg = (HTC_CONNECT_SERVICE_MSG *)pSendPacket->pBuffer;
++ AR_DEBUG_ASSERT(pConnectMsg != NULL);
++ A_MEMZERO(pConnectMsg,sizeof(HTC_CONNECT_SERVICE_MSG));
++ pConnectMsg->MessageID = HTC_MSG_CONNECT_SERVICE_ID;
++ pConnectMsg->ServiceID = pConnectReq->ServiceID;
++ pConnectMsg->ConnectionFlags = pConnectReq->ConnectionFlags;
++ /* check caller if it wants to transfer meta data */
++ if ((pConnectReq->pMetaData != NULL) &&
++ (pConnectReq->MetaDataLength <= HTC_SERVICE_META_DATA_MAX_LENGTH)) {
++ /* copy meta data into message buffer (after header ) */
++ A_MEMCPY((A_UINT8 *)pConnectMsg + sizeof(HTC_CONNECT_SERVICE_MSG),
++ pConnectReq->pMetaData,
++ pConnectReq->MetaDataLength);
++ pConnectMsg->ServiceMetaLength = pConnectReq->MetaDataLength;
++ }
++
++ SET_HTC_PACKET_INFO_TX(pSendPacket,
++ NULL,
++ (A_UINT8 *)pConnectMsg,
++ sizeof(HTC_CONNECT_SERVICE_MSG) + pConnectMsg->ServiceMetaLength,
++ ENDPOINT_0,
++ HTC_SERVICE_TX_PACKET_TAG);
++
++ /* we want synchronous operation */
++ pSendPacket->Completion = NULL;
++
++ status = HTCIssueSend(target,pSendPacket,0);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ /* wait for response */
++ status = HTCWaitforControlMessage(target, &pRecvPacket);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++ /* we controlled the buffer creation so it has to be properly aligned */
++ pResponseMsg = (HTC_CONNECT_SERVICE_RESPONSE_MSG *)pRecvPacket->pBuffer;
++
++ if ((pResponseMsg->MessageID != HTC_MSG_CONNECT_SERVICE_RESPONSE_ID) ||
++ (pRecvPacket->ActualLength < sizeof(HTC_CONNECT_SERVICE_RESPONSE_MSG))) {
++ /* this message is not valid */
++ AR_DEBUG_ASSERT(FALSE);
++ status = A_EPROTO;
++ break;
++ }
++
++ pConnectResp->ConnectRespCode = pResponseMsg->Status;
++ /* check response status */
++ if (pResponseMsg->Status != HTC_SERVICE_SUCCESS) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
++ (" Target failed service 0x%X connect request (status:%d)\n",
++ pResponseMsg->ServiceID, pResponseMsg->Status));
++ status = A_EPROTO;
++ break;
++ }
++
++ assignedEndpoint = pResponseMsg->EndpointID;
++ maxMsgSize = pResponseMsg->MaxMsgSize;
++
++ if ((pConnectResp->pMetaData != NULL) &&
++ (pResponseMsg->ServiceMetaLength > 0) &&
++ (pResponseMsg->ServiceMetaLength <= HTC_SERVICE_META_DATA_MAX_LENGTH)) {
++ /* caller supplied a buffer and the target responded with data */
++ int copyLength = min((int)pConnectResp->BufferLength, (int)pResponseMsg->ServiceMetaLength);
++ /* copy the meta data */
++ A_MEMCPY(pConnectResp->pMetaData,
++ ((A_UINT8 *)pResponseMsg) + sizeof(HTC_CONNECT_SERVICE_RESPONSE_MSG),
++ copyLength);
++ pConnectResp->ActualLength = copyLength;
++ }
++
++ }
++
++ /* the rest of these are parameter checks so set the error status */
++ status = A_EPROTO;
++
++ if (assignedEndpoint >= ENDPOINT_MAX) {
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ if (0 == maxMsgSize) {
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ pEndpoint = &target->EndPoint[assignedEndpoint];
++
++ if (pEndpoint->ServiceID != 0) {
++ /* endpoint already in use! */
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++
++ /* return assigned endpoint to caller */
++ pConnectResp->Endpoint = assignedEndpoint;
++ pConnectResp->MaxMsgLength = maxMsgSize;
++
++ /* setup the endpoint */
++ pEndpoint->ServiceID = pConnectReq->ServiceID; /* this marks the endpoint in use */
++ pEndpoint->MaxTxQueueDepth = pConnectReq->MaxSendQueueDepth;
++ pEndpoint->MaxMsgLength = maxMsgSize;
++ /* copy all the callbacks */
++ pEndpoint->EpCallBacks = pConnectReq->EpCallbacks;
++ INIT_HTC_PACKET_QUEUE(&pEndpoint->RxBuffers);
++ INIT_HTC_PACKET_QUEUE(&pEndpoint->TxQueue);
++ /* set the credit distribution info for this endpoint, this information is
++ * passed back to the credit distribution callback function */
++ pEndpoint->CreditDist.ServiceID = pConnectReq->ServiceID;
++ pEndpoint->CreditDist.pHTCReserved = pEndpoint;
++ pEndpoint->CreditDist.Endpoint = assignedEndpoint;
++ pEndpoint->CreditDist.TxCreditSize = target->TargetCreditSize;
++ pEndpoint->CreditDist.TxCreditsPerMaxMsg = maxMsgSize / target->TargetCreditSize;
++
++ if (0 == pEndpoint->CreditDist.TxCreditsPerMaxMsg) {
++ pEndpoint->CreditDist.TxCreditsPerMaxMsg = 1;
++ }
++
++ status = A_OK;
++
++ } while (FALSE);
++
++ if (pSendPacket != NULL) {
++ HTC_FREE_CONTROL_TX(target,pSendPacket);
++ }
++
++ if (pRecvPacket != NULL) {
++ HTC_FREE_CONTROL_RX(target,pRecvPacket);
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-HTCConnectService \n"));
++
++ return status;
++}
++
++static void AddToEndpointDistList(HTC_TARGET *target, HTC_ENDPOINT_CREDIT_DIST *pEpDist)
++{
++ HTC_ENDPOINT_CREDIT_DIST *pCurEntry,*pLastEntry;
++
++ if (NULL == target->EpCreditDistributionListHead) {
++ target->EpCreditDistributionListHead = pEpDist;
++ pEpDist->pNext = NULL;
++ pEpDist->pPrev = NULL;
++ return;
++ }
++
++ /* queue to the end of the list, this does not have to be very
++ * fast since this list is built at startup time */
++ pCurEntry = target->EpCreditDistributionListHead;
++
++ while (pCurEntry) {
++ pLastEntry = pCurEntry;
++ pCurEntry = pCurEntry->pNext;
++ }
++
++ pLastEntry->pNext = pEpDist;
++ pEpDist->pPrev = pLastEntry;
++ pEpDist->pNext = NULL;
++}
++
++
++
++/* default credit init callback */
++static void HTCDefaultCreditInit(void *Context,
++ HTC_ENDPOINT_CREDIT_DIST *pEPList,
++ int TotalCredits)
++{
++ HTC_ENDPOINT_CREDIT_DIST *pCurEpDist;
++ int totalEps = 0;
++ int creditsPerEndpoint;
++
++ pCurEpDist = pEPList;
++ /* first run through the list and figure out how many endpoints we are dealing with */
++ while (pCurEpDist != NULL) {
++ pCurEpDist = pCurEpDist->pNext;
++ totalEps++;
++ }
++
++ /* even distribution */
++ creditsPerEndpoint = TotalCredits/totalEps;
++
++ pCurEpDist = pEPList;
++ /* run through the list and set minimum and normal credits and
++ * provide the endpoint with some credits to start */
++ while (pCurEpDist != NULL) {
++
++ if (creditsPerEndpoint < pCurEpDist->TxCreditsPerMaxMsg) {
++ /* too many endpoints and not enough credits */
++ AR_DEBUG_ASSERT(FALSE);
++ break;
++ }
++ /* our minimum is set for at least 1 max message */
++ pCurEpDist->TxCreditsMin = pCurEpDist->TxCreditsPerMaxMsg;
++ /* this value is ignored by our credit alg, since we do
++ * not dynamically adjust credits, this is the policy of
++ * the "default" credit distribution, something simple and easy */
++ pCurEpDist->TxCreditsNorm = 0xFFFF;
++ /* give the endpoint minimum credits */
++ pCurEpDist->TxCredits = creditsPerEndpoint;
++ pCurEpDist->TxCreditsAssigned = creditsPerEndpoint;
++ pCurEpDist = pCurEpDist->pNext;
++ }
++
++}
++
++/* default credit distribution callback, NOTE, this callback holds the TX lock */
++void HTCDefaultCreditDist(void *Context,
++ HTC_ENDPOINT_CREDIT_DIST *pEPDistList,
++ HTC_CREDIT_DIST_REASON Reason)
++{
++ HTC_ENDPOINT_CREDIT_DIST *pCurEpDist;
++
++ if (Reason == HTC_CREDIT_DIST_SEND_COMPLETE) {
++ pCurEpDist = pEPDistList;
++ /* simple distribution */
++ while (pCurEpDist != NULL) {
++ if (pCurEpDist->TxCreditsToDist > 0) {
++ /* just give the endpoint back the credits */
++ pCurEpDist->TxCredits += pCurEpDist->TxCreditsToDist;
++ pCurEpDist->TxCreditsToDist = 0;
++ }
++ pCurEpDist = pCurEpDist->pNext;
++ }
++ }
++
++ /* note we do not need to handle the other reason codes as this is a very
++ * simple distribution scheme, no need to seek for more credits or handle inactivity */
++}
++
++void HTCSetCreditDistribution(HTC_HANDLE HTCHandle,
++ void *pCreditDistContext,
++ HTC_CREDIT_DIST_CALLBACK CreditDistFunc,
++ HTC_CREDIT_INIT_CALLBACK CreditInitFunc,
++ HTC_SERVICE_ID ServicePriorityOrder[],
++ int ListLength)
++{
++ HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
++ int i;
++ int ep;
++
++ if (CreditInitFunc != NULL) {
++ /* caller has supplied their own distribution functions */
++ target->InitCredits = CreditInitFunc;
++ AR_DEBUG_ASSERT(CreditDistFunc != NULL);
++ target->DistributeCredits = CreditDistFunc;
++ target->pCredDistContext = pCreditDistContext;
++ } else {
++ /* caller wants HTC to do distribution */
++ /* if caller wants service to handle distributions then
++ * it must set both of these to NULL! */
++ AR_DEBUG_ASSERT(CreditDistFunc == NULL);
++ target->InitCredits = HTCDefaultCreditInit;
++ target->DistributeCredits = HTCDefaultCreditDist;
++ target->pCredDistContext = target;
++ }
++
++ /* always add HTC control endpoint first, we only expose the list after the
++ * first one, this is added for TX queue checking */
++ AddToEndpointDistList(target, &target->EndPoint[ENDPOINT_0].CreditDist);
++
++ /* build the list of credit distribution structures in priority order
++ * supplied by the caller, these will follow endpoint 0 */
++ for (i = 0; i < ListLength; i++) {
++ /* match services with endpoints and add the endpoints to the distribution list
++ * in FIFO order */
++ for (ep = ENDPOINT_1; ep < ENDPOINT_MAX; ep++) {
++ if (target->EndPoint[ep].ServiceID == ServicePriorityOrder[i]) {
++ /* queue this one to the list */
++ AddToEndpointDistList(target, &target->EndPoint[ep].CreditDist);
++ break;
++ }
++ }
++ AR_DEBUG_ASSERT(ep < ENDPOINT_MAX);
++ }
++
++}
+diff --git a/drivers/ar6000/include/AR6001_regdump.h b/drivers/ar6000/include/AR6001_regdump.h
+new file mode 100644
+index 0000000..c1bcade
+--- /dev/null
++++ b/drivers/ar6000/include/AR6001_regdump.h
+@@ -0,0 +1,100 @@
++/*
++ * Copyright (c) 2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++
++#ifndef __AR6000_REGDUMP_H__
++#define __AR6000_REGDUMP_H__
++
++#if !defined(__ASSEMBLER__)
++/*
++ * Target CPU state at the time of failure is reflected
++ * in a register dump, which the Host can fetch through
++ * the diagnostic window.
++ */
++
++struct MIPS_exception_frame_s {
++ A_UINT32 pc; /* Program Counter */
++ A_UINT32 at; /* MIPS General Purpose registers */
++ A_UINT32 v0;
++ A_UINT32 v1;
++ A_UINT32 a0;
++ A_UINT32 a1;
++ A_UINT32 a2;
++ A_UINT32 a3;
++ A_UINT32 t0;
++ A_UINT32 t1;
++ A_UINT32 t2;
++ A_UINT32 t3;
++ A_UINT32 t4;
++ A_UINT32 t5;
++ A_UINT32 t6;
++ A_UINT32 t7;
++ A_UINT32 s0;
++ A_UINT32 s1;
++ A_UINT32 s2;
++ A_UINT32 s3;
++ A_UINT32 s4;
++ A_UINT32 s5;
++ A_UINT32 s6;
++ A_UINT32 s7;
++ A_UINT32 t8;
++ A_UINT32 t9;
++ A_UINT32 k0;
++ A_UINT32 k1;
++ A_UINT32 gp;
++ A_UINT32 sp;
++ A_UINT32 s8;
++ A_UINT32 ra;
++ A_UINT32 cause; /* Selected coprocessor regs */
++ A_UINT32 status;
++};
++typedef struct MIPS_exception_frame_s CPU_exception_frame_t;
++
++#endif
++
++/*
++ * Offsets into MIPS_exception_frame structure, for use in assembler code
++ * MUST MATCH C STRUCTURE ABOVE
++ */
++#define RD_pc 0
++#define RD_at 1
++#define RD_v0 2
++#define RD_v1 3
++#define RD_a0 4
++#define RD_a1 5
++#define RD_a2 6
++#define RD_a3 7
++#define RD_t0 8
++#define RD_t1 9
++#define RD_t2 10
++#define RD_t3 11
++#define RD_t4 12
++#define RD_t5 13
++#define RD_t6 14
++#define RD_t7 15
++#define RD_s0 16
++#define RD_s1 17
++#define RD_s2 18
++#define RD_s3 19
++#define RD_s4 20
++#define RD_s5 21
++#define RD_s6 22
++#define RD_s7 23
++#define RD_t8 24
++#define RD_t9 25
++#define RD_k0 26
++#define RD_k1 27
++#define RD_gp 28
++#define RD_sp 29
++#define RD_s8 30
++#define RD_ra 31
++#define RD_cause 32
++#define RD_status 33
++
++#define RD_SIZE (34*4) /* Space for this number of words */
++
++#endif /* __AR6000_REGDUMP_H__ */
+diff --git a/drivers/ar6000/include/AR6K_version.h b/drivers/ar6000/include/AR6K_version.h
+new file mode 100644
+index 0000000..d5b2a20
+--- /dev/null
++++ b/drivers/ar6000/include/AR6K_version.h
+@@ -0,0 +1,36 @@
++#define __VER_MAJOR_ 2
++#define __VER_MINOR_ 0
++#define __VER_PATCH_ 0
++
++
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ * The makear6ksdk script (used for release builds) modifies the following line.
++ */
++#define __BUILD_NUMBER_ 18
++
++
++/* Format of the version number. */
++#define VER_MAJOR_BIT_OFFSET 28
++#define VER_MINOR_BIT_OFFSET 24
++#define VER_PATCH_BIT_OFFSET 16
++#define VER_BUILD_NUM_BIT_OFFSET 0
++
++
++/*
++ * The version has the following format:
++ * Bits 28-31: Major version
++ * Bits 24-27: Minor version
++ * Bits 16-23: Patch version
++ * Bits 0-15: Build number (automatically generated during build process )
++ * E.g. Build 1.1.3.7 would be represented as 0x11030007.
++ *
++ * DO NOT split the following macro into multiple lines as this may confuse the build scripts.
++ */
++#define AR6K_SW_VERSION ( ( __VER_MAJOR_ << VER_MAJOR_BIT_OFFSET ) + ( __VER_MINOR_ << VER_MINOR_BIT_OFFSET ) + ( __VER_PATCH_ << VER_PATCH_BIT_OFFSET ) + ( __BUILD_NUMBER_ << VER_BUILD_NUM_BIT_OFFSET ) )
++
++
+diff --git a/drivers/ar6000/include/AR6K_version.h.NEW b/drivers/ar6000/include/AR6K_version.h.NEW
+new file mode 100644
+index 0000000..d5b2a20
+--- /dev/null
++++ b/drivers/ar6000/include/AR6K_version.h.NEW
+@@ -0,0 +1,36 @@
++#define __VER_MAJOR_ 2
++#define __VER_MINOR_ 0
++#define __VER_PATCH_ 0
++
++
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ * The makear6ksdk script (used for release builds) modifies the following line.
++ */
++#define __BUILD_NUMBER_ 18
++
++
++/* Format of the version number. */
++#define VER_MAJOR_BIT_OFFSET 28
++#define VER_MINOR_BIT_OFFSET 24
++#define VER_PATCH_BIT_OFFSET 16
++#define VER_BUILD_NUM_BIT_OFFSET 0
++
++
++/*
++ * The version has the following format:
++ * Bits 28-31: Major version
++ * Bits 24-27: Minor version
++ * Bits 16-23: Patch version
++ * Bits 0-15: Build number (automatically generated during build process )
++ * E.g. Build 1.1.3.7 would be represented as 0x11030007.
++ *
++ * DO NOT split the following macro into multiple lines as this may confuse the build scripts.
++ */
++#define AR6K_SW_VERSION ( ( __VER_MAJOR_ << VER_MAJOR_BIT_OFFSET ) + ( __VER_MINOR_ << VER_MINOR_BIT_OFFSET ) + ( __VER_PATCH_ << VER_PATCH_BIT_OFFSET ) + ( __BUILD_NUMBER_ << VER_BUILD_NUM_BIT_OFFSET ) )
++
++
+diff --git a/drivers/ar6000/include/AR6Khwreg.h b/drivers/ar6000/include/AR6Khwreg.h
+new file mode 100644
+index 0000000..ecfdf20
+--- /dev/null
++++ b/drivers/ar6000/include/AR6Khwreg.h
+@@ -0,0 +1,147 @@
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ * This file contains the definitions for AR6001 registers
++ * that may be directly manipulated by Host software.
++ */
++
++#ifndef __AR6KHWREG_H__
++#define __AR6KHWREG_H__
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/* Host registers */
++#define HOST_INT_STATUS_ADDRESS 0x00000400
++#define CPU_INT_STATUS_ADDRESS 0x00000401
++#define ERROR_INT_STATUS_ADDRESS 0x00000402
++#define INT_STATUS_ENABLE_ADDRESS 0x00000418
++#define CPU_INT_STATUS_ENABLE_ADDRESS 0x00000419
++#define COUNT_ADDRESS 0x00000420
++#define COUNT_DEC_ADDRESS 0x00000440
++#define WINDOW_DATA_ADDRESS 0x00000474
++#define WINDOW_WRITE_ADDR_ADDRESS 0x00000478
++#define WINDOW_READ_ADDR_ADDRESS 0x0000047c
++
++/* Target addresses */
++#define RESET_CONTROL_ADDRESS 0x0c000000
++#define MC_REMAP_VALID_ADDRESS 0x0c004080
++#define MC_REMAP_SIZE_ADDRESS 0x0c004100
++#define MC_REMAP_COMPARE_ADDRESS 0x0c004180
++#define MC_REMAP_TARGET_ADDRESS 0x0c004200
++#define LOCAL_COUNT_ADDRESS 0x0c014080
++#define LOCAL_SCRATCH_ADDRESS 0x0c0140c0
++
++
++#define INT_STATUS_ENABLE_ERROR_MSB 7
++#define INT_STATUS_ENABLE_ERROR_LSB 7
++#define INT_STATUS_ENABLE_ERROR_MASK 0x00000080
++#define INT_STATUS_ENABLE_ERROR_GET(x) (((x) & INT_STATUS_ENABLE_ERROR_MASK) >> INT_STATUS_ENABLE_ERROR_LSB)
++#define INT_STATUS_ENABLE_ERROR_SET(x) (((x) << INT_STATUS_ENABLE_ERROR_LSB) & INT_STATUS_ENABLE_ERROR_MASK)
++
++#define INT_STATUS_ENABLE_CPU_MSB 6
++#define INT_STATUS_ENABLE_CPU_LSB 6
++#define INT_STATUS_ENABLE_CPU_MASK 0x00000040
++#define INT_STATUS_ENABLE_CPU_GET(x) (((x) & INT_STATUS_ENABLE_CPU_MASK) >> INT_STATUS_ENABLE_CPU_LSB)
++#define INT_STATUS_ENABLE_CPU_SET(x) (((x) << INT_STATUS_ENABLE_CPU_LSB) & INT_STATUS_ENABLE_CPU_MASK)
++
++#define INT_STATUS_ENABLE_COUNTER_MSB 4
++#define INT_STATUS_ENABLE_COUNTER_LSB 4
++#define INT_STATUS_ENABLE_COUNTER_MASK 0x00000010
++#define INT_STATUS_ENABLE_COUNTER_GET(x) (((x) & INT_STATUS_ENABLE_COUNTER_MASK) >> INT_STATUS_ENABLE_COUNTER_LSB)
++#define INT_STATUS_ENABLE_COUNTER_SET(x) (((x) << INT_STATUS_ENABLE_COUNTER_LSB) & INT_STATUS_ENABLE_COUNTER_MASK)
++
++#define INT_STATUS_ENABLE_MBOX_DATA_MSB 3
++#define INT_STATUS_ENABLE_MBOX_DATA_LSB 0
++#define INT_STATUS_ENABLE_MBOX_DATA_MASK 0x0000000f
++#define INT_STATUS_ENABLE_MBOX_DATA_GET(x) (((x) & INT_STATUS_ENABLE_MBOX_DATA_MASK) >> INT_STATUS_ENABLE_MBOX_DATA_LSB)
++#define INT_STATUS_ENABLE_MBOX_DATA_SET(x) (((x) << INT_STATUS_ENABLE_MBOX_DATA_LSB) & INT_STATUS_ENABLE_MBOX_DATA_MASK)
++
++#define ERROR_STATUS_ENABLE_RX_UNDERFLOW_MSB 1
++#define ERROR_STATUS_ENABLE_RX_UNDERFLOW_LSB 1
++#define ERROR_STATUS_ENABLE_RX_UNDERFLOW_MASK 0x00000002
++#define ERROR_STATUS_ENABLE_RX_UNDERFLOW_GET(x) (((x) & ERROR_STATUS_ENABLE_RX_UNDERFLOW_MASK) >> ERROR_STATUS_ENABLE_RX_UNDERFLOW_LSB)
++#define ERROR_STATUS_ENABLE_RX_UNDERFLOW_SET(x) (((x) << ERROR_STATUS_ENABLE_RX_UNDERFLOW_LSB) & ERROR_STATUS_ENABLE_RX_UNDERFLOW_MASK)
++
++#define ERROR_STATUS_ENABLE_TX_OVERFLOW_MSB 0
++#define ERROR_STATUS_ENABLE_TX_OVERFLOW_LSB 0
++#define ERROR_STATUS_ENABLE_TX_OVERFLOW_MASK 0x00000001
++#define ERROR_STATUS_ENABLE_TX_OVERFLOW_GET(x) (((x) & ERROR_STATUS_ENABLE_TX_OVERFLOW_MASK) >> ERROR_STATUS_ENABLE_TX_OVERFLOW_LSB)
++#define ERROR_STATUS_ENABLE_TX_OVERFLOW_SET(x) (((x) << ERROR_STATUS_ENABLE_TX_OVERFLOW_LSB) & ERROR_STATUS_ENABLE_TX_OVERFLOW_MASK)
++
++
++#define CPU_INT_STATUS_ENABLE_BIT_MSB 7
++#define CPU_INT_STATUS_ENABLE_BIT_LSB 0
++#define CPU_INT_STATUS_ENABLE_BIT_MASK 0x000000ff
++#define CPU_INT_STATUS_ENABLE_BIT_GET(x) (((x) & CPU_INT_STATUS_ENABLE_BIT_MASK) >> CPU_INT_STATUS_ENABLE_BIT_LSB)
++#define CPU_INT_STATUS_ENABLE_BIT_SET(x) (((x) << CPU_INT_STATUS_ENABLE_BIT_LSB) & CPU_INT_STATUS_ENABLE_BIT_MASK)
++
++#define COUNTER_INT_STATUS_ENABLE_BIT_MSB 7
++#define COUNTER_INT_STATUS_ENABLE_BIT_LSB 0
++#define COUNTER_INT_STATUS_ENABLE_BIT_MASK 0x000000ff
++#define COUNTER_INT_STATUS_ENABLE_BIT_GET(x) (((x) & COUNTER_INT_STATUS_ENABLE_BIT_MASK) >> COUNTER_INT_STATUS_ENABLE_BIT_LSB)
++#define COUNTER_INT_STATUS_ENABLE_BIT_SET(x) (((x) << COUNTER_INT_STATUS_ENABLE_BIT_LSB) & COUNTER_INT_STATUS_ENABLE_BIT_MASK)
++
++#define ERROR_INT_STATUS_WAKEUP_MSB 2
++#define ERROR_INT_STATUS_WAKEUP_LSB 2
++#define ERROR_INT_STATUS_WAKEUP_MASK 0x00000004
++#define ERROR_INT_STATUS_WAKEUP_GET(x) (((x) & ERROR_INT_STATUS_WAKEUP_MASK) >> ERROR_INT_STATUS_WAKEUP_LSB)
++#define ERROR_INT_STATUS_WAKEUP_SET(x) (((x) << ERROR_INT_STATUS_WAKEUP_LSB) & ERROR_INT_STATUS_WAKEUP_MASK)
++
++#define ERROR_INT_STATUS_RX_UNDERFLOW_MSB 1
++#define ERROR_INT_STATUS_RX_UNDERFLOW_LSB 1
++#define ERROR_INT_STATUS_RX_UNDERFLOW_MASK 0x00000002
++#define ERROR_INT_STATUS_RX_UNDERFLOW_GET(x) (((x) & ERROR_INT_STATUS_RX_UNDERFLOW_MASK) >> ERROR_INT_STATUS_RX_UNDERFLOW_LSB)
++#define ERROR_INT_STATUS_RX_UNDERFLOW_SET(x) (((x) << ERROR_INT_STATUS_RX_UNDERFLOW_LSB) & ERROR_INT_STATUS_RX_UNDERFLOW_MASK)
++
++#define ERROR_INT_STATUS_TX_OVERFLOW_MSB 0
++#define ERROR_INT_STATUS_TX_OVERFLOW_LSB 0
++#define ERROR_INT_STATUS_TX_OVERFLOW_MASK 0x00000001
++#define ERROR_INT_STATUS_TX_OVERFLOW_GET(x) (((x) & ERROR_INT_STATUS_TX_OVERFLOW_MASK) >> ERROR_INT_STATUS_TX_OVERFLOW_LSB)
++#define ERROR_INT_STATUS_TX_OVERFLOW_SET(x) (((x) << ERROR_INT_STATUS_TX_OVERFLOW_LSB) & ERROR_INT_STATUS_TX_OVERFLOW_MASK)
++
++#define HOST_INT_STATUS_ERROR_MSB 7
++#define HOST_INT_STATUS_ERROR_LSB 7
++#define HOST_INT_STATUS_ERROR_MASK 0x00000080
++#define HOST_INT_STATUS_ERROR_GET(x) (((x) & HOST_INT_STATUS_ERROR_MASK) >> HOST_INT_STATUS_ERROR_LSB)
++#define HOST_INT_STATUS_ERROR_SET(x) (((x) << HOST_INT_STATUS_ERROR_LSB) & HOST_INT_STATUS_ERROR_MASK)
++
++#define HOST_INT_STATUS_CPU_MSB 6
++#define HOST_INT_STATUS_CPU_LSB 6
++#define HOST_INT_STATUS_CPU_MASK 0x00000040
++#define HOST_INT_STATUS_CPU_GET(x) (((x) & HOST_INT_STATUS_CPU_MASK) >> HOST_INT_STATUS_CPU_LSB)
++#define HOST_INT_STATUS_CPU_SET(x) (((x) << HOST_INT_STATUS_CPU_LSB) & HOST_INT_STATUS_CPU_MASK)
++
++#define HOST_INT_STATUS_COUNTER_MSB 4
++#define HOST_INT_STATUS_COUNTER_LSB 4
++#define HOST_INT_STATUS_COUNTER_MASK 0x00000010
++#define HOST_INT_STATUS_COUNTER_GET(x) (((x) & HOST_INT_STATUS_COUNTER_MASK) >> HOST_INT_STATUS_COUNTER_LSB)
++#define HOST_INT_STATUS_COUNTER_SET(x) (((x) << HOST_INT_STATUS_COUNTER_LSB) & HOST_INT_STATUS_COUNTER_MASK)
++
++#define RESET_CONTROL_WARM_RST_MSB 7
++#define RESET_CONTROL_WARM_RST_LSB 7
++#define RESET_CONTROL_WARM_RST_MASK 0x00000080
++#define RESET_CONTROL_WARM_RST_GET(x) (((x) & RESET_CONTROL_WARM_RST_MASK) >> RESET_CONTROL_WARM_RST_LSB)
++#define RESET_CONTROL_WARM_RST_SET(x) (((x) << RESET_CONTROL_WARM_RST_LSB) & RESET_CONTROL_WARM_RST_MASK)
++
++#define RESET_CONTROL_COLD_RST_MSB 8
++#define RESET_CONTROL_COLD_RST_LSB 8
++#define RESET_CONTROL_COLD_RST_MASK 0x00000100
++#define RESET_CONTROL_COLD_RST_GET(x) (((x) & RESET_CONTROL_COLD_RST_MASK) >> RESET_CONTROL_COLD_RST_LSB)
++#define RESET_CONTROL_COLD_RST_SET(x) (((x) << RESET_CONTROL_COLD_RST_LSB) & RESET_CONTROL_COLD_RST_MASK)
++
++#define RESET_CAUSE_LAST_MSB 2
++#define RESET_CAUSE_LAST_LSB 0
++#define RESET_CAUSE_LAST_MASK 0x00000007
++#define RESET_CAUSE_LAST_GET(x) (((x) & RESET_CAUSE_LAST_MASK) >> RESET_CAUSE_LAST_LSB)
++#define RESET_CAUSE_LAST_SET(x) (((x) << RESET_CAUSE_LAST_LSB) & RESET_CAUSE_LAST_MASK)
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __AR6KHWREG_H__ */
+diff --git a/drivers/ar6000/include/a_config.h b/drivers/ar6000/include/a_config.h
+new file mode 100644
+index 0000000..627b298
+--- /dev/null
++++ b/drivers/ar6000/include/a_config.h
+@@ -0,0 +1,27 @@
++#ifndef _A_CONFIG_H_
++#define _A_CONFIG_H_
++/*
++ * Copyright (c) 2004-2005 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++/*
++ * This file contains software configuration options that enables
++ * specific software "features"
++ */
++#include "../ar6000/config_linux.h"
++
++#endif
+diff --git a/drivers/ar6000/include/a_debug.h b/drivers/ar6000/include/a_debug.h
+new file mode 100644
+index 0000000..4b0b351
+--- /dev/null
++++ b/drivers/ar6000/include/a_debug.h
+@@ -0,0 +1,41 @@
++#ifndef _A_DEBUG_H_
++#define _A_DEBUG_H_
++/*
++ * Copyright (c) 2004-2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include <a_types.h>
++#include <a_osapi.h>
++
++#define DBG_INFO 0x00000001
++#define DBG_ERROR 0x00000002
++#define DBG_WARNING 0x00000004
++#define DBG_SDIO 0x00000008
++#define DBG_HIF 0x00000010
++#define DBG_HTC 0x00000020
++#define DBG_WMI 0x00000040
++#define DBG_WMI2 0x00000080
++#define DBG_DRIVER 0x00000100
++
++#define DBG_DEFAULTS (DBG_ERROR|DBG_WARNING)
++
++#include "../ar6000/debug_linux.h"
++
++#endif
+diff --git a/drivers/ar6000/include/a_drv.h b/drivers/ar6000/include/a_drv.h
+new file mode 100644
+index 0000000..07e52d1
+--- /dev/null
++++ b/drivers/ar6000/include/a_drv.h
+@@ -0,0 +1,28 @@
++#ifndef _A_DRV_H_
++#define _A_DRV_H_
++/*
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/include/a_drv.h#1 $
++ *
++ * This file contains the definitions of the basic atheros data types.
++ * It is used to map the data types in atheros files to a platform specific
++ * type.
++ *
++ * Copyright 2003-2005 Atheros Communications, Inc., All Rights Reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "../ar6000/athdrv_linux.h"
++
++#endif /* _ADRV_H_ */
+diff --git a/drivers/ar6000/include/a_drv_api.h b/drivers/ar6000/include/a_drv_api.h
+new file mode 100644
+index 0000000..7531726
+--- /dev/null
++++ b/drivers/ar6000/include/a_drv_api.h
+@@ -0,0 +1,185 @@
++#ifndef _A_DRV_API_H_
++#define _A_DRV_API_H_
++/*
++ * Copyright (c) 2004-2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/****************************************************************************/
++/****************************************************************************/
++/** **/
++/** WMI related hooks **/
++/** **/
++/****************************************************************************/
++/****************************************************************************/
++
++#include <ar6000_api.h>
++
++#define A_WMI_CHANNELLIST_RX(devt, numChan, chanList) \
++ ar6000_channelList_rx((devt), (numChan), (chanList))
++
++#define A_WMI_SET_NUMDATAENDPTS(devt, num) \
++ ar6000_set_numdataendpts((devt), (num))
++
++#define A_WMI_CONTROL_TX(devt, osbuf, streamID) \
++ ar6000_control_tx((devt), (osbuf), (streamID))
++
++#define A_WMI_TARGETSTATS_EVENT(devt, pStats) \
++ ar6000_targetStats_event((devt), (pStats))
++
++#define A_WMI_SCANCOMPLETE_EVENT(devt, status) \
++ ar6000_scanComplete_event((devt), (status))
++
++#ifdef CONFIG_HOST_DSET_SUPPORT
++
++#define A_WMI_DSET_DATA_REQ(devt, access_cookie, offset, length, targ_buf, targ_reply_fn, targ_reply_arg) \
++ ar6000_dset_data_req((devt), (access_cookie), (offset), (length), (targ_buf), (targ_reply_fn), (targ_reply_arg))
++
++#define A_WMI_DSET_CLOSE(devt, access_cookie) \
++ ar6000_dset_close((devt), (access_cookie))
++
++#endif
++
++#define A_WMI_DSET_OPEN_REQ(devt, id, targ_handle, targ_reply_fn, targ_reply_arg) \
++ ar6000_dset_open_req((devt), (id), (targ_handle), (targ_reply_fn), (targ_reply_arg))
++
++#define A_WMI_CONNECT_EVENT(devt, channel, bssid, listenInterval, beaconInterval, networkType, beaconIeLen, assocReqLen, assocRespLen, assocInfo) \
++ ar6000_connect_event((devt), (channel), (bssid), (listenInterval), (beaconInterval), (networkType), (beaconIeLen), (assocReqLen), (assocRespLen), (assocInfo))
++
++#define A_WMI_REGDOMAIN_EVENT(devt, regCode) \
++ ar6000_regDomain_event((devt), (regCode))
++
++#define A_WMI_NEIGHBORREPORT_EVENT(devt, numAps, info) \
++ ar6000_neighborReport_event((devt), (numAps), (info))
++
++#define A_WMI_DISCONNECT_EVENT(devt, reason, bssid, assocRespLen, assocInfo, protocolReasonStatus) \
++ ar6000_disconnect_event((devt), (reason), (bssid), (assocRespLen), (assocInfo), (protocolReasonStatus))
++
++#define A_WMI_TKIP_MICERR_EVENT(devt, keyid, ismcast) \
++ ar6000_tkip_micerr_event((devt), (keyid), (ismcast))
++
++#define A_WMI_BITRATE_RX(devt, rateKbps) \
++ ar6000_bitrate_rx((devt), (rateKbps))
++
++#define A_WMI_TXPWR_RX(devt, txPwr) \
++ ar6000_txPwr_rx((devt), (txPwr))
++
++#define A_WMI_READY_EVENT(devt, datap, phyCap) \
++ ar6000_ready_event((devt), (datap), (phyCap))
++
++#define A_WMI_DBGLOG_INIT_DONE(ar) \
++ ar6000_dbglog_init_done(ar);
++
++#define A_WMI_RSSI_THRESHOLD_EVENT(devt, newThreshold, rssi) \
++ ar6000_rssiThreshold_event((devt), (newThreshold), (rssi))
++
++#define A_WMI_REPORT_ERROR_EVENT(devt, errorVal) \
++ ar6000_reportError_event((devt), (errorVal))
++
++#define A_WMI_ROAM_TABLE_EVENT(devt, pTbl) \
++ ar6000_roam_tbl_event((devt), (pTbl))
++
++#define A_WMI_ROAM_DATA_EVENT(devt, p) \
++ ar6000_roam_data_event((devt), (p))
++
++#define A_WMI_WOW_LIST_EVENT(devt, num_filters, wow_filters) \
++ ar6000_wow_list_event((devt), (num_filters), (wow_filters))
++
++#define A_WMI_CAC_EVENT(devt, ac, cac_indication, statusCode, tspecSuggestion) \
++ ar6000_cac_event((devt), (ac), (cac_indication), (statusCode), (tspecSuggestion))
++
++#define A_WMI_IPTOS_TO_USERPRIORITY(pkt) \
++ ar6000_iptos_to_userPriority((pkt))
++
++#define A_WMI_PMKID_LIST_EVENT(devt, num_pmkid, pmkid_list) \
++ ar6000_pmkid_list_event((devt), (num_pmkid), (pmkid_list))
++
++#ifdef CONFIG_HOST_GPIO_SUPPORT
++
++#define A_WMI_GPIO_INTR_RX(intr_mask, input_values) \
++ ar6000_gpio_intr_rx((intr_mask), (input_values))
++
++#define A_WMI_GPIO_DATA_RX(reg_id, value) \
++ ar6000_gpio_data_rx((reg_id), (value))
++
++#define A_WMI_GPIO_ACK_RX() \
++ ar6000_gpio_ack_rx()
++
++#endif
++
++#ifdef SEND_EVENT_TO_APP
++
++#define A_WMI_SEND_EVENT_TO_APP(ar, eventId, datap, len) \
++ ar6000_send_event_to_app((ar), (eventId), (datap), (len))
++
++#else
++
++#define A_WMI_SEND_EVENT_TO_APP(ar, eventId, datap, len)
++
++#endif
++
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++#define A_WMI_TCMD_RX_REPORT_EVENT(devt, results, len) \
++ ar6000_tcmd_rx_report_event((devt), (results), (len))
++#endif
++
++#define A_WMI_HBCHALLENGERESP_EVENT(devt, cookie, source) \
++ ar6000_hbChallengeResp_event((devt), (cookie), (source))
++
++#define A_WMI_TX_RETRY_ERR_EVENT(devt) \
++ ar6000_tx_retry_err_event((devt))
++
++#define A_WMI_SNR_THRESHOLD_EVENT_RX(devt, newThreshold, snr) \
++ ar6000_snrThresholdEvent_rx((devt), (newThreshold), (snr))
++
++#define A_WMI_LQ_THRESHOLD_EVENT_RX(devt, range, lqVal) \
++ ar6000_lqThresholdEvent_rx((devt), (range), (lqVal))
++
++#define A_WMI_RATEMASK_RX(devt, ratemask) \
++ ar6000_ratemask_rx((devt), (ratemask))
++
++#define A_WMI_KEEPALIVE_RX(devt, configured) \
++ ar6000_keepalive_rx((devt), (configured))
++
++#define A_WMI_BSSINFO_EVENT_RX(ar, datp, len) \
++ ar6000_bssInfo_event_rx((ar), (datap), (len))
++
++#define A_WMI_DBGLOG_EVENT(ar, dropped, buffer, length) \
++ ar6000_dbglog_event((ar), (dropped), (buffer), (length));
++
++#define A_WMI_STREAM_TX_ACTIVE(devt,trafficClass) \
++ ar6000_indicate_tx_activity((devt),(trafficClass), TRUE)
++
++#define A_WMI_STREAM_TX_INACTIVE(devt,trafficClass) \
++ ar6000_indicate_tx_activity((devt),(trafficClass), FALSE)
++
++/****************************************************************************/
++/****************************************************************************/
++/** **/
++/** HTC related hooks **/
++/** **/
++/****************************************************************************/
++/****************************************************************************/
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif
+diff --git a/drivers/ar6000/include/a_osapi.h b/drivers/ar6000/include/a_osapi.h
+new file mode 100644
+index 0000000..7d60867
+--- /dev/null
++++ b/drivers/ar6000/include/a_osapi.h
+@@ -0,0 +1,28 @@
++#ifndef _A_OSAPI_H_
++#define _A_OSAPI_H_
++/*
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/include/a_osapi.h#1 $
++ *
++ * This file contains the definitions of the basic atheros data types.
++ * It is used to map the data types in atheros files to a platform specific
++ * type.
++ *
++ * Copyright 2003-2005 Atheros Communications, Inc., All Rights Reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "../ar6000/osapi_linux.h"
++
++#endif /* _OSAPI_H_ */
+diff --git a/drivers/ar6000/include/a_types.h b/drivers/ar6000/include/a_types.h
+new file mode 100644
+index 0000000..e2ed090
+--- /dev/null
++++ b/drivers/ar6000/include/a_types.h
+@@ -0,0 +1,28 @@
++#ifndef _A_TYPES_H_
++#define _A_TYPES_H_
++/*
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/include/a_types.h#1 $
++ *
++ * This file contains the definitions of the basic atheros data types.
++ * It is used to map the data types in atheros files to a platform specific
++ * type.
++ *
++ * Copyright 2003-2005 Atheros Communications, Inc., All Rights Reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "../ar6000/athtypes_linux.h"
++
++#endif /* _ATHTYPES_H_ */
+diff --git a/drivers/ar6000/include/ar6000_api.h b/drivers/ar6000/include/ar6000_api.h
+new file mode 100644
+index 0000000..abe5de7
+--- /dev/null
++++ b/drivers/ar6000/include/ar6000_api.h
+@@ -0,0 +1,29 @@
++#ifndef _AR6000_API_H_
++#define _AR6000_API_H_
++/*
++ * Copyright (c) 2004-2005 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * This file contains the API to access the OS dependent atheros host driver
++ * by the WMI or WLAN generic modules.
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/include/ar6000_api.h#1 $
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "../ar6000/ar6xapi_linux.h"
++
++#endif /* _AR6000_API_H */
++
+diff --git a/drivers/ar6000/include/ar6000_diag.h b/drivers/ar6000/include/ar6000_diag.h
+new file mode 100644
+index 0000000..2df131d
+--- /dev/null
++++ b/drivers/ar6000/include/ar6000_diag.h
+@@ -0,0 +1,38 @@
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef AR6000_DIAG_H_
++#define AR6000_DIAG_H_
++
++
++A_STATUS
++ar6000_ReadRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data);
++
++A_STATUS
++ar6000_WriteRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data);
++
++A_STATUS
++ar6000_ReadDataDiag(HIF_DEVICE *hifDevice, A_UINT32 address,
++ A_UCHAR *data, A_UINT32 length);
++
++A_STATUS
++ar6000_WriteDataDiag(HIF_DEVICE *hifDevice, A_UINT32 address,
++ A_UCHAR *data, A_UINT32 length);
++
++#endif /*AR6000_DIAG_H_*/
+diff --git a/drivers/ar6000/include/athdefs.h b/drivers/ar6000/include/athdefs.h
+new file mode 100644
+index 0000000..c28c871
+--- /dev/null
++++ b/drivers/ar6000/include/athdefs.h
+@@ -0,0 +1,85 @@
++#ifndef __ATHDEFS_H__
++#define __ATHDEFS_H__
++
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ * This file contains definitions that may be used across both
++ * Host and Target software. Nothing here is module-dependent
++ * or platform-dependent.
++ */
++
++/*
++ * Generic error codes that can be used by hw, sta, ap, sim, dk
++ * and any other environments. Since these are enums, feel free to
++ * add any more codes that you need.
++ */
++
++typedef enum {
++ A_ERROR = -1, /* Generic error return */
++ A_OK = 0, /* success */
++ /* Following values start at 1 */
++ A_DEVICE_NOT_FOUND, /* not able to find PCI device */
++ A_NO_MEMORY, /* not able to allocate memory, not available */
++ A_MEMORY_NOT_AVAIL, /* memory region is not free for mapping */
++ A_NO_FREE_DESC, /* no free descriptors available */
++ A_BAD_ADDRESS, /* address does not match descriptor */
++ A_WIN_DRIVER_ERROR, /* used in NT_HW version, if problem at init */
++ A_REGS_NOT_MAPPED, /* registers not correctly mapped */
++ A_EPERM, /* Not superuser */
++ A_EACCES, /* Access denied */
++ A_ENOENT, /* No such entry, search failed, etc. */
++ A_EEXIST, /* The object already exists (can't create) */
++ A_EFAULT, /* Bad address fault */
++ A_EBUSY, /* Object is busy */
++ A_EINVAL, /* Invalid parameter */
++ A_EMSGSIZE, /* Inappropriate message buffer length */
++ A_ECANCELED, /* Operation canceled */
++ A_ENOTSUP, /* Operation not supported */
++ A_ECOMM, /* Communication error on send */
++ A_EPROTO, /* Protocol error */
++ A_ENODEV, /* No such device */
++ A_EDEVNOTUP, /* device is not UP */
++ A_NO_RESOURCE, /* No resources for requested operation */
++ A_HARDWARE, /* Hardware failure */
++ A_PENDING, /* Asynchronous routine; will send up results la
++ter (typically in callback) */
++ A_EBADCHANNEL, /* The channel cannot be used */
++ A_DECRYPT_ERROR, /* Decryption error */
++ A_PHY_ERROR, /* RX PHY error */
++ A_CONSUMED /* Object was consumed */
++} A_STATUS;
++
++#define A_SUCCESS(x) (x == A_OK)
++#define A_FAILED(x) (!A_SUCCESS(x))
++
++#ifndef TRUE
++#define TRUE 1
++#endif
++
++#ifndef FALSE
++#define FALSE 0
++#endif
++
++/*
++ * The following definition is WLAN specific definition
++ */
++typedef enum {
++ MODE_11A = 0, /* 11a Mode */
++ MODE_11G = 1, /* 11g + 11b Mode */
++ MODE_11B = 2, /* 11b Mode */
++ MODE_11GONLY = 3, /* 11g only Mode */
++ MODE_UNKNOWN = 4,
++ MODE_MAX = 4
++} WLAN_PHY_MODE;
++
++typedef enum {
++ WLAN_11A_CAPABILITY = 1,
++ WLAN_11G_CAPABILITY = 2,
++ WLAN_11AG_CAPABILITY = 3,
++}WLAN_CAPABILITY;
++
++#endif /* __ATHDEFS_H__ */
+diff --git a/drivers/ar6000/include/athdrv.h b/drivers/ar6000/include/athdrv.h
+new file mode 100644
+index 0000000..19da97e
+--- /dev/null
++++ b/drivers/ar6000/include/athdrv.h
+@@ -0,0 +1,32 @@
++/*
++ * Copyright (c) 2004-2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef _ATHDRV_H_
++#define _ATHDRV_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _ATHDRV_H_ */
+diff --git a/drivers/ar6000/include/athendpack.h b/drivers/ar6000/include/athendpack.h
+new file mode 100644
+index 0000000..42921ae
+--- /dev/null
++++ b/drivers/ar6000/include/athendpack.h
+@@ -0,0 +1,41 @@
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ * @file: athendpack.h
++ *
++ * @abstract: end compiler-specific structure packing
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++#ifdef VXWORKS
++#endif /* VXWORKS */
++
++#ifdef LINUX
++#endif /* LINUX */
++
++#ifdef QNX
++#endif /* QNX */
++
++#ifdef INTEGRITY
++#include "integrity/athendpack_integrity.h"
++#endif /* INTEGRITY */
++
++#ifdef NUCLEUS
++#endif /* NUCLEUS */
++
++#ifdef UNDER_CE
++#include "../os/wince/include/athendpack_wince.h"
++#endif /* WINCE */
++
+diff --git a/drivers/ar6000/include/athstartpack.h b/drivers/ar6000/include/athstartpack.h
+new file mode 100644
+index 0000000..6632cc2
+--- /dev/null
++++ b/drivers/ar6000/include/athstartpack.h
+@@ -0,0 +1,42 @@
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ * @file: athstartpack.h
++ *
++ * @abstract: start compiler-specific structure packing
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifdef VXWORKS
++#endif /* VXWORKS */
++
++#ifdef LINUX
++#endif /* LINUX */
++
++#ifdef QNX
++#endif /* QNX */
++
++#ifdef INTEGRITY
++#include "integrity/athstartpack_integrity.h"
++#endif /* INTEGRITY */
++
++#ifdef NUCLEUS
++#endif /* NUCLEUS */
++
++#ifdef UNDER_CE
++#include "../os/wince/include/athstartpack_wince.h"
++#endif /* WINCE */
++
+diff --git a/drivers/ar6000/include/bmi.h b/drivers/ar6000/include/bmi.h
+new file mode 100644
+index 0000000..2eb7134
+--- /dev/null
++++ b/drivers/ar6000/include/bmi.h
+@@ -0,0 +1,100 @@
++#ifndef _BMI_H_
++#define _BMI_H_
++/*
++ * Copyright (c) 2004-2005 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ * BMI declarations and prototypes
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif /* __cplusplus */
++
++/* Header files */
++#include "a_config.h"
++#include "athdefs.h"
++#include "a_types.h"
++#include "hif.h"
++#include "a_osapi.h"
++#include "bmi_msg.h"
++
++void
++BMIInit(void);
++
++A_STATUS
++BMIDone(HIF_DEVICE *device);
++
++A_STATUS
++BMIGetTargetInfo(HIF_DEVICE *device, struct bmi_target_info *targ_info);
++
++A_STATUS
++BMIReadMemory(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UCHAR *buffer,
++ A_UINT32 length);
++
++A_STATUS
++BMIWriteMemory(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UCHAR *buffer,
++ A_UINT32 length);
++
++A_STATUS
++BMIExecute(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UINT32 *param);
++
++A_STATUS
++BMISetAppStart(HIF_DEVICE *device,
++ A_UINT32 address);
++
++A_STATUS
++BMIReadSOCRegister(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UINT32 *param);
++
++A_STATUS
++BMIWriteSOCRegister(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UINT32 param);
++
++A_STATUS
++BMIrompatchInstall(HIF_DEVICE *device,
++ A_UINT32 ROM_addr,
++ A_UINT32 RAM_addr,
++ A_UINT32 nbytes,
++ A_UINT32 do_activate,
++ A_UINT32 *patch_id);
++
++A_STATUS
++BMIrompatchUninstall(HIF_DEVICE *device,
++ A_UINT32 rompatch_id);
++
++A_STATUS
++BMIrompatchActivate(HIF_DEVICE *device,
++ A_UINT32 rompatch_count,
++ A_UINT32 *rompatch_list);
++
++A_STATUS
++BMIrompatchDeactivate(HIF_DEVICE *device,
++ A_UINT32 rompatch_count,
++ A_UINT32 *rompatch_list);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _BMI_H_ */
+diff --git a/drivers/ar6000/include/bmi_msg.h b/drivers/ar6000/include/bmi_msg.h
+new file mode 100644
+index 0000000..7c91ef4
+--- /dev/null
++++ b/drivers/ar6000/include/bmi_msg.h
+@@ -0,0 +1,199 @@
++#ifndef __BMI_MSG_H__
++#define __BMI_MSG_H__
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++/*
++ * Bootloader Messaging Interface (BMI)
++ *
++ * BMI is a very simple messaging interface used during initialization
++ * to read memory, write memory, execute code, and to define an
++ * application entry PC.
++ *
++ * It is used to download an application to AR6K, to provide
++ * patches to code that is already resident on AR6K, and generally
++ * to examine and modify state. The Host has an opportunity to use
++ * BMI only once during bootup. Once the Host issues a BMI_DONE
++ * command, this opportunity ends.
++ *
++ * The Host writes BMI requests to mailbox0, and reads BMI responses
++ * from mailbox0. BMI requests all begin with a command
++ * (see below for specific commands), and are followed by
++ * command-specific data.
++ *
++ * Flow control:
++ * The Host can only issue a command once the Target gives it a
++ * "BMI Command Credit", using AR6K Counter #4. As soon as the
++ * Target has completed a command, it issues another BMI Command
++ * Credit (so the Host can issue the next command).
++ *
++ * BMI handles all required Target-side cache flushing.
++ */
++
++
++/* Maximum data size used for BMI transfers */
++#define BMI_DATASZ_MAX 32
++
++/* BMI Commands */
++
++#define BMI_NO_COMMAND 0
++
++#define BMI_DONE 1
++ /*
++ * Semantics: Host is done using BMI
++ * Request format:
++ * A_UINT32 command (BMI_DONE)
++ * Response format: none
++ */
++
++#define BMI_READ_MEMORY 2
++ /*
++ * Semantics: Host reads AR6K memory
++ * Request format:
++ * A_UINT32 command (BMI_READ_MEMORY)
++ * A_UINT32 address
++ * A_UINT32 length, at most BMI_DATASZ_MAX
++ * Response format:
++ * A_UINT8 data[length]
++ */
++
++#define BMI_WRITE_MEMORY 3
++ /*
++ * Semantics: Host writes AR6K memory
++ * Request format:
++ * A_UINT32 command (BMI_WRITE_MEMORY)
++ * A_UINT32 address
++ * A_UINT32 length, at most BMI_DATASZ_MAX
++ * A_UINT8 data[length]
++ * Response format: none
++ */
++
++#define BMI_EXECUTE 4
++ /*
++ * Semantics: Causes AR6K to execute code
++ * Request format:
++ * A_UINT32 command (BMI_EXECUTE)
++ * A_UINT32 address
++ * A_UINT32 parameter
++ * Response format:
++ * A_UINT32 return value
++ */
++
++#define BMI_SET_APP_START 5
++ /*
++ * Semantics: Set Target application starting address
++ * Request format:
++ * A_UINT32 command (BMI_SET_APP_START)
++ * A_UINT32 address
++ * Response format: none
++ */
++
++#define BMI_READ_SOC_REGISTER 6
++ /*
++ * Semantics: Read a 32-bit Target SOC register.
++ * Request format:
++ * A_UINT32 command (BMI_READ_REGISTER)
++ * A_UINT32 address
++ * Response format:
++ * A_UINT32 value
++ */
++
++#define BMI_WRITE_SOC_REGISTER 7
++ /*
++ * Semantics: Write a 32-bit Target SOC register.
++ * Request format:
++ * A_UINT32 command (BMI_WRITE_REGISTER)
++ * A_UINT32 address
++ * A_UINT32 value
++ *
++ * Response format: none
++ */
++
++#define BMI_GET_TARGET_ID 8
++#define BMI_GET_TARGET_INFO 8
++ /*
++ * Semantics: Fetch the 4-byte Target information
++ * Request format:
++ * A_UINT32 command (BMI_GET_TARGET_ID/INFO)
++ * Response format1 (old firmware):
++ * A_UINT32 TargetVersionID
++ * Response format2 (newer firmware):
++ * A_UINT32 TARGET_VERSION_SENTINAL
++ * struct bmi_target_info;
++ */
++
++struct bmi_target_info {
++ A_UINT32 target_info_byte_count; /* size of this structure */
++ A_UINT32 target_ver; /* Target Version ID */
++ A_UINT32 target_type; /* Target type */
++};
++#define TARGET_VERSION_SENTINAL 0xffffffff
++#define TARGET_TYPE_AR6001 1
++#define TARGET_TYPE_AR6002 2
++
++
++#define BMI_ROMPATCH_INSTALL 9
++ /*
++ * Semantics: Install a ROM Patch.
++ * Request format:
++ * A_UINT32 command (BMI_ROMPATCH_INSTALL)
++ * A_UINT32 Target ROM Address
++ * A_UINT32 Target RAM Address
++ * A_UINT32 Size, in bytes
++ * A_UINT32 Activate? 1-->activate;
++ * 0-->install but do not activate
++ * Response format:
++ * A_UINT32 PatchID
++ */
++
++#define BMI_ROMPATCH_UNINSTALL 10
++ /*
++ * Semantics: Uninstall a previously-installed ROM Patch,
++ * automatically deactivating, if necessary.
++ * Request format:
++ * A_UINT32 command (BMI_ROMPATCH_UNINSTALL)
++ * A_UINT32 PatchID
++ *
++ * Response format: none
++ */
++
++#define BMI_ROMPATCH_ACTIVATE 11
++ /*
++ * Semantics: Activate a list of previously-installed ROM Patches.
++ * Request format:
++ * A_UINT32 command (BMI_ROMPATCH_ACTIVATE)
++ * A_UINT32 rompatch_count
++ * A_UINT32 PatchID[rompatch_count]
++ *
++ * Response format: none
++ */
++
++#define BMI_ROMPATCH_DEACTIVATE 12
++ /*
++ * Semantics: Deactivate a list of active ROM Patches.
++ * Request format:
++ * A_UINT32 command (BMI_ROMPATCH_DEACTIVATE)
++ * A_UINT32 rompatch_count
++ * A_UINT32 PatchID[rompatch_count]
++ *
++ * Response format: none
++ */
++
++
++#endif /* __BMI_MSG_H__ */
+diff --git a/drivers/ar6000/include/common_drv.h b/drivers/ar6000/include/common_drv.h
+new file mode 100644
+index 0000000..1bdc3da
+--- /dev/null
++++ b/drivers/ar6000/include/common_drv.h
+@@ -0,0 +1,61 @@
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++
++#ifndef COMMON_DRV_H_
++#define COMMON_DRV_H_
++
++#include "hif.h"
++#include "htc_packet.h"
++
++
++
++/* structure that is the state information for the default credit distribution callback
++ * drivers should instantiate (zero-init as well) this structure in their driver instance
++ * and pass it as a context to the HTC credit distribution functions */
++typedef struct _COMMON_CREDIT_STATE_INFO {
++ int TotalAvailableCredits; /* total credits in the system at startup */
++ int CurrentFreeCredits; /* credits available in the pool that have not been
++ given out to endpoints */
++ HTC_ENDPOINT_CREDIT_DIST *pLowestPriEpDist; /* pointer to the lowest priority endpoint dist struct */
++} COMMON_CREDIT_STATE_INFO;
++
++
++/* HTC TX packet tagging definitions */
++#define AR6K_CONTROL_PKT_TAG HTC_TX_PACKET_TAG_USER_DEFINED
++#define AR6K_DATA_PKT_TAG (AR6K_CONTROL_PKT_TAG + 1)
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/* OS-independent APIs */
++A_STATUS ar6000_setup_credit_dist(HTC_HANDLE HTCHandle, COMMON_CREDIT_STATE_INFO *pCredInfo);
++A_STATUS ar6000_ReadRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data);
++A_STATUS ar6000_WriteRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data);
++A_STATUS ar6000_ReadDataDiag(HIF_DEVICE *hifDevice, A_UINT32 address, A_UCHAR *data, A_UINT32 length);
++A_STATUS ar6000_reset_device(HIF_DEVICE *hifDevice, A_UINT32 TargetType);
++void ar6000_dump_target_assert_info(HIF_DEVICE *hifDevice, A_UINT32 TargetType);
++A_STATUS ar6000_reset_device_skipflash(HIF_DEVICE *hifDevice);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /*COMMON_DRV_H_*/
+diff --git a/drivers/ar6000/include/dbglog.h b/drivers/ar6000/include/dbglog.h
+new file mode 100644
+index 0000000..3d1e528
+--- /dev/null
++++ b/drivers/ar6000/include/dbglog.h
+@@ -0,0 +1,107 @@
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ * This file contains the definitions and data structures associated with
++ * the log based debug mechanism.
++ *
++ */
++
++#ifndef _DBGLOG_H_
++#define _DBGLOG_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define DBGLOG_TIMESTAMP_OFFSET 0
++#define DBGLOG_TIMESTAMP_MASK 0x0000FFFF /* Bit 0-15. Contains bit
++ 8-23 of the LF0 timer */
++#define DBGLOG_DBGID_OFFSET 16
++#define DBGLOG_DBGID_MASK 0x03FF0000 /* Bit 16-25 */
++#define DBGLOG_DBGID_NUM_MAX 256 /* Upper limit is width of mask */
++
++#define DBGLOG_MODULEID_OFFSET 26
++#define DBGLOG_MODULEID_MASK 0x3C000000 /* Bit 26-29 */
++#define DBGLOG_MODULEID_NUM_MAX 16 /* Upper limit is width of mask */
++
++/*
++ * Please ensure that the definition of any new module intrduced is captured
++ * between the DBGLOG_MODULEID_START and DBGLOG_MODULEID_END defines. The
++ * structure is required for the parser to correctly pick up the values for
++ * different modules.
++ */
++#define DBGLOG_MODULEID_START
++#define DBGLOG_MODULEID_INF 0
++#define DBGLOG_MODULEID_WMI 1
++#define DBGLOG_MODULEID_CSERV 2
++#define DBGLOG_MODULEID_PM 3
++#define DBGLOG_MODULEID_TXRX_MGMTBUF 4
++#define DBGLOG_MODULEID_TXRX_TXBUF 5
++#define DBGLOG_MODULEID_TXRX_RXBUF 6
++#define DBGLOG_MODULEID_WOW 7
++#define DBGLOG_MODULEID_WHAL 8
++#define DBGLOG_MODULEID_END
++
++#define DBGLOG_NUM_ARGS_OFFSET 30
++#define DBGLOG_NUM_ARGS_MASK 0xC0000000 /* Bit 30-31 */
++#define DBGLOG_NUM_ARGS_MAX 2 /* Upper limit is width of mask */
++
++#define DBGLOG_MODULE_LOG_ENABLE_OFFSET 0
++#define DBGLOG_MODULE_LOG_ENABLE_MASK 0x0000FFFF
++
++#define DBGLOG_REPORTING_ENABLED_OFFSET 16
++#define DBGLOG_REPORTING_ENABLED_MASK 0x00010000
++
++#define DBGLOG_TIMESTAMP_RESOLUTION_OFFSET 17
++#define DBGLOG_TIMESTAMP_RESOLUTION_MASK 0x000E0000
++
++#define DBGLOG_REPORT_SIZE_OFFSET 20
++#define DBGLOG_REPORT_SIZE_MASK 0x3FF00000
++
++#define DBGLOG_LOG_BUFFER_SIZE 1500
++#define DBGLOG_DBGID_DEFINITION_LEN_MAX 64
++
++struct dbglog_buf_s {
++ struct dbglog_buf_s *next;
++ A_INT8 *buffer;
++ A_UINT32 bufsize;
++ A_UINT32 length;
++ A_UINT32 count;
++ A_UINT32 free;
++};
++
++struct dbglog_hdr_s {
++ struct dbglog_buf_s *dbuf;
++ A_UINT32 dropped;
++};
++
++struct dbglog_config_s {
++ A_UINT32 cfgvalid; /* Mask with valid config bits */
++ union {
++ /* TODO: Take care of endianness */
++ struct {
++ A_UINT32 mmask:16; /* Mask of modules with logging on */
++ A_UINT32 rep:1; /* Reporting enabled or not */
++ A_UINT32 tsr:3; /* Time stamp resolution. Def: 1 ms */
++ A_UINT32 size:10; /* Report size in number of messages */
++ A_UINT32 reserved:2;
++ } dbglog_config;
++
++ A_UINT32 value;
++ } u;
++};
++
++#define cfgmmask u.dbglog_config.mmask
++#define cfgrep u.dbglog_config.rep
++#define cfgtsr u.dbglog_config.tsr
++#define cfgsize u.dbglog_config.size
++#define cfgvalue u.value
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _DBGLOG_H_ */
+diff --git a/drivers/ar6000/include/dbglog_api.h b/drivers/ar6000/include/dbglog_api.h
+new file mode 100644
+index 0000000..06c8102
+--- /dev/null
++++ b/drivers/ar6000/include/dbglog_api.h
+@@ -0,0 +1,46 @@
++#ifndef _DBGLOG_API_H_
++#define _DBGLOG_API_H_
++/*
++ * Copyright (c) 2004-2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ * This file contains host side debug primitives.
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include "dbglog.h"
++
++#define DBGLOG_HOST_LOG_BUFFER_SIZE DBGLOG_LOG_BUFFER_SIZE
++
++#define DBGLOG_GET_DBGID(arg) \
++ ((arg & DBGLOG_DBGID_MASK) >> DBGLOG_DBGID_OFFSET)
++
++#define DBGLOG_GET_MODULEID(arg) \
++ ((arg & DBGLOG_MODULEID_MASK) >> DBGLOG_MODULEID_OFFSET)
++
++#define DBGLOG_GET_NUMARGS(arg) \
++ ((arg & DBGLOG_NUM_ARGS_MASK) >> DBGLOG_NUM_ARGS_OFFSET)
++
++#define DBGLOG_GET_TIMESTAMP(arg) \
++ ((arg & DBGLOG_TIMESTAMP_MASK) >> DBGLOG_TIMESTAMP_OFFSET)
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _DBGLOG_API_H_ */
+diff --git a/drivers/ar6000/include/dbglog_id.h b/drivers/ar6000/include/dbglog_id.h
+new file mode 100644
+index 0000000..ce22b16
+--- /dev/null
++++ b/drivers/ar6000/include/dbglog_id.h
+@@ -0,0 +1,307 @@
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ * This file contains the definitions of the debug identifiers for different
++ * modules.
++ *
++ */
++
++#ifndef _DBGLOG_ID_H_
++#define _DBGLOG_ID_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*
++ * The nomenclature for the debug identifiers is MODULE_DESCRIPTION.
++ * Please ensure that the definition of any new debugid introduced is captured
++ * between the <MODULE>_DBGID_DEFINITION_START and
++ * <MODULE>_DBGID_DEFINITION_END defines. The structure is required for the
++ * parser to correctly pick up the values for different debug identifiers.
++ */
++
++/* INF debug identifier definitions */
++#define INF_DBGID_DEFINITION_START
++#define INF_ASSERTION_FAILED 1
++#define INF_TARGET_ID 2
++#define INF_DBGID_DEFINITION_END
++
++/* WMI debug identifier definitions */
++#define WMI_DBGID_DEFINITION_START
++#define WMI_CMD_RX_XTND_PKT_TOO_SHORT 1
++#define WMI_EXTENDED_CMD_NOT_HANDLED 2
++#define WMI_CMD_RX_PKT_TOO_SHORT 3
++#define WMI_CALLING_WMI_EXTENSION_FN 4
++#define WMI_CMD_NOT_HANDLED 5
++#define WMI_IN_SYNC 6
++#define WMI_TARGET_WMI_SYNC_CMD 7
++#define WMI_SET_SNR_THRESHOLD_PARAMS 8
++#define WMI_SET_RSSI_THRESHOLD_PARAMS 9
++#define WMI_SET_LQ_TRESHOLD_PARAMS 10
++#define WMI_TARGET_CREATE_PSTREAM_CMD 11
++#define WMI_WI_DTM_INUSE 12
++#define WMI_TARGET_DELETE_PSTREAM_CMD 13
++#define WMI_TARGET_IMPLICIT_DELETE_PSTREAM_CMD 14
++#define WMI_TARGET_GET_BIT_RATE_CMD 15
++#define WMI_GET_RATE_MASK_CMD_FIX_RATE_MASK_IS 16
++#define WMI_TARGET_GET_AVAILABLE_CHANNELS_CMD 17
++#define WMI_TARGET_GET_TX_PWR_CMD 18
++#define WMI_FREE_EVBUF_WMIBUF 19
++#define WMI_FREE_EVBUF_DATABUF 20
++#define WMI_FREE_EVBUF_BADFLAG 21
++#define WMI_HTC_RX_ERROR_DATA_PACKET 22
++#define WMI_HTC_RX_SYNC_PAUSING_FOR_MBOX 23
++#define WMI_INCORRECT_WMI_DATA_HDR_DROPPING_PKT 24
++#define WMI_SENDING_READY_EVENT 25
++#define WMI_SETPOWER_MDOE_TO_MAXPERF 26
++#define WMI_SETPOWER_MDOE_TO_REC 27
++#define WMI_BSSINFO_EVENT_FROM 28
++#define WMI_TARGET_GET_STATS_CMD 29
++#define WMI_SENDING_SCAN_COMPLETE_EVENT 30
++#define WMI_SENDING_RSSI_INDB_THRESHOLD_EVENT 31
++#define WMI_SENDING_RSSI_INDBM_THRESHOLD_EVENT 32
++#define WMI_SENDING_LINK_QUALITY_THRESHOLD_EVENT 33
++#define WMI_SENDING_ERROR_REPORT_EVENT 34
++#define WMI_SENDING_CAC_EVENT 35
++#define WMI_TARGET_GET_ROAM_TABLE_CMD 36
++#define WMI_TARGET_GET_ROAM_DATA_CMD 37
++#define WMI_SENDING_GPIO_INTR_EVENT 38
++#define WMI_SENDING_GPIO_ACK_EVENT 39
++#define WMI_SENDING_GPIO_DATA_EVENT 40
++#define WMI_CMD_RX 41
++#define WMI_CMD_RX_XTND 42
++#define WMI_EVENT_SEND 43
++#define WMI_EVENT_SEND_XTND 44
++#define WMI_DBGID_DEFINITION_END
++
++/* CSERV debug identifier definitions */
++#define CSERV_DBGID_DEFINITION_START
++#define CSERV_BEGIN_SCAN1 1
++#define CSERV_BEGIN_SCAN2 2
++#define CSERV_END_SCAN1 3
++#define CSERV_END_SCAN2 4
++#define CSERV_CHAN_SCAN_START 5
++#define CSERV_CHAN_SCAN_STOP 6
++#define CSERV_CHANNEL_OPPPORTUNITY 7
++#define CSERV_NC_TIMEOUT 8
++#define CSERV_BACK_HOME 10
++#define CSERV_CHMGR_CH_CALLBACK1 11
++#define CSERV_CHMGR_CH_CALLBACK2 12
++#define CSERV_CHMGR_CH_CALLBACK3 13
++#define CSERV_SET_SCAN_PARAMS1 14
++#define CSERV_SET_SCAN_PARAMS2 15
++#define CSERV_SET_SCAN_PARAMS3 16
++#define CSERV_SET_SCAN_PARAMS4 17
++#define CSERV_ABORT_SCAN 18
++#define CSERV_NEWSTATE 19
++#define CSERV_MINCHMGR_OP_END 20
++#define CSERV_CHMGR_OP_END 21
++#define CSERV_DISCONNECT_TIMEOUT 22
++#define CSERV_ROAM_TIMEOUT 23
++#define CSERV_FORCE_SCAN1 24
++#define CSERV_FORCE_SCAN2 25
++#define CSERV_FORCE_SCAN3 26
++#define CSERV_UTIL_TIMEOUT 27
++#define CSERV_RSSIPOLLER 28
++#define CSERV_RETRY_CONNECT_TIMEOUT 29
++#define CSERV_RSSIINDBMPOLLER 30
++#define CSERV_BGSCAN_ENABLE 31
++#define CSERV_BGSCAN_DISABLE 32
++#define CSERV_WLAN_START_SCAN_CMD1 33
++#define CSERV_WLAN_START_SCAN_CMD2 34
++#define CSERV_WLAN_START_SCAN_CMD3 35
++#define CSERV_START_SCAN_CMD 36
++#define CSERV_START_FORCE_SCAN 37
++#define CSERV_NEXT_CHAN 38
++#define CSERV_SET_REGCODE 39
++#define CSERV_START_ADHOC 40
++#define CSERV_ADHOC_AT_HOME 41
++#define CSERV_OPT_AT_HOME 42
++#define CSERV_WLAN_CONNECT_CMD 43
++#define CSERV_WLAN_RECONNECT_CMD 44
++#define CSERV_WLAN_DISCONNECT_CMD 45
++#define CSERV_BSS_CHANGE_CHANNEL 46
++#define CSERV_BEACON_RX 47
++#define CSERV_KEEPALIVE_CHECK 48
++#define CSERV_RC_BEGIN_SCAN 49
++#define CSERV_RC_SCAN_START 50
++#define CSERV_RC_SCAN_STOP 51
++#define CSERV_RC_NEXT 52
++#define CSERV_RC_SCAN_END 53
++#define CSERV_PROBE_CALLBACK 54
++#define CSERV_ROAM1 55
++#define CSERV_ROAM2 56
++#define CSERV_ROAM3 57
++#define CSERV_CONNECT_EVENT 58
++#define CSERV_DISCONNECT_EVENT 59
++#define CSERV_BMISS_HANDLER1 60
++#define CSERV_BMISS_HANDLER2 61
++#define CSERV_BMISS_HANDLER3 62
++#define CSERV_LOWRSSI_HANDLER 63
++#define CSERV_WLAN_SET_PMKID_CMD 64
++#define CSERV_RECONNECT_REQUEST 65
++#define CSERV_KEYSPLUMBED_EVENT 66
++#define CSERV_NEW_REG 67
++#define CSERV_SET_RSSI_THOLD 68
++#define CSERV_RSSITHRESHOLDCHECK 69
++#define CSERV_RSSIINDBMTHRESHOLDCHECK 70
++#define CSERV_WLAN_SET_OPT_CMD1 71
++#define CSERV_WLAN_SET_OPT_CMD2 72
++#define CSERV_WLAN_SET_OPT_CMD3 73
++#define CSERV_WLAN_SET_OPT_CMD4 74
++#define CSERV_SCAN_CONNECT_STOP 75
++#define CSERV_BMISS_HANDLER4 76
++#define CSERV_INITIALIZE_TIMER 77
++#define CSERV_ARM_TIMER 78
++#define CSERV_DISARM_TIMER 79
++#define CSERV_UNINITIALIZE_TIMER 80
++#define CSERV_DISCONNECT_EVENT2 81
++#define CSERV_SCAN_CONNECT_START 82
++#define CSERV_BSSINFO_MEMORY_ALLOC_FAILED 83
++#define CSERV_SET_SCAN_PARAMS5 84
++#define CSERV_DBGID_DEFINITION_END
++
++/* TXRX debug identifier definitions */
++#define TXRX_TXBUF_DBGID_DEFINITION_START
++#define TXRX_TXBUF_ALLOCATE_BUF 1
++#define TXRX_TXBUF_QUEUE_BUF_TO_MBOX 2
++#define TXRX_TXBUF_QUEUE_BUF_TO_TXQ 3
++#define TXRX_TXBUF_TXQ_DEPTH 4
++#define TXRX_TXBUF_IBSS_QUEUE_TO_SFQ 5
++#define TXRX_TXBUF_IBSS_QUEUE_TO_TXQ_FRM_SFQ 6
++#define TXRX_TXBUF_INITIALIZE_TIMER 7
++#define TXRX_TXBUF_ARM_TIMER 8
++#define TXRX_TXBUF_DISARM_TIMER 9
++#define TXRX_TXBUF_UNINITIALIZE_TIMER 10
++#define TXRX_TXBUF_DBGID_DEFINITION_END
++
++#define TXRX_RXBUF_DBGID_DEFINITION_START
++#define TXRX_RXBUF_ALLOCATE_BUF 1
++#define TXRX_RXBUF_QUEUE_TO_HOST 2
++#define TXRX_RXBUF_QUEUE_TO_WLAN 3
++#define TXRX_RXBUF_ZERO_LEN_BUF 4
++#define TXRX_RXBUF_QUEUE_TO_HOST_LASTBUF_IN_RXCHAIN 5
++#define TXRX_RXBUF_LASTBUF_IN_RXCHAIN_ZEROBUF 6
++#define TXRX_RXBUF_QUEUE_EMPTY_QUEUE_TO_WLAN 7
++#define TXRX_RXBUF_SEND_TO_RECV_MGMT 8
++#define TXRX_RXBUF_SEND_TO_IEEE_LAYER 9
++#define TXRX_RXBUF_DBGID_DEFINITION_END
++
++#define TXRX_MGMTBUF_DBGID_DEFINITION_START
++#define TXRX_MGMTBUF_ALLOCATE_BUF 1
++#define TXRX_MGMTBUF_ALLOCATE_SM_BUF 2
++#define TXRX_MGMTBUF_ALLOCATE_RMBUF 3
++#define TXRX_MGMTBUF_GET_BUF 4
++#define TXRX_MGMTBUF_GET_SM_BUF 5
++#define TXRX_MGMTBUF_QUEUE_BUF_TO_TXQ 6
++#define TXRX_MGMTBUF_REAPED_BUF 7
++#define TXRX_MGMTBUF_REAPED_SM_BUF 8
++#define TXRX_MGMTBUF_WAIT_FOR_TXQ_DRAIN 9
++#define TXRX_MGMTBUF_WAIT_FOR_TXQ_SFQ_DRAIN 10
++#define TXRX_MGMTBUF_ENQUEUE_INTO_SFQ 11
++#define TXRX_MGMTBUF_DEQUEUE_FROM_SFQ 12
++#define TXRX_MGMTBUF_PAUSE_TXQ 13
++#define TXRX_MGMTBUF_RESUME_TXQ 14
++#define TXRX_MGMTBUF_WAIT_FORTXQ_DRAIN_TIMEOUT 15
++#define TXRX_MGMTBUF_DRAINQ 16
++#define TXRX_MGMTBUF_INDICATE_Q_DRAINED 17
++#define TXRX_MGMTBUF_DBGID_DEFINITION_END
++
++/* PM (Power Module) debug identifier definitions */
++#define PM_DBGID_DEFINITION_START
++#define PM_INIT 1
++#define PM_ENABLE 2
++#define PM_SET_STATE 3
++#define PM_SET_POWERMODE 4
++#define PM_CONN_NOTIFY 5
++#define PM_REF_COUNT_NEGATIVE 6
++#define PM_APSD_ENABLE 7
++#define PM_UPDATE_APSD_STATE 8
++#define PM_CHAN_OP_REQ 9
++#define PM_SET_MY_BEACON_POLICY 10
++#define PM_SET_ALL_BEACON_POLICY 11
++#define PM_SET_PM_PARAMS1 12
++#define PM_SET_PM_PARAMS2 13
++#define PM_ADHOC_SET_PM_CAPS_FAIL 14
++#define PM_ADHOC_UNKNOWN_IBSS_ATTRIB_ID 15
++#define PM_DBGID_DEFINITION_END
++
++/* Wake on Wireless debug identifier definitions */
++#define WOW_DBGID_DEFINITION_START
++#define WOW_INIT 1
++#define WOW_GET_CONFIG_DSET 2
++#define WOW_NO_CONFIG_DSET 3
++#define WOW_INVALID_CONFIG_DSET 4
++#define WOW_USE_DEFAULT_CONFIG 5
++#define WOW_SETUP_GPIO 6
++#define WOW_INIT_DONE 7
++#define WOW_SET_GPIO_PIN 8
++#define WOW_CLEAR_GPIO_PIN 9
++#define WOW_SET_WOW_MODE_CMD 10
++#define WOW_SET_HOST_MODE_CMD 11
++#define WOW_ADD_WOW_PATTERN_CMD 12
++#define WOW_NEW_WOW_PATTERN_AT_INDEX 13
++#define WOW_DEL_WOW_PATTERN_CMD 14
++#define WOW_LIST_CONTAINS_PATTERNS 15
++#define WOW_GET_WOW_LIST_CMD 16
++#define WOW_INVALID_FILTER_ID 17
++#define WOW_INVALID_FILTER_LISTID 18
++#define WOW_NO_VALID_FILTER_AT_ID 19
++#define WOW_NO_VALID_LIST_AT_ID 20
++#define WOW_NUM_PATTERNS_EXCEEDED 21
++#define WOW_NUM_LISTS_EXCEEDED 22
++#define WOW_GET_WOW_STATS 23
++#define WOW_CLEAR_WOW_STATS 24
++#define WOW_WAKEUP_HOST 25
++#define WOW_EVENT_WAKEUP_HOST 26
++#define WOW_EVENT_DISCARD 27
++#define WOW_PATTERN_MATCH 28
++#define WOW_PATTERN_NOT_MATCH 29
++#define WOW_PATTERN_NOT_MATCH_OFFSET 30
++#define WOW_DISABLED_HOST_ASLEEP 31
++#define WOW_ENABLED_HOST_ASLEEP_NO_PATTERNS 32
++#define WOW_ENABLED_HOST_ASLEEP_NO_MATCH_FOUND 33
++#define WOW_DBGID_DEFINITION_END
++
++/* WHAL debug identifier definitions */
++#define WHAL_DBGID_DEFINITION_START
++#define WHAL_ERROR_ANI_CONTROL 1
++#define WHAL_ERROR_CHIP_TEST1 2
++#define WHAL_ERROR_CHIP_TEST2 3
++#define WHAL_ERROR_EEPROM_CHECKSUM 4
++#define WHAL_ERROR_EEPROM_MACADDR 5
++#define WHAL_ERROR_INTERRUPT_HIU 6
++#define WHAL_ERROR_KEYCACHE_RESET 7
++#define WHAL_ERROR_KEYCACHE_SET 8
++#define WHAL_ERROR_KEYCACHE_TYPE 9
++#define WHAL_ERROR_KEYCACHE_TKIPENTRY 10
++#define WHAL_ERROR_KEYCACHE_WEPLENGTH 11
++#define WHAL_ERROR_PHY_INVALID_CHANNEL 12
++#define WHAL_ERROR_POWER_AWAKE 13
++#define WHAL_ERROR_POWER_SET 14
++#define WHAL_ERROR_RECV_STOPDMA 15
++#define WHAL_ERROR_RECV_STOPPCU 16
++#define WHAL_ERROR_RESET_CHANNF1 17
++#define WHAL_ERROR_RESET_CHANNF2 18
++#define WHAL_ERROR_RESET_PM 19
++#define WHAL_ERROR_RESET_OFFSETCAL 20
++#define WHAL_ERROR_RESET_RFGRANT 21
++#define WHAL_ERROR_RESET_RXFRAME 22
++#define WHAL_ERROR_RESET_STOPDMA 23
++#define WHAL_ERROR_RESET_RECOVER 24
++#define WHAL_ERROR_XMIT_COMPUTE 25
++#define WHAL_ERROR_XMIT_NOQUEUE 26
++#define WHAL_ERROR_XMIT_ACTIVEQUEUE 27
++#define WHAL_ERROR_XMIT_BADTYPE 28
++#define WHAL_DBGID_DEFINITION_END
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _DBGLOG_ID_H_ */
+diff --git a/drivers/ar6000/include/dl_list.h b/drivers/ar6000/include/dl_list.h
+new file mode 100644
+index 0000000..4b9c581
+--- /dev/null
++++ b/drivers/ar6000/include/dl_list.h
+@@ -0,0 +1,114 @@
++/*
++ *
++ * Double-link list definitions (adapted from Atheros SDIO stack)
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++#ifndef __DL_LIST_H___
++#define __DL_LIST_H___
++
++#define A_CONTAINING_STRUCT(address, struct_type, field_name)\
++ ((struct_type *)((A_UINT32)(address) - (A_UINT32)(&((struct_type *)0)->field_name)))
++
++/* list functions */
++/* pointers for the list */
++typedef struct _DL_LIST {
++ struct _DL_LIST *pPrev;
++ struct _DL_LIST *pNext;
++}DL_LIST, *PDL_LIST;
++/*
++ * DL_LIST_INIT , initialize doubly linked list
++*/
++#define DL_LIST_INIT(pList)\
++ {(pList)->pPrev = pList; (pList)->pNext = pList;}
++
++#define DL_LIST_IS_EMPTY(pList) (((pList)->pPrev == (pList)) && ((pList)->pNext == (pList)))
++#define DL_LIST_GET_ITEM_AT_HEAD(pList) (pList)->pNext
++#define DL_LIST_GET_ITEM_AT_TAIL(pList) (pList)->pPrev
++/*
++ * ITERATE_OVER_LIST pStart is the list, pTemp is a temp list member
++ * NOT: do not use this function if the items in the list are deleted inside the
++ * iteration loop
++*/
++#define ITERATE_OVER_LIST(pStart, pTemp) \
++ for((pTemp) =(pStart)->pNext; pTemp != (pStart); (pTemp) = (pTemp)->pNext)
++
++
++/* safe iterate macro that allows the item to be removed from the list
++ * the iteration continues to the next item in the list
++ */
++#define ITERATE_OVER_LIST_ALLOW_REMOVE(pStart,pItem,st,offset) \
++{ \
++ PDL_LIST pTemp; \
++ pTemp = (pStart)->pNext; \
++ while (pTemp != (pStart)) { \
++ (pItem) = A_CONTAINING_STRUCT(pTemp,st,offset); \
++ pTemp = pTemp->pNext; \
++
++#define ITERATE_END }}
++
++/*
++ * DL_ListInsertTail - insert pAdd to the end of the list
++*/
++static INLINE PDL_LIST DL_ListInsertTail(PDL_LIST pList, PDL_LIST pAdd) {
++ /* insert at tail */
++ pAdd->pPrev = pList->pPrev;
++ pAdd->pNext = pList;
++ pList->pPrev->pNext = pAdd;
++ pList->pPrev = pAdd;
++ return pAdd;
++}
++
++/*
++ * DL_ListInsertHead - insert pAdd into the head of the list
++*/
++static INLINE PDL_LIST DL_ListInsertHead(PDL_LIST pList, PDL_LIST pAdd) {
++ /* insert at head */
++ pAdd->pPrev = pList;
++ pAdd->pNext = pList->pNext;
++ pList->pNext->pPrev = pAdd;
++ pList->pNext = pAdd;
++ return pAdd;
++}
++
++#define DL_ListAdd(pList,pItem) DL_ListInsertHead((pList),(pItem))
++/*
++ * DL_ListRemove - remove pDel from list
++*/
++static INLINE PDL_LIST DL_ListRemove(PDL_LIST pDel) {
++ pDel->pNext->pPrev = pDel->pPrev;
++ pDel->pPrev->pNext = pDel->pNext;
++ /* point back to itself just to be safe, incase remove is called again */
++ pDel->pNext = pDel;
++ pDel->pPrev = pDel;
++ return pDel;
++}
++
++/*
++ * DL_ListRemoveItemFromHead - get a list item from the head
++*/
++static INLINE PDL_LIST DL_ListRemoveItemFromHead(PDL_LIST pList) {
++ PDL_LIST pItem = NULL;
++ if (pList->pNext != pList) {
++ pItem = pList->pNext;
++ /* remove the first item from head */
++ DL_ListRemove(pItem);
++ }
++ return pItem;
++}
++
++#endif /* __DL_LIST_H___ */
+diff --git a/drivers/ar6000/include/dset_api.h b/drivers/ar6000/include/dset_api.h
+new file mode 100644
+index 0000000..de5cc6a
+--- /dev/null
++++ b/drivers/ar6000/include/dset_api.h
+@@ -0,0 +1,63 @@
++/*
++ * Copyright (c) 2004-2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/include/dset_api.h#1 $
++ *
++ * Host-side DataSet API.
++ *
++ */
++
++#ifndef _DSET_API_H_
++#define _DSET_API_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif /* __cplusplus */
++
++/*
++ * Host-side DataSet support is optional, and is not
++ * currently required for correct operation. To disable
++ * Host-side DataSet support, set this to 0.
++ */
++#ifndef CONFIG_HOST_DSET_SUPPORT
++#define CONFIG_HOST_DSET_SUPPORT 1
++#endif
++
++/* Called to send a DataSet Open Reply back to the Target. */
++A_STATUS wmi_dset_open_reply(struct wmi_t *wmip,
++ A_UINT32 status,
++ A_UINT32 access_cookie,
++ A_UINT32 size,
++ A_UINT32 version,
++ A_UINT32 targ_handle,
++ A_UINT32 targ_reply_fn,
++ A_UINT32 targ_reply_arg);
++
++/* Called to send a DataSet Data Reply back to the Target. */
++A_STATUS wmi_dset_data_reply(struct wmi_t *wmip,
++ A_UINT32 status,
++ A_UINT8 *host_buf,
++ A_UINT32 length,
++ A_UINT32 targ_buf,
++ A_UINT32 targ_reply_fn,
++ A_UINT32 targ_reply_arg);
++
++#ifdef __cplusplus
++}
++#endif /* __cplusplus */
++
++
++#endif /* _DSET_API_H_ */
+diff --git a/drivers/ar6000/include/dset_internal.h b/drivers/ar6000/include/dset_internal.h
+new file mode 100644
+index 0000000..f0be380
+--- /dev/null
++++ b/drivers/ar6000/include/dset_internal.h
+@@ -0,0 +1,39 @@
++/*
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++
++#ifndef __DSET_INTERNAL_H__
++#define __DSET_INTERNAL_H__
++
++/*
++ * Internal dset definitions, common for DataSet layer.
++ */
++
++#define DSET_TYPE_STANDARD 0
++#define DSET_TYPE_BPATCHED 1
++#define DSET_TYPE_COMPRESSED 2
++
++/* Dataset descriptor */
++
++typedef struct dset_descriptor_s {
++ struct dset_descriptor_s *next; /* List link. NULL only at the last
++ descriptor */
++ A_UINT16 id; /* Dset ID */
++ A_UINT16 size; /* Dset size. */
++ void *DataPtr; /* Pointer to raw data for standard
++ DataSet or pointer to original
++ dset_descriptor for patched
++ DataSet */
++ A_UINT32 data_type; /* DSET_TYPE_*, above */
++
++ void *AuxPtr; /* Additional data that might
++ needed for data_type. For
++ example, pointer to patch
++ Dataset descriptor for BPatch. */
++} dset_descriptor_t;
++
++#endif /* __DSET_INTERNAL_H__ */
+diff --git a/drivers/ar6000/include/dsetid.h b/drivers/ar6000/include/dsetid.h
+new file mode 100644
+index 0000000..85729f8
+--- /dev/null
++++ b/drivers/ar6000/include/dsetid.h
+@@ -0,0 +1,110 @@
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++
++#ifndef __DSETID_H__
++#define __DSETID_H__
++
++/* Well-known DataSet IDs */
++#define DSETID_UNUSED 0x00000000
++#define DSETID_BOARD_DATA 0x00000001 /* Cal and board data */
++#define DSETID_REGDB 0x00000002 /* Regulatory Database */
++#define DSETID_POWER_CONTROL 0x00000003 /* TX Pwr Lim & Ant Gain */
++#define DSETID_USER_CONFIG 0x00000004 /* User Configuration */
++
++#define DSETID_ANALOG_CONTROL_DATA_START 0x00000005
++#define DSETID_ANALOG_CONTROL_DATA_END 0x00000025
++/*
++ * Get DSETID for various reference clock speeds.
++ * For each speed there are three DataSets that correspond
++ * to the three columns of bank6 data (addr, 11a, 11b/g).
++ * This macro returns the dsetid of the first of those
++ * three DataSets.
++ */
++#define ANALOG_CONTROL_DATA_DSETID(refclk) \
++ (DSETID_ANALOG_CONTROL_DATA_START + 3*refclk)
++
++/*
++ * There are TWO STARTUP_PATCH DataSets.
++ * DSETID_STARTUP_PATCH is historical, and was applied before BMI on
++ * earlier systems. On AR6002, it is applied after BMI, just like
++ * DSETID_STARTUP_PATCH2.
++ */
++#define DSETID_STARTUP_PATCH 0x00000026
++#define DSETID_GPIO_CONFIG_PATCH 0x00000027
++#define DSETID_WLANREGS 0x00000028 /* override wlan regs */
++#define DSETID_STARTUP_PATCH2 0x00000029
++
++#define DSETID_WOW_CONFIG 0x00000090 /* WoW Configuration */
++
++/* Add WHAL_INI_DATA_ID to DSETID_INI_DATA for a specific WHAL INI table. */
++#define DSETID_INI_DATA 0x00000100
++/* Reserved for WHAL INI Tables: 0x100..0x11f */
++#define DSETID_INI_DATA_END 0x0000011f
++
++#define DSETID_VENDOR_START 0x00010000 /* Vendor-defined DataSets */
++
++#define DSETID_INDEX_END 0xfffffffe /* Reserved to indicate the
++ end of a memory-based
++ DataSet Index */
++#define DSETID_INDEX_FREE 0xffffffff /* An unused index entry */
++
++/*
++ * PATCH DataSet format:
++ * A list of patches, terminated by a patch with
++ * address=PATCH_END.
++ *
++ * This allows for patches to be stored in flash.
++ */
++struct patch_s {
++ A_UINT32 *address;
++ A_UINT32 data;
++};
++
++/*
++ * Skip some patches. Can be used to erase a single patch in a
++ * patch DataSet without having to re-write the DataSet. May
++ * also be used to embed information for use by subsequent
++ * patch code. The "data" in a PATCH_SKIP tells how many
++ * bytes of length "patch_s" to skip.
++ */
++#define PATCH_SKIP ((A_UINT32 *)0x00000000)
++
++/*
++ * Execute code at the address specified by "data".
++ * The address of the patch structure is passed as
++ * the one parameter.
++ */
++#define PATCH_CODE_ABS ((A_UINT32 *)0x00000001)
++
++/*
++ * Same as PATCH_CODE_ABS, but treat "data" as an
++ * offset from the start of the patch word.
++ */
++#define PATCH_CODE_REL ((A_UINT32 *)0x00000002)
++
++/* Mark the end of this patch DataSet. */
++#define PATCH_END ((A_UINT32 *)0xffffffff)
++
++/*
++ * A DataSet which contains a Binary Patch to some other DataSet
++ * uses the original dsetid with the DSETID_BPATCH_FLAG bit set.
++ * Such a BPatch DataSet consists of BPatch metadata followed by
++ * the bdiff bytes. BPatch metadata consists of a single 32-bit
++ * word that contains the size of the BPatched final image.
++ *
++ * To create a suitable bdiff DataSet, use bdiff in host/tools/bdiff
++ * to create "diffs":
++ * bdiff -q -O -nooldmd5 -nonewmd5 -d ORIGfile NEWfile diffs
++ * Then add BPatch metadata to the start of "diffs".
++ *
++ * NB: There are some implementation-induced restrictions
++ * on which DataSets can be BPatched.
++ */
++#define DSETID_BPATCH_FLAG 0x80000000
++
++#endif /* __DSETID_H__ */
+diff --git a/drivers/ar6000/include/gpio.h b/drivers/ar6000/include/gpio.h
+new file mode 100644
+index 0000000..2203c7e
+--- /dev/null
++++ b/drivers/ar6000/include/gpio.h
+@@ -0,0 +1,34 @@
++/*
++ * Copyright (c) 2005 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++
++#if defined(AR6001)
++#define GPIO_PIN_COUNT 18
++#else
++#define GPIO_PIN_COUNT 18
++#endif
++
++/*
++ * Possible values for WMIX_GPIO_SET_REGISTER_CMDID.
++ * NB: These match hardware order, so that addresses can
++ * easily be computed.
++ */
++#define GPIO_ID_OUT 0x00000000
++#define GPIO_ID_OUT_W1TS 0x00000001
++#define GPIO_ID_OUT_W1TC 0x00000002
++#define GPIO_ID_ENABLE 0x00000003
++#define GPIO_ID_ENABLE_W1TS 0x00000004
++#define GPIO_ID_ENABLE_W1TC 0x00000005
++#define GPIO_ID_IN 0x00000006
++#define GPIO_ID_STATUS 0x00000007
++#define GPIO_ID_STATUS_W1TS 0x00000008
++#define GPIO_ID_STATUS_W1TC 0x00000009
++#define GPIO_ID_PIN0 0x0000000a
++#define GPIO_ID_PIN(n) (GPIO_ID_PIN0+(n))
++
++#define GPIO_LAST_REGISTER_ID GPIO_ID_PIN(17)
++#define GPIO_ID_NONE 0xffffffff
+diff --git a/drivers/ar6000/include/gpio_api.h b/drivers/ar6000/include/gpio_api.h
+new file mode 100644
+index 0000000..8078aa5
+--- /dev/null
++++ b/drivers/ar6000/include/gpio_api.h
+@@ -0,0 +1,57 @@
++#ifndef _GPIO_API_H_
++#define _GPIO_API_H_
++/*
++ * Copyright 2005 Atheros Communications, Inc., All Rights Reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++/*
++ * Host-side General Purpose I/O API.
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/include/gpio_api.h#1 $
++ */
++
++/*
++ * Send a command to the Target in order to change output on GPIO pins.
++ */
++A_STATUS wmi_gpio_output_set(struct wmi_t *wmip,
++ A_UINT32 set_mask,
++ A_UINT32 clear_mask,
++ A_UINT32 enable_mask,
++ A_UINT32 disable_mask);
++
++/*
++ * Send a command to the Target requesting input state of GPIO pins.
++ */
++A_STATUS wmi_gpio_input_get(struct wmi_t *wmip);
++
++/*
++ * Send a command to the Target to change the value of a GPIO register.
++ */
++A_STATUS wmi_gpio_register_set(struct wmi_t *wmip,
++ A_UINT32 gpioreg_id,
++ A_UINT32 value);
++
++/*
++ * Send a command to the Target to fetch the value of a GPIO register.
++ */
++A_STATUS wmi_gpio_register_get(struct wmi_t *wmip, A_UINT32 gpioreg_id);
++
++/*
++ * Send a command to the Target, acknowledging some GPIO interrupts.
++ */
++A_STATUS wmi_gpio_intr_ack(struct wmi_t *wmip, A_UINT32 ack_mask);
++
++#endif /* _GPIO_API_H_ */
+diff --git a/drivers/ar6000/include/hif.h b/drivers/ar6000/include/hif.h
+new file mode 100644
+index 0000000..846a69f
+--- /dev/null
++++ b/drivers/ar6000/include/hif.h
+@@ -0,0 +1,296 @@
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ * HIF specific declarations and prototypes
++ */
++
++#ifndef _HIF_H_
++#define _HIF_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif /* __cplusplus */
++
++/* Header files */
++#include "a_config.h"
++#include "athdefs.h"
++#include "a_types.h"
++#include "a_osapi.h"
++
++typedef struct htc_callbacks HTC_CALLBACKS;
++typedef struct hif_device HIF_DEVICE;
++
++/*
++ * direction - Direction of transfer (HIF_READ/HIF_WRITE).
++ */
++#define HIF_READ 0x00000001
++#define HIF_WRITE 0x00000002
++#define HIF_DIR_MASK (HIF_READ | HIF_WRITE)
++
++/*
++ * type - An interface may support different kind of read/write commands.
++ * The command type is divided into a basic and an extended command
++ * and can be specified using HIF_BASIC_IO/HIF_EXTENDED_IO.
++ */
++#define HIF_BASIC_IO 0x00000004
++#define HIF_EXTENDED_IO 0x00000008
++#define HIF_TYPE_MASK (HIF_BASIC_IO | HIF_EXTENDED_IO)
++
++/*
++ * emode - This indicates the whether the command is to be executed in a
++ * blocking or non-blocking fashion (HIF_SYNCHRONOUS/
++ * HIF_ASYNCHRONOUS). The read/write data paths in HTC have been
++ * implemented using the asynchronous mode allowing the the bus
++ * driver to indicate the completion of operation through the
++ * registered callback routine. The requirement primarily comes
++ * from the contexts these operations get called from (a driver's
++ * transmit context or the ISR context in case of receive).
++ * Support for both of these modes is essential.
++ */
++#define HIF_SYNCHRONOUS 0x00000010
++#define HIF_ASYNCHRONOUS 0x00000020
++#define HIF_EMODE_MASK (HIF_SYNCHRONOUS | HIF_ASYNCHRONOUS)
++
++/*
++ * dmode - An interface may support different kinds of commands based on
++ * the tradeoff between the amount of data it can carry and the
++ * setup time. Byte and Block modes are supported (HIF_BYTE_BASIS/
++ * HIF_BLOCK_BASIS). In case of latter, the data is rounded off
++ * to the nearest block size by padding. The size of the block is
++ * configurable at compile time using the HIF_BLOCK_SIZE and is
++ * negotiated with the target during initialization after the
++ * dragon interrupts are enabled.
++ */
++#define HIF_BYTE_BASIS 0x00000040
++#define HIF_BLOCK_BASIS 0x00000080
++#define HIF_DMODE_MASK (HIF_BYTE_BASIS | HIF_BLOCK_BASIS)
++
++/*
++ * amode - This indicates if the address has to be incremented on dragon
++ * after every read/write operation (HIF?FIXED_ADDRESS/
++ * HIF_INCREMENTAL_ADDRESS).
++ */
++#define HIF_FIXED_ADDRESS 0x00000100
++#define HIF_INCREMENTAL_ADDRESS 0x00000200
++#define HIF_AMODE_MASK (HIF_FIXED_ADDRESS | HIF_INCREMENTAL_ADDRESS)
++
++#define HIF_WR_ASYNC_BYTE_FIX \
++ (HIF_WRITE | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_FIXED_ADDRESS)
++#define HIF_WR_ASYNC_BYTE_INC \
++ (HIF_WRITE | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS)
++#define HIF_WR_ASYNC_BLOCK_INC \
++ (HIF_WRITE | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS)
++#define HIF_WR_SYNC_BYTE_FIX \
++ (HIF_WRITE | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_FIXED_ADDRESS)
++#define HIF_WR_SYNC_BYTE_INC \
++ (HIF_WRITE | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS)
++#define HIF_WR_SYNC_BLOCK_INC \
++ (HIF_WRITE | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS)
++#define HIF_RD_SYNC_BYTE_INC \
++ (HIF_READ | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS)
++#define HIF_RD_SYNC_BYTE_FIX \
++ (HIF_READ | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_FIXED_ADDRESS)
++#define HIF_RD_ASYNC_BYTE_FIX \
++ (HIF_READ | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_FIXED_ADDRESS)
++#define HIF_RD_ASYNC_BLOCK_FIX \
++ (HIF_READ | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BLOCK_BASIS | HIF_FIXED_ADDRESS)
++#define HIF_RD_ASYNC_BYTE_INC \
++ (HIF_READ | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS)
++#define HIF_RD_ASYNC_BLOCK_INC \
++ (HIF_READ | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS)
++#define HIF_RD_SYNC_BLOCK_INC \
++ (HIF_READ | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS)
++
++
++typedef enum {
++ HIF_DEVICE_POWER_STATE = 0,
++ HIF_DEVICE_GET_MBOX_BLOCK_SIZE,
++ HIF_DEVICE_GET_MBOX_ADDR,
++ HIF_DEVICE_GET_PENDING_EVENTS_FUNC,
++ HIF_DEVICE_GET_IRQ_PROC_MODE,
++ HIF_DEVICE_GET_RECV_EVENT_MASK_UNMASK_FUNC,
++} HIF_DEVICE_CONFIG_OPCODE;
++
++/*
++ * HIF CONFIGURE definitions:
++ *
++ * HIF_DEVICE_GET_MBOX_BLOCK_SIZE
++ * input : none
++ * output : array of 4 A_UINT32s
++ * notes: block size is returned for each mailbox (4)
++ *
++ * HIF_DEVICE_GET_MBOX_ADDR
++ * input : none
++ * output : array of 4 A_UINT32
++ * notes: address is returned for each mailbox (4) in the array
++ *
++ * HIF_DEVICE_GET_PENDING_EVENTS_FUNC
++ * input : none
++ * output: HIF_PENDING_EVENTS_FUNC function pointer
++ * notes: this is optional for the HIF layer, if the request is
++ * not handled then it indicates that the upper layer can use
++ * the standard device methods to get pending events (IRQs, mailbox messages etc..)
++ * otherwise it can call the function pointer to check pending events.
++ *
++ * HIF_DEVICE_GET_IRQ_PROC_MODE
++ * input : none
++ * output : HIF_DEVICE_IRQ_PROCESSING_MODE (interrupt processing mode)
++ * note: the hif layer interfaces with the underlying OS-specific bus driver. The HIF
++ * layer can report whether IRQ processing is requires synchronous behavior or
++ * can be processed using asynchronous bus requests (typically faster).
++ *
++ * HIF_DEVICE_GET_RECV_EVENT_MASK_UNMASK_FUNC
++ * input :
++ * output : HIF_MASK_UNMASK_RECV_EVENT function pointer
++ * notes: this is optional for the HIF layer. The HIF layer may require a special mechanism
++ * to mask receive message events. The upper layer can call this pointer when it needs
++ * to mask/unmask receive events (in case it runs out of buffers).
++ *
++ *
++ */
++
++typedef enum {
++ HIF_DEVICE_IRQ_SYNC_ONLY, /* for HIF implementations that require the DSR to process all
++ interrupts before returning */
++ HIF_DEVICE_IRQ_ASYNC_SYNC, /* for HIF implementations that allow DSR to process interrupts
++ using ASYNC I/O (that is HIFAckInterrupt can be called at a
++ later time */
++} HIF_DEVICE_IRQ_PROCESSING_MODE;
++
++#define HIF_MAX_DEVICES 1
++
++struct htc_callbacks {
++ A_UCHAR *name;
++ A_UINT32 id;
++ A_STATUS (* deviceInsertedHandler)(void *hif_handle);
++ A_STATUS (* deviceRemovedHandler)(void *htc_handle, A_STATUS status);
++ A_STATUS (* deviceSuspendHandler)(void *htc_handle);
++ A_STATUS (* deviceResumeHandler)(void *htc_handle);
++ A_STATUS (* deviceWakeupHandler)(void *htc_handle);
++ A_STATUS (* rwCompletionHandler)(void *context, A_STATUS status);
++ A_STATUS (* dsrHandler)(void *htc_handle);
++};
++
++
++#define HIF_OTHER_EVENTS (1 << 0) /* other interrupts (non-Recv) are pending, host
++ needs to read the register table to figure out what */
++#define HIF_RECV_MSG_AVAIL (1 << 1) /* pending recv packet */
++
++typedef struct _HIF_PENDING_EVENTS_INFO {
++ A_UINT32 Events;
++ A_UINT32 LookAhead;
++} HIF_PENDING_EVENTS_INFO;
++
++ /* function to get pending events , some HIF modules use special mechanisms
++ * to detect packet available and other interrupts */
++typedef A_STATUS ( *HIF_PENDING_EVENTS_FUNC)(HIF_DEVICE *device,
++ HIF_PENDING_EVENTS_INFO *pEvents,
++ void *AsyncContext);
++
++#define HIF_MASK_RECV TRUE
++#define HIF_UNMASK_RECV FALSE
++ /* function to mask recv events */
++typedef A_STATUS ( *HIF_MASK_UNMASK_RECV_EVENT)(HIF_DEVICE *device,
++ A_BOOL Mask,
++ void *AsyncContext);
++
++
++/*
++ * This API is used by the HTC layer to initialize the HIF layer and to
++ * register different callback routines. Support for following events has
++ * been captured - DSR, Read/Write completion, Device insertion/removal,
++ * Device suspension/resumption/wakeup. In addition to this, the API is
++ * also used to register the name and the revision of the chip. The latter
++ * can be used to verify the revision of the chip read from the device
++ * before reporting it to HTC.
++ */
++int HIFInit(HTC_CALLBACKS *callbacks);
++
++/*
++ * This API is used to provide the read/write interface over the specific bus
++ * interface.
++ * address - Starting address in the dragon's address space. For mailbox
++ * writes, it refers to the start of the mbox boundary. It should
++ * be ensured that the last byte falls on the mailbox's EOM. For
++ * mailbox reads, it refers to the end of the mbox boundary.
++ * buffer - Pointer to the buffer containg the data to be transmitted or
++ * received.
++ * length - Amount of data to be transmitted or received.
++ * request - Characterizes the attributes of the command.
++ */
++A_STATUS
++HIFReadWrite(HIF_DEVICE *device,
++ A_UINT32 address,
++ A_UCHAR *buffer,
++ A_UINT32 length,
++ A_UINT32 request,
++ void *context);
++
++/*
++ * This can be initiated from the unload driver context ie when the HTCShutdown
++ * routine is called.
++ */
++void HIFShutDownDevice(HIF_DEVICE *device);
++
++/*
++ * This should translate to an acknowledgment to the bus driver indicating that
++ * the previous interrupt request has been serviced and the all the relevant
++ * sources have been cleared. HTC is ready to process more interrupts.
++ * This should prevent the bus driver from raising an interrupt unless the
++ * previous one has been serviced and acknowledged using the previous API.
++ */
++void HIFAckInterrupt(HIF_DEVICE *device);
++
++void HIFMaskInterrupt(HIF_DEVICE *device);
++
++void HIFUnMaskInterrupt(HIF_DEVICE *device);
++
++/*
++ * This set of functions are to be used by the bus driver to notify
++ * the HIF module about various events.
++ * These are not implemented if the bus driver provides an alternative
++ * way for this notification though callbacks for instance.
++ */
++int HIFInsertEventNotify(void);
++
++int HIFRemoveEventNotify(void);
++
++int HIFIRQEventNotify(void);
++
++int HIFRWCompleteEventNotify(void);
++
++/*
++ * This function associates a opaque handle with the HIF layer
++ * to be used in communication with upper layer i.e. HTC.
++ * This would normaly be a pointer to htc_target data structure.
++ */
++void HIFSetHandle(void *hif_handle, void *handle);
++
++A_STATUS
++HIFConfigureDevice(HIF_DEVICE *device, HIF_DEVICE_CONFIG_OPCODE opcode,
++ void *config, A_UINT32 configLen);
++
++
++struct device;
++struct device*
++HIFGetOSDevice(HIF_DEVICE *device);
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _HIF_H_ */
+diff --git a/drivers/ar6000/include/host_version.h b/drivers/ar6000/include/host_version.h
+new file mode 100644
+index 0000000..c090115
+--- /dev/null
++++ b/drivers/ar6000/include/host_version.h
+@@ -0,0 +1,49 @@
++#ifndef _HOST_VERSION_H_
++#define _HOST_VERSION_H_
++/*
++ * Copyright (c) 2004-2005 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * This file contains version information for the sample host driver for the
++ * AR6000 chip
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/include/host_version.h#2 $
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#include <AR6K_version.h>
++
++/*
++ * The version number is made up of major, minor, patch and build
++ * numbers. These are 16 bit numbers. The build and release script will
++ * set the build number using a Perforce counter. Here the build number is
++ * set to 9999 so that builds done without the build-release script are easily
++ * identifiable.
++ */
++
++#define ATH_SW_VER_MAJOR __VER_MAJOR_
++#define ATH_SW_VER_MINOR __VER_MINOR_
++#define ATH_SW_VER_PATCH __VER_PATCH_
++#define ATH_SW_VER_BUILD 9999
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _HOST_VERSION_H_ */
+diff --git a/drivers/ar6000/include/htc.h b/drivers/ar6000/include/htc.h
+new file mode 100644
+index 0000000..152d867
+--- /dev/null
++++ b/drivers/ar6000/include/htc.h
+@@ -0,0 +1,190 @@
++/*
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++
++
++#ifndef __HTC_H__
++#define __HTC_H__
++
++#ifndef ATH_TARGET
++#include "athstartpack.h"
++#endif
++
++#define A_OFFSETOF(type,field) (int)(&(((type *)NULL)->field))
++
++#define ASSEMBLE_UNALIGNED_UINT16(p,highbyte,lowbyte) \
++ (((A_UINT16)(((A_UINT8 *)(p))[(highbyte)])) << 8 | (A_UINT16)(((A_UINT8 *)(p))[(lowbyte)]))
++
++/* alignment independent macros (little-endian) to fetch UINT16s or UINT8s from a
++ * structure using only the type and field name.
++ * Use these macros if there is the potential for unaligned buffer accesses. */
++#define A_GET_UINT16_FIELD(p,type,field) \
++ ASSEMBLE_UNALIGNED_UINT16(p,\
++ A_OFFSETOF(type,field) + 1, \
++ A_OFFSETOF(type,field))
++
++#define A_SET_UINT16_FIELD(p,type,field,value) \
++{ \
++ ((A_UINT8 *)(p))[A_OFFSETOF(type,field)] = (A_UINT8)(value); \
++ ((A_UINT8 *)(p))[A_OFFSETOF(type,field) + 1] = (A_UINT8)((value) >> 8); \
++}
++
++#define A_GET_UINT8_FIELD(p,type,field) \
++ ((A_UINT8 *)(p))[A_OFFSETOF(type,field)]
++
++#define A_SET_UINT8_FIELD(p,type,field,value) \
++ ((A_UINT8 *)(p))[A_OFFSETOF(type,field)] = (value)
++
++/****** DANGER DANGER ***************
++ *
++ * The frame header length and message formats defined herein were
++ * selected to accommodate optimal alignment for target processing. This reduces code
++ * size and improves performance.
++ *
++ * Any changes to the header length may alter the alignment and cause exceptions
++ * on the target. When adding to the message structures insure that fields are
++ * properly aligned.
++ *
++ */
++
++/* HTC frame header */
++typedef PREPACK struct _HTC_FRAME_HDR{
++ /* do not remove or re-arrange these fields, these are minimally required
++ * to take advantage of 4-byte lookaheads in some hardware implementations */
++ A_UINT8 EndpointID;
++ A_UINT8 Flags;
++ A_UINT16 PayloadLen; /* length of data (including trailer) that follows the header */
++
++ /***** end of 4-byte lookahead ****/
++
++ A_UINT8 ControlBytes[2];
++
++ /* message payload starts after the header */
++
++} POSTPACK HTC_FRAME_HDR;
++
++/* frame header flags */
++#define HTC_FLAGS_NEED_CREDIT_UPDATE (1 << 0)
++#define HTC_FLAGS_RECV_TRAILER (1 << 1)
++
++
++#define HTC_HDR_LENGTH (sizeof(HTC_FRAME_HDR))
++#define HTC_MAX_TRAILER_LENGTH 255
++#define HTC_MAX_PAYLOAD_LENGTH (2048 - sizeof(HTC_FRAME_HDR))
++
++/* HTC control message IDs */
++typedef enum {
++ HTC_MSG_READY_ID = 1,
++ HTC_MSG_CONNECT_SERVICE_ID = 2,
++ HTC_MSG_CONNECT_SERVICE_RESPONSE_ID = 3,
++ HTC_MSG_SETUP_COMPLETE_ID = 4,
++} HTC_MSG_IDS;
++
++#define HTC_MAX_CONTROL_MESSAGE_LENGTH 256
++
++/* base message ID header */
++typedef PREPACK struct {
++ A_UINT16 MessageID;
++} POSTPACK HTC_UNKNOWN_MSG;
++
++/* HTC ready message
++ * direction : target-to-host */
++typedef PREPACK struct {
++ A_UINT16 MessageID; /* ID */
++ A_UINT16 CreditCount; /* number of credits the target can offer */
++ A_UINT16 CreditSize; /* size of each credit */
++ A_UINT8 MaxEndpoints; /* maximum number of endpoints the target has resources for */
++ A_UINT8 _Pad1;
++} POSTPACK HTC_READY_MSG;
++
++#define HTC_SERVICE_META_DATA_MAX_LENGTH 128
++
++/* connect service
++ * direction : host-to-target */
++typedef PREPACK struct {
++ A_UINT16 MessageID;
++ A_UINT16 ServiceID; /* service ID of the service to connect to */
++ A_UINT16 ConnectionFlags; /* connection flags */
++
++#define HTC_CONNECT_FLAGS_REDUCE_CREDIT_DRIBBLE (1 << 2) /* reduce credit dribbling when
++ the host needs credits */
++#define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_MASK (0x3)
++#define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_ONE_FOURTH 0x0
++#define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_ONE_HALF 0x1
++#define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_THREE_FOURTHS 0x2
++#define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_UNITY 0x3
++
++ A_UINT8 ServiceMetaLength; /* length of meta data that follows */
++ A_UINT8 _Pad1;
++
++ /* service-specific meta data starts after the header */
++
++} POSTPACK HTC_CONNECT_SERVICE_MSG;
++
++/* connect response
++ * direction : target-to-host */
++typedef PREPACK struct {
++ A_UINT16 MessageID;
++ A_UINT16 ServiceID; /* service ID that the connection request was made */
++ A_UINT8 Status; /* service connection status */
++ A_UINT8 EndpointID; /* assigned endpoint ID */
++ A_UINT16 MaxMsgSize; /* maximum expected message size on this endpoint */
++ A_UINT8 ServiceMetaLength; /* length of meta data that follows */
++ A_UINT8 _Pad1;
++
++ /* service-specific meta data starts after the header */
++
++} POSTPACK HTC_CONNECT_SERVICE_RESPONSE_MSG;
++
++typedef PREPACK struct {
++ A_UINT16 MessageID;
++ /* currently, no other fields */
++} POSTPACK HTC_SETUP_COMPLETE_MSG;
++
++
++/* connect response status codes */
++#define HTC_SERVICE_SUCCESS 0 /* success */
++#define HTC_SERVICE_NOT_FOUND 1 /* service could not be found */
++#define HTC_SERVICE_FAILED 2 /* specific service failed the connect */
++#define HTC_SERVICE_NO_RESOURCES 3 /* no resources (i.e. no more endpoints) */
++#define HTC_SERVICE_NO_MORE_EP 4 /* specific service is not allowing any more
++ endpoints */
++
++/* report record IDs */
++typedef enum {
++ HTC_RECORD_NULL = 0,
++ HTC_RECORD_CREDITS = 1,
++ HTC_RECORD_LOOKAHEAD = 2,
++} HTC_RPT_IDS;
++
++typedef PREPACK struct {
++ A_UINT8 RecordID; /* Record ID */
++ A_UINT8 Length; /* Length of record */
++} POSTPACK HTC_RECORD_HDR;
++
++typedef PREPACK struct {
++ A_UINT8 EndpointID; /* Endpoint that owns these credits */
++ A_UINT8 Credits; /* credits to report since last report */
++} POSTPACK HTC_CREDIT_REPORT;
++
++typedef PREPACK struct {
++ A_UINT8 PreValid; /* pre valid guard */
++ A_UINT8 LookAhead[4]; /* 4 byte lookahead */
++ A_UINT8 PostValid; /* post valid guard */
++
++ /* NOTE: the LookAhead array is guarded by a PreValid and Post Valid guard bytes.
++ * The PreValid bytes must equal the inverse of the PostValid byte */
++
++} POSTPACK HTC_LOOKAHEAD_REPORT;
++
++#ifndef ATH_TARGET
++#include "athendpack.h"
++#endif
++
++
++#endif /* __HTC_H__ */
++
+diff --git a/drivers/ar6000/include/htc_api.h b/drivers/ar6000/include/htc_api.h
+new file mode 100644
+index 0000000..e75692d
+--- /dev/null
++++ b/drivers/ar6000/include/htc_api.h
+@@ -0,0 +1,439 @@
++/*
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef _HTC_API_H_
++#define _HTC_API_H_
++
++#include <htc.h>
++#include <htc_services.h>
++#include "htc_packet.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif /* __cplusplus */
++
++/* TODO.. for BMI */
++#define ENDPOINT1 0
++// TODO -remove me, but we have to fix BMI first
++#define HTC_MAILBOX_NUM_MAX 4
++
++
++/* ------ Endpoint IDS ------ */
++typedef enum
++{
++ ENDPOINT_UNUSED = -1,
++ ENDPOINT_0 = 0,
++ ENDPOINT_1 = 1,
++ ENDPOINT_2 = 2,
++ ENDPOINT_3,
++ ENDPOINT_4,
++ ENDPOINT_5,
++ ENDPOINT_6,
++ ENDPOINT_7,
++ ENDPOINT_8,
++ ENDPOINT_MAX,
++} HTC_ENDPOINT_ID;
++
++/* this is the amount of header room required by users of HTC */
++#define HTC_HEADER_LEN HTC_HDR_LENGTH
++
++typedef void *HTC_HANDLE;
++
++typedef A_UINT16 HTC_SERVICE_ID;
++
++typedef struct _HTC_INIT_INFO {
++ void (*AddInstance)(HTC_HANDLE);
++ void (*DeleteInstance)(void *Instance);
++ void (*TargetFailure)(void *Instance, A_STATUS Status);
++} HTC_INIT_INFO;
++
++/* per service connection send completion */
++typedef void (*HTC_EP_SEND_PKT_COMPLETE)(void *,HTC_PACKET *);
++/* per service connection pkt received */
++typedef void (*HTC_EP_RECV_PKT)(void *,HTC_PACKET *);
++
++/* Optional per service connection receive buffer re-fill callback,
++ * On some OSes (like Linux) packets are allocated from a global pool and indicated up
++ * to the network stack. The driver never gets the packets back from the OS. For these OSes
++ * a refill callback can be used to allocate and re-queue buffers into HTC.
++ *
++ * On other OSes, the network stack can call into the driver's OS-specifc "return_packet" handler and
++ * the driver can re-queue these buffers into HTC. In this regard a refill callback is
++ * unnecessary */
++typedef void (*HTC_EP_RECV_REFILL)(void *, HTC_ENDPOINT_ID Endpoint);
++
++/* Optional per service connection callback when a send queue is full. This can occur if the
++ * host continues queueing up TX packets faster than credits can arrive
++ * To prevent the host (on some Oses like Linux) from continuously queueing packets
++ * and consuming resources, this callback is provided so that that the host
++ * can disable TX in the subsystem (i.e. network stack)
++ * Other OSes require a "per-packet" indication_RAW_STREAM_NUM_MAX for each completed TX packet, this
++ * closed loop mechanism will prevent the network stack from overunning the NIC */
++typedef void (*HTC_EP_SEND_QUEUE_FULL)(void *, HTC_ENDPOINT_ID Endpoint);
++/* Optional per service connection callback when a send queue is available for receive new packet. */
++typedef void (*HTC_EP_SEND_QUEUE_AVAIL)(void *, HTC_ENDPOINT_ID Endpoint);
++
++typedef struct _HTC_EP_CALLBACKS {
++ void *pContext; /* context for each callback */
++ HTC_EP_SEND_PKT_COMPLETE EpTxComplete; /* tx completion callback for connected endpoint */
++ HTC_EP_RECV_PKT EpRecv; /* receive callback for connected endpoint */
++ HTC_EP_RECV_REFILL EpRecvRefill; /* OPTIONAL receive re-fill callback for connected endpoint */
++ HTC_EP_SEND_QUEUE_FULL EpSendFull; /* OPTIONAL send full callback */
++ HTC_EP_SEND_QUEUE_AVAIL EpSendAvail; /* OPTIONAL send available callback */
++} HTC_EP_CALLBACKS;
++
++/* service connection information */
++typedef struct _HTC_SERVICE_CONNECT_REQ {
++ HTC_SERVICE_ID ServiceID; /* service ID to connect to */
++ A_UINT16 ConnectionFlags; /* connection flags, see htc protocol definition */
++ A_UINT8 *pMetaData; /* ptr to optional service-specific meta-data */
++ A_UINT8 MetaDataLength; /* optional meta data length */
++ HTC_EP_CALLBACKS EpCallbacks; /* endpoint callbacks */
++ int MaxSendQueueDepth; /* maximum depth of any send queue */
++} HTC_SERVICE_CONNECT_REQ;
++
++/* service connection response information */
++typedef struct _HTC_SERVICE_CONNECT_RESP {
++ A_UINT8 *pMetaData; /* caller supplied buffer to optional meta-data */
++ A_UINT8 BufferLength; /* length of caller supplied buffer */
++ A_UINT8 ActualLength; /* actual length of meta data */
++ HTC_ENDPOINT_ID Endpoint; /* endpoint to communicate over */
++ int MaxMsgLength; /* max length of all messages over this endpoint */
++ A_UINT8 ConnectRespCode; /* connect response code from target */
++} HTC_SERVICE_CONNECT_RESP;
++
++/* endpoint distribution structure */
++typedef struct _HTC_ENDPOINT_CREDIT_DIST {
++ struct _HTC_ENDPOINT_CREDIT_DIST *pNext;
++ struct _HTC_ENDPOINT_CREDIT_DIST *pPrev;
++ HTC_SERVICE_ID ServiceID; /* Service ID (set by HTC) */
++ HTC_ENDPOINT_ID Endpoint; /* endpoint for this distribution struct (set by HTC) */
++ A_UINT32 DistFlags; /* distribution flags, distribution function can
++ set default activity using SET_EP_ACTIVE() macro */
++ int TxCreditsNorm; /* credits for normal operation, anything above this
++ indicates the endpoint is over-subscribed, this field
++ is only relevant to the credit distribution function */
++ int TxCreditsMin; /* floor for credit distribution, this field is
++ only relevant to the credit distribution function */
++ int TxCreditsAssigned; /* number of credits assigned to this EP, this field
++ is only relevant to the credit dist function */
++ int TxCredits; /* current credits available, this field is used by
++ HTC to determine whether a message can be sent or
++ must be queued */
++ int TxCreditsToDist; /* pending credits to distribute on this endpoint, this
++ is set by HTC when credit reports arrive.
++ The credit distribution functions sets this to zero
++ when it distributes the credits */
++ int TxCreditsSeek; /* this is the number of credits that the current pending TX
++ packet needs to transmit. This is set by HTC when
++ and endpoint needs credits in order to transmit */
++ int TxCreditSize; /* size in bytes of each credit (set by HTC) */
++ int TxCreditsPerMaxMsg; /* credits required for a maximum sized messages (set by HTC) */
++ void *pHTCReserved; /* reserved for HTC use */
++} HTC_ENDPOINT_CREDIT_DIST;
++
++#define HTC_EP_ACTIVE (1 << 31)
++
++/* macro to check if an endpoint has gone active, useful for credit
++ * distributions */
++#define IS_EP_ACTIVE(epDist) ((epDist)->DistFlags & HTC_EP_ACTIVE)
++#define SET_EP_ACTIVE(epDist) (epDist)->DistFlags |= HTC_EP_ACTIVE
++
++ /* credit distibution code that is passed into the distrbution function,
++ * there are mandatory and optional codes that must be handled */
++typedef enum _HTC_CREDIT_DIST_REASON {
++ HTC_CREDIT_DIST_SEND_COMPLETE = 0, /* credits available as a result of completed
++ send operations (MANDATORY) resulting in credit reports */
++ HTC_CREDIT_DIST_ACTIVITY_CHANGE = 1, /* a change in endpoint activity occured (OPTIONAL) */
++ HTC_CREDIT_DIST_SEEK_CREDITS, /* an endpoint needs to "seek" credits (OPTIONAL) */
++ HTC_DUMP_CREDIT_STATE /* for debugging, dump any state information that is kept by
++ the distribution function */
++} HTC_CREDIT_DIST_REASON;
++
++typedef void (*HTC_CREDIT_DIST_CALLBACK)(void *Context,
++ HTC_ENDPOINT_CREDIT_DIST *pEPList,
++ HTC_CREDIT_DIST_REASON Reason);
++
++typedef void (*HTC_CREDIT_INIT_CALLBACK)(void *Context,
++ HTC_ENDPOINT_CREDIT_DIST *pEPList,
++ int TotalCredits);
++
++ /* endpoint statistics action */
++typedef enum _HTC_ENDPOINT_STAT_ACTION {
++ HTC_EP_STAT_SAMPLE = 0, /* only read statistics */
++ HTC_EP_STAT_SAMPLE_AND_CLEAR = 1, /* sample and immediately clear statistics */
++ HTC_EP_STAT_CLEAR /* clear only */
++} HTC_ENDPOINT_STAT_ACTION;
++
++ /* endpoint statistics */
++typedef struct _HTC_ENDPOINT_STATS {
++ A_UINT32 TxCreditLowIndications; /* number of times the host set the credit-low flag in a send message on
++ this endpoint */
++ A_UINT32 TxIssued; /* running count of TX packets issued */
++ A_UINT32 TxCreditRpts; /* running count of total credit reports received for this endpoint */
++ A_UINT32 TxCreditRptsFromRx;
++ A_UINT32 TxCreditRptsFromOther;
++ A_UINT32 TxCreditRptsFromEp0;
++ A_UINT32 TxCreditsFromRx; /* count of credits received via Rx packets on this endpoint */
++ A_UINT32 TxCreditsFromOther; /* count of credits received via another endpoint */
++ A_UINT32 TxCreditsFromEp0; /* count of credits received via another endpoint */
++ A_UINT32 TxCreditsConsummed; /* count of consummed credits */
++ A_UINT32 TxCreditsReturned; /* count of credits returned */
++ A_UINT32 RxReceived; /* count of RX packets received */
++ A_UINT32 RxLookAheads; /* count of lookahead records
++ found in messages received on this endpoint */
++} HTC_ENDPOINT_STATS;
++
++/* ------ Function Prototypes ------ */
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Initialize HTC
++ @function name: HTCInit
++ @input: pInfo - initialization information
++ @output:
++ @return: A_OK on success
++ @notes: The caller initializes global HTC state and registers various instance
++ notification callbacks (see HTC_INIT_INFO).
++
++ @example:
++ @see also: HTCShutdown
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++A_STATUS HTCInit(HTC_INIT_INFO *pInfo);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Get the underlying HIF device handle
++ @function name: HTCGetHifDevice
++ @input: HTCHandle - handle passed into the AddInstance callback
++ @output:
++ @return: opaque HIF device handle usable in HIF API calls.
++ @notes:
++ @example:
++ @see also:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++void *HTCGetHifDevice(HTC_HANDLE HTCHandle);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Set the associated instance for the HTC handle
++ @function name: HTCSetInstance
++ @input: HTCHandle - handle passed into the AddInstance callback
++ Instance - caller supplied instance object
++ @output:
++ @return:
++ @notes: Caller must set the instance information for the HTC handle in order to receive
++ notifications for instance deletion (DeleteInstance callback is called) and for target
++ failure notification.
++ @example:
++ @see also:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++void HTCSetInstance(HTC_HANDLE HTCHandle, void *Instance);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Set credit distribution parameters
++ @function name: HTCSetCreditDistribution
++ @input: HTCHandle - HTC handle
++ pCreditDistCont - caller supplied context to pass into distribution functions
++ CreditDistFunc - Distribution function callback
++ CreditDistInit - Credit Distribution initialization callback
++ ServicePriorityOrder - Array containing list of service IDs, lowest index is highest
++ priority
++ ListLength - number of elements in ServicePriorityOrder
++ @output:
++ @return:
++ @notes: The user can set a custom credit distribution function to handle special requirements
++ for each endpoint. A default credit distribution routine can be used by setting
++ CreditInitFunc to NULL. The default credit distribution is only provided for simple
++ "fair" credit distribution without regard to any prioritization.
++
++ @example:
++ @see also:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++void HTCSetCreditDistribution(HTC_HANDLE HTCHandle,
++ void *pCreditDistContext,
++ HTC_CREDIT_DIST_CALLBACK CreditDistFunc,
++ HTC_CREDIT_INIT_CALLBACK CreditInitFunc,
++ HTC_SERVICE_ID ServicePriorityOrder[],
++ int ListLength);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Wait for the target to indicate the HTC layer is ready
++ @function name: HTCWaitTarget
++ @input: HTCHandle - HTC handle
++ @output:
++ @return:
++ @notes: This API blocks until the target responds with an HTC ready message.
++ The caller should not connect services until the target has indicated it is
++ ready.
++ @example:
++ @see also: HTCConnectService
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++A_STATUS HTCWaitTarget(HTC_HANDLE HTCHandle);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Start target service communications
++ @function name: HTCStart
++ @input: HTCHandle - HTC handle
++ @output:
++ @return:
++ @notes: This API indicates to the target that the service connection phase is complete
++ and the target can freely start all connected services. This API should only be
++ called AFTER all service connections have been made. TCStart will issue a
++ SETUP_COMPLETE message to the target to indicate that all service connections
++ have been made and the target can start communicating over the endpoints.
++ @example:
++ @see also: HTCConnectService
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++A_STATUS HTCStart(HTC_HANDLE HTCHandle);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Add receive packet to HTC
++ @function name: HTCAddReceivePkt
++ @input: HTCHandle - HTC handle
++ pPacket - HTC receive packet to add
++ @output:
++ @return: A_OK on success
++ @notes: user must supply HTC packets for capturing incomming HTC frames. The caller
++ must initialize each HTC packet using the SET_HTC_PACKET_INFO_RX_REFILL()
++ macro.
++ @example:
++ @see also:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++A_STATUS HTCAddReceivePkt(HTC_HANDLE HTCHandle, HTC_PACKET *pPacket);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Connect to an HTC service
++ @function name: HTCConnectService
++ @input: HTCHandle - HTC handle
++ pReq - connection details
++ @output: pResp - connection response
++ @return:
++ @notes: Service connections must be performed before HTCStart. User provides callback handlers
++ for various endpoint events.
++ @example:
++ @see also: HTCStart
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++A_STATUS HTCConnectService(HTC_HANDLE HTCHandle,
++ HTC_SERVICE_CONNECT_REQ *pReq,
++ HTC_SERVICE_CONNECT_RESP *pResp);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Send an HTC packet
++ @function name: HTCSendPkt
++ @input: HTCHandle - HTC handle
++ pPacket - packet to send
++ @output:
++ @return: A_OK
++ @notes: Caller must initialize packet using SET_HTC_PACKET_INFO_TX() macro.
++ This interface is fully asynchronous. On error, HTC SendPkt will
++ call the registered Endpoint callback to cleanup the packet.
++ @example:
++ @see also: HTCFlushEndpoint
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++A_STATUS HTCSendPkt(HTC_HANDLE HTCHandle, HTC_PACKET *pPacket);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Stop HTC service communications
++ @function name: HTCStop
++ @input: HTCHandle - HTC handle
++ @output:
++ @return:
++ @notes: HTC communications is halted. All receive and pending TX packets will
++ be flushed.
++ @example:
++ @see also:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++void HTCStop(HTC_HANDLE HTCHandle);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Shutdown HTC
++ @function name: HTCShutdown
++ @input:
++ @output:
++ @return:
++ @notes: This cleans up all resources allocated by HTCInit().
++ @example:
++ @see also: HTCInit
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++void HTCShutDown(void);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Flush pending TX packets
++ @function name: HTCFlushEndpoint
++ @input: HTCHandle - HTC handle
++ Endpoint - Endpoint to flush
++ Tag - flush tag
++ @output:
++ @return:
++ @notes: The Tag parameter is used to selectively flush packets with matching tags.
++ The value of 0 forces all packets to be flush regardless of tag.
++ @example:
++ @see also: HTCSendPkt
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++void HTCFlushEndpoint(HTC_HANDLE HTCHandle, HTC_ENDPOINT_ID Endpoint, HTC_TX_TAG Tag);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Dump credit distribution state
++ @function name: HTCDumpCreditStates
++ @input: HTCHandle - HTC handle
++ @output:
++ @return:
++ @notes: This dumps all credit distribution information to the debugger
++ @example:
++ @see also:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++void HTCDumpCreditStates(HTC_HANDLE HTCHandle);
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Indicate a traffic activity change on an endpoint
++ @function name: HTCIndicateActivityChange
++ @input: HTCHandle - HTC handle
++ Endpoint - endpoint in which activity has changed
++ Active - TRUE if active, FALSE if it has become inactive
++ @output:
++ @return:
++ @notes: This triggers the registered credit distribution function to
++ re-adjust credits for active/inactive endpoints.
++ @example:
++ @see also:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++void HTCIndicateActivityChange(HTC_HANDLE HTCHandle,
++ HTC_ENDPOINT_ID Endpoint,
++ A_BOOL Active);
++
++/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++ @desc: Get endpoint statistics
++ @function name: HTCGetEndpointStatistics
++ @input: HTCHandle - HTC handle
++ Endpoint - Endpoint identifier
++ Action - action to take with statistics
++ @output:
++ pStats - statistics that were sampled (can be NULL if Action is HTC_EP_STAT_CLEAR)
++
++ @return: TRUE if statistics profiling is enabled, otherwise FALSE.
++
++ @notes: Statistics is a compile-time option and this function may return FALSE
++ if HTC is not compiled with profiling.
++
++ The caller can specify the statistic "action" to take when sampling
++ the statistics. This includes:
++
++ HTC_EP_STAT_SAMPLE: The pStats structure is filled with the current values.
++ HTC_EP_STAT_SAMPLE_AND_CLEAR: The structure is filled and the current statistics
++ are cleared.
++ HTC_EP_STAT_CLEA : the statistics are cleared, the called can pass a NULL value for
++ pStats
++
++ @example:
++ @see also:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
++A_BOOL HTCGetEndpointStatistics(HTC_HANDLE HTCHandle,
++ HTC_ENDPOINT_ID Endpoint,
++ HTC_ENDPOINT_STAT_ACTION Action,
++ HTC_ENDPOINT_STATS *pStats);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _HTC_API_H_ */
+diff --git a/drivers/ar6000/include/htc_packet.h b/drivers/ar6000/include/htc_packet.h
+new file mode 100644
+index 0000000..9ce8718
+--- /dev/null
++++ b/drivers/ar6000/include/htc_packet.h
+@@ -0,0 +1,138 @@
++/*
++ *
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifndef HTC_PACKET_H_
++#define HTC_PACKET_H_
++
++
++#include "dl_list.h"
++
++struct _HTC_PACKET;
++
++typedef void (* HTC_PACKET_COMPLETION)(void *,struct _HTC_PACKET *);
++
++typedef A_UINT16 HTC_TX_TAG;
++
++typedef struct _HTC_TX_PACKET_INFO {
++ HTC_TX_TAG Tag; /* tag used to selective flush packets */
++} HTC_TX_PACKET_INFO;
++
++#define HTC_TX_PACKET_TAG_ALL 0 /* a tag of zero is reserved and used to flush ALL packets */
++#define HTC_TX_PACKET_TAG_INTERNAL 1 /* internal tags start here */
++#define HTC_TX_PACKET_TAG_USER_DEFINED (HTC_TX_PACKET_TAG_INTERNAL + 9) /* user-defined tags start here */
++
++typedef struct _HTC_RX_PACKET_INFO {
++ A_UINT32 Unused; /* for future use and to make compilers happy */
++} HTC_RX_PACKET_INFO;
++
++/* wrapper around endpoint-specific packets */
++typedef struct _HTC_PACKET {
++ DL_LIST ListLink; /* double link */
++ void *pPktContext; /* caller's per packet specific context */
++
++ A_UINT8 *pBufferStart; /* the true buffer start , the caller can
++ store the real buffer start here. In
++ receive callbacks, the HTC layer sets pBuffer
++ to the start of the payload past the header. This
++ field allows the caller to reset pBuffer when it
++ recycles receive packets back to HTC */
++ /*
++ * Pointer to the start of the buffer. In the transmit
++ * direction this points to the start of the payload. In the
++ * receive direction, however, the buffer when queued up
++ * points to the start of the HTC header but when returned
++ * to the caller points to the start of the payload
++ */
++ A_UINT8 *pBuffer; /* payload start (RX/TX) */
++ A_UINT32 BufferLength; /* length of buffer */
++ A_UINT32 ActualLength; /* actual length of payload */
++ int Endpoint; /* endpoint that this packet was sent/recv'd from */
++ A_STATUS Status; /* completion status */
++ union {
++ HTC_TX_PACKET_INFO AsTx; /* Tx Packet specific info */
++ HTC_RX_PACKET_INFO AsRx; /* Rx Packet specific info */
++ } PktInfo;
++
++ /* the following fields are for internal HTC use */
++ HTC_PACKET_COMPLETION Completion; /* completion */
++ void *pContext; /* HTC private completion context */
++ A_UINT32 HTCReserved; /* reserved */
++} HTC_PACKET;
++
++
++
++#define COMPLETE_HTC_PACKET(p,status) \
++{ \
++ (p)->Status = (status); \
++ (p)->Completion((p)->pContext,(p)); \
++}
++
++#define INIT_HTC_PACKET_INFO(p,b,len) \
++{ \
++ (p)->pBufferStart = (b); \
++ (p)->BufferLength = (len); \
++}
++
++/* macro to set an initial RX packet for refilling HTC */
++#define SET_HTC_PACKET_INFO_RX_REFILL(p,c,b,len,ep) \
++{ \
++ (p)->pPktContext = (c); \
++ (p)->pBuffer = (b); \
++ (p)->pBufferStart = (b); \
++ (p)->BufferLength = (len); \
++ (p)->Endpoint = (ep); \
++}
++
++/* fast macro to recycle an RX packet that will be re-queued to HTC */
++#define HTC_PACKET_RESET_RX(p) \
++ (p)->pBuffer = (p)->pBufferStart
++
++/* macro to set packet parameters for TX */
++#define SET_HTC_PACKET_INFO_TX(p,c,b,len,ep,tag) \
++{ \
++ (p)->pPktContext = (c); \
++ (p)->pBuffer = (b); \
++ (p)->ActualLength = (len); \
++ (p)->Endpoint = (ep); \
++ (p)->PktInfo.AsTx.Tag = (tag); \
++}
++
++/* HTC Packet Queueing Macros */
++typedef DL_LIST HTC_PACKET_QUEUE;
++/* initialize queue */
++#define INIT_HTC_PACKET_QUEUE(pQ) DL_LIST_INIT((pQ))
++/* enqueue HTC packet to the tail of the queue */
++#define HTC_PACKET_ENQUEUE(pQ,p) DL_ListInsertTail((pQ),&(p)->ListLink)
++/* test if a queue is empty */
++#define HTC_QUEUE_EMPTY(pQ) DL_LIST_IS_EMPTY((pQ))
++/* get packet at head without removing it */
++#define HTC_GET_PKT_AT_HEAD(pQ) A_CONTAINING_STRUCT((DL_LIST_GET_ITEM_AT_HEAD(pQ)),HTC_PACKET,ListLink);
++/* remove a packet from the current list it is linked to */
++#define HTC_PACKET_REMOVE(p) DL_ListRemove(&(p)->ListLink)
++
++/* dequeue an HTC packet from the head of the queue */
++static INLINE HTC_PACKET *HTC_PACKET_DEQUEUE(HTC_PACKET_QUEUE *queue) {
++ DL_LIST *pItem = DL_ListRemoveItemFromHead(queue);
++ if (pItem != NULL) {
++ return A_CONTAINING_STRUCT(pItem, HTC_PACKET, ListLink);
++ }
++ return NULL;
++}
++
++#endif /*HTC_PACKET_H_*/
+diff --git a/drivers/ar6000/include/htc_services.h b/drivers/ar6000/include/htc_services.h
+new file mode 100644
+index 0000000..fc6fc29
+--- /dev/null
++++ b/drivers/ar6000/include/htc_services.h
+@@ -0,0 +1,37 @@
++/*
++ * Copyright (c) 2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++
++#ifndef __HTC_SERVICES_H__
++#define __HTC_SERVICES_H__
++
++/* Current service IDs */
++
++typedef enum {
++ RSVD_SERVICE_GROUP = 0,
++ WMI_SERVICE_GROUP = 1,
++
++ HTC_TEST_GROUP = 254,
++ HTC_SERVICE_GROUP_LAST = 255
++}HTC_SERVICE_GROUP_IDS;
++
++#define MAKE_SERVICE_ID(group,index) \
++ (int)(((int)group << 8) | (int)(index))
++
++/* NOTE: service ID of 0x0000 is reserved and should never be used */
++#define HTC_CTRL_RSVD_SVC MAKE_SERVICE_ID(RSVD_SERVICE_GROUP,1)
++#define WMI_CONTROL_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP,0)
++#define WMI_DATA_BE_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP,1)
++#define WMI_DATA_BK_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP,2)
++#define WMI_DATA_VI_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP,3)
++#define WMI_DATA_VO_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP,4)
++#define WMI_MAX_SERVICES 5
++
++/* raw stream service (i.e. flash, tcmd, calibration apps) */
++#define HTC_RAW_STREAMS_SVC MAKE_SERVICE_ID(HTC_TEST_GROUP,0)
++
++#endif /*HTC_SERVICES_H_*/
+diff --git a/drivers/ar6000/include/ieee80211.h b/drivers/ar6000/include/ieee80211.h
+new file mode 100644
+index 0000000..7090040
+--- /dev/null
++++ b/drivers/ar6000/include/ieee80211.h
+@@ -0,0 +1,342 @@
++/*-
++ * Copyright (c) 2001 Atsushi Onoe
++ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting
++ * Copyright (c) 2006 Atheros Communications, Inc.
++ *
++ * Wireless Network driver for Atheros AR6001
++ * All rights reserved.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ *
++ */
++#ifndef _NET80211_IEEE80211_H_
++#define _NET80211_IEEE80211_H_
++
++#include "athstartpack.h"
++
++/*
++ * 802.11 protocol definitions.
++ */
++
++#define IEEE80211_ADDR_LEN 6 /* size of 802.11 address */
++/* is 802.11 address multicast/broadcast? */
++#define IEEE80211_IS_MULTICAST(_a) (*(_a) & 0x01)
++#define IEEE80211_ADDR_EQ(addr1, addr2) \
++ (A_MEMCMP(addr1, addr2, IEEE80211_ADDR_LEN) == 0)
++
++#define IEEE80211_KEYBUF_SIZE 16
++#define IEEE80211_MICBUF_SIZE (8+8) /* space for both tx and rx */
++
++/*
++ * NB: these values are ordered carefully; there are lots of
++ * of implications in any reordering. In particular beware
++ * that 4 is not used to avoid conflicting with IEEE80211_F_PRIVACY.
++ */
++#define IEEE80211_CIPHER_WEP 0
++#define IEEE80211_CIPHER_TKIP 1
++#define IEEE80211_CIPHER_AES_OCB 2
++#define IEEE80211_CIPHER_AES_CCM 3
++#define IEEE80211_CIPHER_CKIP 5
++#define IEEE80211_CIPHER_CCKM_KRK 6
++#define IEEE80211_CIPHER_NONE 7 /* pseudo value */
++
++#define IEEE80211_CIPHER_MAX (IEEE80211_CIPHER_NONE+1)
++
++#define IEEE80211_IS_VALID_WEP_CIPHER_LEN(len) \
++ (((len) == 5) || ((len) == 13) || ((len) == 16))
++
++
++
++/*
++ * generic definitions for IEEE 802.11 frames
++ */
++PREPACK struct ieee80211_frame {
++ A_UINT8 i_fc[2];
++ A_UINT8 i_dur[2];
++ A_UINT8 i_addr1[IEEE80211_ADDR_LEN];
++ A_UINT8 i_addr2[IEEE80211_ADDR_LEN];
++ A_UINT8 i_addr3[IEEE80211_ADDR_LEN];
++ A_UINT8 i_seq[2];
++ /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
++ /* see below */
++} POSTPACK;
++
++#define IEEE80211_FC0_VERSION_MASK 0x03
++#define IEEE80211_FC0_VERSION_SHIFT 0
++#define IEEE80211_FC0_VERSION_0 0x00
++#define IEEE80211_FC0_TYPE_MASK 0x0c
++#define IEEE80211_FC0_TYPE_SHIFT 2
++#define IEEE80211_FC0_TYPE_MGT 0x00
++#define IEEE80211_FC0_TYPE_CTL 0x04
++#define IEEE80211_FC0_TYPE_DATA 0x08
++
++#define IEEE80211_FC0_SUBTYPE_MASK 0xf0
++#define IEEE80211_FC0_SUBTYPE_SHIFT 4
++/* for TYPE_MGT */
++#define IEEE80211_FC0_SUBTYPE_ASSOC_REQ 0x00
++#define IEEE80211_FC0_SUBTYPE_ASSOC_RESP 0x10
++#define IEEE80211_FC0_SUBTYPE_REASSOC_REQ 0x20
++#define IEEE80211_FC0_SUBTYPE_REASSOC_RESP 0x30
++#define IEEE80211_FC0_SUBTYPE_PROBE_REQ 0x40
++#define IEEE80211_FC0_SUBTYPE_PROBE_RESP 0x50
++#define IEEE80211_FC0_SUBTYPE_BEACON 0x80
++#define IEEE80211_FC0_SUBTYPE_ATIM 0x90
++#define IEEE80211_FC0_SUBTYPE_DISASSOC 0xa0
++#define IEEE80211_FC0_SUBTYPE_AUTH 0xb0
++#define IEEE80211_FC0_SUBTYPE_DEAUTH 0xc0
++/* for TYPE_CTL */
++#define IEEE80211_FC0_SUBTYPE_PS_POLL 0xa0
++#define IEEE80211_FC0_SUBTYPE_RTS 0xb0
++#define IEEE80211_FC0_SUBTYPE_CTS 0xc0
++#define IEEE80211_FC0_SUBTYPE_ACK 0xd0
++#define IEEE80211_FC0_SUBTYPE_CF_END 0xe0
++#define IEEE80211_FC0_SUBTYPE_CF_END_ACK 0xf0
++/* for TYPE_DATA (bit combination) */
++#define IEEE80211_FC0_SUBTYPE_DATA 0x00
++#define IEEE80211_FC0_SUBTYPE_CF_ACK 0x10
++#define IEEE80211_FC0_SUBTYPE_CF_POLL 0x20
++#define IEEE80211_FC0_SUBTYPE_CF_ACPL 0x30
++#define IEEE80211_FC0_SUBTYPE_NODATA 0x40
++#define IEEE80211_FC0_SUBTYPE_CFACK 0x50
++#define IEEE80211_FC0_SUBTYPE_CFPOLL 0x60
++#define IEEE80211_FC0_SUBTYPE_CF_ACK_CF_ACK 0x70
++#define IEEE80211_FC0_SUBTYPE_QOS 0x80
++#define IEEE80211_FC0_SUBTYPE_QOS_NULL 0xc0
++
++#define IEEE80211_FC1_DIR_MASK 0x03
++#define IEEE80211_FC1_DIR_NODS 0x00 /* STA->STA */
++#define IEEE80211_FC1_DIR_TODS 0x01 /* STA->AP */
++#define IEEE80211_FC1_DIR_FROMDS 0x02 /* AP ->STA */
++#define IEEE80211_FC1_DIR_DSTODS 0x03 /* AP ->AP */
++
++#define IEEE80211_FC1_MORE_FRAG 0x04
++#define IEEE80211_FC1_RETRY 0x08
++#define IEEE80211_FC1_PWR_MGT 0x10
++#define IEEE80211_FC1_MORE_DATA 0x20
++#define IEEE80211_FC1_WEP 0x40
++#define IEEE80211_FC1_ORDER 0x80
++
++#define IEEE80211_SEQ_FRAG_MASK 0x000f
++#define IEEE80211_SEQ_FRAG_SHIFT 0
++#define IEEE80211_SEQ_SEQ_MASK 0xfff0
++#define IEEE80211_SEQ_SEQ_SHIFT 4
++
++#define IEEE80211_NWID_LEN 32
++
++/*
++ * 802.11 rate set.
++ */
++#define IEEE80211_RATE_SIZE 8 /* 802.11 standard */
++#define IEEE80211_RATE_MAXSIZE 15 /* max rates we'll handle */
++
++#define WMM_NUM_AC 4 /* 4 AC categories */
++
++#define WMM_PARAM_ACI_M 0x60 /* Mask for ACI field */
++#define WMM_PARAM_ACI_S 5 /* Shift for ACI field */
++#define WMM_PARAM_ACM_M 0x10 /* Mask for ACM bit */
++#define WMM_PARAM_ACM_S 4 /* Shift for ACM bit */
++#define WMM_PARAM_AIFSN_M 0x0f /* Mask for aifsn field */
++#define WMM_PARAM_LOGCWMIN_M 0x0f /* Mask for CwMin field (in log) */
++#define WMM_PARAM_LOGCWMAX_M 0xf0 /* Mask for CwMax field (in log) */
++#define WMM_PARAM_LOGCWMAX_S 4 /* Shift for CwMax field */
++
++#define WMM_AC_TO_TID(_ac) ( \
++ ((_ac) == WMM_AC_VO) ? 6 : \
++ ((_ac) == WMM_AC_VI) ? 5 : \
++ ((_ac) == WMM_AC_BK) ? 1 : \
++ 0)
++
++#define TID_TO_WMM_AC(_tid) ( \
++ ((_tid) < 1) ? WMM_AC_BE : \
++ ((_tid) < 3) ? WMM_AC_BK : \
++ ((_tid) < 6) ? WMM_AC_VI : \
++ WMM_AC_VO)
++/*
++ * Management information element payloads.
++ */
++
++enum {
++ IEEE80211_ELEMID_SSID = 0,
++ IEEE80211_ELEMID_RATES = 1,
++ IEEE80211_ELEMID_FHPARMS = 2,
++ IEEE80211_ELEMID_DSPARMS = 3,
++ IEEE80211_ELEMID_CFPARMS = 4,
++ IEEE80211_ELEMID_TIM = 5,
++ IEEE80211_ELEMID_IBSSPARMS = 6,
++ IEEE80211_ELEMID_COUNTRY = 7,
++ IEEE80211_ELEMID_CHALLENGE = 16,
++ /* 17-31 reserved for challenge text extension */
++ IEEE80211_ELEMID_PWRCNSTR = 32,
++ IEEE80211_ELEMID_PWRCAP = 33,
++ IEEE80211_ELEMID_TPCREQ = 34,
++ IEEE80211_ELEMID_TPCREP = 35,
++ IEEE80211_ELEMID_SUPPCHAN = 36,
++ IEEE80211_ELEMID_CHANSWITCH = 37,
++ IEEE80211_ELEMID_MEASREQ = 38,
++ IEEE80211_ELEMID_MEASREP = 39,
++ IEEE80211_ELEMID_QUIET = 40,
++ IEEE80211_ELEMID_IBSSDFS = 41,
++ IEEE80211_ELEMID_ERP = 42,
++ IEEE80211_ELEMID_RSN = 48,
++ IEEE80211_ELEMID_XRATES = 50,
++ IEEE80211_ELEMID_TPC = 150,
++ IEEE80211_ELEMID_CCKM = 156,
++ IEEE80211_ELEMID_VENDOR = 221, /* vendor private */
++};
++
++#define ATH_OUI 0x7f0300 /* Atheros OUI */
++#define ATH_OUI_TYPE 0x01
++#define ATH_OUI_SUBTYPE 0x01
++#define ATH_OUI_VERSION 0x00
++
++#define WPA_OUI 0xf25000
++#define WPA_OUI_TYPE 0x01
++#define WPA_VERSION 1 /* current supported version */
++
++#define WPA_CSE_NULL 0x00
++#define WPA_CSE_WEP40 0x01
++#define WPA_CSE_TKIP 0x02
++#define WPA_CSE_CCMP 0x04
++#define WPA_CSE_WEP104 0x05
++
++#define WPA_ASE_NONE 0x00
++#define WPA_ASE_8021X_UNSPEC 0x01
++#define WPA_ASE_8021X_PSK 0x02
++
++#define RSN_OUI 0xac0f00
++#define RSN_VERSION 1 /* current supported version */
++
++#define RSN_CSE_NULL 0x00
++#define RSN_CSE_WEP40 0x01
++#define RSN_CSE_TKIP 0x02
++#define RSN_CSE_WRAP 0x03
++#define RSN_CSE_CCMP 0x04
++#define RSN_CSE_WEP104 0x05
++
++#define RSN_ASE_NONE 0x00
++#define RSN_ASE_8021X_UNSPEC 0x01
++#define RSN_ASE_8021X_PSK 0x02
++
++#define RSN_CAP_PREAUTH 0x01
++
++#define WMM_OUI 0xf25000
++#define WMM_OUI_TYPE 0x02
++#define WMM_INFO_OUI_SUBTYPE 0x00
++#define WMM_PARAM_OUI_SUBTYPE 0x01
++#define WMM_VERSION 1
++
++/* WMM stream classes */
++#define WMM_NUM_AC 4
++#define WMM_AC_BE 0 /* best effort */
++#define WMM_AC_BK 1 /* background */
++#define WMM_AC_VI 2 /* video */
++#define WMM_AC_VO 3 /* voice */
++
++/* TSPEC related */
++#define ACTION_CATEGORY_CODE_TSPEC 17
++#define ACTION_CODE_TSPEC_ADDTS 0
++#define ACTION_CODE_TSPEC_ADDTS_RESP 1
++#define ACTION_CODE_TSPEC_DELTS 2
++
++typedef enum {
++ TSPEC_STATUS_CODE_ADMISSION_ACCEPTED = 0,
++ TSPEC_STATUS_CODE_ADDTS_INVALID_PARAMS = 0x1,
++ TSPEC_STATUS_CODE_ADDTS_REQUEST_REFUSED = 0x3,
++ TSPEC_STATUS_CODE_UNSPECIFIED_QOS_RELATED_FAILURE = 0xC8,
++ TSPEC_STATUS_CODE_REQUESTED_REFUSED_POLICY_CONFIGURATION = 0xC9,
++ TSPEC_STATUS_CODE_INSUFFCIENT_BANDWIDTH = 0xCA,
++ TSPEC_STATUS_CODE_INVALID_PARAMS = 0xCB,
++ TSPEC_STATUS_CODE_DELTS_SENT = 0x30,
++ TSPEC_STATUS_CODE_DELTS_RECV = 0x31,
++} TSPEC_STATUS_CODE;
++
++/*
++ * WMM/802.11e Tspec Element
++ */
++typedef PREPACK struct wmm_tspec_ie_t {
++ A_UINT8 elementId;
++ A_UINT8 len;
++ A_UINT8 oui[3];
++ A_UINT8 ouiType;
++ A_UINT8 ouiSubType;
++ A_UINT8 version;
++ A_UINT16 tsInfo_info;
++ A_UINT8 tsInfo_reserved;
++ A_UINT16 nominalMSDU;
++ A_UINT16 maxMSDU;
++ A_UINT32 minServiceInt;
++ A_UINT32 maxServiceInt;
++ A_UINT32 inactivityInt;
++ A_UINT32 suspensionInt;
++ A_UINT32 serviceStartTime;
++ A_UINT32 minDataRate;
++ A_UINT32 meanDataRate;
++ A_UINT32 peakDataRate;
++ A_UINT32 maxBurstSize;
++ A_UINT32 delayBound;
++ A_UINT32 minPhyRate;
++ A_UINT16 sba;
++ A_UINT16 mediumTime;
++} POSTPACK WMM_TSPEC_IE;
++
++
++/*
++ * BEACON management packets
++ *
++ * octet timestamp[8]
++ * octet beacon interval[2]
++ * octet capability information[2]
++ * information element
++ * octet elemid
++ * octet length
++ * octet information[length]
++ */
++
++#define IEEE80211_BEACON_INTERVAL(beacon) \
++ ((beacon)[8] | ((beacon)[9] << 8))
++#define IEEE80211_BEACON_CAPABILITY(beacon) \
++ ((beacon)[10] | ((beacon)[11] << 8))
++
++#define IEEE80211_CAPINFO_ESS 0x0001
++#define IEEE80211_CAPINFO_IBSS 0x0002
++#define IEEE80211_CAPINFO_CF_POLLABLE 0x0004
++#define IEEE80211_CAPINFO_CF_POLLREQ 0x0008
++#define IEEE80211_CAPINFO_PRIVACY 0x0010
++#define IEEE80211_CAPINFO_SHORT_PREAMBLE 0x0020
++#define IEEE80211_CAPINFO_PBCC 0x0040
++#define IEEE80211_CAPINFO_CHNL_AGILITY 0x0080
++/* bits 8-9 are reserved */
++#define IEEE80211_CAPINFO_SHORT_SLOTTIME 0x0400
++#define IEEE80211_CAPINFO_APSD 0x0800
++/* bit 12 is reserved */
++#define IEEE80211_CAPINFO_DSSSOFDM 0x2000
++/* bits 14-15 are reserved */
++
++/*
++ * Authentication Modes
++ */
++
++enum ieee80211_authmode {
++ IEEE80211_AUTH_NONE = 0,
++ IEEE80211_AUTH_OPEN = 1,
++ IEEE80211_AUTH_SHARED = 2,
++ IEEE80211_AUTH_8021X = 3,
++ IEEE80211_AUTH_AUTO = 4, /* auto-select/accept */
++ /* NB: these are used only for ioctls */
++ IEEE80211_AUTH_WPA = 5, /* WPA/RSN w/ 802.1x */
++ IEEE80211_AUTH_WPA_PSK = 6, /* WPA/RSN w/ PSK */
++ IEEE80211_AUTH_WPA_CCKM = 7, /* WPA/RSN IE w/ CCKM */
++};
++
++#include "athendpack.h"
++
++#endif /* _NET80211_IEEE80211_H_ */
+diff --git a/drivers/ar6000/include/ieee80211_ioctl.h b/drivers/ar6000/include/ieee80211_ioctl.h
+new file mode 100644
+index 0000000..dab6747
+--- /dev/null
++++ b/drivers/ar6000/include/ieee80211_ioctl.h
+@@ -0,0 +1,163 @@
++/*
++ * Copyright (c) 2004-2005 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/os/linux/include/ieee80211_ioctl.h#1 $
++ */
++
++#ifndef _IEEE80211_IOCTL_H_
++#define _IEEE80211_IOCTL_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*
++ * Extracted from the MADWIFI net80211/ieee80211_ioctl.h
++ */
++
++/*
++ * WPA/RSN get/set key request. Specify the key/cipher
++ * type and whether the key is to be used for sending and/or
++ * receiving. The key index should be set only when working
++ * with global keys (use IEEE80211_KEYIX_NONE for ``no index'').
++ * Otherwise a unicast/pairwise key is specified by the bssid
++ * (on a station) or mac address (on an ap). They key length
++ * must include any MIC key data; otherwise it should be no
++ more than IEEE80211_KEYBUF_SIZE.
++ */
++struct ieee80211req_key {
++ u_int8_t ik_type; /* key/cipher type */
++ u_int8_t ik_pad;
++ u_int16_t ik_keyix; /* key index */
++ u_int8_t ik_keylen; /* key length in bytes */
++ u_int8_t ik_flags;
++#define IEEE80211_KEY_XMIT 0x01
++#define IEEE80211_KEY_RECV 0x02
++#define IEEE80211_KEY_DEFAULT 0x80 /* default xmit key */
++ u_int8_t ik_macaddr[IEEE80211_ADDR_LEN];
++ u_int64_t ik_keyrsc; /* key receive sequence counter */
++ u_int64_t ik_keytsc; /* key transmit sequence counter */
++ u_int8_t ik_keydata[IEEE80211_KEYBUF_SIZE+IEEE80211_MICBUF_SIZE];
++};
++/*
++ * Delete a key either by index or address. Set the index
++ * to IEEE80211_KEYIX_NONE when deleting a unicast key.
++ */
++struct ieee80211req_del_key {
++ u_int8_t idk_keyix; /* key index */
++ u_int8_t idk_macaddr[IEEE80211_ADDR_LEN];
++};
++/*
++ * MLME state manipulation request. IEEE80211_MLME_ASSOC
++ * only makes sense when operating as a station. The other
++ * requests can be used when operating as a station or an
++ * ap (to effect a station).
++ */
++struct ieee80211req_mlme {
++ u_int8_t im_op; /* operation to perform */
++#define IEEE80211_MLME_ASSOC 1 /* associate station */
++#define IEEE80211_MLME_DISASSOC 2 /* disassociate station */
++#define IEEE80211_MLME_DEAUTH 3 /* deauthenticate station */
++#define IEEE80211_MLME_AUTHORIZE 4 /* authorize station */
++#define IEEE80211_MLME_UNAUTHORIZE 5 /* unauthorize station */
++ u_int16_t im_reason; /* 802.11 reason code */
++ u_int8_t im_macaddr[IEEE80211_ADDR_LEN];
++};
++
++struct ieee80211req_addpmkid {
++ u_int8_t pi_bssid[IEEE80211_ADDR_LEN];
++ u_int8_t pi_enable;
++ u_int8_t pi_pmkid[16];
++};
++
++#define AUTH_ALG_OPEN_SYSTEM 0x01
++#define AUTH_ALG_SHARED_KEY 0x02
++#define AUTH_ALG_LEAP 0x04
++
++struct ieee80211req_authalg {
++ u_int8_t auth_alg;
++};
++
++/*
++ * Request to add an IE to a Management Frame
++ */
++enum{
++ IEEE80211_APPIE_FRAME_BEACON = 0,
++ IEEE80211_APPIE_FRAME_PROBE_REQ = 1,
++ IEEE80211_APPIE_FRAME_PROBE_RESP = 2,
++ IEEE80211_APPIE_FRAME_ASSOC_REQ = 3,
++ IEEE80211_APPIE_FRAME_ASSOC_RESP = 4,
++ IEEE80211_APPIE_NUM_OF_FRAME = 5
++};
++
++/*
++ * The Maximum length of the IE that can be added to a Management frame
++ */
++#define IEEE80211_APPIE_FRAME_MAX_LEN 78
++
++struct ieee80211req_getset_appiebuf {
++ u_int32_t app_frmtype; /* management frame type for which buffer is added */
++ u_int32_t app_buflen; /*application supplied buffer length */
++ u_int8_t app_buf[];
++};
++
++/*
++ * The following definitions are used by an application to set filter
++ * for receiving management frames
++ */
++enum {
++ IEEE80211_FILTER_TYPE_BEACON = 0x1,
++ IEEE80211_FILTER_TYPE_PROBE_REQ = 0x2,
++ IEEE80211_FILTER_TYPE_PROBE_RESP = 0x4,
++ IEEE80211_FILTER_TYPE_ASSOC_REQ = 0x8,
++ IEEE80211_FILTER_TYPE_ASSOC_RESP = 0x10,
++ IEEE80211_FILTER_TYPE_AUTH = 0x20,
++ IEEE80211_FILTER_TYPE_DEAUTH = 0x40,
++ IEEE80211_FILTER_TYPE_DISASSOC = 0x80,
++ IEEE80211_FILTER_TYPE_ALL = 0xFF /* used to check the valid filter bits */
++};
++
++struct ieee80211req_set_filter {
++ u_int32_t app_filterype; /* management frame filter type */
++};
++
++enum {
++ IEEE80211_PARAM_AUTHMODE = 3, /* Authentication Mode */
++ IEEE80211_PARAM_MCASTCIPHER = 5,
++ IEEE80211_PARAM_MCASTKEYLEN = 6, /* multicast key length */
++ IEEE80211_PARAM_UCASTCIPHER = 8,
++ IEEE80211_PARAM_UCASTKEYLEN = 9, /* unicast key length */
++ IEEE80211_PARAM_WPA = 10, /* WPA mode (0,1,2) */
++ IEEE80211_PARAM_ROAMING = 12, /* roaming mode */
++ IEEE80211_PARAM_PRIVACY = 13, /* privacy invoked */
++ IEEE80211_PARAM_COUNTERMEASURES = 14, /* WPA/TKIP countermeasures */
++ IEEE80211_PARAM_DROPUNENCRYPTED = 15, /* discard unencrypted frames */
++};
++
++/*
++ * Values for IEEE80211_PARAM_WPA
++ */
++#define WPA_MODE_WPA1 1
++#define WPA_MODE_WPA2 2
++#define WPA_MODE_AUTO 3
++#define WPA_MODE_NONE 4
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _IEEE80211_IOCTL_H_ */
+diff --git a/drivers/ar6000/include/ieee80211_node.h b/drivers/ar6000/include/ieee80211_node.h
+new file mode 100644
+index 0000000..46b613c
+--- /dev/null
++++ b/drivers/ar6000/include/ieee80211_node.h
+@@ -0,0 +1,77 @@
++/*-
++ * Copyright (c) 2001 Atsushi Onoe
++ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting
++ * Copyright (c) 2006 Atheros Communications, Inc.
++ *
++ * Wireless Network driver for Atheros AR6001
++ * All rights reserved.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ *
++ */
++#ifndef _IEEE80211_NODE_H_
++#define _IEEE80211_NODE_H_
++
++/*
++ * Node locking definitions.
++ */
++#define IEEE80211_NODE_LOCK_INIT(_nt) A_MUTEX_INIT(&(_nt)->nt_nodelock)
++#define IEEE80211_NODE_LOCK_DESTROY(_nt)
++#define IEEE80211_NODE_LOCK(_nt) A_MUTEX_LOCK(&(_nt)->nt_nodelock)
++#define IEEE80211_NODE_UNLOCK(_nt) A_MUTEX_UNLOCK(&(_nt)->nt_nodelock)
++#define IEEE80211_NODE_LOCK_BH(_nt) A_MUTEX_LOCK(&(_nt)->nt_nodelock)
++#define IEEE80211_NODE_UNLOCK_BH(_nt) A_MUTEX_UNLOCK(&(_nt)->nt_nodelock)
++#define IEEE80211_NODE_LOCK_ASSERT(_nt)
++
++/*
++ * Node reference counting definitions.
++ *
++ * ieee80211_node_initref initialize the reference count to 1
++ * ieee80211_node_incref add a reference
++ * ieee80211_node_decref remove a reference
++ * ieee80211_node_dectestref remove a reference and return 1 if this
++ * is the last reference, otherwise 0
++ * ieee80211_node_refcnt reference count for printing (only)
++ */
++#define ieee80211_node_initref(_ni) ((_ni)->ni_refcnt = 1)
++#define ieee80211_node_incref(_ni) ((_ni)->ni_refcnt++)
++#define ieee80211_node_decref(_ni) ((_ni)->ni_refcnt--)
++#define ieee80211_node_dectestref(_ni) (((_ni)->ni_refcnt--) == 0)
++#define ieee80211_node_refcnt(_ni) ((_ni)->ni_refcnt)
++
++#define IEEE80211_NODE_HASHSIZE 32
++/* simple hash is enough for variation of macaddr */
++#define IEEE80211_NODE_HASH(addr) \
++ (((const A_UINT8 *)(addr))[IEEE80211_ADDR_LEN - 1] % \
++ IEEE80211_NODE_HASHSIZE)
++
++/*
++ * Table of ieee80211_node instances. Each ieee80211com
++ * has at least one for holding the scan candidates.
++ * When operating as an access point or in ibss mode there
++ * is a second table for associated stations or neighbors.
++ */
++struct ieee80211_node_table {
++ void *nt_wmip; /* back reference */
++ A_MUTEX_T nt_nodelock; /* on node table */
++ struct bss *nt_node_first; /* information of all nodes */
++ struct bss *nt_node_last; /* information of all nodes */
++ struct bss *nt_hash[IEEE80211_NODE_HASHSIZE];
++ const char *nt_name; /* for debugging */
++ A_UINT32 nt_scangen; /* gen# for timeout scan */
++ A_TIMER nt_inact_timer;
++ A_UINT8 isTimerArmed; /* is the node timer armed */
++};
++
++#define WLAN_NODE_INACT_TIMEOUT_MSEC 10000
++
++#endif /* _IEEE80211_NODE_H_ */
+diff --git a/drivers/ar6000/include/ini_dset.h b/drivers/ar6000/include/ini_dset.h
+new file mode 100644
+index 0000000..410f2b52
+--- /dev/null
++++ b/drivers/ar6000/include/ini_dset.h
+@@ -0,0 +1,40 @@
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++#ifndef _INI_DSET_H_
++#define _INI_DSET_H_
++
++/*
++ * Each of these represents a WHAL INI table, which consists
++ * of an "address column" followed by 1 or more "value columns".
++ *
++ * Software uses the base WHAL_INI_DATA_ID+column to access a
++ * DataSet that holds a particular column of data.
++ */
++typedef enum {
++ WHAL_INI_DATA_ID_NULL =0,
++ WHAL_INI_DATA_ID_MODE_SPECIFIC =1, /* 2,3 */
++ WHAL_INI_DATA_ID_COMMON =4, /* 5 */
++ WHAL_INI_DATA_ID_BB_RFGAIN =6, /* 7,8 */
++ WHAL_INI_DATA_ID_ANALOG_BANK1 =9, /* 10 */
++ WHAL_INI_DATA_ID_ANALOG_BANK2 =11, /* 12 */
++ WHAL_INI_DATA_ID_ANALOG_BANK3 =13, /* 14, 15 */
++ WHAL_INI_DATA_ID_ANALOG_BANK6 =16, /* 17, 18 */
++ WHAL_INI_DATA_ID_ANALOG_BANK7 =19, /* 20 */
++ WHAL_INI_DATA_ID_MODE_OVERRIDES =21, /* 22,23 */
++ WHAL_INI_DATA_ID_COMMON_OVERRIDES =24, /* 25 */
++
++ WHAL_INI_DATA_ID_MAX =25
++} WHAL_INI_DATA_ID;
++
++typedef PREPACK struct {
++ A_UINT16 freqIndex; // 1 - A mode 2 - B or G mode 0 - common
++ A_UINT16 offset;
++ A_UINT32 newValue;
++} POSTPACK INI_DSET_REG_OVERRIDE;
++
++#endif
+diff --git a/drivers/ar6000/include/regDb.h b/drivers/ar6000/include/regDb.h
+new file mode 100644
+index 0000000..b3f665f
+--- /dev/null
++++ b/drivers/ar6000/include/regDb.h
+@@ -0,0 +1,19 @@
++/*
++ * Copyright (c) 2005 Atheros Communications, Inc.
++ * All rights reserved.
++ *
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ * This module contains the header files for regulatory module,
++ * which include the DB schema and DB values.
++ * $Id:
++ */
++
++#ifndef __REG_DB_H__
++#define __REG_DB_H__
++
++#include "./regulatory/reg_dbschema.h"
++#include "./regulatory/reg_dbvalues.h"
++
++#endif /* __REG_DB_H__ */
+diff --git a/drivers/ar6000/include/regdump.h b/drivers/ar6000/include/regdump.h
+new file mode 100644
+index 0000000..0106825
+--- /dev/null
++++ b/drivers/ar6000/include/regdump.h
+@@ -0,0 +1,33 @@
++#ifndef __REGDUMP_H__
++#define __REGDUMP_H__
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++#if defined(AR6001)
++#include "AR6001/AR6001_regdump.h"
++#endif
++#if defined(AR6002)
++#include "AR6002/AR6002_regdump.h"
++#endif
++
++#if !defined(__ASSEMBLER__)
++/*
++ * Target CPU state at the time of failure is reflected
++ * in a register dump, which the Host can fetch through
++ * the diagnostic window.
++ */
++struct register_dump_s {
++ A_UINT32 target_id; /* Target ID */
++ A_UINT32 assline; /* Line number (if assertion failure) */
++ A_UINT32 pc; /* Program Counter at time of exception */
++ A_UINT32 badvaddr; /* Virtual address causing exception */
++ CPU_exception_frame_t exc_frame; /* CPU-specific exception info */
++
++ /* Could copy top of stack here, too.... */
++};
++#endif /* __ASSEMBLER__ */
++#endif /* __REGDUMP_H__ */
+diff --git a/drivers/ar6000/include/targaddrs.h b/drivers/ar6000/include/targaddrs.h
+new file mode 100644
+index 0000000..da2a650
+--- /dev/null
++++ b/drivers/ar6000/include/targaddrs.h
+@@ -0,0 +1,158 @@
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++
++#ifndef __TARGADDRS_H__
++#define __TARGADDRS_H__
++#if defined(AR6001)
++#include "AR6001/addrs.h"
++#endif
++#if defined(AR6002)
++#include "AR6002/addrs.h"
++#endif
++
++/*
++ * AR6K option bits, to enable/disable various features.
++ * By default, all option bits are 0.
++ * These bits can be set in LOCAL_SCRATCH register 0.
++ */
++#define AR6K_OPTION_BMI_DISABLE 0x01 /* Disable BMI comm with Host */
++#define AR6K_OPTION_SERIAL_ENABLE 0x02 /* Enable serial port msgs */
++#define AR6K_OPTION_WDT_DISABLE 0x04 /* WatchDog Timer override */
++#define AR6K_OPTION_SLEEP_DISABLE 0x08 /* Disable system sleep */
++#define AR6K_OPTION_STOP_BOOT 0x10 /* Stop boot processes (for ATE) */
++#define AR6K_OPTION_ENABLE_NOANI 0x20 /* Operate without ANI */
++#define AR6K_OPTION_DSET_DISABLE 0x40 /* Ignore DataSets */
++#define AR6K_OPTION_IGNORE_FLASH 0x80 /* Ignore flash during bootup */
++
++/*
++ * xxx_HOST_INTEREST_ADDRESS is the address in Target RAM of the
++ * host_interest structure. It must match the address of the _host_interest
++ * symbol (see linker script).
++ *
++ * Host Interest is shared between Host and Target in order to coordinate
++ * between the two, and is intended to remain constant (with additions only
++ * at the end) across software releases.
++ */
++#define AR6001_HOST_INTEREST_ADDRESS 0x80000600
++#define AR6002_HOST_INTEREST_ADDRESS 0x00500400
++
++#define HOST_INTEREST_MAX_SIZE 0x100
++
++#if !defined(__ASSEMBLER__)
++struct register_dump_s;
++struct dbglog_hdr_s;
++
++/*
++ * These are items that the Host may need to access
++ * via BMI or via the Diagnostic Window. The position
++ * of items in this structure must remain constant
++ * across firmware revisions!
++ *
++ * Types for each item must be fixed size across
++ * target and host platforms.
++ *
++ * More items may be added at the end.
++ */
++struct host_interest_s {
++ /*
++ * Pointer to application-defined area, if any.
++ * Set by Target application during startup.
++ */
++ A_UINT32 hi_app_host_interest; /* 0x00 */
++
++ /* Pointer to register dump area, valid after Target crash. */
++ A_UINT32 hi_failure_state; /* 0x04 */
++
++ /* Pointer to debug logging header */
++ A_UINT32 hi_dbglog_hdr; /* 0x08 */
++
++ /* Indicates whether or not flash is present on Target.
++ * NB: flash_is_present indicator is here not just
++ * because it might be of interest to the Host; but
++ * also because it's set early on by Target's startup
++ * asm code and we need it to have a special RAM address
++ * so that it doesn't get reinitialized with the rest
++ * of data.
++ */
++ A_UINT32 hi_flash_is_present; /* 0x0c */
++
++ /*
++ * General-purpose flag bits, similar to AR6000_OPTION_* flags.
++ * Can be used by application rather than by OS.
++ */
++ A_UINT32 hi_option_flag; /* 0x10 */
++
++ /*
++ * Boolean that determines whether or not to
++ * display messages on the serial port.
++ */
++ A_UINT32 hi_serial_enable; /* 0x14 */
++
++ /* Start address of Flash DataSet index, if any */
++ A_UINT32 hi_dset_list_head; /* 0x18 */
++
++ /* Override Target application start address */
++ A_UINT32 hi_app_start; /* 0x1c */
++
++ /* Clock and voltage tuning */
++ A_UINT32 hi_skip_clock_init; /* 0x20 */
++ A_UINT32 hi_core_clock_setting; /* 0x24 */
++ A_UINT32 hi_cpu_clock_setting; /* 0x28 */
++ A_UINT32 hi_system_sleep_setting; /* 0x2c */
++ A_UINT32 hi_xtal_control_setting; /* 0x30 */
++ A_UINT32 hi_pll_ctrl_setting_24ghz; /* 0x34 */
++ A_UINT32 hi_pll_ctrl_setting_5ghz; /* 0x38 */
++ A_UINT32 hi_ref_voltage_trim_setting; /* 0x3c */
++ A_UINT32 hi_clock_info; /* 0x40 */
++
++ /*
++ * Flash configuration overrides, used only
++ * when firmware is not executing from flash.
++ * (When using flash, modify the global variables
++ * with equivalent names.)
++ */
++ A_UINT32 hi_bank0_addr_value; /* 0x44 */
++ A_UINT32 hi_bank0_read_value; /* 0x48 */
++ A_UINT32 hi_bank0_write_value; /* 0x4c */
++ A_UINT32 hi_bank0_config_value; /* 0x50 */
++
++ /* Pointer to Board Data */
++ A_UINT32 hi_board_data; /* 0x54 */
++ A_UINT32 hi_board_data_initialized; /* 0x58 */
++
++ A_UINT32 hi_dset_RAM_index_table; /* 0x5c */
++
++ A_UINT32 hi_desired_baud_rate; /* 0x60 */
++ A_UINT32 hi_dbglog_config; /* 0x64 */
++ A_UINT32 hi_end_RAM_reserve_sz; /* 0x68 */
++ A_UINT32 hi_mbox_io_block_sz; /* 0x6c */
++
++ A_UINT32 hi_num_bpatch_streams; /* 0x70 */
++ A_UINT32 hi_mbox_isr_yield_limit; /* 0x74 */
++
++ A_UINT32 hi_refclk_hz; /* 0x78 */
++};
++
++/* Bits defined in hi_option_flag */
++#define HI_OPTION_TIMER_WAR 1 /* not really used */
++
++/*
++ * Intended for use by Host software, this macro returns the Target RAM
++ * address of any item in the host_interest structure.
++ * Example: target_addr = AR6001_HOST_INTEREST_ITEM_ADDRESS(hi_board_data);
++ */
++#define AR6001_HOST_INTEREST_ITEM_ADDRESS(item) \
++ ((A_UINT32)&((((struct host_interest_s *)(AR6001_HOST_INTEREST_ADDRESS))->item)))
++
++#define AR6002_HOST_INTEREST_ITEM_ADDRESS(item) \
++ ((A_UINT32)&((((struct host_interest_s *)(AR6002_HOST_INTEREST_ADDRESS))->item)))
++
++
++#endif /* !__ASSEMBLER__ */
++
++#endif /* __TARGADDRS_H__ */
+diff --git a/drivers/ar6000/include/testcmd.h b/drivers/ar6000/include/testcmd.h
+new file mode 100644
+index 0000000..737533a
+--- /dev/null
++++ b/drivers/ar6000/include/testcmd.h
+@@ -0,0 +1,144 @@
++/*
++ * Copyright (c) 2004-2005 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++
++#ifndef TESTCMD_H_
++#define TESTCMD_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++typedef enum {
++ ZEROES_PATTERN = 0,
++ ONES_PATTERN,
++ REPEATING_10,
++ PN7_PATTERN,
++ PN9_PATTERN,
++ PN15_PATTERN
++}TX_DATA_PATTERN;
++
++/* Continous tx
++ mode : TCMD_CONT_TX_OFF - Disabling continous tx
++ TCMD_CONT_TX_SINE - Enable continuous unmodulated tx
++ TCMD_CONT_TX_FRAME- Enable continuous modulated tx
++ freq : Channel freq in Mhz. (e.g 2412 for channel 1 in 11 g)
++dataRate: 0 - 1 Mbps
++ 1 - 2 Mbps
++ 2 - 5.5 Mbps
++ 3 - 11 Mbps
++ 4 - 6 Mbps
++ 5 - 9 Mbps
++ 6 - 12 Mbps
++ 7 - 18 Mbps
++ 8 - 24 Mbps
++ 9 - 36 Mbps
++ 10 - 28 Mbps
++ 11 - 54 Mbps
++ txPwr: Tx power in dBm[5 -11] for unmod Tx, [5-14] for mod Tx
++antenna: 1 - one antenna
++ 2 - two antenna
++Note : Enable/disable continuous tx test cmd works only when target is awake.
++*/
++
++typedef enum {
++ TCMD_CONT_TX_OFF = 0,
++ TCMD_CONT_TX_SINE,
++ TCMD_CONT_TX_FRAME,
++ TCMD_CONT_TX_TX99,
++ TCMD_CONT_TX_TX100
++} TCMD_CONT_TX_MODE;
++
++typedef PREPACK struct {
++ A_UINT32 testCmdId;
++ A_UINT32 mode;
++ A_UINT32 freq;
++ A_UINT32 dataRate;
++ A_INT32 txPwr;
++ A_UINT32 antenna;
++ A_UINT32 enANI;
++ A_UINT32 scramblerOff;
++ A_UINT32 aifsn;
++ A_UINT16 pktSz;
++ A_UINT16 txPattern;
++} POSTPACK TCMD_CONT_TX;
++
++#define TCMD_TXPATTERN_ZERONE 0x1
++#define TCMD_TXPATTERN_ZERONE_DIS_SCRAMBLE 0x2
++
++/* Continuous Rx
++ act: TCMD_CONT_RX_PROMIS - promiscuous mode (accept all incoming frames)
++ TCMD_CONT_RX_FILTER - filter mode (accept only frames with dest
++ address equal specified
++ mac address (set via act =3)
++ TCMD_CONT_RX_REPORT off mode (disable cont rx mode and get the
++ report from the last cont
++ Rx test)
++
++ TCMD_CONT_RX_SETMAC - set MacAddr mode (sets the MAC address for the
++ target. This Overrides
++ the default MAC address.)
++
++*/
++typedef enum {
++ TCMD_CONT_RX_PROMIS =0,
++ TCMD_CONT_RX_FILTER,
++ TCMD_CONT_RX_REPORT,
++ TCMD_CONT_RX_SETMAC
++} TCMD_CONT_RX_ACT;
++
++typedef PREPACK struct {
++ A_UINT32 testCmdId;
++ A_UINT32 act;
++ A_UINT32 enANI;
++ PREPACK union {
++ struct PREPACK TCMD_CONT_RX_PARA {
++ A_UINT32 freq;
++ A_UINT32 antenna;
++ } POSTPACK para;
++ struct PREPACK TCMD_CONT_RX_REPORT {
++ A_UINT32 totalPkt;
++ A_INT32 rssiInDBm;
++ } POSTPACK report;
++ struct PREPACK TCMD_CONT_RX_MAC {
++ A_UCHAR addr[ATH_MAC_LEN];
++ } POSTPACK mac;
++ } POSTPACK u;
++} POSTPACK TCMD_CONT_RX;
++
++/* Force sleep/wake test cmd
++ mode: TCMD_PM_WAKEUP - Wakeup the target
++ TCMD_PM_SLEEP - Force the target to sleep.
++ */
++typedef enum {
++ TCMD_PM_WAKEUP = 1, /* be consistent with target */
++ TCMD_PM_SLEEP
++} TCMD_PM_MODE;
++
++typedef PREPACK struct {
++ A_UINT32 testCmdId;
++ A_UINT32 mode;
++} POSTPACK TCMD_PM;
++
++typedef enum{
++ TCMD_CONT_TX_ID,
++ TCMD_CONT_RX_ID,
++ TCMD_PM_ID
++ } TCMD_ID;
++
++typedef PREPACK union {
++ TCMD_CONT_TX contTx;
++ TCMD_CONT_RX contRx;
++ TCMD_PM pm ;
++} POSTPACK TEST_CMD;
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* TESTCMD_H_ */
+diff --git a/drivers/ar6000/include/wlan_api.h b/drivers/ar6000/include/wlan_api.h
+new file mode 100644
+index 0000000..aabca4b
+--- /dev/null
++++ b/drivers/ar6000/include/wlan_api.h
+@@ -0,0 +1,101 @@
++#ifndef _HOST_WLAN_API_H_
++#define _HOST_WLAN_API_H_
++/*
++ * Copyright (c) 2004-2005 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * This file contains the API for the host wlan module
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/include/wlan_api.h#1 $
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++struct ieee80211_node_table;
++struct ieee80211_frame;
++
++struct ieee80211_common_ie {
++ A_UINT16 ie_chan;
++ A_UINT8 *ie_tstamp;
++ A_UINT8 *ie_ssid;
++ A_UINT8 *ie_rates;
++ A_UINT8 *ie_xrates;
++ A_UINT8 *ie_country;
++ A_UINT8 *ie_wpa;
++ A_UINT8 *ie_rsn;
++ A_UINT8 *ie_wmm;
++ A_UINT8 *ie_ath;
++ A_UINT16 ie_capInfo;
++ A_UINT16 ie_beaconInt;
++ A_UINT8 *ie_tim;
++ A_UINT8 *ie_chswitch;
++ A_UINT8 ie_erp;
++ A_UINT8 *ie_wsc;
++};
++
++typedef struct bss {
++ A_UINT8 ni_macaddr[6];
++ A_UINT8 ni_snr;
++ A_INT16 ni_rssi;
++ struct bss *ni_list_next;
++ struct bss *ni_list_prev;
++ struct bss *ni_hash_next;
++ struct bss *ni_hash_prev;
++ struct ieee80211_common_ie ni_cie;
++ A_UINT8 *ni_buf;
++ struct ieee80211_node_table *ni_table;
++ A_UINT32 ni_refcnt;
++ int ni_scangen;
++ A_UINT32 ni_tstamp;
++} bss_t;
++
++typedef void wlan_node_iter_func(void *arg, bss_t *);
++
++bss_t *wlan_node_alloc(struct ieee80211_node_table *nt, int wh_size);
++void wlan_node_free(bss_t *ni);
++void wlan_setup_node(struct ieee80211_node_table *nt, bss_t *ni,
++ const A_UINT8 *macaddr);
++bss_t *wlan_find_node(struct ieee80211_node_table *nt, const A_UINT8 *macaddr);
++void wlan_node_reclaim(struct ieee80211_node_table *nt, bss_t *ni);
++void wlan_free_allnodes(struct ieee80211_node_table *nt);
++void wlan_iterate_nodes(struct ieee80211_node_table *nt, wlan_node_iter_func *f,
++ void *arg);
++
++void wlan_node_table_init(void *wmip, struct ieee80211_node_table *nt);
++void wlan_node_table_reset(struct ieee80211_node_table *nt);
++void wlan_node_table_cleanup(struct ieee80211_node_table *nt);
++
++A_STATUS wlan_parse_beacon(A_UINT8 *buf, int framelen,
++ struct ieee80211_common_ie *cie);
++
++A_UINT16 wlan_ieee2freq(int chan);
++A_UINT32 wlan_freq2ieee(A_UINT16 freq);
++
++
++bss_t *
++wlan_find_Ssidnode (struct ieee80211_node_table *nt, A_UCHAR *pSsid,
++ A_UINT32 ssidLength, A_BOOL bIsWPA2);
++
++void
++wlan_node_return (struct ieee80211_node_table *nt, bss_t *ni);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _HOST_WLAN_API_H_ */
+diff --git a/drivers/ar6000/include/wlan_dset.h b/drivers/ar6000/include/wlan_dset.h
+new file mode 100644
+index 0000000..8a876d6
+--- /dev/null
++++ b/drivers/ar6000/include/wlan_dset.h
+@@ -0,0 +1,20 @@
++/*
++ * Copyright (c) 2007 Atheros Communications, Inc.
++ * All rights reserved.
++ *
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ */
++
++#ifndef __WLAN_DSET_H__
++#define __WKAN_DSET_H__
++
++typedef PREPACK struct wow_config_dset {
++
++ A_UINT8 valid_dset;
++ A_UINT8 gpio_enable;
++ A_UINT16 gpio_pin;
++} POSTPACK WOW_CONFIG_DSET;
++
++#endif
+diff --git a/drivers/ar6000/include/wmi.h b/drivers/ar6000/include/wmi.h
+new file mode 100644
+index 0000000..045acd4
+--- /dev/null
++++ b/drivers/ar6000/include/wmi.h
+@@ -0,0 +1,1743 @@
++/*
++ * Copyright (c) 2004-2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ * This file contains the definitions of the WMI protocol specified in the
++ * Wireless Module Interface (WMI). It includes definitions of all the
++ * commands and events. Commands are messages from the host to the WM.
++ * Events and Replies are messages from the WM to the host.
++ *
++ * Ownership of correctness in regards to WMI commands
++ * belongs to the host driver and the WM is not required to validate
++ * parameters for value, proper range, or any other checking.
++ *
++ */
++
++#ifndef _WMI_H_
++#define _WMI_H_
++
++#ifndef ATH_TARGET
++#include "athstartpack.h"
++#endif
++
++#include "wmix.h"
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#define WMI_PROTOCOL_VERSION 0x0002
++#define WMI_PROTOCOL_REVISION 0x0000
++
++#define ATH_MAC_LEN 6 /* length of mac in bytes */
++#define WMI_CMD_MAX_LEN 100
++#define WMI_CONTROL_MSG_MAX_LEN 256
++#define WMI_OPT_CONTROL_MSG_MAX_LEN 1536
++#define IS_ETHERTYPE(_typeOrLen) ((_typeOrLen) >= 0x0600)
++#define RFC1042OUI {0x00, 0x00, 0x00}
++
++#define IP_ETHERTYPE 0x0800
++
++#define WMI_IMPLICIT_PSTREAM 0xFF
++#define WMI_MAX_THINSTREAM 15
++
++struct host_app_area_s {
++ A_UINT32 wmi_protocol_ver;
++};
++
++/*
++ * Data Path
++ */
++typedef PREPACK struct {
++ A_UINT8 dstMac[ATH_MAC_LEN];
++ A_UINT8 srcMac[ATH_MAC_LEN];
++ A_UINT16 typeOrLen;
++} POSTPACK ATH_MAC_HDR;
++
++typedef PREPACK struct {
++ A_UINT8 dsap;
++ A_UINT8 ssap;
++ A_UINT8 cntl;
++ A_UINT8 orgCode[3];
++ A_UINT16 etherType;
++} POSTPACK ATH_LLC_SNAP_HDR;
++
++typedef enum {
++ DATA_MSGTYPE = 0x0,
++ CNTL_MSGTYPE,
++ SYNC_MSGTYPE
++} WMI_MSG_TYPE;
++
++
++typedef PREPACK struct {
++ A_INT8 rssi;
++ A_UINT8 info; /* WMI_MSG_TYPE in lower 2 bits - b1b0 */
++ /* UP in next 3 bits - b4b3b2 */
++#define WMI_DATA_HDR_MSG_TYPE_MASK 0x03
++#define WMI_DATA_HDR_MSG_TYPE_SHIFT 0
++#define WMI_DATA_HDR_UP_MASK 0x07
++#define WMI_DATA_HDR_UP_SHIFT 2
++#define WMI_DATA_HDR_IS_MSG_TYPE(h, t) (((h)->info & (WMI_DATA_HDR_MSG_TYPE_MASK)) == (t))
++} POSTPACK WMI_DATA_HDR;
++
++
++#define WMI_DATA_HDR_SET_MSG_TYPE(h, t) (h)->info = (((h)->info & ~(WMI_DATA_HDR_MSG_TYPE_MASK << WMI_DATA_HDR_MSG_TYPE_SHIFT)) | (t << WMI_DATA_HDR_MSG_TYPE_SHIFT))
++#define WMI_DATA_HDR_SET_UP(h, p) (h)->info = (((h)->info & ~(WMI_DATA_HDR_UP_MASK << WMI_DATA_HDR_UP_SHIFT)) | (p << WMI_DATA_HDR_UP_SHIFT))
++
++/*
++ * Control Path
++ */
++typedef PREPACK struct {
++ A_UINT16 commandId;
++} POSTPACK WMI_CMD_HDR; /* used for commands and events */
++
++/*
++ * List of Commnands
++ */
++typedef enum {
++ WMI_CONNECT_CMDID = 0x0001,
++ WMI_RECONNECT_CMDID,
++ WMI_DISCONNECT_CMDID,
++ WMI_SYNCHRONIZE_CMDID,
++ WMI_CREATE_PSTREAM_CMDID,
++ WMI_DELETE_PSTREAM_CMDID,
++ WMI_START_SCAN_CMDID,
++ WMI_SET_SCAN_PARAMS_CMDID,
++ WMI_SET_BSS_FILTER_CMDID,
++ WMI_SET_PROBED_SSID_CMDID,
++ WMI_SET_LISTEN_INT_CMDID,
++ WMI_SET_BMISS_TIME_CMDID,
++ WMI_SET_DISC_TIMEOUT_CMDID,
++ WMI_GET_CHANNEL_LIST_CMDID,
++ WMI_SET_BEACON_INT_CMDID,
++ WMI_GET_STATISTICS_CMDID,
++ WMI_SET_CHANNEL_PARAMS_CMDID,
++ WMI_SET_POWER_MODE_CMDID,
++ WMI_SET_IBSS_PM_CAPS_CMDID,
++ WMI_SET_POWER_PARAMS_CMDID,
++ WMI_SET_POWERSAVE_TIMERS_POLICY_CMDID,
++ WMI_ADD_CIPHER_KEY_CMDID,
++ WMI_DELETE_CIPHER_KEY_CMDID,
++ WMI_ADD_KRK_CMDID,
++ WMI_DELETE_KRK_CMDID,
++ WMI_SET_PMKID_CMDID,
++ WMI_SET_TX_PWR_CMDID,
++ WMI_GET_TX_PWR_CMDID,
++ WMI_SET_ASSOC_INFO_CMDID,
++ WMI_ADD_BAD_AP_CMDID,
++ WMI_DELETE_BAD_AP_CMDID,
++ WMI_SET_TKIP_COUNTERMEASURES_CMDID,
++ WMI_RSSI_THRESHOLD_PARAMS_CMDID,
++ WMI_TARGET_ERROR_REPORT_BITMASK_CMDID,
++ WMI_SET_ACCESS_PARAMS_CMDID,
++ WMI_SET_RETRY_LIMITS_CMDID,
++ WMI_SET_OPT_MODE_CMDID,
++ WMI_OPT_TX_FRAME_CMDID,
++ WMI_SET_VOICE_PKT_SIZE_CMDID,
++ WMI_SET_MAX_SP_LEN_CMDID,
++ WMI_SET_ROAM_CTRL_CMDID,
++ WMI_GET_ROAM_TBL_CMDID,
++ WMI_GET_ROAM_DATA_CMDID,
++ WMI_ENABLE_RM_CMDID,
++ WMI_SET_MAX_OFFHOME_DURATION_CMDID,
++ WMI_EXTENSION_CMDID, /* Non-wireless extensions */
++ WMI_SNR_THRESHOLD_PARAMS_CMDID,
++ WMI_LQ_THRESHOLD_PARAMS_CMDID,
++ WMI_SET_LPREAMBLE_CMDID,
++ WMI_SET_RTS_CMDID,
++ WMI_CLR_RSSI_SNR_CMDID,
++ WMI_SET_FIXRATES_CMDID,
++ WMI_GET_FIXRATES_CMDID,
++ WMI_SET_AUTH_MODE_CMDID,
++ WMI_SET_REASSOC_MODE_CMDID,
++ WMI_SET_WMM_CMDID,
++ WMI_SET_WMM_TXOP_CMDID,
++ WMI_TEST_CMDID,
++ WMI_SET_BT_STATUS_CMDID,
++ WMI_SET_BT_PARAMS_CMDID,
++
++ WMI_SET_KEEPALIVE_CMDID,
++ WMI_GET_KEEPALIVE_CMDID,
++ WMI_SET_APPIE_CMDID,
++ WMI_GET_APPIE_CMDID,
++ WMI_SET_WSC_STATUS_CMDID,
++
++ /* Wake on Wireless */
++ WMI_SET_HOST_SLEEP_MODE_CMDID,
++ WMI_SET_WOW_MODE_CMDID,
++ WMI_GET_WOW_LIST_CMDID,
++ WMI_ADD_WOW_PATTERN_CMDID,
++ WMI_DEL_WOW_PATTERN_CMDID,
++ WMI_SET_MAC_ADDRESS_CMDID,
++ WMI_SET_AKMP_PARAMS_CMDID,
++ WMI_SET_PMKID_LIST_CMDID,
++ WMI_GET_PMKID_LIST_CMDID,
++
++ /*
++ * Developer commands starts at 0xF000
++ */
++ WMI_SET_BITRATE_CMDID = 0xF000,
++ WMI_GET_BITRATE_CMDID,
++ WMI_SET_WHALPARAM_CMDID,
++
++} WMI_COMMAND_ID;
++
++/*
++ * Frame Types
++ */
++typedef enum {
++ WMI_FRAME_BEACON = 0,
++ WMI_FRAME_PROBE_REQ,
++ WMI_FRAME_PROBE_RESP,
++ WMI_FRAME_ASSOC_REQ,
++ WMI_FRAME_ASSOC_RESP,
++ WMI_NUM_MGMT_FRAME
++} WMI_MGMT_FRAME_TYPE;
++
++/*
++ * Connect Command
++ */
++typedef enum {
++ INFRA_NETWORK = 0x01,
++ ADHOC_NETWORK = 0x02,
++ ADHOC_CREATOR = 0x04,
++} NETWORK_TYPE;
++
++typedef enum {
++ OPEN_AUTH = 0x01,
++ SHARED_AUTH = 0x02,
++ LEAP_AUTH = 0x04, /* different from IEEE_AUTH_MODE definitions */
++} DOT11_AUTH_MODE;
++
++typedef enum {
++ NONE_AUTH = 0x01,
++ WPA_AUTH = 0x02,
++ WPA_PSK_AUTH = 0x03,
++ WPA2_AUTH = 0x04,
++ WPA2_PSK_AUTH = 0x05,
++ WPA_AUTH_CCKM = 0x06,
++ WPA2_AUTH_CCKM = 0x07,
++} AUTH_MODE;
++
++typedef enum {
++ NONE_CRYPT = 0x01,
++ WEP_CRYPT = 0x02,
++ TKIP_CRYPT = 0x03,
++ AES_CRYPT = 0x04,
++} CRYPTO_TYPE;
++
++#define WMI_MIN_CRYPTO_TYPE NONE_CRYPT
++#define WMI_MAX_CRYPTO_TYPE (AES_CRYPT + 1)
++
++#define WMI_MIN_KEY_INDEX 0
++#define WMI_MAX_KEY_INDEX 3
++
++#define WMI_MAX_KEY_LEN 32
++
++#define WMI_MAX_SSID_LEN 32
++
++typedef enum {
++ CONNECT_ASSOC_POLICY_USER = 0x0001,
++ CONNECT_SEND_REASSOC = 0x0002,
++ CONNECT_IGNORE_WPAx_GROUP_CIPHER = 0x0004,
++ CONNECT_PROFILE_MATCH_DONE = 0x0008,
++ CONNECT_IGNORE_AAC_BEACON = 0x0010,
++ CONNECT_CSA_FOLLOW_BSS = 0x0020,
++} WMI_CONNECT_CTRL_FLAGS_BITS;
++
++#define DEFAULT_CONNECT_CTRL_FLAGS (CONNECT_CSA_FOLLOW_BSS)
++
++typedef PREPACK struct {
++ A_UINT8 networkType;
++ A_UINT8 dot11AuthMode;
++ A_UINT8 authMode;
++ A_UINT8 pairwiseCryptoType;
++ A_UINT8 pairwiseCryptoLen;
++ A_UINT8 groupCryptoType;
++ A_UINT8 groupCryptoLen;
++ A_UINT8 ssidLength;
++ A_UCHAR ssid[WMI_MAX_SSID_LEN];
++ A_UINT16 channel;
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_UINT32 ctrl_flags;
++} POSTPACK WMI_CONNECT_CMD;
++
++/*
++ * WMI_RECONNECT_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT16 channel; /* hint */
++ A_UINT8 bssid[ATH_MAC_LEN]; /* mandatory if set */
++} POSTPACK WMI_RECONNECT_CMD;
++
++/*
++ * WMI_ADD_CIPHER_KEY_CMDID
++ */
++typedef enum {
++ PAIRWISE_USAGE = 0x00,
++ GROUP_USAGE = 0x01,
++ TX_USAGE = 0x02, /* default Tx Key - Static WEP only */
++} KEY_USAGE;
++
++/*
++ * Bit Flag
++ * Bit 0 - Initialise TSC - default is Initialize
++ */
++#define KEY_OP_INIT_TSC 0x01
++#define KEY_OP_INIT_RSC 0x02
++
++#define KEY_OP_INIT_VAL 0x03 /* Default Initialise the TSC & RSC */
++#define KEY_OP_VALID_MASK 0x03
++
++typedef PREPACK struct {
++ A_UINT8 keyIndex;
++ A_UINT8 keyType;
++ A_UINT8 keyUsage; /* KEY_USAGE */
++ A_UINT8 keyLength;
++ A_UINT8 keyRSC[8]; /* key replay sequence counter */
++ A_UINT8 key[WMI_MAX_KEY_LEN];
++ A_UINT8 key_op_ctrl; /* Additional Key Control information */
++} POSTPACK WMI_ADD_CIPHER_KEY_CMD;
++
++/*
++ * WMI_DELETE_CIPHER_KEY_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT8 keyIndex;
++} POSTPACK WMI_DELETE_CIPHER_KEY_CMD;
++
++#define WMI_KRK_LEN 16
++/*
++ * WMI_ADD_KRK_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT8 krk[WMI_KRK_LEN];
++} POSTPACK WMI_ADD_KRK_CMD;
++
++/*
++ * WMI_SET_TKIP_COUNTERMEASURES_CMDID
++ */
++typedef enum {
++ WMI_TKIP_CM_DISABLE = 0x0,
++ WMI_TKIP_CM_ENABLE = 0x1,
++} WMI_TKIP_CM_CONTROL;
++
++typedef PREPACK struct {
++ A_UINT8 cm_en; /* WMI_TKIP_CM_CONTROL */
++} POSTPACK WMI_SET_TKIP_COUNTERMEASURES_CMD;
++
++/*
++ * WMI_SET_PMKID_CMDID
++ */
++
++#define WMI_PMKID_LEN 16
++
++typedef enum {
++ PMKID_DISABLE = 0,
++ PMKID_ENABLE = 1,
++} PMKID_ENABLE_FLG;
++
++typedef PREPACK struct {
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_UINT8 enable; /* PMKID_ENABLE_FLG */
++ A_UINT8 pmkid[WMI_PMKID_LEN];
++} POSTPACK WMI_SET_PMKID_CMD;
++
++/*
++ * WMI_START_SCAN_CMD
++ */
++typedef enum {
++ WMI_LONG_SCAN = 0,
++ WMI_SHORT_SCAN = 1,
++} WMI_SCAN_TYPE;
++
++typedef PREPACK struct {
++ A_BOOL forceFgScan;
++ A_BOOL isLegacy; /* For Legacy Cisco AP compatibility */
++ A_UINT32 homeDwellTime; /* Maximum duration in the home channel(milliseconds) */
++ A_UINT32 forceScanInterval; /* Time interval between scans (milliseconds)*/
++ A_UINT8 scanType; /* WMI_SCAN_TYPE */
++} POSTPACK WMI_START_SCAN_CMD;
++
++/*
++ * WMI_SET_SCAN_PARAMS_CMDID
++ */
++#define WMI_SHORTSCANRATIO_DEFAULT 3
++typedef enum {
++ CONNECT_SCAN_CTRL_FLAGS = 0x01, /* set if can scan in the Connect cmd */
++ SCAN_CONNECTED_CTRL_FLAGS = 0x02, /* set if scan for the SSID it is */
++ /* already connected to */
++ ACTIVE_SCAN_CTRL_FLAGS = 0x04, /* set if enable active scan */
++ ROAM_SCAN_CTRL_FLAGS = 0x08, /* set if enable roam scan when bmiss and lowrssi */
++ REPORT_BSSINFO_CTRL_FLAGS = 0x10, /* set if follows customer BSSINFO reporting rule */
++ ENABLE_AUTO_CTRL_FLAGS = 0x20, /* if disabled, target doesn't
++ scan after a disconnect event */
++ ENABLE_SCAN_ABORT_EVENT = 0x40 /* Scan complete event with canceled status will be generated when a scan is prempted before it gets completed */
++
++} WMI_SCAN_CTRL_FLAGS_BITS;
++
++#define CAN_SCAN_IN_CONNECT(flags) (flags & CONNECT_SCAN_CTRL_FLAGS)
++#define CAN_SCAN_CONNECTED(flags) (flags & SCAN_CONNECTED_CTRL_FLAGS)
++#define ENABLE_ACTIVE_SCAN(flags) (flags & ACTIVE_SCAN_CTRL_FLAGS)
++#define ENABLE_ROAM_SCAN(flags) (flags & ROAM_SCAN_CTRL_FLAGS)
++#define CONFIG_REPORT_BSSINFO(flags) (flags & REPORT_BSSINFO_CTRL_FLAGS)
++#define IS_AUTO_SCAN_ENABLED(flags) (flags & ENABLE_AUTO_CTRL_FLAGS)
++#define SCAN_ABORT_EVENT_ENABLED(flags) (flags & ENABLE_SCAN_ABORT_EVENT)
++
++#define DEFAULT_SCAN_CTRL_FLAGS (CONNECT_SCAN_CTRL_FLAGS| SCAN_CONNECTED_CTRL_FLAGS| ACTIVE_SCAN_CTRL_FLAGS| ROAM_SCAN_CTRL_FLAGS | ENABLE_AUTO_CTRL_FLAGS)
++
++
++typedef PREPACK struct {
++ A_UINT16 fg_start_period; /* seconds */
++ A_UINT16 fg_end_period; /* seconds */
++ A_UINT16 bg_period; /* seconds */
++ A_UINT16 maxact_chdwell_time; /* msec */
++ A_UINT16 pas_chdwell_time; /* msec */
++ A_UINT8 shortScanRatio; /* how many shorts scan for one long */
++ A_UINT8 scanCtrlFlags;
++ A_UINT16 minact_chdwell_time; /* msec */
++ A_UINT32 max_dfsch_act_time; /* msecs */
++} POSTPACK WMI_SCAN_PARAMS_CMD;
++
++/*
++ * WMI_SET_BSS_FILTER_CMDID
++ */
++typedef enum {
++ NONE_BSS_FILTER = 0x0, /* no beacons forwarded */
++ ALL_BSS_FILTER, /* all beacons forwarded */
++ PROFILE_FILTER, /* only beacons matching profile */
++ ALL_BUT_PROFILE_FILTER, /* all but beacons matching profile */
++ CURRENT_BSS_FILTER, /* only beacons matching current BSS */
++ ALL_BUT_BSS_FILTER, /* all but beacons matching BSS */
++ PROBED_SSID_FILTER, /* beacons matching probed ssid */
++ LAST_BSS_FILTER, /* marker only */
++} WMI_BSS_FILTER;
++
++typedef PREPACK struct {
++ A_UINT8 bssFilter; /* see WMI_BSS_FILTER */
++ A_UINT32 ieMask;
++} POSTPACK WMI_BSS_FILTER_CMD;
++
++/*
++ * WMI_SET_PROBED_SSID_CMDID
++ */
++#define MAX_PROBED_SSID_INDEX 5
++
++typedef enum {
++ DISABLE_SSID_FLAG = 0, /* disables entry */
++ SPECIFIC_SSID_FLAG = 0x01, /* probes specified ssid */
++ ANY_SSID_FLAG = 0x02, /* probes for any ssid */
++} WMI_SSID_FLAG;
++
++typedef PREPACK struct {
++ A_UINT8 entryIndex; /* 0 to MAX_PROBED_SSID_INDEX */
++ A_UINT8 flag; /* WMI_SSID_FLG */
++ A_UINT8 ssidLength;
++ A_UINT8 ssid[32];
++} POSTPACK WMI_PROBED_SSID_CMD;
++
++/*
++ * WMI_SET_LISTEN_INT_CMDID
++ * The Listen interval is between 15 and 3000 TUs
++ */
++#define MIN_LISTEN_INTERVAL 15
++#define MAX_LISTEN_INTERVAL 5000
++#define MIN_LISTEN_BEACONS 1
++#define MAX_LISTEN_BEACONS 50
++
++typedef PREPACK struct {
++ A_UINT16 listenInterval;
++ A_UINT16 numBeacons;
++} POSTPACK WMI_LISTEN_INT_CMD;
++
++/*
++ * WMI_SET_BEACON_INT_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT16 beaconInterval;
++} POSTPACK WMI_BEACON_INT_CMD;
++
++/*
++ * WMI_SET_BMISS_TIME_CMDID
++ * valid values are between 1000 and 5000 TUs
++ */
++
++#define MIN_BMISS_TIME 1000
++#define MAX_BMISS_TIME 5000
++#define MIN_BMISS_BEACONS 1
++#define MAX_BMISS_BEACONS 50
++
++typedef PREPACK struct {
++ A_UINT16 bmissTime;
++ A_UINT16 numBeacons;
++} POSTPACK WMI_BMISS_TIME_CMD;
++
++/*
++ * WMI_SET_POWER_MODE_CMDID
++ */
++typedef enum {
++ REC_POWER = 0x01,
++ MAX_PERF_POWER,
++} WMI_POWER_MODE;
++
++typedef PREPACK struct {
++ A_UINT8 powerMode; /* WMI_POWER_MODE */
++} POSTPACK WMI_POWER_MODE_CMD;
++
++/*
++ * WMI_SET_POWER_PARAMS_CMDID
++ */
++typedef enum {
++ IGNORE_DTIM = 0x01,
++ NORMAL_DTIM = 0x02,
++ STICK_DTIM = 0x03,
++} WMI_DTIM_POLICY;
++
++typedef PREPACK struct {
++ A_UINT16 idle_period; /* msec */
++ A_UINT16 pspoll_number;
++ A_UINT16 dtim_policy;
++} POSTPACK WMI_POWER_PARAMS_CMD;
++
++typedef PREPACK struct {
++ A_UINT8 power_saving;
++ A_UINT8 ttl; /* number of beacon periods */
++ A_UINT16 atim_windows; /* msec */
++ A_UINT16 timeout_value; /* msec */
++} POSTPACK WMI_IBSS_PM_CAPS_CMD;
++
++/*
++ * WMI_SET_POWERSAVE_TIMERS_POLICY_CMDID
++ */
++typedef enum {
++ IGNORE_TIM_ALL_QUEUES_APSD = 0,
++ PROCESS_TIM_ALL_QUEUES_APSD = 1,
++ IGNORE_TIM_SIMULATED_APSD = 2,
++ PROCESS_TIM_SIMULATED_APSD = 3,
++} APSD_TIM_POLICY;
++
++typedef PREPACK struct {
++ A_UINT16 psPollTimeout; /* msec */
++ A_UINT16 triggerTimeout; /* msec */
++ A_UINT32 apsdTimPolicy; /* TIM behavior with ques APSD enabled. Default is IGNORE_TIM_ALL_QUEUES_APSD */
++ A_UINT32 simulatedAPSDTimPolicy; /* TIM behavior with simulated APSD enabled. Default is PROCESS_TIM_SIMULATED_APSD */
++} POSTPACK WMI_POWERSAVE_TIMERS_POLICY_CMD;
++
++/*
++ * WMI_SET_VOICE_PKT_SIZE_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT16 voicePktSize;
++} POSTPACK WMI_SET_VOICE_PKT_SIZE_CMD;
++
++/*
++ * WMI_SET_MAX_SP_LEN_CMDID
++ */
++typedef enum {
++ DELIVER_ALL_PKT = 0x0,
++ DELIVER_2_PKT = 0x1,
++ DELIVER_4_PKT = 0x2,
++ DELIVER_6_PKT = 0x3,
++} APSD_SP_LEN_TYPE;
++
++typedef PREPACK struct {
++ A_UINT8 maxSPLen;
++} POSTPACK WMI_SET_MAX_SP_LEN_CMD;
++
++/*
++ * WMI_SET_DISC_TIMEOUT_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT8 disconnectTimeout; /* seconds */
++} POSTPACK WMI_DISC_TIMEOUT_CMD;
++
++typedef enum {
++ UPLINK_TRAFFIC = 0,
++ DNLINK_TRAFFIC = 1,
++ BIDIR_TRAFFIC = 2,
++} DIR_TYPE;
++
++typedef enum {
++ DISABLE_FOR_THIS_AC = 0,
++ ENABLE_FOR_THIS_AC = 1,
++ ENABLE_FOR_ALL_AC = 2,
++} VOICEPS_CAP_TYPE;
++
++typedef enum {
++ TRAFFIC_TYPE_APERIODIC = 0,
++ TRAFFIC_TYPE_PERIODIC = 1,
++}TRAFFIC_TYPE;
++
++/*
++ * WMI_CREATE_PSTREAM_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT32 minServiceInt; /* in milli-sec */
++ A_UINT32 maxServiceInt; /* in milli-sec */
++ A_UINT32 inactivityInt; /* in milli-sec */
++ A_UINT32 suspensionInt; /* in milli-sec */
++ A_UINT32 serviceStartTime;
++ A_UINT32 minDataRate; /* in bps */
++ A_UINT32 meanDataRate; /* in bps */
++ A_UINT32 peakDataRate; /* in bps */
++ A_UINT32 maxBurstSize;
++ A_UINT32 delayBound;
++ A_UINT32 minPhyRate; /* in bps */
++ A_UINT32 sba;
++ A_UINT32 mediumTime;
++ A_UINT16 nominalMSDU; /* in octects */
++ A_UINT16 maxMSDU; /* in octects */
++ A_UINT8 trafficClass;
++ A_UINT8 trafficType; /* TRAFFIC_TYPE */
++ A_UINT8 trafficDirection; /* TRAFFIC_DIR */
++ A_UINT8 voicePSCapability; /* VOICEPS_CAP_TYPE */
++ A_UINT8 tsid;
++ A_UINT8 userPriority; /* 802.1D user priority */
++} POSTPACK WMI_CREATE_PSTREAM_CMD;
++
++/*
++ * WMI_DELETE_PSTREAM_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT8 trafficClass;
++ A_UINT8 tsid;
++} POSTPACK WMI_DELETE_PSTREAM_CMD;
++
++/*
++ * WMI_SET_CHANNEL_PARAMS_CMDID
++ */
++typedef enum {
++ WMI_11A_MODE = 0x1,
++ WMI_11G_MODE = 0x2,
++ WMI_11AG_MODE = 0x3,
++ WMI_11B_MODE = 0x4,
++ WMI_11GONLY_MODE = 0x5,
++} WMI_PHY_MODE;
++
++#define WMI_MAX_CHANNELS 32
++
++typedef PREPACK struct {
++ A_UINT8 reserved1;
++ A_UINT8 scanParam; /* set if enable scan */
++ A_UINT8 phyMode; /* see WMI_PHY_MODE */
++ A_UINT8 numChannels; /* how many channels follow */
++ A_UINT16 channelList[1]; /* channels in Mhz */
++} POSTPACK WMI_CHANNEL_PARAMS_CMD;
++
++
++/*
++ * WMI_RSSI_THRESHOLD_PARAMS_CMDID
++ * Setting the polltime to 0 would disable polling.
++ * Threshold values are in the ascending order, and should agree to:
++ * (lowThreshold_lowerVal < lowThreshold_upperVal < highThreshold_lowerVal
++ * < highThreshold_upperVal)
++ */
++
++typedef PREPACK struct WMI_RSSI_THRESHOLD_PARAMS{
++ A_UINT32 pollTime; /* Polling time as a factor of LI */
++ A_INT16 thresholdAbove1_Val; /* lowest of upper */
++ A_INT16 thresholdAbove2_Val;
++ A_INT16 thresholdAbove3_Val;
++ A_INT16 thresholdAbove4_Val;
++ A_INT16 thresholdAbove5_Val;
++ A_INT16 thresholdAbove6_Val; /* highest of upper */
++ A_INT16 thresholdBelow1_Val; /* lowest of bellow */
++ A_INT16 thresholdBelow2_Val;
++ A_INT16 thresholdBelow3_Val;
++ A_INT16 thresholdBelow4_Val;
++ A_INT16 thresholdBelow5_Val;
++ A_INT16 thresholdBelow6_Val; /* highest of bellow */
++ A_UINT8 weight; /* "alpha" */
++ A_UINT8 reserved[3];
++} POSTPACK WMI_RSSI_THRESHOLD_PARAMS_CMD;
++
++/*
++ * WMI_SNR_THRESHOLD_PARAMS_CMDID
++ * Setting the polltime to 0 would disable polling.
++ */
++
++typedef PREPACK struct WMI_SNR_THRESHOLD_PARAMS{
++ A_UINT32 pollTime; /* Polling time as a factor of LI */
++ A_UINT8 weight; /* "alpha" */
++ A_UINT8 thresholdAbove1_Val; /* lowest of uppper*/
++ A_UINT8 thresholdAbove2_Val;
++ A_UINT8 thresholdAbove3_Val;
++ A_UINT8 thresholdAbove4_Val; /* highest of upper */
++ A_UINT8 thresholdBelow1_Val; /* lowest of bellow */
++ A_UINT8 thresholdBelow2_Val;
++ A_UINT8 thresholdBelow3_Val;
++ A_UINT8 thresholdBelow4_Val; /* highest of bellow */
++ A_UINT8 reserved[3];
++} POSTPACK WMI_SNR_THRESHOLD_PARAMS_CMD;
++
++/*
++ * WMI_LQ_THRESHOLD_PARAMS_CMDID
++ */
++typedef PREPACK struct WMI_LQ_THRESHOLD_PARAMS {
++ A_UINT8 enable;
++ A_UINT8 thresholdAbove1_Val;
++ A_UINT8 thresholdAbove2_Val;
++ A_UINT8 thresholdAbove3_Val;
++ A_UINT8 thresholdAbove4_Val;
++ A_UINT8 thresholdBelow1_Val;
++ A_UINT8 thresholdBelow2_Val;
++ A_UINT8 thresholdBelow3_Val;
++ A_UINT8 thresholdBelow4_Val;
++ A_UINT8 reserved[3];
++} POSTPACK WMI_LQ_THRESHOLD_PARAMS_CMD;
++
++typedef enum {
++ WMI_LPREAMBLE_DISABLED = 0,
++ WMI_LPREAMBLE_ENABLED
++} WMI_LPREAMBLE_STATUS;
++
++typedef PREPACK struct {
++ A_UINT8 status;
++}POSTPACK WMI_SET_LPREAMBLE_CMD;
++
++typedef PREPACK struct {
++ A_UINT16 threshold;
++}POSTPACK WMI_SET_RTS_CMD;
++
++/*
++ * WMI_TARGET_ERROR_REPORT_BITMASK_CMDID
++ * Sets the error reporting event bitmask in target. Target clears it
++ * upon an error. Subsequent errors are counted, but not reported
++ * via event, unless the bitmask is set again.
++ */
++typedef PREPACK struct {
++ A_UINT32 bitmask;
++} POSTPACK WMI_TARGET_ERROR_REPORT_BITMASK;
++
++/*
++ * WMI_SET_TX_PWR_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT8 dbM; /* in dbM units */
++} POSTPACK WMI_SET_TX_PWR_CMD, WMI_TX_PWR_REPLY;
++
++/*
++ * WMI_SET_ASSOC_INFO_CMDID
++ *
++ * A maximum of 2 private IEs can be sent in the [Re]Assoc request.
++ * A 3rd one, the CCX version IE can also be set from the host.
++ */
++#define WMI_MAX_ASSOC_INFO_TYPE 2
++#define WMI_CCX_VER_IE 2 /* ieType to set CCX Version IE */
++
++#define WMI_MAX_ASSOC_INFO_LEN 240
++
++typedef PREPACK struct {
++ A_UINT8 ieType;
++ A_UINT8 bufferSize;
++ A_UINT8 assocInfo[1]; /* up to WMI_MAX_ASSOC_INFO_LEN */
++} POSTPACK WMI_SET_ASSOC_INFO_CMD;
++
++
++/*
++ * WMI_GET_TX_PWR_CMDID does not take any parameters
++ */
++
++/*
++ * WMI_ADD_BAD_AP_CMDID
++ */
++#define WMI_MAX_BAD_AP_INDEX 1
++
++typedef PREPACK struct {
++ A_UINT8 badApIndex; /* 0 to WMI_MAX_BAD_AP_INDEX */
++ A_UINT8 bssid[ATH_MAC_LEN];
++} POSTPACK WMI_ADD_BAD_AP_CMD;
++
++/*
++ * WMI_DELETE_BAD_AP_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT8 badApIndex; /* 0 to WMI_MAX_BAD_AP_INDEX */
++} POSTPACK WMI_DELETE_BAD_AP_CMD;
++
++/*
++ * WMI_SET_ACCESS_PARAMS_CMDID
++ */
++#define WMI_DEFAULT_TXOP_ACPARAM 0 /* implies one MSDU */
++#define WMI_DEFAULT_ECWMIN_ACPARAM 4 /* corresponds to CWmin of 15 */
++#define WMI_DEFAULT_ECWMAX_ACPARAM 10 /* corresponds to CWmax of 1023 */
++#define WMI_MAX_CW_ACPARAM 15 /* maximum eCWmin or eCWmax */
++#define WMI_DEFAULT_AIFSN_ACPARAM 2
++#define WMI_MAX_AIFSN_ACPARAM 15
++typedef PREPACK struct {
++ A_UINT16 txop; /* in units of 32 usec */
++ A_UINT8 eCWmin;
++ A_UINT8 eCWmax;
++ A_UINT8 aifsn;
++} POSTPACK WMI_SET_ACCESS_PARAMS_CMD;
++
++
++/*
++ * WMI_SET_RETRY_LIMITS_CMDID
++ *
++ * This command is used to customize the number of retries the
++ * wlan device will perform on a given frame.
++ */
++#define WMI_MIN_RETRIES 2
++#define WMI_MAX_RETRIES 13
++typedef enum {
++ MGMT_FRAMETYPE = 0,
++ CONTROL_FRAMETYPE = 1,
++ DATA_FRAMETYPE = 2
++} WMI_FRAMETYPE;
++
++typedef PREPACK struct {
++ A_UINT8 frameType; /* WMI_FRAMETYPE */
++ A_UINT8 trafficClass; /* applies only to DATA_FRAMETYPE */
++ A_UINT8 maxRetries;
++ A_UINT8 enableNotify;
++} POSTPACK WMI_SET_RETRY_LIMITS_CMD;
++
++/*
++ * WMI_SET_ROAM_CTRL_CMDID
++ *
++ * This command is used to influence the Roaming behaviour
++ * Set the host biases of the BSSs before setting the roam mode as bias
++ * based.
++ */
++
++/*
++ * Different types of Roam Control
++ */
++
++typedef enum {
++ WMI_FORCE_ROAM = 1, /* Roam to the specified BSSID */
++ WMI_SET_ROAM_MODE = 2, /* default ,progd bias, no roam */
++ WMI_SET_HOST_BIAS = 3, /* Set the Host Bias */
++ WMI_SET_LOWRSSI_SCAN_PARAMS = 4, /* Set lowrssi Scan parameters */
++} WMI_ROAM_CTRL_TYPE;
++
++#define WMI_MIN_ROAM_CTRL_TYPE WMI_FORCE_ROAM
++#define WMI_MAX_ROAM_CTRL_TYPE WMI_SET_LOWRSSI_SCAN_PARAMS
++
++/*
++ * ROAM MODES
++ */
++
++typedef enum {
++ WMI_DEFAULT_ROAM_MODE = 1, /* RSSI based ROAM */
++ WMI_HOST_BIAS_ROAM_MODE = 2, /* HOST BIAS based ROAM */
++ WMI_LOCK_BSS_MODE = 3 /* Lock to the Current BSS - no Roam */
++} WMI_ROAM_MODE;
++
++/*
++ * BSS HOST BIAS INFO
++ */
++
++typedef PREPACK struct {
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_INT8 bias;
++} POSTPACK WMI_BSS_BIAS;
++
++typedef PREPACK struct {
++ A_UINT8 numBss;
++ WMI_BSS_BIAS bssBias[1];
++} POSTPACK WMI_BSS_BIAS_INFO;
++
++typedef PREPACK struct WMI_LOWRSSI_SCAN_PARAMS {
++ A_UINT16 lowrssi_scan_period;
++ A_INT16 lowrssi_scan_threshold;
++ A_INT16 lowrssi_roam_threshold;
++ A_UINT8 roam_rssi_floor;
++ A_UINT8 reserved[1]; /* For alignment */
++} POSTPACK WMI_LOWRSSI_SCAN_PARAMS;
++
++typedef PREPACK struct {
++ PREPACK union {
++ A_UINT8 bssid[ATH_MAC_LEN]; /* WMI_FORCE_ROAM */
++ A_UINT8 roamMode; /* WMI_SET_ROAM_MODE */
++ WMI_BSS_BIAS_INFO bssBiasInfo; /* WMI_SET_HOST_BIAS */
++ WMI_LOWRSSI_SCAN_PARAMS lrScanParams;
++ } POSTPACK info;
++ A_UINT8 roamCtrlType ;
++} POSTPACK WMI_SET_ROAM_CTRL_CMD;
++
++/*
++ * WMI_ENABLE_RM_CMDID
++ */
++typedef PREPACK struct {
++ A_BOOL enable_radio_measurements;
++} POSTPACK WMI_ENABLE_RM_CMD;
++
++/*
++ * WMI_SET_MAX_OFFHOME_DURATION_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT8 max_offhome_duration;
++} POSTPACK WMI_SET_MAX_OFFHOME_DURATION_CMD;
++
++typedef PREPACK struct {
++ A_UINT32 frequency;
++ A_UINT8 threshold;
++} POSTPACK WMI_SET_HB_CHALLENGE_RESP_PARAMS_CMD;
++
++typedef enum {
++ BT_STREAM_UNDEF = 0,
++ BT_STREAM_SCO, /* SCO stream */
++ BT_STREAM_A2DP, /* A2DP stream */
++ BT_STREAM_MAX
++} BT_STREAM_TYPE;
++
++typedef enum {
++ BT_PARAM_SCO = 1, /* SCO stream parameters */
++ BT_PARAM_A2DP, /* A2DP stream parameters */
++ BT_PARAM_MISC, /* miscellaneous parameters */
++ BT_PARAM_REGS, /* co-existence register parameters */
++ BT_PARAM_MAX
++} BT_PARAM_TYPE;
++
++typedef enum {
++ BT_STATUS_UNDEF = 0,
++ BT_STATUS_START,
++ BT_STATUS_STOP,
++ BT_STATUS_RESUME,
++ BT_STATUS_SUSPEND,
++ BT_STATUS_MAX
++} BT_STREAM_STATUS;
++
++typedef PREPACK struct {
++ A_UINT8 streamType;
++ A_UINT8 status;
++} POSTPACK WMI_SET_BT_STATUS_CMD;
++
++typedef PREPACK struct {
++ A_UINT8 noSCOPkts;
++ A_UINT8 pspollTimeout;
++ A_UINT8 stompbt;
++} POSTPACK BT_PARAMS_SCO;
++
++typedef PREPACK struct {
++ A_UINT32 period;
++ A_UINT32 dutycycle;
++ A_UINT8 stompbt;
++} POSTPACK BT_PARAMS_A2DP;
++
++typedef PREPACK struct {
++ A_UINT32 mode;
++ A_UINT32 scoWghts;
++ A_UINT32 a2dpWghts;
++ A_UINT32 genWghts;
++ A_UINT32 mode2;
++ A_UINT8 setVal;
++} POSTPACK BT_COEX_REGS;
++
++typedef enum {
++ WLAN_PROTECT_POLICY = 1,
++ WLAN_COEX_CTRL_FLAGS
++} BT_PARAMS_MISC_TYPE;
++
++typedef enum {
++ WLAN_PROTECT_PER_STREAM = 0x01, /* default */
++ WLAN_PROTECT_ANY_TX = 0x02
++} WLAN_PROTECT_FLAGS;
++
++
++#define WLAN_DISABLE_COEX_IN_DISCONNECT 0x01 /* default */
++#define WLAN_KEEP_COEX_IN_DISCONNECT 0x02
++#define WLAN_STOMPBT_IN_DISCONNECT 0x04
++
++#define WLAN_DISABLE_COEX_IN_ROAM 0x10 /* default */
++#define WLAN_KEEP_COEX_IN_ROAM 0x20
++#define WLAN_STOMPBT_IN_ROAM 0x40
++
++#define WLAN_DISABLE_COEX_IN_SCAN 0x100 /* default */
++#define WLAN_KEEP_COEX_IN_SCAN 0x200
++#define WLAN_STOMPBT_IN_SCAN 0x400
++
++#define WLAN_DISABLE_COEX_BT_OFF 0x1000 /* default */
++#define WLAN_KEEP_COEX_BT_OFF 0x2000
++#define WLAN_STOMPBT_BT_OFF 0x4000
++
++typedef PREPACK struct {
++ A_UINT32 period;
++ A_UINT32 dutycycle;
++ A_UINT8 stompbt;
++ A_UINT8 policy;
++} POSTPACK WLAN_PROTECT_POLICY_TYPE;
++
++typedef PREPACK struct {
++ PREPACK union {
++ WLAN_PROTECT_POLICY_TYPE protectParams;
++ A_UINT16 wlanCtrlFlags;
++ } POSTPACK info;
++ A_UINT8 paramType;
++} POSTPACK BT_PARAMS_MISC;
++
++typedef PREPACK struct {
++ PREPACK union {
++ BT_PARAMS_SCO scoParams;
++ BT_PARAMS_A2DP a2dpParams;
++ BT_PARAMS_MISC miscParams;
++ BT_COEX_REGS regs;
++ } POSTPACK info;
++ A_UINT8 paramType;
++} POSTPACK WMI_SET_BT_PARAMS_CMD;
++
++/*
++ * Command Replies
++ */
++
++/*
++ * WMI_GET_CHANNEL_LIST_CMDID reply
++ */
++typedef PREPACK struct {
++ A_UINT8 reserved1;
++ A_UINT8 numChannels; /* number of channels in reply */
++ A_UINT16 channelList[1]; /* channel in Mhz */
++} POSTPACK WMI_CHANNEL_LIST_REPLY;
++
++typedef enum {
++ A_SUCCEEDED = A_OK,
++ A_FAILED_DELETE_STREAM_DOESNOT_EXIST=250,
++ A_SUCCEEDED_MODIFY_STREAM=251,
++ A_FAILED_INVALID_STREAM = 252,
++ A_FAILED_MAX_THINSTREAMS = 253,
++ A_FAILED_CREATE_REMOVE_PSTREAM_FIRST = 254,
++} PSTREAM_REPLY_STATUS;
++
++/*
++ * List of Events (target to host)
++ */
++typedef enum {
++ WMI_READY_EVENTID = 0x1001,
++ WMI_CONNECT_EVENTID,
++ WMI_DISCONNECT_EVENTID,
++ WMI_BSSINFO_EVENTID,
++ WMI_CMDERROR_EVENTID,
++ WMI_REGDOMAIN_EVENTID,
++ WMI_PSTREAM_TIMEOUT_EVENTID,
++ WMI_NEIGHBOR_REPORT_EVENTID,
++ WMI_TKIP_MICERR_EVENTID,
++ WMI_SCAN_COMPLETE_EVENTID,
++ WMI_REPORT_STATISTICS_EVENTID,
++ WMI_RSSI_THRESHOLD_EVENTID,
++ WMI_ERROR_REPORT_EVENTID,
++ WMI_OPT_RX_FRAME_EVENTID,
++ WMI_REPORT_ROAM_TBL_EVENTID,
++ WMI_EXTENSION_EVENTID,
++ WMI_CAC_EVENTID,
++ WMI_SNR_THRESHOLD_EVENTID,
++ WMI_LQ_THRESHOLD_EVENTID,
++ WMI_TX_RETRY_ERR_EVENTID,
++ WMI_REPORT_ROAM_DATA_EVENTID,
++ WMI_TEST_EVENTID,
++ WMI_APLIST_EVENTID,
++ WMI_GET_WOW_LIST_EVENTID,
++ WMI_GET_PMKID_LIST_EVENTID
++} WMI_EVENT_ID;
++
++typedef enum {
++ WMI_11A_CAPABILITY = 1,
++ WMI_11G_CAPABILITY = 2,
++ WMI_11AG_CAPABILITY = 3,
++} WMI_PHY_CAPABILITY;
++
++typedef PREPACK struct {
++ A_UINT8 macaddr[ATH_MAC_LEN];
++ A_UINT8 phyCapability; /* WMI_PHY_CAPABILITY */
++} POSTPACK WMI_READY_EVENT;
++
++/*
++ * Connect Event
++ */
++typedef PREPACK struct {
++ A_UINT16 channel;
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_UINT16 listenInterval;
++ A_UINT16 beaconInterval;
++ A_UINT32 networkType;
++ A_UINT8 beaconIeLen;
++ A_UINT8 assocReqLen;
++ A_UINT8 assocRespLen;
++ A_UINT8 assocInfo[1];
++} POSTPACK WMI_CONNECT_EVENT;
++
++/*
++ * Disconnect Event
++ */
++typedef enum {
++ NO_NETWORK_AVAIL = 0x01,
++ LOST_LINK = 0x02, /* bmiss */
++ DISCONNECT_CMD = 0x03,
++ BSS_DISCONNECTED = 0x04,
++ AUTH_FAILED = 0x05,
++ ASSOC_FAILED = 0x06,
++ NO_RESOURCES_AVAIL = 0x07,
++ CSERV_DISCONNECT = 0x08,
++ INVALID_PROFILE = 0x0a,
++ DOT11H_CHANNEL_SWITCH = 0x0b,
++} WMI_DISCONNECT_REASON;
++
++typedef PREPACK struct {
++ A_UINT16 protocolReasonStatus; /* reason code, see 802.11 spec. */
++ A_UINT8 bssid[ATH_MAC_LEN]; /* set if known */
++ A_UINT8 disconnectReason ; /* see WMI_DISCONNECT_REASON */
++ A_UINT8 assocRespLen;
++ A_UINT8 assocInfo[1];
++} POSTPACK WMI_DISCONNECT_EVENT;
++
++/*
++ * BSS Info Event.
++ * Mechanism used to inform host of the presence and characteristic of
++ * wireless networks present. Consists of bss info header followed by
++ * the beacon or probe-response frame body. The 802.11 header is not included.
++ */
++typedef enum {
++ BEACON_FTYPE = 0x1,
++ PROBERESP_FTYPE,
++ ACTION_MGMT_FTYPE,
++} WMI_BI_FTYPE;
++
++enum {
++ BSS_ELEMID_CHANSWITCH = 0x01,
++ BSS_ELEMID_ATHEROS = 0x02,
++};
++
++typedef PREPACK struct {
++ A_UINT16 channel;
++ A_UINT8 frameType; /* see WMI_BI_FTYPE */
++ A_UINT8 snr;
++ A_INT16 rssi;
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_UINT32 ieMask;
++} POSTPACK WMI_BSS_INFO_HDR;
++
++/*
++ * Command Error Event
++ */
++typedef enum {
++ INVALID_PARAM = 0x01,
++ ILLEGAL_STATE = 0x02,
++ INTERNAL_ERROR = 0x03,
++} WMI_ERROR_CODE;
++
++typedef PREPACK struct {
++ A_UINT16 commandId;
++ A_UINT8 errorCode;
++} POSTPACK WMI_CMD_ERROR_EVENT;
++
++/*
++ * New Regulatory Domain Event
++ */
++typedef PREPACK struct {
++ A_UINT32 regDomain;
++} POSTPACK WMI_REG_DOMAIN_EVENT;
++
++typedef PREPACK struct {
++ A_UINT8 trafficClass;
++} POSTPACK WMI_PSTREAM_TIMEOUT_EVENT;
++
++/*
++ * The WMI_NEIGHBOR_REPORT Event is generated by the target to inform
++ * the host of BSS's it has found that matches the current profile.
++ * It can be used by the host to cache PMKs and/to initiate pre-authentication
++ * if the BSS supports it. The first bssid is always the current associated
++ * BSS.
++ * The bssid and bssFlags information repeats according to the number
++ * or APs reported.
++ */
++typedef enum {
++ WMI_DEFAULT_BSS_FLAGS = 0x00,
++ WMI_PREAUTH_CAPABLE_BSS = 0x01,
++ WMI_PMKID_VALID_BSS = 0x02,
++} WMI_BSS_FLAGS;
++
++typedef PREPACK struct {
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_UINT8 bssFlags; /* see WMI_BSS_FLAGS */
++} POSTPACK WMI_NEIGHBOR_INFO;
++
++typedef PREPACK struct {
++ A_INT8 numberOfAps;
++ WMI_NEIGHBOR_INFO neighbor[1];
++} POSTPACK WMI_NEIGHBOR_REPORT_EVENT;
++
++/*
++ * TKIP MIC Error Event
++ */
++typedef PREPACK struct {
++ A_UINT8 keyid;
++ A_UINT8 ismcast;
++} POSTPACK WMI_TKIP_MICERR_EVENT;
++
++/*
++ * WMI_SCAN_COMPLETE_EVENTID - no parameters (old), staus parameter (new)
++ */
++typedef PREPACK struct {
++ A_STATUS status;
++} POSTPACK WMI_SCAN_COMPLETE_EVENT;
++
++#define MAX_OPT_DATA_LEN 1400
++
++/*
++ * WMI_SET_ADHOC_BSSID_CMDID
++ */
++typedef PREPACK struct {
++ A_UINT8 bssid[ATH_MAC_LEN];
++} POSTPACK WMI_SET_ADHOC_BSSID_CMD;
++
++/*
++ * WMI_SET_OPT_MODE_CMDID
++ */
++typedef enum {
++ SPECIAL_OFF,
++ SPECIAL_ON,
++} OPT_MODE_TYPE;
++
++typedef PREPACK struct {
++ A_UINT8 optMode;
++} POSTPACK WMI_SET_OPT_MODE_CMD;
++
++/*
++ * WMI_TX_OPT_FRAME_CMDID
++ */
++typedef enum {
++ OPT_PROBE_REQ = 0x01,
++ OPT_PROBE_RESP = 0x02,
++ OPT_CPPP_START = 0x03,
++ OPT_CPPP_STOP = 0x04,
++} WMI_OPT_FTYPE;
++
++typedef PREPACK struct {
++ A_UINT16 optIEDataLen;
++ A_UINT8 frmType;
++ A_UINT8 dstAddr[ATH_MAC_LEN];
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_UINT8 reserved; /* For alignment */
++ A_UINT8 optIEData[1];
++} POSTPACK WMI_OPT_TX_FRAME_CMD;
++
++/*
++ * Special frame receive Event.
++ * Mechanism used to inform host of the receiption of the special frames.
++ * Consists of special frame info header followed by special frame body.
++ * The 802.11 header is not included.
++ */
++typedef PREPACK struct {
++ A_UINT16 channel;
++ A_UINT8 frameType; /* see WMI_OPT_FTYPE */
++ A_INT8 snr;
++ A_UINT8 srcAddr[ATH_MAC_LEN];
++ A_UINT8 bssid[ATH_MAC_LEN];
++} POSTPACK WMI_OPT_RX_INFO_HDR;
++
++/*
++ * Reporting statistics.
++ */
++typedef PREPACK struct {
++ A_UINT32 tx_packets;
++ A_UINT32 tx_bytes;
++ A_UINT32 tx_unicast_pkts;
++ A_UINT32 tx_unicast_bytes;
++ A_UINT32 tx_multicast_pkts;
++ A_UINT32 tx_multicast_bytes;
++ A_UINT32 tx_broadcast_pkts;
++ A_UINT32 tx_broadcast_bytes;
++ A_UINT32 tx_rts_success_cnt;
++ A_UINT32 tx_packet_per_ac[4];
++ A_UINT32 tx_errors_per_ac[4];
++
++ A_UINT32 tx_errors;
++ A_UINT32 tx_failed_cnt;
++ A_UINT32 tx_retry_cnt;
++ A_UINT32 tx_rts_fail_cnt;
++ A_INT32 tx_unicast_rate;
++}POSTPACK tx_stats_t;
++
++typedef PREPACK struct {
++ A_UINT32 rx_packets;
++ A_UINT32 rx_bytes;
++ A_UINT32 rx_unicast_pkts;
++ A_UINT32 rx_unicast_bytes;
++ A_UINT32 rx_multicast_pkts;
++ A_UINT32 rx_multicast_bytes;
++ A_UINT32 rx_broadcast_pkts;
++ A_UINT32 rx_broadcast_bytes;
++ A_UINT32 rx_fragment_pkt;
++
++ A_UINT32 rx_errors;
++ A_UINT32 rx_crcerr;
++ A_UINT32 rx_key_cache_miss;
++ A_UINT32 rx_decrypt_err;
++ A_UINT32 rx_duplicate_frames;
++ A_INT32 rx_unicast_rate;
++}POSTPACK rx_stats_t;
++
++typedef PREPACK struct {
++ A_UINT32 tkip_local_mic_failure;
++ A_UINT32 tkip_counter_measures_invoked;
++ A_UINT32 tkip_replays;
++ A_UINT32 tkip_format_errors;
++ A_UINT32 ccmp_format_errors;
++ A_UINT32 ccmp_replays;
++}POSTPACK tkip_ccmp_stats_t;
++
++typedef PREPACK struct {
++ A_UINT32 power_save_failure_cnt;
++}POSTPACK pm_stats_t;
++
++typedef PREPACK struct {
++ A_UINT32 cs_bmiss_cnt;
++ A_UINT32 cs_lowRssi_cnt;
++ A_UINT16 cs_connect_cnt;
++ A_UINT16 cs_disconnect_cnt;
++ A_INT16 cs_aveBeacon_rssi;
++ A_UINT16 cs_roam_count;
++ A_UINT16 cs_rssi;
++ A_UINT8 cs_snr;
++ A_UINT8 cs_aveBeacon_snr;
++ A_UINT8 cs_lastRoam_msec;
++} POSTPACK cserv_stats_t;
++
++typedef PREPACK struct {
++ tx_stats_t tx_stats;
++ rx_stats_t rx_stats;
++ tkip_ccmp_stats_t tkipCcmpStats;
++}POSTPACK wlan_net_stats_t;
++
++typedef PREPACK struct {
++ A_UINT32 wow_num_pkts_dropped;
++ A_UINT16 wow_num_events_discarded;
++ A_UINT8 wow_num_host_pkt_wakeups;
++ A_UINT8 wow_num_host_event_wakeups;
++} POSTPACK wlan_wow_stats_t;
++
++typedef PREPACK struct {
++ A_UINT32 lqVal;
++ A_INT32 noise_floor_calibation;
++ pm_stats_t pmStats;
++ wlan_net_stats_t txrxStats;
++ wlan_wow_stats_t wowStats;
++ cserv_stats_t cservStats;
++} POSTPACK WMI_TARGET_STATS;
++
++/*
++ * WMI_RSSI_THRESHOLD_EVENTID.
++ * Indicate the RSSI events to host. Events are indicated when we breach a
++ * thresold value.
++ */
++typedef enum{
++ WMI_RSSI_THRESHOLD1_ABOVE = 0,
++ WMI_RSSI_THRESHOLD2_ABOVE,
++ WMI_RSSI_THRESHOLD3_ABOVE,
++ WMI_RSSI_THRESHOLD4_ABOVE,
++ WMI_RSSI_THRESHOLD5_ABOVE,
++ WMI_RSSI_THRESHOLD6_ABOVE,
++ WMI_RSSI_THRESHOLD1_BELOW,
++ WMI_RSSI_THRESHOLD2_BELOW,
++ WMI_RSSI_THRESHOLD3_BELOW,
++ WMI_RSSI_THRESHOLD4_BELOW,
++ WMI_RSSI_THRESHOLD5_BELOW,
++ WMI_RSSI_THRESHOLD6_BELOW
++}WMI_RSSI_THRESHOLD_VAL;
++
++typedef PREPACK struct {
++ A_INT16 rssi;
++ A_UINT8 range;
++}POSTPACK WMI_RSSI_THRESHOLD_EVENT;
++
++/*
++ * WMI_ERROR_REPORT_EVENTID
++ */
++typedef enum{
++ WMI_TARGET_PM_ERR_FAIL = 0x00000001,
++ WMI_TARGET_KEY_NOT_FOUND = 0x00000002,
++ WMI_TARGET_DECRYPTION_ERR = 0x00000004,
++ WMI_TARGET_BMISS = 0x00000008,
++ WMI_PSDISABLE_NODE_JOIN = 0x00000010,
++ WMI_TARGET_COM_ERR = 0x00000020,
++ WMI_TARGET_FATAL_ERR = 0x00000040
++} WMI_TARGET_ERROR_VAL;
++
++typedef PREPACK struct {
++ A_UINT32 errorVal;
++}POSTPACK WMI_TARGET_ERROR_REPORT_EVENT;
++
++typedef PREPACK struct {
++ A_UINT8 retrys;
++}POSTPACK WMI_TX_RETRY_ERR_EVENT;
++
++typedef enum{
++ WMI_SNR_THRESHOLD1_ABOVE = 1,
++ WMI_SNR_THRESHOLD1_BELOW,
++ WMI_SNR_THRESHOLD2_ABOVE,
++ WMI_SNR_THRESHOLD2_BELOW,
++ WMI_SNR_THRESHOLD3_ABOVE,
++ WMI_SNR_THRESHOLD3_BELOW,
++ WMI_SNR_THRESHOLD4_ABOVE,
++ WMI_SNR_THRESHOLD4_BELOW
++} WMI_SNR_THRESHOLD_VAL;
++
++typedef PREPACK struct {
++ A_UINT8 range; /* WMI_SNR_THRESHOLD_VAL */
++ A_UINT8 snr;
++}POSTPACK WMI_SNR_THRESHOLD_EVENT;
++
++typedef enum{
++ WMI_LQ_THRESHOLD1_ABOVE = 1,
++ WMI_LQ_THRESHOLD1_BELOW,
++ WMI_LQ_THRESHOLD2_ABOVE,
++ WMI_LQ_THRESHOLD2_BELOW,
++ WMI_LQ_THRESHOLD3_ABOVE,
++ WMI_LQ_THRESHOLD3_BELOW,
++ WMI_LQ_THRESHOLD4_ABOVE,
++ WMI_LQ_THRESHOLD4_BELOW
++} WMI_LQ_THRESHOLD_VAL;
++
++typedef PREPACK struct {
++ A_INT32 lq;
++ A_UINT8 range; /* WMI_LQ_THRESHOLD_VAL */
++}POSTPACK WMI_LQ_THRESHOLD_EVENT;
++/*
++ * WMI_REPORT_ROAM_TBL_EVENTID
++ */
++#define MAX_ROAM_TBL_CAND 5
++
++typedef PREPACK struct {
++ A_INT32 roam_util;
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_INT8 rssi;
++ A_INT8 rssidt;
++ A_INT8 last_rssi;
++ A_INT8 util;
++ A_INT8 bias;
++ A_UINT8 reserved; /* For alignment */
++} POSTPACK WMI_BSS_ROAM_INFO;
++
++
++typedef PREPACK struct {
++ A_UINT16 roamMode;
++ A_UINT16 numEntries;
++ WMI_BSS_ROAM_INFO bssRoamInfo[1];
++} POSTPACK WMI_TARGET_ROAM_TBL;
++
++/*
++ * WMI_CAC_EVENTID
++ */
++typedef enum {
++ CAC_INDICATION_ADMISSION = 0x00,
++ CAC_INDICATION_ADMISSION_RESP = 0x01,
++ CAC_INDICATION_DELETE = 0x02,
++ CAC_INDICATION_NO_RESP = 0x03,
++}CAC_INDICATION;
++
++#define WMM_TSPEC_IE_LEN 63
++
++typedef PREPACK struct {
++ A_UINT8 ac;
++ A_UINT8 cac_indication;
++ A_UINT8 statusCode;
++ A_UINT8 tspecSuggestion[WMM_TSPEC_IE_LEN];
++}POSTPACK WMI_CAC_EVENT;
++
++/*
++ * WMI_APLIST_EVENTID
++ */
++
++typedef enum {
++ APLIST_VER1 = 1,
++} APLIST_VER;
++
++typedef PREPACK struct {
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_UINT16 channel;
++} POSTPACK WMI_AP_INFO_V1;
++
++typedef PREPACK union {
++ WMI_AP_INFO_V1 apInfoV1;
++} POSTPACK WMI_AP_INFO;
++
++typedef PREPACK struct {
++ A_UINT8 apListVer;
++ A_UINT8 numAP;
++ WMI_AP_INFO apList[1];
++} POSTPACK WMI_APLIST_EVENT;
++
++/*
++ * developer commands
++ */
++
++/*
++ * WMI_SET_BITRATE_CMDID
++ *
++ * Get bit rate cmd uses same definition as set bit rate cmd
++ */
++typedef enum {
++ RATE_AUTO = -1,
++ RATE_1Mb = 0,
++ RATE_2Mb = 1,
++ RATE_5_5Mb = 2,
++ RATE_11Mb = 3,
++ RATE_6Mb = 4,
++ RATE_9Mb = 5,
++ RATE_12Mb = 6,
++ RATE_18Mb = 7,
++ RATE_24Mb = 8,
++ RATE_36Mb = 9,
++ RATE_48Mb = 10,
++ RATE_54Mb = 11,
++} WMI_BIT_RATE;
++
++typedef PREPACK struct {
++ A_INT8 rateIndex; /* see WMI_BIT_RATE */
++} POSTPACK WMI_BIT_RATE_CMD, WMI_BIT_RATE_REPLY;
++
++/*
++ * WMI_SET_FIXRATES_CMDID
++ *
++ * Get fix rates cmd uses same definition as set fix rates cmd
++ */
++typedef enum {
++ FIX_RATE_1Mb = 0x1,
++ FIX_RATE_2Mb = 0x2,
++ FIX_RATE_5_5Mb = 0x4,
++ FIX_RATE_11Mb = 0x8,
++ FIX_RATE_6Mb = 0x10,
++ FIX_RATE_9Mb = 0x20,
++ FIX_RATE_12Mb = 0x40,
++ FIX_RATE_18Mb = 0x80,
++ FIX_RATE_24Mb = 0x100,
++ FIX_RATE_36Mb = 0x200,
++ FIX_RATE_48Mb = 0x400,
++ FIX_RATE_54Mb = 0x800,
++} WMI_FIX_RATES_MASK;
++
++typedef PREPACK struct {
++ A_UINT16 fixRateMask; /* see WMI_BIT_RATE */
++} POSTPACK WMI_FIX_RATES_CMD, WMI_FIX_RATES_REPLY;
++
++/*
++ * WMI_SET_RECONNECT_AUTH_MODE_CMDID
++ *
++ * Set authentication mode
++ */
++typedef enum {
++ RECONN_DO_AUTH = 0x00,
++ RECONN_NOT_AUTH = 0x01
++} WMI_AUTH_MODE;
++
++typedef PREPACK struct {
++ A_UINT8 mode;
++} POSTPACK WMI_SET_AUTH_MODE_CMD;
++
++/*
++ * WMI_SET_REASSOC_MODE_CMDID
++ *
++ * Set authentication mode
++ */
++typedef enum {
++ REASSOC_DO_DISASSOC = 0x00,
++ REASSOC_DONOT_DISASSOC = 0x01
++} WMI_REASSOC_MODE;
++
++typedef PREPACK struct {
++ A_UINT8 mode;
++}POSTPACK WMI_SET_REASSOC_MODE_CMD;
++
++typedef enum {
++ ROAM_DATA_TIME = 1, /* Get The Roam Time Data */
++} ROAM_DATA_TYPE;
++
++typedef PREPACK struct {
++ A_UINT32 disassoc_time;
++ A_UINT32 no_txrx_time;
++ A_UINT32 assoc_time;
++ A_UINT32 allow_txrx_time;
++ A_UINT32 last_data_txrx_time;
++ A_UINT32 first_data_txrx_time;
++ A_UINT8 disassoc_bssid[ATH_MAC_LEN];
++ A_INT8 disassoc_bss_rssi;
++ A_UINT8 assoc_bssid[ATH_MAC_LEN];
++ A_INT8 assoc_bss_rssi;
++} POSTPACK WMI_TARGET_ROAM_TIME;
++
++typedef PREPACK struct {
++ PREPACK union {
++ WMI_TARGET_ROAM_TIME roamTime;
++ } POSTPACK u;
++ A_UINT8 roamDataType ;
++} POSTPACK WMI_TARGET_ROAM_DATA;
++
++typedef enum {
++ WMI_WMM_DISABLED = 0,
++ WMI_WMM_ENABLED
++} WMI_WMM_STATUS;
++
++typedef PREPACK struct {
++ A_UINT8 status;
++}POSTPACK WMI_SET_WMM_CMD;
++
++typedef enum {
++ WMI_TXOP_DISABLED = 0,
++ WMI_TXOP_ENABLED
++} WMI_TXOP_CFG;
++
++typedef PREPACK struct {
++ A_UINT8 txopEnable;
++}POSTPACK WMI_SET_WMM_TXOP_CMD;
++
++typedef PREPACK struct {
++ A_UINT8 keepaliveInterval;
++} POSTPACK WMI_SET_KEEPALIVE_CMD;
++
++typedef PREPACK struct {
++ A_BOOL configured;
++ A_UINT8 keepaliveInterval;
++} POSTPACK WMI_GET_KEEPALIVE_CMD;
++
++/*
++ * Add Application specified IE to a management frame
++ */
++#define WMI_MAX_IE_LEN 78
++
++typedef PREPACK struct {
++ A_UINT8 mgmtFrmType; /* one of WMI_MGMT_FRAME_TYPE */
++ A_UINT8 ieLen; /* Length of the IE that should be added to the MGMT frame */
++ A_UINT8 ieInfo[1];
++} POSTPACK WMI_SET_APPIE_CMD;
++
++/*
++ * Notify the WSC registration status to the target
++ */
++#define WSC_REG_ACTIVE 1
++#define WSC_REG_INACTIVE 0
++/* Generic Hal Interface for setting hal paramters. */
++/* Add new Set HAL Param cmdIds here for newer params */
++typedef enum {
++ WHAL_SETCABTO_CMDID = 1,
++}WHAL_CMDID;
++
++typedef PREPACK struct {
++ A_UINT8 cabTimeOut;
++} POSTPACK WHAL_SETCABTO_PARAM;
++
++typedef PREPACK struct {
++ A_UINT8 whalCmdId;
++ A_UINT8 data[1];
++} POSTPACK WHAL_PARAMCMD;
++
++
++#define WOW_MAX_FILTER_LISTS 1 /*4*/
++#define WOW_MAX_FILTERS_PER_LIST 4
++#define WOW_PATTERN_SIZE 64
++#define WOW_MASK_SIZE 64
++
++typedef PREPACK struct {
++ A_UINT8 wow_valid_filter;
++ A_UINT8 wow_filter_id;
++ A_UINT8 wow_filter_size;
++ A_UINT8 wow_filter_offset;
++ A_UINT8 wow_filter_mask[WOW_MASK_SIZE];
++ A_UINT8 wow_filter_pattern[WOW_PATTERN_SIZE];
++} POSTPACK WOW_FILTER;
++
++
++typedef PREPACK struct {
++ A_UINT8 wow_valid_list;
++ A_UINT8 wow_list_id;
++ A_UINT8 wow_num_filters;
++ A_UINT8 wow_total_list_size;
++ WOW_FILTER list[WOW_MAX_FILTERS_PER_LIST];
++} POSTPACK WOW_FILTER_LIST;
++
++typedef PREPACK struct {
++ A_BOOL awake;
++ A_BOOL asleep;
++} POSTPACK WMI_SET_HOST_SLEEP_MODE_CMD;
++
++typedef PREPACK struct {
++ A_BOOL enable_wow;
++} POSTPACK WMI_SET_WOW_MODE_CMD;
++
++typedef PREPACK struct {
++ A_UINT8 filter_list_id;
++} POSTPACK WMI_GET_WOW_LIST_CMD;
++
++/*
++ * WMI_GET_WOW_LIST_CMD reply
++ */
++typedef PREPACK struct {
++ A_UINT8 num_filters; /* number of patterns in reply */
++ A_UINT8 this_filter_num; /* this is filter # x of total num_filters */
++ A_UINT8 wow_mode;
++ A_UINT8 host_mode;
++ WOW_FILTER wow_filters[1];
++} POSTPACK WMI_GET_WOW_LIST_REPLY;
++
++typedef PREPACK struct {
++ A_UINT8 filter_list_id;
++ A_UINT8 filter_size;
++ A_UINT8 filter_offset;
++ A_UINT8 filter[1];
++} POSTPACK WMI_ADD_WOW_PATTERN_CMD;
++
++typedef PREPACK struct {
++ A_UINT16 filter_list_id;
++ A_UINT16 filter_id;
++} POSTPACK WMI_DEL_WOW_PATTERN_CMD;
++
++typedef PREPACK struct {
++ A_UINT8 macaddr[ATH_MAC_LEN];
++} POSTPACK WMI_SET_MAC_ADDRESS_CMD;
++
++/*
++ * WMI_SET_AKMP_PARAMS_CMD
++ */
++
++#define WMI_AKMP_MULTI_PMKID_EN 0x000001
++
++typedef PREPACK struct {
++ A_UINT32 akmpInfo;
++} POSTPACK WMI_SET_AKMP_PARAMS_CMD;
++
++typedef PREPACK struct {
++ A_UINT8 pmkid[WMI_PMKID_LEN];
++} POSTPACK WMI_PMKID;
++
++/*
++ * WMI_SET_PMKID_LIST_CMD
++ */
++#define WMI_MAX_PMKID_CACHE 8
++
++typedef PREPACK struct {
++ A_UINT32 numPMKID;
++ WMI_PMKID pmkidList[WMI_MAX_PMKID_CACHE];
++} POSTPACK WMI_SET_PMKID_LIST_CMD;
++
++/*
++ * WMI_GET_PMKID_LIST_CMD Reply
++ * Following the Number of PMKIDs is the list of PMKIDs
++ */
++typedef PREPACK struct {
++ A_UINT32 numPMKID;
++ WMI_PMKID pmkidList[1];
++} POSTPACK WMI_PMKID_LIST_REPLY;
++
++/* index used for priority streams */
++typedef enum {
++ WMI_NOT_MAPPED = -1,
++ WMI_CONTROL_PRI = 0,
++ WMI_BEST_EFFORT_PRI = 1,
++ WMI_LOW_PRI = 2,
++ WMI_HIGH_PRI = 3,
++ WMI_HIGHEST_PRI,
++ WMI_PRI_MAX_COUNT
++} WMI_PRI_STREAM_ID;
++
++#ifndef ATH_TARGET
++#include "athendpack.h"
++#endif
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _WMI_H_ */
+diff --git a/drivers/ar6000/include/wmi_api.h b/drivers/ar6000/include/wmi_api.h
+new file mode 100644
+index 0000000..267edfd
+--- /dev/null
++++ b/drivers/ar6000/include/wmi_api.h
+@@ -0,0 +1,260 @@
++#ifndef _WMI_API_H_
++#define _WMI_API_H_
++/*
++ * Copyright (c) 2004-2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * This file contains the definitions for the Wireless Module Interface (WMI).
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/include/wmi_api.h#2 $
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/*
++ * IP QoS Field definitions according to 802.1p
++ */
++#define BEST_EFFORT_PRI 0
++#define BACKGROUND_PRI 1
++#define EXCELLENT_EFFORT_PRI 3
++#define CONTROLLED_LOAD_PRI 4
++#define VIDEO_PRI 5
++#define VOICE_PRI 6
++#define NETWORK_CONTROL_PRI 7
++#define MAX_NUM_PRI 8
++
++#define UNDEFINED_PRI (0xff)
++
++/* simple mapping of IP TOS field to a WMI priority stream
++ * this mapping was taken from the original linux driver implementation
++ * The operation maps the following
++ *
++ * */
++#define IP_TOS_TO_WMI_PRI(tos) \
++ ((WMI_PRI_STREAM_ID)(((tos) >> 1) & 0x03))
++
++#define WMI_IMPLICIT_PSTREAM_INACTIVITY_INT 5000 /* 5 seconds */
++
++
++struct wmi_t;
++
++void *wmi_init(void *devt);
++
++void wmi_qos_state_init(struct wmi_t *wmip);
++void wmi_shutdown(struct wmi_t *wmip);
++A_UINT16 wmi_get_mapped_qos_queue(struct wmi_t *, A_UINT8);
++A_STATUS wmi_dix_2_dot3(struct wmi_t *wmip, void *osbuf);
++A_STATUS wmi_data_hdr_add(struct wmi_t *wmip, void *osbuf, A_UINT8 msgType);
++A_STATUS wmi_dot3_2_dix(struct wmi_t *wmip, void *osbuf);
++A_STATUS wmi_data_hdr_remove(struct wmi_t *wmip, void *osbuf);
++A_STATUS wmi_syncpoint(struct wmi_t *wmip);
++A_STATUS wmi_syncpoint_reset(struct wmi_t *wmip);
++WMI_PRI_STREAM_ID wmi_get_stream_id(struct wmi_t *wmip, A_UINT8 trafficClass);
++A_UINT8 wmi_implicit_create_pstream(struct wmi_t *wmip, void *osbuf, A_UINT8 dir, A_UINT8 up);
++
++A_STATUS wmi_control_rx(struct wmi_t *wmip, void *osbuf);
++void wmi_iterate_nodes(struct wmi_t *wmip, wlan_node_iter_func *f, void *arg);
++void wmi_free_allnodes(struct wmi_t *wmip);
++bss_t *wmi_find_node(struct wmi_t *wmip, const A_UINT8 *macaddr);
++
++
++typedef enum {
++ NO_SYNC_WMIFLAG = 0,
++ SYNC_BEFORE_WMIFLAG, /* transmit all queued data before cmd */
++ SYNC_AFTER_WMIFLAG, /* any new data waits until cmd execs */
++ SYNC_BOTH_WMIFLAG,
++ END_WMIFLAG /* end marker */
++} WMI_SYNC_FLAG;
++
++A_STATUS wmi_cmd_send(struct wmi_t *wmip, void *osbuf, WMI_COMMAND_ID cmdId,
++ WMI_SYNC_FLAG flag);
++A_STATUS wmi_connect_cmd(struct wmi_t *wmip,
++ NETWORK_TYPE netType,
++ DOT11_AUTH_MODE dot11AuthMode,
++ AUTH_MODE authMode,
++ CRYPTO_TYPE pairwiseCrypto,
++ A_UINT8 pairwiseCryptoLen,
++ CRYPTO_TYPE groupCrypto,
++ A_UINT8 groupCryptoLen,
++ int ssidLength,
++ A_UCHAR *ssid,
++ A_UINT8 *bssid,
++ A_UINT16 channel,
++ A_UINT32 ctrl_flags);
++A_STATUS wmi_reconnect_cmd(struct wmi_t *wmip,
++ A_UINT8 *bssid,
++ A_UINT16 channel);
++A_STATUS wmi_disconnect_cmd(struct wmi_t *wmip);
++A_STATUS wmi_getrev_cmd(struct wmi_t *wmip);
++A_STATUS wmi_startscan_cmd(struct wmi_t *wmip, WMI_SCAN_TYPE scanType,
++ A_BOOL forceFgScan, A_BOOL isLegacy,
++ A_UINT32 homeDwellTime, A_UINT32 forceScanInterval);
++A_STATUS wmi_scanparams_cmd(struct wmi_t *wmip, A_UINT16 fg_start_sec,
++ A_UINT16 fg_end_sec, A_UINT16 bg_sec,
++ A_UINT16 minact_chdw_msec,
++ A_UINT16 maxact_chdw_msec, A_UINT16 pas_chdw_msec,
++ A_UINT8 shScanRatio, A_UINT8 scanCtrlFlags,
++ A_UINT32 max_dfsch_act_time);
++A_STATUS wmi_bssfilter_cmd(struct wmi_t *wmip, A_UINT8 filter, A_UINT32 ieMask);
++A_STATUS wmi_probedSsid_cmd(struct wmi_t *wmip, A_UINT8 index, A_UINT8 flag,
++ A_UINT8 ssidLength, A_UCHAR *ssid);
++A_STATUS wmi_listeninterval_cmd(struct wmi_t *wmip, A_UINT16 listenInterval, A_UINT16 listenBeacons);
++A_STATUS wmi_bmisstime_cmd(struct wmi_t *wmip, A_UINT16 bmisstime, A_UINT16 bmissbeacons);
++A_STATUS wmi_associnfo_cmd(struct wmi_t *wmip, A_UINT8 ieType,
++ A_UINT8 ieLen, A_UINT8 *ieInfo);
++A_STATUS wmi_powermode_cmd(struct wmi_t *wmip, A_UINT8 powerMode);
++A_STATUS wmi_ibsspmcaps_cmd(struct wmi_t *wmip, A_UINT8 pmEnable, A_UINT8 ttl,
++ A_UINT16 atim_windows, A_UINT16 timeout_value);
++A_STATUS wmi_pmparams_cmd(struct wmi_t *wmip, A_UINT16 idlePeriod,
++ A_UINT16 psPollNum, A_UINT16 dtimPolicy);
++A_STATUS wmi_disctimeout_cmd(struct wmi_t *wmip, A_UINT8 timeout);
++A_STATUS wmi_sync_cmd(struct wmi_t *wmip, A_UINT8 syncNumber);
++A_STATUS wmi_create_pstream_cmd(struct wmi_t *wmip, WMI_CREATE_PSTREAM_CMD *pstream);
++A_STATUS wmi_delete_pstream_cmd(struct wmi_t *wmip, A_UINT8 trafficClass, A_UINT8 streamID);
++A_STATUS wmi_set_bitrate_cmd(struct wmi_t *wmip, A_INT32 rate);
++A_STATUS wmi_get_bitrate_cmd(struct wmi_t *wmip);
++A_INT8 wmi_validate_bitrate(struct wmi_t *wmip, A_INT32 rate);
++A_STATUS wmi_get_regDomain_cmd(struct wmi_t *wmip);
++A_STATUS wmi_get_channelList_cmd(struct wmi_t *wmip);
++A_STATUS wmi_set_channelParams_cmd(struct wmi_t *wmip, A_UINT8 scanParam,
++ WMI_PHY_MODE mode, A_INT8 numChan,
++ A_UINT16 *channelList);
++
++A_STATUS wmi_set_snr_threshold_params(struct wmi_t *wmip,
++ WMI_SNR_THRESHOLD_PARAMS_CMD *snrCmd);
++A_STATUS wmi_set_rssi_threshold_params(struct wmi_t *wmip,
++ WMI_RSSI_THRESHOLD_PARAMS_CMD *rssiCmd);
++A_STATUS wmi_clr_rssi_snr(struct wmi_t *wmip);
++A_STATUS wmi_set_lq_threshold_params(struct wmi_t *wmip,
++ WMI_LQ_THRESHOLD_PARAMS_CMD *lqCmd);
++A_STATUS wmi_set_rts_cmd(struct wmi_t *wmip, A_UINT16 threshold);
++A_STATUS wmi_set_lpreamble_cmd(struct wmi_t *wmip, A_UINT8 status);
++
++A_STATUS wmi_set_error_report_bitmask(struct wmi_t *wmip, A_UINT32 bitmask);
++
++A_STATUS wmi_get_challenge_resp_cmd(struct wmi_t *wmip, A_UINT32 cookie,
++ A_UINT32 source);
++A_STATUS wmi_config_debug_module_cmd(struct wmi_t *wmip, A_UINT16 mmask,
++ A_UINT16 tsr, A_BOOL rep, A_UINT16 size,
++ A_UINT32 valid);
++A_STATUS wmi_get_stats_cmd(struct wmi_t *wmip);
++A_STATUS wmi_addKey_cmd(struct wmi_t *wmip, A_UINT8 keyIndex,
++ CRYPTO_TYPE keyType, A_UINT8 keyUsage,
++ A_UINT8 keyLength,A_UINT8 *keyRSC,
++ A_UINT8 *keyMaterial, A_UINT8 key_op_ctrl,
++ WMI_SYNC_FLAG sync_flag);
++A_STATUS wmi_add_krk_cmd(struct wmi_t *wmip, A_UINT8 *krk);
++A_STATUS wmi_delete_krk_cmd(struct wmi_t *wmip);
++A_STATUS wmi_deleteKey_cmd(struct wmi_t *wmip, A_UINT8 keyIndex);
++A_STATUS wmi_set_akmp_params_cmd(struct wmi_t *wmip,
++ WMI_SET_AKMP_PARAMS_CMD *akmpParams);
++A_STATUS wmi_get_pmkid_list_cmd(struct wmi_t *wmip);
++A_STATUS wmi_set_pmkid_list_cmd(struct wmi_t *wmip,
++ WMI_SET_PMKID_LIST_CMD *pmkInfo);
++A_STATUS wmi_set_txPwr_cmd(struct wmi_t *wmip, A_UINT8 dbM);
++A_STATUS wmi_get_txPwr_cmd(struct wmi_t *wmip);
++A_STATUS wmi_switch_radio(struct wmi_t *wmip, A_UINT8 on);
++A_STATUS wmi_addBadAp_cmd(struct wmi_t *wmip, A_UINT8 apIndex, A_UINT8 *bssid);
++A_STATUS wmi_deleteBadAp_cmd(struct wmi_t *wmip, A_UINT8 apIndex);
++A_STATUS wmi_set_tkip_countermeasures_cmd(struct wmi_t *wmip, A_BOOL en);
++A_STATUS wmi_setPmkid_cmd(struct wmi_t *wmip, A_UINT8 *bssid, A_UINT8 *pmkId,
++ A_BOOL set);
++A_STATUS wmi_set_access_params_cmd(struct wmi_t *wmip, A_UINT16 txop,
++ A_UINT8 eCWmin, A_UINT8 eCWmax,
++ A_UINT8 aifsn);
++A_STATUS wmi_set_retry_limits_cmd(struct wmi_t *wmip, A_UINT8 frameType,
++ A_UINT8 trafficClass, A_UINT8 maxRetries,
++ A_UINT8 enableNotify);
++
++void wmi_get_current_bssid(struct wmi_t *wmip, A_UINT8 *bssid);
++
++A_STATUS wmi_get_roam_tbl_cmd(struct wmi_t *wmip);
++A_STATUS wmi_get_roam_data_cmd(struct wmi_t *wmip, A_UINT8 roamDataType);
++A_STATUS wmi_set_roam_ctrl_cmd(struct wmi_t *wmip, WMI_SET_ROAM_CTRL_CMD *p,
++ A_UINT8 size);
++A_STATUS wmi_set_powersave_timers_cmd(struct wmi_t *wmip,
++ WMI_POWERSAVE_TIMERS_POLICY_CMD *pCmd,
++ A_UINT8 size);
++
++A_STATUS wmi_set_opt_mode_cmd(struct wmi_t *wmip, A_UINT8 optMode);
++A_STATUS wmi_opt_tx_frame_cmd(struct wmi_t *wmip,
++ A_UINT8 frmType,
++ A_UINT8 *dstMacAddr,
++ A_UINT8 *bssid,
++ A_UINT16 optIEDataLen,
++ A_UINT8 *optIEData);
++
++A_STATUS wmi_set_adhoc_bconIntvl_cmd(struct wmi_t *wmip, A_UINT16 intvl);
++A_STATUS wmi_set_voice_pkt_size_cmd(struct wmi_t *wmip, A_UINT16 voicePktSize);
++A_STATUS wmi_set_max_sp_len_cmd(struct wmi_t *wmip, A_UINT8 maxSpLen);
++A_UINT8 convert_userPriority_to_trafficClass(A_UINT8 userPriority);
++A_UINT8 wmi_get_power_mode_cmd(struct wmi_t *wmip);
++A_STATUS wmi_verify_tspec_params(WMI_CREATE_PSTREAM_CMD *pCmd, A_BOOL tspecCompliance);
++
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++A_STATUS wmi_test_cmd(struct wmi_t *wmip, A_UINT8 *buf, A_UINT32 len);
++#endif
++
++A_STATUS wmi_set_bt_status_cmd(struct wmi_t *wmip, A_UINT8 streamType, A_UINT8 status);
++A_STATUS wmi_set_bt_params_cmd(struct wmi_t *wmip, WMI_SET_BT_PARAMS_CMD* cmd);
++
++
++/*
++ * This function is used to configure the fix rates mask to the target.
++ */
++A_STATUS wmi_set_fixrates_cmd(struct wmi_t *wmip, A_INT16 fixRatesMask);
++A_STATUS wmi_get_ratemask_cmd(struct wmi_t *wmip);
++
++A_STATUS wmi_set_authmode_cmd(struct wmi_t *wmip, A_UINT8 mode);
++
++A_STATUS wmi_set_reassocmode_cmd(struct wmi_t *wmip, A_UINT8 mode);
++
++A_STATUS wmi_set_wmm_cmd(struct wmi_t *wmip, WMI_WMM_STATUS status);
++A_STATUS wmi_set_wmm_txop(struct wmi_t *wmip, WMI_TXOP_CFG txEnable);
++
++A_STATUS wmi_get_keepalive_configured(struct wmi_t *wmip);
++A_UINT8 wmi_get_keepalive_cmd(struct wmi_t *wmip);
++A_STATUS wmi_set_keepalive_cmd(struct wmi_t *wmip, A_UINT8 keepaliveInterval);
++
++A_STATUS wmi_set_appie_cmd(struct wmi_t *wmip, A_UINT8 mgmtFrmType,
++ A_UINT8 ieLen,A_UINT8 *ieInfo);
++
++A_STATUS wmi_set_halparam_cmd(struct wmi_t *wmip, A_UINT8 *cmd, A_UINT16 dataLen);
++A_INT32 wmi_get_rate(A_INT8 rateindex);
++
++/*Wake on Wireless WMI commands*/
++A_STATUS wmi_set_host_sleep_mode_cmd(struct wmi_t *wmip, WMI_SET_HOST_SLEEP_MODE_CMD *cmd);
++A_STATUS wmi_set_wow_mode_cmd(struct wmi_t *wmip, WMI_SET_WOW_MODE_CMD *cmd);
++A_STATUS wmi_get_wow_list_cmd(struct wmi_t *wmip, WMI_GET_WOW_LIST_CMD *cmd);
++A_STATUS wmi_add_wow_pattern_cmd(struct wmi_t *wmip,
++ WMI_ADD_WOW_PATTERN_CMD *cmd, A_UINT8* pattern, A_UINT8* mask, A_UINT8 pattern_size);
++A_STATUS wmi_del_wow_pattern_cmd(struct wmi_t *wmip,
++ WMI_DEL_WOW_PATTERN_CMD *cmd);
++A_STATUS wmi_set_wsc_status_cmd(struct wmi_t *wmip, A_UINT32 status);
++
++bss_t *
++wmi_find_Ssidnode (struct wmi_t *wmip, A_UCHAR *pSsid,
++ A_UINT32 ssidLength, A_BOOL bIsWPA2);
++
++void
++wmi_node_return (struct wmi_t *wmip, bss_t *bss);
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _WMI_API_H_ */
+diff --git a/drivers/ar6000/include/wmix.h b/drivers/ar6000/include/wmix.h
+new file mode 100644
+index 0000000..8f12b5e
+--- /dev/null
++++ b/drivers/ar6000/include/wmix.h
+@@ -0,0 +1,233 @@
++/*
++ * Copyright (c) 2004-2005 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * $ATH_LICENSE_HOSTSDK0_C$
++ *
++ * This file contains extensions of the WMI protocol specified in the
++ * Wireless Module Interface (WMI). It includes definitions of all
++ * extended commands and events. Extensions include useful commands
++ * that are not directly related to wireless activities. They may
++ * be hardware-specific, and they might not be supported on all
++ * implementations.
++ *
++ * Extended WMIX commands are encapsulated in a WMI message with
++ * cmd=WMI_EXTENSION_CMD.
++ *
++ */
++
++#ifndef _WMIX_H_
++#define _WMIX_H_
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++#ifndef ATH_TARGET
++#include "athstartpack.h"
++#endif
++
++#include "dbglog.h"
++
++/*
++ * Extended WMI commands are those that are needed during wireless
++ * operation, but which are not really wireless commands. This allows,
++ * for instance, platform-specific commands. Extended WMI commands are
++ * embedded in a WMI command message with WMI_COMMAND_ID=WMI_EXTENSION_CMDID.
++ * Extended WMI events are similarly embedded in a WMI event message with
++ * WMI_EVENT_ID=WMI_EXTENSION_EVENTID.
++ */
++typedef PREPACK struct {
++ A_UINT32 commandId;
++} POSTPACK WMIX_CMD_HDR;
++
++typedef enum {
++ WMIX_DSETOPEN_REPLY_CMDID = 0x2001,
++ WMIX_DSETDATA_REPLY_CMDID,
++ WMIX_GPIO_OUTPUT_SET_CMDID,
++ WMIX_GPIO_INPUT_GET_CMDID,
++ WMIX_GPIO_REGISTER_SET_CMDID,
++ WMIX_GPIO_REGISTER_GET_CMDID,
++ WMIX_GPIO_INTR_ACK_CMDID,
++ WMIX_HB_CHALLENGE_RESP_CMDID,
++ WMIX_DBGLOG_CFG_MODULE_CMDID,
++} WMIX_COMMAND_ID;
++
++typedef enum {
++ WMIX_DSETOPENREQ_EVENTID = 0x3001,
++ WMIX_DSETCLOSE_EVENTID,
++ WMIX_DSETDATAREQ_EVENTID,
++ WMIX_GPIO_INTR_EVENTID,
++ WMIX_GPIO_DATA_EVENTID,
++ WMIX_GPIO_ACK_EVENTID,
++ WMIX_HB_CHALLENGE_RESP_EVENTID,
++ WMIX_DBGLOG_EVENTID,
++} WMIX_EVENT_ID;
++
++/*
++ * =============DataSet support=================
++ */
++
++/*
++ * WMIX_DSETOPENREQ_EVENTID
++ * DataSet Open Request Event
++ */
++typedef PREPACK struct {
++ A_UINT32 dset_id;
++ A_UINT32 targ_dset_handle; /* echo'ed, not used by Host, */
++ A_UINT32 targ_reply_fn; /* echo'ed, not used by Host, */
++ A_UINT32 targ_reply_arg; /* echo'ed, not used by Host, */
++} POSTPACK WMIX_DSETOPENREQ_EVENT;
++
++/*
++ * WMIX_DSETCLOSE_EVENTID
++ * DataSet Close Event
++ */
++typedef PREPACK struct {
++ A_UINT32 access_cookie;
++} POSTPACK WMIX_DSETCLOSE_EVENT;
++
++/*
++ * WMIX_DSETDATAREQ_EVENTID
++ * DataSet Data Request Event
++ */
++typedef PREPACK struct {
++ A_UINT32 access_cookie;
++ A_UINT32 offset;
++ A_UINT32 length;
++ A_UINT32 targ_buf; /* echo'ed, not used by Host, */
++ A_UINT32 targ_reply_fn; /* echo'ed, not used by Host, */
++ A_UINT32 targ_reply_arg; /* echo'ed, not used by Host, */
++} POSTPACK WMIX_DSETDATAREQ_EVENT;
++
++typedef PREPACK struct {
++ A_UINT32 status;
++ A_UINT32 targ_dset_handle;
++ A_UINT32 targ_reply_fn;
++ A_UINT32 targ_reply_arg;
++ A_UINT32 access_cookie;
++ A_UINT32 size;
++ A_UINT32 version;
++} POSTPACK WMIX_DSETOPEN_REPLY_CMD;
++
++typedef PREPACK struct {
++ A_UINT32 status;
++ A_UINT32 targ_buf;
++ A_UINT32 targ_reply_fn;
++ A_UINT32 targ_reply_arg;
++ A_UINT32 length;
++ A_UINT8 buf[1];
++} POSTPACK WMIX_DSETDATA_REPLY_CMD;
++
++
++/*
++ * =============GPIO support=================
++ * All masks are 18-bit masks with bit N operating on GPIO pin N.
++ */
++
++#include "gpio.h"
++
++/*
++ * Set GPIO pin output state.
++ * In order for output to be driven, a pin must be enabled for output.
++ * This can be done during initialization through the GPIO Configuration
++ * DataSet, or during operation with the enable_mask.
++ *
++ * If a request is made to simultaneously set/clear or set/disable or
++ * clear/disable or disable/enable, results are undefined.
++ */
++typedef PREPACK struct {
++ A_UINT32 set_mask; /* pins to set */
++ A_UINT32 clear_mask; /* pins to clear */
++ A_UINT32 enable_mask; /* pins to enable for output */
++ A_UINT32 disable_mask; /* pins to disable/tristate */
++} POSTPACK WMIX_GPIO_OUTPUT_SET_CMD;
++
++/*
++ * Set a GPIO register. For debug/exceptional cases.
++ * Values for gpioreg_id are GPIO_REGISTER_IDs, defined in a
++ * platform-dependent header.
++ */
++typedef PREPACK struct {
++ A_UINT32 gpioreg_id; /* GPIO register ID */
++ A_UINT32 value; /* value to write */
++} POSTPACK WMIX_GPIO_REGISTER_SET_CMD;
++
++/* Get a GPIO register. For debug/exceptional cases. */
++typedef PREPACK struct {
++ A_UINT32 gpioreg_id; /* GPIO register to read */
++} POSTPACK WMIX_GPIO_REGISTER_GET_CMD;
++
++/*
++ * Host acknowledges and re-arms GPIO interrupts. A single
++ * message should be used to acknowledge all interrupts that
++ * were delivered in an earlier WMIX_GPIO_INTR_EVENT message.
++ */
++typedef PREPACK struct {
++ A_UINT32 ack_mask; /* interrupts to acknowledge */
++} POSTPACK WMIX_GPIO_INTR_ACK_CMD;
++
++/*
++ * Target informs Host of GPIO interrupts that have ocurred since the
++ * last WMIX_GIPO_INTR_ACK_CMD was received. Additional information --
++ * the current GPIO input values is provided -- in order to support
++ * use of a GPIO interrupt as a Data Valid signal for other GPIO pins.
++ */
++typedef PREPACK struct {
++ A_UINT32 intr_mask; /* pending GPIO interrupts */
++ A_UINT32 input_values; /* recent GPIO input values */
++} POSTPACK WMIX_GPIO_INTR_EVENT;
++
++/*
++ * Target responds to Host's earlier WMIX_GPIO_INPUT_GET_CMDID request
++ * using a GPIO_DATA_EVENT with
++ * value set to the mask of GPIO pin inputs and
++ * reg_id set to GPIO_ID_NONE
++ *
++ *
++ * Target responds to Hosts's earlier WMIX_GPIO_REGISTER_GET_CMDID request
++ * using a GPIO_DATA_EVENT with
++ * value set to the value of the requested register and
++ * reg_id identifying the register (reflects the original request)
++ * NB: reg_id supports the future possibility of unsolicited
++ * WMIX_GPIO_DATA_EVENTs (for polling GPIO input), and it may
++ * simplify Host GPIO support.
++ */
++typedef PREPACK struct {
++ A_UINT32 value;
++ A_UINT32 reg_id;
++} POSTPACK WMIX_GPIO_DATA_EVENT;
++
++/*
++ * =============Error Detection support=================
++ */
++
++/*
++ * WMIX_HB_CHALLENGE_RESP_CMDID
++ * Heartbeat Challenge Response command
++ */
++typedef PREPACK struct {
++ A_UINT32 cookie;
++ A_UINT32 source;
++} POSTPACK WMIX_HB_CHALLENGE_RESP_CMD;
++
++/*
++ * WMIX_HB_CHALLENGE_RESP_EVENTID
++ * Heartbeat Challenge Response Event
++ */
++#define WMIX_HB_CHALLENGE_RESP_EVENT WMIX_HB_CHALLENGE_RESP_CMD
++
++typedef PREPACK struct {
++ struct dbglog_config_s config;
++} POSTPACK WMIX_DBGLOG_CFG_MODULE_CMD;
++
++#ifndef ATH_TARGET
++#include "athendpack.h"
++#endif
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _WMIX_H_ */
+diff --git a/drivers/ar6000/miscdrv/common_drv.c b/drivers/ar6000/miscdrv/common_drv.c
+new file mode 100644
+index 0000000..4f12734
+--- /dev/null
++++ b/drivers/ar6000/miscdrv/common_drv.c
+@@ -0,0 +1,467 @@
++
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "a_config.h"
++#include "athdefs.h"
++#include "a_types.h"
++#include "AR6Khwreg.h"
++#include "targaddrs.h"
++#include "a_osapi.h"
++#include "hif.h"
++#include "htc_api.h"
++#include "bmi.h"
++#include "bmi_msg.h"
++#include "common_drv.h"
++#include "a_debug.h"
++#include "targaddrs.h"
++
++#define HOST_INTEREST_ITEM_ADDRESS(target, item) \
++(((TargetType) == TARGET_TYPE_AR6001) ? \
++ AR6001_HOST_INTEREST_ITEM_ADDRESS(item) : \
++ AR6002_HOST_INTEREST_ITEM_ADDRESS(item))
++
++
++/* Compile the 4BYTE version of the window register setup routine,
++ * This mitigates host interconnect issues with non-4byte aligned bus requests, some
++ * interconnects use bus adapters that impose strict limitations.
++ * Since diag window access is not intended for performance critical operations, the 4byte mode should
++ * be satisfactory even though it generates 4X the bus activity. */
++
++#ifdef USE_4BYTE_REGISTER_ACCESS
++
++ /* set the window address register (using 4-byte register access ). */
++A_STATUS ar6000_SetAddressWindowRegister(HIF_DEVICE *hifDevice, A_UINT32 RegisterAddr, A_UINT32 Address)
++{
++ A_STATUS status;
++ A_UINT8 addrValue[4];
++ int i;
++
++ /* write bytes 1,2,3 of the register to set the upper address bytes, the LSB is written
++ * last to initiate the access cycle */
++
++ for (i = 1; i <= 3; i++) {
++ /* fill the buffer with the address byte value we want to hit 4 times*/
++ addrValue[0] = ((A_UINT8 *)&Address)[i];
++ addrValue[1] = addrValue[0];
++ addrValue[2] = addrValue[0];
++ addrValue[3] = addrValue[0];
++
++ /* hit each byte of the register address with a 4-byte write operation to the same address,
++ * this is a harmless operation */
++ status = HIFReadWrite(hifDevice,
++ RegisterAddr+i,
++ addrValue,
++ 4,
++ HIF_WR_SYNC_BYTE_FIX,
++ NULL);
++ if (status != A_OK) {
++ break;
++ }
++ }
++
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot write initial bytes of 0x%x to window reg: 0x%X \n",
++ RegisterAddr, Address));
++ return status;
++ }
++
++ /* write the address register again, this time write the whole 4-byte value.
++ * The effect here is that the LSB write causes the cycle to start, the extra
++ * 3 byte write to bytes 1,2,3 has no effect since we are writing the same values again */
++ status = HIFReadWrite(hifDevice,
++ RegisterAddr,
++ (A_UCHAR *)(&Address),
++ 4,
++ HIF_WR_SYNC_BYTE_INC,
++ NULL);
++
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot write 0x%x to window reg: 0x%X \n",
++ RegisterAddr, Address));
++ return status;
++ }
++
++ return A_OK;
++
++
++
++}
++
++
++#else
++
++ /* set the window address register */
++A_STATUS ar6000_SetAddressWindowRegister(HIF_DEVICE *hifDevice, A_UINT32 RegisterAddr, A_UINT32 Address)
++{
++ A_STATUS status;
++
++ /* write bytes 1,2,3 of the register to set the upper address bytes, the LSB is written
++ * last to initiate the access cycle */
++ status = HIFReadWrite(hifDevice,
++ RegisterAddr+1, /* write upper 3 bytes */
++ ((A_UCHAR *)(&Address))+1,
++ sizeof(A_UINT32)-1,
++ HIF_WR_SYNC_BYTE_INC,
++ NULL);
++
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot write initial bytes of 0x%x to window reg: 0x%X \n",
++ RegisterAddr, Address));
++ return status;
++ }
++
++ /* write the LSB of the register, this initiates the operation */
++ status = HIFReadWrite(hifDevice,
++ RegisterAddr,
++ (A_UCHAR *)(&Address),
++ sizeof(A_UINT8),
++ HIF_WR_SYNC_BYTE_INC,
++ NULL);
++
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot write 0x%x to window reg: 0x%X \n",
++ RegisterAddr, Address));
++ return status;
++ }
++
++ return A_OK;
++}
++
++#endif
++
++/*
++ * Read from the AR6000 through its diagnostic window.
++ * No cooperation from the Target is required for this.
++ */
++A_STATUS
++ar6000_ReadRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data)
++{
++ A_STATUS status;
++
++ /* set window register to start read cycle */
++ status = ar6000_SetAddressWindowRegister(hifDevice,
++ WINDOW_READ_ADDR_ADDRESS,
++ *address);
++
++ if (status != A_OK) {
++ return status;
++ }
++
++ /* read the data */
++ status = HIFReadWrite(hifDevice,
++ WINDOW_DATA_ADDRESS,
++ (A_UCHAR *)data,
++ sizeof(A_UINT32),
++ HIF_RD_SYNC_BYTE_INC,
++ NULL);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot read from WINDOW_DATA_ADDRESS\n"));
++ return status;
++ }
++
++ return status;
++}
++
++
++/*
++ * Write to the AR6000 through its diagnostic window.
++ * No cooperation from the Target is required for this.
++ */
++A_STATUS
++ar6000_WriteRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data)
++{
++ A_STATUS status;
++
++ /* set write data */
++ status = HIFReadWrite(hifDevice,
++ WINDOW_DATA_ADDRESS,
++ (A_UCHAR *)data,
++ sizeof(A_UINT32),
++ HIF_WR_SYNC_BYTE_INC,
++ NULL);
++ if (status != A_OK) {
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot write 0x%x to WINDOW_DATA_ADDRESS\n", *data));
++ return status;
++ }
++
++ /* set window register, which starts the write cycle */
++ return ar6000_SetAddressWindowRegister(hifDevice,
++ WINDOW_WRITE_ADDR_ADDRESS,
++ *address);
++}
++
++A_STATUS
++ar6000_ReadDataDiag(HIF_DEVICE *hifDevice, A_UINT32 address,
++ A_UCHAR *data, A_UINT32 length)
++{
++ A_UINT32 count;
++ A_STATUS status = A_OK;
++
++ for (count = 0; count < length; count += 4, address += 4) {
++ if ((status = ar6000_ReadRegDiag(hifDevice, &address,
++ (A_UINT32 *)&data[count])) != A_OK)
++ {
++ break;
++ }
++ }
++
++ return status;
++}
++
++A_STATUS
++ar6000_WriteDataDiag(HIF_DEVICE *hifDevice, A_UINT32 address,
++ A_UCHAR *data, A_UINT32 length)
++{
++ A_UINT32 count;
++ A_STATUS status = A_OK;
++
++ for (count = 0; count < length; count += 4, address += 4) {
++ if ((status = ar6000_WriteRegDiag(hifDevice, &address,
++ (A_UINT32 *)&data[count])) != A_OK)
++ {
++ break;
++ }
++ }
++
++ return status;
++}
++
++A_STATUS
++ar6000_reset_device_skipflash(HIF_DEVICE *hifDevice)
++{
++ int i;
++ struct forceROM_s {
++ A_UINT32 addr;
++ A_UINT32 data;
++ };
++ struct forceROM_s *ForceROM;
++ int szForceROM;
++ A_UINT32 instruction;
++
++ static struct forceROM_s ForceROM_REV2[] = {
++ /* NB: This works for old REV2 ROM (old). */
++ {0x00001ff0, 0x175b0027}, /* jump instruction at 0xa0001ff0 */
++ {0x00001ff4, 0x00000000}, /* nop instruction at 0xa0001ff4 */
++
++ {MC_REMAP_TARGET_ADDRESS, 0x00001ff0}, /* remap to 0xa0001ff0 */
++ {MC_REMAP_COMPARE_ADDRESS, 0x01000040},/* ...from 0xbfc00040 */
++ {MC_REMAP_SIZE_ADDRESS, 0x00000000}, /* ...1 cache line */
++ {MC_REMAP_VALID_ADDRESS, 0x00000001}, /* ...remap is valid */
++
++ {LOCAL_COUNT_ADDRESS+0x10, 0}, /* clear BMI credit counter */
++
++ {RESET_CONTROL_ADDRESS, RESET_CONTROL_WARM_RST_MASK},
++ };
++
++ static struct forceROM_s ForceROM_NEW[] = {
++ /* NB: This works for AR6000 ROM REV3 and beyond. */
++ {LOCAL_SCRATCH_ADDRESS, AR6K_OPTION_IGNORE_FLASH},
++ {LOCAL_COUNT_ADDRESS+0x10, 0}, /* clear BMI credit counter */
++ {RESET_CONTROL_ADDRESS, RESET_CONTROL_WARM_RST_MASK},
++ };
++
++ /*
++ * Examine a semi-arbitrary instruction that's different
++ * in REV2 and other revisions.
++ * NB: If a Host port does not require simultaneous support
++ * for multiple revisions of Target ROM, this code can be elided.
++ */
++ (void)ar6000_ReadDataDiag(hifDevice, 0x01000040,
++ (A_UCHAR *)&instruction, 4);
++
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("instruction=0x%x\n", instruction));
++
++ if (instruction == 0x3c1aa200) {
++ /* It's an old ROM */
++ ForceROM = ForceROM_REV2;
++ szForceROM = sizeof(ForceROM_REV2)/sizeof(*ForceROM);
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Using OLD method\n"));
++ } else {
++ ForceROM = ForceROM_NEW;
++ szForceROM = sizeof(ForceROM_NEW)/sizeof(*ForceROM);
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Using NEW method\n"));
++ }
++
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Force Target to execute from ROM....\n"));
++ for (i = 0; i < szForceROM; i++)
++ {
++ if (ar6000_WriteRegDiag(hifDevice,
++ &ForceROM[i].addr,
++ &ForceROM[i].data) != A_OK)
++ {
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot force Target to execute ROM!\n"));
++ return A_ERROR;
++ }
++ }
++
++ msleep(50); /* delay to allow dragon to come to BMI phase */
++ return A_OK;
++}
++
++/* reset device */
++A_STATUS ar6000_reset_device(HIF_DEVICE *hifDevice, A_UINT32 TargetType)
++{
++
++#if !defined(DWSIM)
++ A_STATUS status = A_OK;
++ A_UINT32 address;
++ A_UINT32 data;
++
++ do {
++
++ // address = RESET_CONTROL_ADDRESS;
++ data = RESET_CONTROL_COLD_RST_MASK;
++
++ /* Hardcode the address of RESET_CONTROL_ADDRESS based on the target type */
++ if (TargetType == TARGET_TYPE_AR6001) {
++ address = 0x0C000000;
++ } else {
++ if (TargetType == TARGET_TYPE_AR6002) {
++ address = 0x00004000;
++ } else {
++ A_ASSERT(0);
++ }
++ }
++
++ status = ar6000_WriteRegDiag(hifDevice, &address, &data);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ /*
++ * Read back the RESET CAUSE register to ensure that the cold reset
++ * went through.
++ */
++ msleep(2000); /* 2 second delay to allow things to settle down */
++
++
++ // address = RESET_CAUSE_ADDRESS;
++ /* Hardcode the address of RESET_CAUSE_ADDRESS based on the target type */
++ if (TargetType == TARGET_TYPE_AR6001) {
++ address = 0x0C0000CC;
++ } else {
++ if (TargetType == TARGET_TYPE_AR6002) {
++ address = 0x000040C0;
++ } else {
++ A_ASSERT(0);
++ }
++ }
++
++ data = 0;
++ status = ar6000_ReadRegDiag(hifDevice, &address, &data);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Reset Cause readback: 0x%X \n",data));
++ data &= RESET_CAUSE_LAST_MASK;
++ if (data != 2) {
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Unable to cold reset the target \n"));
++ }
++
++ } while (FALSE);
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Failed to reset target \n"));
++ }
++#endif
++ return A_OK;
++}
++
++#define REG_DUMP_COUNT_AR6001 38 /* WORDs, derived from AR6001_regdump.h */
++#define REG_DUMP_COUNT_AR6002 32 /* WORDs, derived from AR6002_regdump.h */
++
++
++#if REG_DUMP_COUNT_AR6001 <= REG_DUMP_COUNT_AR6002
++#define REGISTER_DUMP_LEN_MAX REG_DUMP_COUNT_AR6002
++#else
++#define REGISTER_DUMP_LEN_MAX REG_DUMP_COUNT_AR6001
++#endif
++
++void ar6000_dump_target_assert_info(HIF_DEVICE *hifDevice, A_UINT32 TargetType)
++{
++ A_UINT32 address;
++ A_UINT32 regDumpArea = 0;
++ A_STATUS status;
++ A_UINT32 regDumpValues[REGISTER_DUMP_LEN_MAX];
++ A_UINT32 regDumpCount = 0;
++ A_UINT32 i;
++
++ do {
++
++ /* the reg dump pointer is copied to the host interest area */
++ address = HOST_INTEREST_ITEM_ADDRESS(TargetType, hi_failure_state);
++
++ if (TargetType == TARGET_TYPE_AR6001) {
++ /* for AR6001, this is a fixed location because the ptr is actually stuck in cache,
++ * this may be fixed in later firmware versions */
++ address = 0x18a0;
++ regDumpCount = REG_DUMP_COUNT_AR6001;
++
++ } else if (TargetType == TARGET_TYPE_AR6002) {
++
++ regDumpCount = REG_DUMP_COUNT_AR6002;
++
++ } else {
++ A_ASSERT(0);
++ }
++
++ /* read RAM location through diagnostic window */
++ status = ar6000_ReadRegDiag(hifDevice, &address, &regDumpArea);
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("AR6K: Failed to get ptr to register dump area \n"));
++ break;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("AR6K: Location of register dump data: 0x%X \n",regDumpArea));
++
++ if (regDumpArea == 0) {
++ /* no reg dump */
++ break;
++ }
++
++ if (TargetType == TARGET_TYPE_AR6001) {
++ regDumpArea &= 0x0FFFFFFF; /* convert to physical address in target memory */
++ }
++
++ /* fetch register dump data */
++ status = ar6000_ReadDataDiag(hifDevice,
++ regDumpArea,
++ (A_UCHAR *)&regDumpValues[0],
++ regDumpCount * (sizeof(A_UINT32)));
++
++ if (A_FAILED(status)) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("AR6K: Failed to get register dump \n"));
++ break;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("AR6K: Register Dump: \n"));
++
++ for (i = 0; i < regDumpCount; i++) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" %d : 0x%8.8X \n",i, regDumpValues[i]));
++ }
++
++ } while (FALSE);
++
++}
++
+diff --git a/drivers/ar6000/miscdrv/credit_dist.c b/drivers/ar6000/miscdrv/credit_dist.c
+new file mode 100644
+index 0000000..8d37d62
+--- /dev/null
++++ b/drivers/ar6000/miscdrv/credit_dist.c
+@@ -0,0 +1,346 @@
++
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include "a_config.h"
++#include "athdefs.h"
++#include "a_types.h"
++#include "a_osapi.h"
++#include "a_debug.h"
++#include "htc_api.h"
++#include "common_drv.h"
++
++/********* CREDIT DISTRIBUTION FUNCTIONS ******************************************/
++
++#define NO_VO_SERVICE 1 /* currently WMI only uses 3 data streams, so we leave VO service inactive */
++
++#ifdef NO_VO_SERVICE
++#define DATA_SVCS_USED 3
++#else
++#define DATA_SVCS_USED 4
++#endif
++
++static void RedistributeCredits(COMMON_CREDIT_STATE_INFO *pCredInfo,
++ HTC_ENDPOINT_CREDIT_DIST *pEPDistList);
++
++static void SeekCredits(COMMON_CREDIT_STATE_INFO *pCredInfo,
++ HTC_ENDPOINT_CREDIT_DIST *pEPDistList);
++
++/* reduce an ep's credits back to a set limit */
++static INLINE void ReduceCredits(COMMON_CREDIT_STATE_INFO *pCredInfo,
++ HTC_ENDPOINT_CREDIT_DIST *pEpDist,
++ int Limit)
++{
++ int credits;
++
++ /* set the new limit */
++ pEpDist->TxCreditsAssigned = Limit;
++
++ if (pEpDist->TxCredits <= Limit) {
++ return;
++ }
++
++ /* figure out how much to take away */
++ credits = pEpDist->TxCredits - Limit;
++ /* take them away */
++ pEpDist->TxCredits -= credits;
++ pCredInfo->CurrentFreeCredits += credits;
++}
++
++/* give an endpoint some credits from the free credit pool */
++#define GiveCredits(pCredInfo,pEpDist,credits) \
++{ \
++ (pEpDist)->TxCredits += (credits); \
++ (pEpDist)->TxCreditsAssigned += (credits); \
++ (pCredInfo)->CurrentFreeCredits -= (credits); \
++}
++
++
++/* default credit init callback.
++ * This function is called in the context of HTCStart() to setup initial (application-specific)
++ * credit distributions */
++static void ar6000_credit_init(void *Context,
++ HTC_ENDPOINT_CREDIT_DIST *pEPList,
++ int TotalCredits)
++{
++ HTC_ENDPOINT_CREDIT_DIST *pCurEpDist;
++ int count;
++ COMMON_CREDIT_STATE_INFO *pCredInfo = (COMMON_CREDIT_STATE_INFO *)Context;
++
++ pCredInfo->CurrentFreeCredits = TotalCredits;
++ pCredInfo->TotalAvailableCredits = TotalCredits;
++
++ pCurEpDist = pEPList;
++
++ /* run through the list and initialize */
++ while (pCurEpDist != NULL) {
++
++ /* set minimums for each endpoint */
++ pCurEpDist->TxCreditsMin = pCurEpDist->TxCreditsPerMaxMsg;
++
++ if (pCurEpDist->ServiceID == WMI_CONTROL_SVC) {
++ /* give control service some credits */
++ GiveCredits(pCredInfo,pCurEpDist,pCurEpDist->TxCreditsMin);
++ /* control service is always marked active, it never goes inactive EVER */
++ SET_EP_ACTIVE(pCurEpDist);
++ } else if (pCurEpDist->ServiceID == WMI_DATA_BK_SVC) {
++ /* this is the lowest priority data endpoint, save this off for easy access */
++ pCredInfo->pLowestPriEpDist = pCurEpDist;
++ }
++
++ /* Streams have to be created (explicit | implicit)for all kinds
++ * of traffic. BE endpoints are also inactive in the beginning.
++ * When BE traffic starts it creates implicit streams that
++ * redistributes credits.
++ */
++
++ /* note, all other endpoints have minimums set but are initially given NO credits.
++ * Credits will be distributed as traffic activity demands */
++ pCurEpDist = pCurEpDist->pNext;
++ }
++
++ if (pCredInfo->CurrentFreeCredits <= 0) {
++ AR_DEBUG_PRINTF(ATH_LOG_INF, ("Not enough credits (%d) to do credit distributions \n", TotalCredits));
++ A_ASSERT(FALSE);
++ return;
++ }
++
++ /* reset list */
++ pCurEpDist = pEPList;
++ /* now run through the list and set max operating credit limits for everyone */
++ while (pCurEpDist != NULL) {
++ if (pCurEpDist->ServiceID == WMI_CONTROL_SVC) {
++ /* control service max is just 1 max message */
++ pCurEpDist->TxCreditsNorm = pCurEpDist->TxCreditsPerMaxMsg;
++ } else {
++ /* for the remaining data endpoints, we assume that each TxCreditsPerMaxMsg are
++ * the same.
++ * We use a simple calculation here, we take the remaining credits and
++ * determine how many max messages this can cover and then set each endpoint's
++ * normal value equal to half this amount.
++ * */
++ count = (pCredInfo->CurrentFreeCredits/pCurEpDist->TxCreditsPerMaxMsg) * pCurEpDist->TxCreditsPerMaxMsg;
++ count = count >> 1;
++ count = max(count,pCurEpDist->TxCreditsPerMaxMsg);
++ /* set normal */
++ pCurEpDist->TxCreditsNorm = count;
++
++ }
++ pCurEpDist = pCurEpDist->pNext;
++ }
++
++}
++
++
++/* default credit distribution callback
++ * This callback is invoked whenever endpoints require credit distributions.
++ * A lock is held while this function is invoked, this function shall NOT block.
++ * The pEPDistList is a list of distribution structures in prioritized order as
++ * defined by the call to the HTCSetCreditDistribution() api.
++ *
++ */
++static void ar6000_credit_distribute(void *Context,
++ HTC_ENDPOINT_CREDIT_DIST *pEPDistList,
++ HTC_CREDIT_DIST_REASON Reason)
++{
++ HTC_ENDPOINT_CREDIT_DIST *pCurEpDist;
++ COMMON_CREDIT_STATE_INFO *pCredInfo = (COMMON_CREDIT_STATE_INFO *)Context;
++
++ switch (Reason) {
++ case HTC_CREDIT_DIST_SEND_COMPLETE :
++ pCurEpDist = pEPDistList;
++ /* we are given the start of the endpoint distribution list.
++ * There may be one or more endpoints to service.
++ * Run through the list and distribute credits */
++ while (pCurEpDist != NULL) {
++
++ if (pCurEpDist->TxCreditsToDist > 0) {
++ /* return the credits back to the endpoint */
++ pCurEpDist->TxCredits += pCurEpDist->TxCreditsToDist;
++ /* always zero out when we are done */
++ pCurEpDist->TxCreditsToDist = 0;
++
++ if (pCurEpDist->TxCredits > pCurEpDist->TxCreditsAssigned) {
++ /* reduce to the assigned limit, previous credit reductions
++ * could have caused the limit to change */
++ ReduceCredits(pCredInfo, pCurEpDist, pCurEpDist->TxCreditsAssigned);
++ }
++
++ if (pCurEpDist->TxCredits > pCurEpDist->TxCreditsNorm) {
++ /* oversubscribed endpoints need to reduce back to normal */
++ ReduceCredits(pCredInfo, pCurEpDist, pCurEpDist->TxCreditsNorm);
++ }
++ }
++
++ pCurEpDist = pCurEpDist->pNext;
++ }
++
++ A_ASSERT(pCredInfo->CurrentFreeCredits <= pCredInfo->TotalAvailableCredits);
++
++ break;
++
++ case HTC_CREDIT_DIST_ACTIVITY_CHANGE :
++ RedistributeCredits(pCredInfo,pEPDistList);
++ break;
++ case HTC_CREDIT_DIST_SEEK_CREDITS :
++ SeekCredits(pCredInfo,pEPDistList);
++ break;
++ case HTC_DUMP_CREDIT_STATE :
++ AR_DEBUG_PRINTF(ATH_LOG_INF, ("Credit Distribution, total : %d, free : %d\n",
++ pCredInfo->TotalAvailableCredits, pCredInfo->CurrentFreeCredits));
++ break;
++ default:
++ break;
++
++ }
++
++}
++
++/* redistribute credits based on activity change */
++static void RedistributeCredits(COMMON_CREDIT_STATE_INFO *pCredInfo,
++ HTC_ENDPOINT_CREDIT_DIST *pEPDistList)
++{
++ HTC_ENDPOINT_CREDIT_DIST *pCurEpDist = pEPDistList;
++
++ /* walk through the list and remove credits from inactive endpoints */
++ while (pCurEpDist != NULL) {
++
++ if (pCurEpDist->ServiceID != WMI_CONTROL_SVC) {
++ if (!IS_EP_ACTIVE(pCurEpDist)) {
++ /* EP is inactive, reduce credits back to zero */
++ ReduceCredits(pCredInfo, pCurEpDist, 0);
++ }
++ }
++
++ /* NOTE in the active case, we do not need to do anything further,
++ * when an EP goes active and needs credits, HTC will call into
++ * our distribution function using a reason code of HTC_CREDIT_DIST_SEEK_CREDITS */
++
++ pCurEpDist = pCurEpDist->pNext;
++ }
++
++ A_ASSERT(pCredInfo->CurrentFreeCredits <= pCredInfo->TotalAvailableCredits);
++
++}
++
++/* HTC has an endpoint that needs credits, pEPDist is the endpoint in question */
++static void SeekCredits(COMMON_CREDIT_STATE_INFO *pCredInfo,
++ HTC_ENDPOINT_CREDIT_DIST *pEPDist)
++{
++ HTC_ENDPOINT_CREDIT_DIST *pCurEpDist;
++ int credits = 0;
++ int need;
++
++ do {
++
++ if (pEPDist->ServiceID == WMI_CONTROL_SVC) {
++ /* we never oversubscribe on the control service, this is not
++ * a high performance path and the target never holds onto control
++ * credits for too long */
++ break;
++ }
++
++ /* for all other services, we follow a simple algorithm of
++ * 1. checking the free pool for credits
++ * 2. checking lower priority endpoints for credits to take */
++
++ if (pCredInfo->CurrentFreeCredits >= 2 * pEPDist->TxCreditsSeek) {
++ /* try to give more credits than it needs */
++ credits = 2 * pEPDist->TxCreditsSeek;
++ } else {
++ /* give what we can */
++ credits = min(pCredInfo->CurrentFreeCredits,pEPDist->TxCreditsSeek);
++ }
++
++ if (credits >= pEPDist->TxCreditsSeek) {
++ /* we found some to fullfill the seek request */
++ break;
++ }
++
++ /* we don't have enough in the free pool, try taking away from lower priority services
++ *
++ * The rule for taking away credits:
++ * 1. Only take from lower priority endpoints
++ * 2. Only take what is allocated above the minimum (never starve an endpoint completely)
++ * 3. Only take what you need.
++ *
++ * */
++
++ /* starting at the lowest priority */
++ pCurEpDist = pCredInfo->pLowestPriEpDist;
++
++ /* work backwards until we hit the endpoint again */
++ while (pCurEpDist != pEPDist) {
++ /* calculate how many we need so far */
++ need = pEPDist->TxCreditsSeek - pCredInfo->CurrentFreeCredits;
++
++ if ((pCurEpDist->TxCreditsAssigned - need) > pCurEpDist->TxCreditsMin) {
++ /* the current one has been allocated more than it's minimum and it
++ * has enough credits assigned above it's minimum to fullfill our need
++ * try to take away just enough to fullfill our need */
++ ReduceCredits(pCredInfo,
++ pCurEpDist,
++ pCurEpDist->TxCreditsAssigned - need);
++
++ if (pCredInfo->CurrentFreeCredits >= pEPDist->TxCreditsSeek) {
++ /* we have enough */
++ break;
++ }
++ }
++
++ pCurEpDist = pCurEpDist->pPrev;
++ }
++
++ /* return what we can get */
++ credits = min(pCredInfo->CurrentFreeCredits,pEPDist->TxCreditsSeek);
++
++ } while (FALSE);
++
++ /* did we find some credits? */
++ if (credits) {
++ /* give what we can */
++ GiveCredits(pCredInfo, pEPDist, credits);
++ }
++
++}
++
++/* initialize and setup credit distribution */
++A_STATUS ar6000_setup_credit_dist(HTC_HANDLE HTCHandle, COMMON_CREDIT_STATE_INFO *pCredInfo)
++{
++ HTC_SERVICE_ID servicepriority[5];
++
++ A_MEMZERO(pCredInfo,sizeof(COMMON_CREDIT_STATE_INFO));
++
++ servicepriority[0] = WMI_CONTROL_SVC; /* highest */
++ servicepriority[1] = WMI_DATA_VO_SVC;
++ servicepriority[2] = WMI_DATA_VI_SVC;
++ servicepriority[3] = WMI_DATA_BE_SVC;
++ servicepriority[4] = WMI_DATA_BK_SVC; /* lowest */
++
++ /* set callbacks and priority list */
++ HTCSetCreditDistribution(HTCHandle,
++ pCredInfo,
++ ar6000_credit_distribute,
++ ar6000_credit_init,
++ servicepriority,
++ 5);
++
++ return A_OK;
++}
++
+diff --git a/drivers/ar6000/wlan/wlan_node.c b/drivers/ar6000/wlan/wlan_node.c
+new file mode 100644
+index 0000000..b124845
+--- /dev/null
++++ b/drivers/ar6000/wlan/wlan_node.c
+@@ -0,0 +1,371 @@
++/*-
++ * Copyright (c) 2001 Atsushi Onoe
++ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting
++ * Copyright (c) 2004-2005 Atheros Communications
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ * derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * GNU General Public License ("GPL") version 2 as published by the Free
++ * Software Foundation.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/wlan/src/wlan_node.c#1 $
++ */
++/*
++ * IEEE 802.11 node handling support.
++ */
++#include <a_config.h>
++#include <athdefs.h>
++#include <a_types.h>
++#include <a_osapi.h>
++#include <a_debug.h>
++#include <ieee80211.h>
++#include <wlan_api.h>
++#include <ieee80211_node.h>
++#include <htc_api.h>
++#include <wmi.h>
++#include <wmi_api.h>
++
++static void wlan_node_timeout(A_ATH_TIMER arg);
++static bss_t * _ieee80211_find_node(struct ieee80211_node_table *nt,
++ const A_UINT8 *macaddr);
++
++bss_t *
++wlan_node_alloc(struct ieee80211_node_table *nt, int wh_size)
++{
++ bss_t *ni;
++
++ ni = A_MALLOC_NOWAIT(sizeof(bss_t));
++
++ if (ni != NULL) {
++ ni->ni_buf = A_MALLOC_NOWAIT(wh_size);
++ if (ni->ni_buf == NULL) {
++ A_FREE(ni);
++ ni = NULL;
++ return ni;
++ }
++ } else {
++ return ni;
++ }
++
++ /* Make sure our lists are clean */
++ ni->ni_list_next = NULL;
++ ni->ni_list_prev = NULL;
++ ni->ni_hash_next = NULL;
++ ni->ni_hash_prev = NULL;
++
++ //
++ // ni_scangen never initialized before and during suspend/resume of winmobile, customer (LG/SEMCO) identified
++ // that some junk has been stored in this, due to this scan list didn't properly updated
++ //
++ ni->ni_scangen = 0;
++
++ return ni;
++}
++
++void
++wlan_node_free(bss_t *ni)
++{
++ if (ni->ni_buf != NULL) {
++ A_FREE(ni->ni_buf);
++ }
++ A_FREE(ni);
++}
++
++void
++wlan_setup_node(struct ieee80211_node_table *nt, bss_t *ni,
++ const A_UINT8 *macaddr)
++{
++ int hash;
++
++ A_MEMCPY(ni->ni_macaddr, macaddr, IEEE80211_ADDR_LEN);
++ hash = IEEE80211_NODE_HASH(macaddr);
++ ieee80211_node_initref(ni); /* mark referenced */
++
++ ni->ni_tstamp = A_GET_MS(WLAN_NODE_INACT_TIMEOUT_MSEC);
++ IEEE80211_NODE_LOCK_BH(nt);
++
++ /* Insert at the end of the node list */
++ ni->ni_list_next = NULL;
++ ni->ni_list_prev = nt->nt_node_last;
++ if(nt->nt_node_last != NULL)
++ {
++ nt->nt_node_last->ni_list_next = ni;
++ }
++ nt->nt_node_last = ni;
++ if(nt->nt_node_first == NULL)
++ {
++ nt->nt_node_first = ni;
++ }
++
++ /* Insert into the hash list i.e. the bucket */
++ if((ni->ni_hash_next = nt->nt_hash[hash]) != NULL)
++ {
++ nt->nt_hash[hash]->ni_hash_prev = ni;
++ }
++ ni->ni_hash_prev = NULL;
++ nt->nt_hash[hash] = ni;
++
++ if (!nt->isTimerArmed) {
++ A_TIMEOUT_MS(&nt->nt_inact_timer, WLAN_NODE_INACT_TIMEOUT_MSEC, 0);
++ nt->isTimerArmed = TRUE;
++ }
++
++ IEEE80211_NODE_UNLOCK_BH(nt);
++}
++
++static bss_t *
++_ieee80211_find_node(struct ieee80211_node_table *nt,
++ const A_UINT8 *macaddr)
++{
++ bss_t *ni;
++ int hash;
++
++ IEEE80211_NODE_LOCK_ASSERT(nt);
++
++ hash = IEEE80211_NODE_HASH(macaddr);
++ for(ni = nt->nt_hash[hash]; ni; ni = ni->ni_hash_next) {
++ if (IEEE80211_ADDR_EQ(ni->ni_macaddr, macaddr)) {
++ ieee80211_node_incref(ni); /* mark referenced */
++ return ni;
++ }
++ }
++ return NULL;
++}
++
++bss_t *
++wlan_find_node(struct ieee80211_node_table *nt, const A_UINT8 *macaddr)
++{
++ bss_t *ni;
++
++ IEEE80211_NODE_LOCK(nt);
++ ni = _ieee80211_find_node(nt, macaddr);
++ IEEE80211_NODE_UNLOCK(nt);
++ return ni;
++}
++
++/*
++ * Reclaim a node. If this is the last reference count then
++ * do the normal free work. Otherwise remove it from the node
++ * table and mark it gone by clearing the back-reference.
++ */
++void
++wlan_node_reclaim(struct ieee80211_node_table *nt, bss_t *ni)
++{
++ IEEE80211_NODE_LOCK(nt);
++
++ if(ni->ni_list_prev == NULL)
++ {
++ /* First in list so fix the list head */
++ nt->nt_node_first = ni->ni_list_next;
++ }
++ else
++ {
++ ni->ni_list_prev->ni_list_next = ni->ni_list_next;
++ }
++
++ if(ni->ni_list_next == NULL)
++ {
++ /* Last in list so fix list tail */
++ nt->nt_node_last = ni->ni_list_prev;
++ }
++ else
++ {
++ ni->ni_list_next->ni_list_prev = ni->ni_list_prev;
++ }
++
++ if(ni->ni_hash_prev == NULL)
++ {
++ /* First in list so fix the list head */
++ int hash;
++ hash = IEEE80211_NODE_HASH(ni->ni_macaddr);
++ nt->nt_hash[hash] = ni->ni_hash_next;
++ }
++ else
++ {
++ ni->ni_hash_prev->ni_hash_next = ni->ni_hash_next;
++ }
++
++ if(ni->ni_hash_next != NULL)
++ {
++ ni->ni_hash_next->ni_hash_prev = ni->ni_hash_prev;
++ }
++ wlan_node_free(ni);
++
++ IEEE80211_NODE_UNLOCK(nt);
++}
++
++static void
++wlan_node_dec_free(bss_t *ni)
++{
++ if (ieee80211_node_dectestref(ni)) {
++ wlan_node_free(ni);
++ }
++}
++
++void
++wlan_free_allnodes(struct ieee80211_node_table *nt)
++{
++ bss_t *ni;
++
++ while ((ni = nt->nt_node_first) != NULL) {
++ wlan_node_reclaim(nt, ni);
++ }
++}
++
++void
++wlan_iterate_nodes(struct ieee80211_node_table *nt, wlan_node_iter_func *f,
++ void *arg)
++{
++ bss_t *ni;
++ A_UINT32 gen;
++
++ gen = ++nt->nt_scangen;
++
++ IEEE80211_NODE_LOCK(nt);
++ for (ni = nt->nt_node_first; ni; ni = ni->ni_list_next) {
++ if (ni->ni_scangen != gen) {
++ ni->ni_scangen = gen;
++ (void) ieee80211_node_incref(ni);
++ (*f)(arg, ni);
++ wlan_node_dec_free(ni);
++ }
++ }
++ IEEE80211_NODE_UNLOCK(nt);
++}
++
++/*
++ * Node table support.
++ */
++void
++wlan_node_table_init(void *wmip, struct ieee80211_node_table *nt)
++{
++ int i;
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_WLAN, ("node table = 0x%x\n", (A_UINT32)nt));
++ IEEE80211_NODE_LOCK_INIT(nt);
++
++ nt->nt_node_first = nt->nt_node_last = NULL;
++ for(i = 0; i < IEEE80211_NODE_HASHSIZE; i++)
++ {
++ nt->nt_hash[i] = NULL;
++ }
++ A_INIT_TIMER(&nt->nt_inact_timer, wlan_node_timeout, nt);
++ nt->isTimerArmed = FALSE;
++ nt->nt_wmip = wmip;
++}
++
++static void
++wlan_node_timeout(A_ATH_TIMER arg)
++{
++ struct ieee80211_node_table *nt = (struct ieee80211_node_table *)arg;
++ bss_t *bss, *nextBss;
++ A_UINT8 myBssid[IEEE80211_ADDR_LEN], reArmTimer = FALSE;
++
++ wmi_get_current_bssid(nt->nt_wmip, myBssid);
++
++ bss = nt->nt_node_first;
++ while (bss != NULL)
++ {
++ nextBss = bss->ni_list_next;
++ if (A_MEMCMP(myBssid, bss->ni_macaddr, sizeof(myBssid)) != 0)
++ {
++
++ if (bss->ni_tstamp <= A_GET_MS(0))
++ {
++ /*
++ * free up all but the current bss - if set
++ */
++ wlan_node_reclaim(nt, bss);
++ }
++ else
++ {
++ /*
++ * Re-arm timer, only when we have a bss other than
++ * current bss AND it is not aged-out.
++ */
++ reArmTimer = TRUE;
++ }
++ }
++ bss = nextBss;
++ }
++
++ if(reArmTimer)
++ A_TIMEOUT_MS(&nt->nt_inact_timer, WLAN_NODE_INACT_TIMEOUT_MSEC, 0);
++
++ nt->isTimerArmed = reArmTimer;
++}
++
++void
++wlan_node_table_cleanup(struct ieee80211_node_table *nt)
++{
++ A_UNTIMEOUT(&nt->nt_inact_timer);
++ A_DELETE_TIMER(&nt->nt_inact_timer);
++ wlan_free_allnodes(nt);
++ IEEE80211_NODE_LOCK_DESTROY(nt);
++}
++
++bss_t *
++wlan_find_Ssidnode (struct ieee80211_node_table *nt, A_UCHAR *pSsid,
++ A_UINT32 ssidLength, A_BOOL bIsWPA2)
++{
++ bss_t *ni = NULL;
++ A_UCHAR *pIESsid = NULL;
++
++ IEEE80211_NODE_LOCK (nt);
++
++ for (ni = nt->nt_node_first; ni; ni = ni->ni_list_next) {
++ pIESsid = ni->ni_cie.ie_ssid;
++ if (pIESsid[1] <= 32) {
++
++ // Step 1 : Check SSID
++ if (0x00 == memcmp (pSsid, &pIESsid[2], ssidLength)) {
++
++ // Step 2 : if SSID matches, check WPA or WPA2
++ if (TRUE == bIsWPA2 && NULL != ni->ni_cie.ie_rsn) {
++ ieee80211_node_incref (ni); /* mark referenced */
++ IEEE80211_NODE_UNLOCK (nt);
++ return ni;
++ }
++ if (FALSE == bIsWPA2 && NULL != ni->ni_cie.ie_wpa) {
++ ieee80211_node_incref(ni); /* mark referenced */
++ IEEE80211_NODE_UNLOCK (nt);
++ return ni;
++ }
++ }
++ }
++ }
++
++ IEEE80211_NODE_UNLOCK (nt);
++
++ return NULL;
++}
++
++void
++wlan_node_return (struct ieee80211_node_table *nt, bss_t *ni)
++{
++ IEEE80211_NODE_LOCK (nt);
++ wlan_node_dec_free (ni);
++ IEEE80211_NODE_UNLOCK (nt);
++}
+diff --git a/drivers/ar6000/wlan/wlan_recv_beacon.c b/drivers/ar6000/wlan/wlan_recv_beacon.c
+new file mode 100644
+index 0000000..15beabb
+--- /dev/null
++++ b/drivers/ar6000/wlan/wlan_recv_beacon.c
+@@ -0,0 +1,192 @@
++/*-
++ * Copyright (c) 2001 Atsushi Onoe
++ * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting
++ * All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * 3. The name of the author may not be used to endorse or promote products
++ * derived from this software without specific prior written permission.
++ *
++ * Alternatively, this software may be distributed under the terms of the
++ * GNU General Public License ("GPL") version 2 as published by the Free
++ * Software Foundation.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++/*
++ * IEEE 802.11 input handling.
++ */
++
++#include "a_config.h"
++#include "athdefs.h"
++#include "a_types.h"
++#include "a_osapi.h"
++#include <wmi.h>
++#include <ieee80211.h>
++#include <wlan_api.h>
++
++#define IEEE80211_VERIFY_LENGTH(_len, _minlen) do { \
++ if ((_len) < (_minlen)) { \
++ return A_EINVAL; \
++ } \
++} while (0)
++
++#define IEEE80211_VERIFY_ELEMENT(__elem, __maxlen) do { \
++ if ((__elem) == NULL) { \
++ return A_EINVAL; \
++ } \
++ if ((__elem)[1] > (__maxlen)) { \
++ return A_EINVAL; \
++ } \
++} while (0)
++
++
++/* unaligned little endian access */
++#define LE_READ_2(p) \
++ ((A_UINT16) \
++ ((((A_UINT8 *)(p))[0] ) | (((A_UINT8 *)(p))[1] << 8)))
++
++#define LE_READ_4(p) \
++ ((A_UINT32) \
++ ((((A_UINT8 *)(p))[0] ) | (((A_UINT8 *)(p))[1] << 8) | \
++ (((A_UINT8 *)(p))[2] << 16) | (((A_UINT8 *)(p))[3] << 24)))
++
++
++static int __inline
++iswpaoui(const A_UINT8 *frm)
++{
++ return frm[1] > 3 && LE_READ_4(frm+2) == ((WPA_OUI_TYPE<<24)|WPA_OUI);
++}
++
++static int __inline
++iswmmoui(const A_UINT8 *frm)
++{
++ return frm[1] > 3 && LE_READ_4(frm+2) == ((WMM_OUI_TYPE<<24)|WMM_OUI);
++}
++
++static int __inline
++iswmmparam(const A_UINT8 *frm)
++{
++ return frm[1] > 5 && frm[6] == WMM_PARAM_OUI_SUBTYPE;
++}
++
++static int __inline
++iswmminfo(const A_UINT8 *frm)
++{
++ return frm[1] > 5 && frm[6] == WMM_INFO_OUI_SUBTYPE;
++}
++
++static int __inline
++isatherosoui(const A_UINT8 *frm)
++{
++ return frm[1] > 3 && LE_READ_4(frm+2) == ((ATH_OUI_TYPE<<24)|ATH_OUI);
++}
++
++static int __inline
++iswscoui(const A_UINT8 *frm)
++{
++ return frm[1] > 3 && LE_READ_4(frm+2) == ((0x04<<24)|WPA_OUI);
++}
++
++A_STATUS
++wlan_parse_beacon(A_UINT8 *buf, int framelen, struct ieee80211_common_ie *cie)
++{
++ A_UINT8 *frm, *efrm;
++
++ frm = buf;
++ efrm = (A_UINT8 *) (frm + framelen);
++
++ /*
++ * beacon/probe response frame format
++ * [8] time stamp
++ * [2] beacon interval
++ * [2] capability information
++ * [tlv] ssid
++ * [tlv] supported rates
++ * [tlv] country information
++ * [tlv] parameter set (FH/DS)
++ * [tlv] erp information
++ * [tlv] extended supported rates
++ * [tlv] WMM
++ * [tlv] WPA or RSN
++ * [tlv] Atheros Advanced Capabilities
++ */
++ IEEE80211_VERIFY_LENGTH(efrm - frm, 12);
++ A_MEMZERO(cie, sizeof(*cie));
++
++ cie->ie_tstamp = frm; frm += 8;
++ cie->ie_beaconInt = A_LE2CPU16(*(A_UINT16 *)frm); frm += 2;
++ cie->ie_capInfo = A_LE2CPU16(*(A_UINT16 *)frm); frm += 2;
++ cie->ie_chan = 0;
++
++ while (frm < efrm) {
++ switch (*frm) {
++ case IEEE80211_ELEMID_SSID:
++ cie->ie_ssid = frm;
++ break;
++ case IEEE80211_ELEMID_RATES:
++ cie->ie_rates = frm;
++ break;
++ case IEEE80211_ELEMID_COUNTRY:
++ cie->ie_country = frm;
++ break;
++ case IEEE80211_ELEMID_FHPARMS:
++ break;
++ case IEEE80211_ELEMID_DSPARMS:
++ cie->ie_chan = frm[2];
++ break;
++ case IEEE80211_ELEMID_TIM:
++ cie->ie_tim = frm;
++ break;
++ case IEEE80211_ELEMID_IBSSPARMS:
++ break;
++ case IEEE80211_ELEMID_XRATES:
++ cie->ie_xrates = frm;
++ break;
++ case IEEE80211_ELEMID_ERP:
++ if (frm[1] != 1) {
++ //A_PRINTF("Discarding ERP Element - Bad Len\n");
++ return A_EINVAL;
++ }
++ cie->ie_erp = frm[2];
++ break;
++ case IEEE80211_ELEMID_RSN:
++ cie->ie_rsn = frm;
++ break;
++ case IEEE80211_ELEMID_VENDOR:
++ if (iswpaoui(frm)) {
++ cie->ie_wpa = frm;
++ } else if (iswmmoui(frm)) {
++ cie->ie_wmm = frm;
++ } else if (isatherosoui(frm)) {
++ cie->ie_ath = frm;
++ } else if(iswscoui(frm)) {
++ cie->ie_wsc = frm;
++ }
++ break;
++ default:
++ break;
++ }
++ frm += frm[1] + 2;
++ }
++ IEEE80211_VERIFY_ELEMENT(cie->ie_rates, IEEE80211_RATE_MAXSIZE);
++ IEEE80211_VERIFY_ELEMENT(cie->ie_ssid, IEEE80211_NWID_LEN);
++
++ return A_OK;
++}
+diff --git a/drivers/ar6000/wlan/wlan_utils.c b/drivers/ar6000/wlan/wlan_utils.c
+new file mode 100644
+index 0000000..fd5aac9
+--- /dev/null
++++ b/drivers/ar6000/wlan/wlan_utils.c
+@@ -0,0 +1,59 @@
++/*
++ * Copyright (c) 2004-2005 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * This module implements frequently used wlan utilies
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/wlan/src/wlan_utils.c#1 $
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include <a_config.h>
++#include <athdefs.h>
++#include <a_types.h>
++#include <a_osapi.h>
++
++/*
++ * converts ieee channel number to frequency
++ */
++A_UINT16
++wlan_ieee2freq(int chan)
++{
++ if (chan == 14) {
++ return 2484;
++ }
++ if (chan < 14) { /* 0-13 */
++ return (2407 + (chan*5));
++ }
++ if (chan < 27) { /* 15-26 */
++ return (2512 + ((chan-15)*20));
++ }
++ return (5000 + (chan*5));
++}
++
++/*
++ * Converts MHz frequency to IEEE channel number.
++ */
++A_UINT32
++wlan_freq2ieee(A_UINT16 freq)
++{
++ if (freq == 2484)
++ return 14;
++ if (freq < 2484)
++ return (freq - 2407) / 5;
++ if (freq < 5000)
++ return 15 + ((freq - 2512) / 20);
++ return (freq - 5000) / 5;
++}
+diff --git a/drivers/ar6000/wmi/wmi.c b/drivers/ar6000/wmi/wmi.c
+new file mode 100644
+index 0000000..d322cf3
+--- /dev/null
++++ b/drivers/ar6000/wmi/wmi.c
+@@ -0,0 +1,3954 @@
++/*
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * This module implements the hardware independent layer of the
++ * Wireless Module Interface (WMI) protocol.
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/wmi/wmi.c#3 $
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#include <a_config.h>
++#include <athdefs.h>
++#include <a_types.h>
++#include <a_osapi.h>
++#include "htc.h"
++#include "htc_api.h"
++#include "wmi.h"
++#include <ieee80211.h>
++#include <ieee80211_node.h>
++#include <wlan_api.h>
++#include <wmi_api.h>
++#include "dset_api.h"
++#include "gpio_api.h"
++#include "wmi_host.h"
++#include "a_drv.h"
++#include "a_drv_api.h"
++#include "a_debug.h"
++#include "dbglog_api.h"
++
++static A_STATUS wmi_ready_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++
++static A_STATUS wmi_connect_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_disconnect_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_tkip_micerr_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_bssInfo_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_opt_frame_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_pstream_timeout_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_sync_point(struct wmi_t *wmip);
++
++static A_STATUS wmi_bitrate_reply_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_ratemask_reply_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_channelList_reply_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_regDomain_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_txPwr_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++static A_STATUS wmi_neighborReport_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++
++static A_STATUS wmi_dset_open_req_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++#ifdef CONFIG_HOST_DSET_SUPPORT
++static A_STATUS wmi_dset_close_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++static A_STATUS wmi_dset_data_req_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++#endif /* CONFIG_HOST_DSET_SUPPORT */
++
++
++static A_STATUS wmi_scanComplete_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_errorEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++static A_STATUS wmi_statsEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++static A_STATUS wmi_rssiThresholdEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++static A_STATUS wmi_hbChallengeResp_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++static A_STATUS wmi_reportErrorEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++static A_STATUS wmi_cac_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++static A_STATUS wmi_roam_tbl_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_roam_data_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS wmi_get_wow_list_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
++ int len);
++static A_STATUS
++wmi_get_pmkid_list_event_rx(struct wmi_t *wmip, A_UINT8 *datap, A_UINT32 len);
++
++#ifdef CONFIG_HOST_GPIO_SUPPORT
++static A_STATUS wmi_gpio_intr_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++static A_STATUS wmi_gpio_data_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++static A_STATUS wmi_gpio_ack_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++#endif /* CONFIG_HOST_GPIO_SUPPORT */
++
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++static A_STATUS
++wmi_tcmd_test_report_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++#endif
++
++static A_STATUS
++wmi_txRetryErrEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++
++static A_STATUS
++wmi_snrThresholdEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++
++static A_STATUS
++wmi_lqThresholdEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++
++static A_BOOL
++wmi_is_bitrate_index_valid(struct wmi_t *wmip, A_UINT32 rateIndex);
++
++static A_STATUS
++wmi_aplistEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++
++static A_STATUS
++wmi_dbglog_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++
++static A_STATUS wmi_keepalive_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
++
++int wps_enable;
++static const A_INT32 wmi_rateTable[] = {
++ 1000,
++ 2000,
++ 5500,
++ 11000,
++ 6000,
++ 9000,
++ 12000,
++ 18000,
++ 24000,
++ 36000,
++ 48000,
++ 54000,
++ 0};
++
++#define MODE_A_SUPPORT_RATE_START 4
++#define MODE_A_SUPPORT_RATE_STOP 11
++
++#define MODE_GONLY_SUPPORT_RATE_START MODE_A_SUPPORT_RATE_START
++#define MODE_GONLY_SUPPORT_RATE_STOP MODE_A_SUPPORT_RATE_STOP
++
++#define MODE_B_SUPPORT_RATE_START 0
++#define MODE_B_SUPPORT_RATE_STOP 3
++
++#define MODE_G_SUPPORT_RATE_START 0
++#define MODE_G_SUPPORT_RATE_STOP 11
++
++#define MAX_NUMBER_OF_SUPPORT_RATES (MODE_G_SUPPORT_RATE_STOP + 1)
++
++/* 802.1d to AC mapping. Refer pg 57 of WMM-test-plan-v1.2 */
++const A_UINT8 up_to_ac[]= {
++ WMM_AC_BE,
++ WMM_AC_BK,
++ WMM_AC_BK,
++ WMM_AC_BE,
++ WMM_AC_VI,
++ WMM_AC_VI,
++ WMM_AC_VO,
++ WMM_AC_VO,
++ };
++
++void *
++wmi_init(void *devt)
++{
++ struct wmi_t *wmip;
++
++ wmip = A_MALLOC(sizeof(struct wmi_t));
++ if (wmip == NULL) {
++ return (NULL);
++ }
++ A_MEMZERO(wmip, sizeof(*wmip));
++ A_MUTEX_INIT(&wmip->wmi_lock);
++ wmip->wmi_devt = devt;
++ wlan_node_table_init(wmip, &wmip->wmi_scan_table);
++ wmi_qos_state_init(wmip);
++ wmip->wmi_powerMode = REC_POWER;
++ wmip->wmi_phyMode = WMI_11G_MODE;
++
++ return (wmip);
++}
++
++void
++wmi_qos_state_init(struct wmi_t *wmip)
++{
++ A_UINT8 i;
++
++ if (wmip == NULL) {
++ return;
++ }
++ LOCK_WMI(wmip);
++
++ /* Initialize QoS States */
++ wmip->wmi_numQoSStream = 0;
++
++ wmip->wmi_fatPipeExists = 0;
++
++ for (i=0; i < WMM_NUM_AC; i++) {
++ wmip->wmi_streamExistsForAC[i]=0;
++ }
++
++ /* Initialize the static Wmi stream Pri to WMM AC mappings Arrays */
++ WMI_INIT_WMISTREAM_AC_MAP(wmip);
++
++ UNLOCK_WMI(wmip);
++
++ A_WMI_SET_NUMDATAENDPTS(wmip->wmi_devt, 1);
++}
++
++void
++wmi_shutdown(struct wmi_t *wmip)
++{
++ if (wmip != NULL) {
++ wlan_node_table_cleanup(&wmip->wmi_scan_table);
++ if (A_IS_MUTEX_VALID(&wmip->wmi_lock)) {
++ A_MUTEX_DELETE(&wmip->wmi_lock);
++ }
++ A_FREE(wmip);
++ }
++}
++
++/*
++ * performs DIX to 802.3 encapsulation for transmit packets.
++ * uses passed in buffer. Returns buffer or NULL if failed.
++ * Assumes the entire DIX header is contigous and that there is
++ * enough room in the buffer for a 802.3 mac header and LLC+SNAP headers.
++ */
++A_STATUS
++wmi_dix_2_dot3(struct wmi_t *wmip, void *osbuf)
++{
++ A_UINT8 *datap;
++ A_UINT16 typeorlen;
++ ATH_MAC_HDR macHdr;
++ ATH_LLC_SNAP_HDR *llcHdr;
++
++ A_ASSERT(osbuf != NULL);
++
++ if (A_NETBUF_HEADROOM(osbuf) <
++ (sizeof(ATH_LLC_SNAP_HDR) + sizeof(WMI_DATA_HDR)))
++ {
++ return A_NO_MEMORY;
++ }
++
++ datap = A_NETBUF_DATA(osbuf);
++
++ typeorlen = *(A_UINT16 *)(datap + ATH_MAC_LEN + ATH_MAC_LEN);
++
++ if (!IS_ETHERTYPE(A_BE2CPU16(typeorlen))) {
++ /*
++ * packet is already in 802.3 format - return success
++ */
++ A_DPRINTF(DBG_WMI, (DBGFMT "packet already 802.3\n", DBGARG));
++ return (A_OK);
++ }
++
++ /*
++ * Save mac fields and length to be inserted later
++ */
++ A_MEMCPY(macHdr.dstMac, datap, ATH_MAC_LEN);
++ A_MEMCPY(macHdr.srcMac, datap + ATH_MAC_LEN, ATH_MAC_LEN);
++ macHdr.typeOrLen = A_CPU2BE16(A_NETBUF_LEN(osbuf) - sizeof(ATH_MAC_HDR) +
++ sizeof(ATH_LLC_SNAP_HDR));
++
++ /*
++ * Make room for LLC+SNAP headers
++ */
++ if (A_NETBUF_PUSH(osbuf, sizeof(ATH_LLC_SNAP_HDR)) != A_OK) {
++ return A_NO_MEMORY;
++ }
++
++ datap = A_NETBUF_DATA(osbuf);
++
++ A_MEMCPY(datap, &macHdr, sizeof (ATH_MAC_HDR));
++
++ llcHdr = (ATH_LLC_SNAP_HDR *)(datap + sizeof(ATH_MAC_HDR));
++ llcHdr->dsap = 0xAA;
++ llcHdr->ssap = 0xAA;
++ llcHdr->cntl = 0x03;
++ llcHdr->orgCode[0] = 0x0;
++ llcHdr->orgCode[1] = 0x0;
++ llcHdr->orgCode[2] = 0x0;
++ llcHdr->etherType = typeorlen;
++
++ return (A_OK);
++}
++
++/*
++ * Adds a WMI data header
++ * Assumes there is enough room in the buffer to add header.
++ */
++A_STATUS
++wmi_data_hdr_add(struct wmi_t *wmip, void *osbuf, A_UINT8 msgType)
++{
++ WMI_DATA_HDR *dtHdr;
++
++ A_ASSERT(osbuf != NULL);
++
++ if (A_NETBUF_PUSH(osbuf, sizeof(WMI_DATA_HDR)) != A_OK) {
++ return A_NO_MEMORY;
++ }
++
++ dtHdr = (WMI_DATA_HDR *)A_NETBUF_DATA(osbuf);
++ dtHdr->info = msgType;
++ dtHdr->rssi = 0;
++
++ return (A_OK);
++}
++
++A_UINT8 wmi_implicit_create_pstream(struct wmi_t *wmip, void *osbuf, A_UINT8 dir, A_UINT8 up)
++{
++ A_UINT8 *datap;
++ A_UINT8 trafficClass = WMM_AC_BE, userPriority = up;
++ ATH_LLC_SNAP_HDR *llcHdr;
++ A_UINT16 ipType = IP_ETHERTYPE;
++ WMI_DATA_HDR *dtHdr;
++ WMI_CREATE_PSTREAM_CMD cmd;
++ A_BOOL streamExists = FALSE;
++
++ A_ASSERT(osbuf != NULL);
++
++ datap = A_NETBUF_DATA(osbuf);
++
++ if (up == UNDEFINED_PRI) {
++ llcHdr = (ATH_LLC_SNAP_HDR *)(datap + sizeof(WMI_DATA_HDR) +
++ sizeof(ATH_MAC_HDR));
++
++ if (llcHdr->etherType == A_CPU2BE16(ipType)) {
++ /* Extract the endpoint info from the TOS field in the IP header */
++ userPriority = A_WMI_IPTOS_TO_USERPRIORITY(((A_UINT8 *)llcHdr) + sizeof(ATH_LLC_SNAP_HDR));
++ }
++ }
++
++ if (userPriority < MAX_NUM_PRI) {
++ trafficClass = convert_userPriority_to_trafficClass(userPriority);
++ }
++
++ dtHdr = (WMI_DATA_HDR *)datap;
++ if(dir==UPLINK_TRAFFIC)
++ dtHdr->info |= (userPriority & WMI_DATA_HDR_UP_MASK) << WMI_DATA_HDR_UP_SHIFT; /* lower 3-bits are 802.1d priority */
++
++ LOCK_WMI(wmip);
++ streamExists = wmip->wmi_fatPipeExists;
++ UNLOCK_WMI(wmip);
++
++ if (!(streamExists & (1 << trafficClass))) {
++
++ A_MEMZERO(&cmd, sizeof(cmd));
++ cmd.trafficClass = trafficClass;
++ cmd.userPriority = userPriority;
++ cmd.inactivityInt = WMI_IMPLICIT_PSTREAM_INACTIVITY_INT;
++ /* Implicit streams are created with TSID 0xFF */
++ cmd.tsid = WMI_IMPLICIT_PSTREAM;
++ wmi_create_pstream_cmd(wmip, &cmd);
++ }
++
++ return trafficClass;
++}
++
++WMI_PRI_STREAM_ID
++wmi_get_stream_id(struct wmi_t *wmip, A_UINT8 trafficClass)
++{
++ return WMI_ACCESSCATEGORY_WMISTREAM(wmip, trafficClass);
++}
++
++/*
++ * performs 802.3 to DIX encapsulation for received packets.
++ * Assumes the entire 802.3 header is contigous.
++ */
++A_STATUS
++wmi_dot3_2_dix(struct wmi_t *wmip, void *osbuf)
++{
++ A_UINT8 *datap;
++ ATH_MAC_HDR macHdr;
++ ATH_LLC_SNAP_HDR *llcHdr;
++
++ A_ASSERT(osbuf != NULL);
++ datap = A_NETBUF_DATA(osbuf);
++
++ A_MEMCPY(&macHdr, datap, sizeof(ATH_MAC_HDR));
++ llcHdr = (ATH_LLC_SNAP_HDR *)(datap + sizeof(ATH_MAC_HDR));
++ macHdr.typeOrLen = llcHdr->etherType;
++
++ if (A_NETBUF_PULL(osbuf, sizeof(ATH_LLC_SNAP_HDR)) != A_OK) {
++ return A_NO_MEMORY;
++ }
++
++ datap = A_NETBUF_DATA(osbuf);
++
++ A_MEMCPY(datap, &macHdr, sizeof (ATH_MAC_HDR));
++
++ return (A_OK);
++}
++
++/*
++ * Removes a WMI data header
++ */
++A_STATUS
++wmi_data_hdr_remove(struct wmi_t *wmip, void *osbuf)
++{
++ A_ASSERT(osbuf != NULL);
++
++ return (A_NETBUF_PULL(osbuf, sizeof(WMI_DATA_HDR)));
++}
++
++void
++wmi_iterate_nodes(struct wmi_t *wmip, wlan_node_iter_func *f, void *arg)
++{
++ wlan_iterate_nodes(&wmip->wmi_scan_table, f, arg);
++}
++
++/*
++ * WMI Extended Event received from Target.
++ */
++A_STATUS
++wmi_control_rx_xtnd(struct wmi_t *wmip, void *osbuf)
++{
++ WMIX_CMD_HDR *cmd;
++ A_UINT16 id;
++ A_UINT8 *datap;
++ A_UINT32 len;
++ A_STATUS status = A_OK;
++
++ if (A_NETBUF_LEN(osbuf) < sizeof(WMIX_CMD_HDR)) {
++ A_DPRINTF(DBG_WMI, (DBGFMT "bad packet 1\n", DBGARG));
++ wmip->wmi_stats.cmd_len_err++;
++ A_NETBUF_FREE(osbuf);
++ return A_ERROR;
++ }
++
++ cmd = (WMIX_CMD_HDR *)A_NETBUF_DATA(osbuf);
++ id = cmd->commandId;
++
++ if (A_NETBUF_PULL(osbuf, sizeof(WMIX_CMD_HDR)) != A_OK) {
++ A_DPRINTF(DBG_WMI, (DBGFMT "bad packet 2\n", DBGARG));
++ wmip->wmi_stats.cmd_len_err++;
++ A_NETBUF_FREE(osbuf);
++ return A_ERROR;
++ }
++
++ datap = A_NETBUF_DATA(osbuf);
++ len = A_NETBUF_LEN(osbuf);
++
++ switch (id) {
++ case (WMIX_DSETOPENREQ_EVENTID):
++ status = wmi_dset_open_req_rx(wmip, datap, len);
++ break;
++#ifdef CONFIG_HOST_DSET_SUPPORT
++ case (WMIX_DSETCLOSE_EVENTID):
++ status = wmi_dset_close_rx(wmip, datap, len);
++ break;
++ case (WMIX_DSETDATAREQ_EVENTID):
++ status = wmi_dset_data_req_rx(wmip, datap, len);
++ break;
++#endif /* CONFIG_HOST_DSET_SUPPORT */
++#ifdef CONFIG_HOST_GPIO_SUPPORT
++ case (WMIX_GPIO_INTR_EVENTID):
++ wmi_gpio_intr_rx(wmip, datap, len);
++ break;
++ case (WMIX_GPIO_DATA_EVENTID):
++ wmi_gpio_data_rx(wmip, datap, len);
++ break;
++ case (WMIX_GPIO_ACK_EVENTID):
++ wmi_gpio_ack_rx(wmip, datap, len);
++ break;
++#endif /* CONFIG_HOST_GPIO_SUPPORT */
++ case (WMIX_HB_CHALLENGE_RESP_EVENTID):
++ wmi_hbChallengeResp_rx(wmip, datap, len);
++ break;
++ case (WMIX_DBGLOG_EVENTID):
++ wmi_dbglog_event_rx(wmip, datap, len);
++ break;
++ default:
++ A_DPRINTF(DBG_WMI|DBG_ERROR,
++ (DBGFMT "Unknown id 0x%x\n", DBGARG, id));
++ wmip->wmi_stats.cmd_id_err++;
++ status = A_ERROR;
++ break;
++ }
++
++ return status;
++}
++
++/*
++ * Control Path
++ */
++A_UINT32 cmdRecvNum;
++
++A_STATUS
++wmi_control_rx(struct wmi_t *wmip, void *osbuf)
++{
++ WMI_CMD_HDR *cmd;
++ A_UINT16 id;
++ A_UINT8 *datap;
++ A_UINT32 len, i, loggingReq;
++ A_STATUS status = A_OK;
++
++ A_ASSERT(osbuf != NULL);
++ if (A_NETBUF_LEN(osbuf) < sizeof(WMI_CMD_HDR)) {
++ A_DPRINTF(DBG_WMI, (DBGFMT "bad packet 1\n", DBGARG));
++ wmip->wmi_stats.cmd_len_err++;
++ A_NETBUF_FREE(osbuf);
++ return A_ERROR;
++ }
++
++ cmd = (WMI_CMD_HDR *)A_NETBUF_DATA(osbuf);
++ id = cmd->commandId;
++
++ if (A_NETBUF_PULL(osbuf, sizeof(WMI_CMD_HDR)) != A_OK) {
++ A_DPRINTF(DBG_WMI, (DBGFMT "bad packet 2\n", DBGARG));
++ wmip->wmi_stats.cmd_len_err++;
++ A_NETBUF_FREE(osbuf);
++ return A_ERROR;
++ }
++
++ datap = A_NETBUF_DATA(osbuf);
++ len = A_NETBUF_LEN(osbuf);
++
++ ar6000_get_driver_cfg(wmip->wmi_devt,
++ AR6000_DRIVER_CFG_LOG_RAW_WMI_MSGS,
++ &loggingReq);
++
++ if(loggingReq) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("WMI %d \n",id));
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("WMI recv, MsgNo %d : ", cmdRecvNum));
++ for(i = 0; i < len; i++)
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("%x ", datap[i]));
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("\n"));
++ }
++
++ LOCK_WMI(wmip);
++ cmdRecvNum++;
++ UNLOCK_WMI(wmip);
++
++ switch (id) {
++ case (WMI_GET_BITRATE_CMDID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_GET_BITRATE_CMDID\n", DBGARG));
++ status = wmi_bitrate_reply_rx(wmip, datap, len);
++ break;
++ case (WMI_GET_CHANNEL_LIST_CMDID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_GET_CHANNEL_LIST_CMDID\n", DBGARG));
++ status = wmi_channelList_reply_rx(wmip, datap, len);
++ break;
++ case (WMI_GET_TX_PWR_CMDID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_GET_TX_PWR_CMDID\n", DBGARG));
++ status = wmi_txPwr_reply_rx(wmip, datap, len);
++ break;
++ case (WMI_READY_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_READY_EVENTID\n", DBGARG));
++ status = wmi_ready_event_rx(wmip, datap, len);
++ A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
++ A_WMI_DBGLOG_INIT_DONE(wmip->wmi_devt);
++ break;
++ case (WMI_CONNECT_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_CONNECT_EVENTID\n", DBGARG));
++ status = wmi_connect_event_rx(wmip, datap, len);
++ A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
++ break;
++ case (WMI_DISCONNECT_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_DISCONNECT_EVENTID\n", DBGARG));
++ status = wmi_disconnect_event_rx(wmip, datap, len);
++ A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
++ break;
++ case (WMI_TKIP_MICERR_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_TKIP_MICERR_EVENTID\n", DBGARG));
++ status = wmi_tkip_micerr_event_rx(wmip, datap, len);
++ break;
++ case (WMI_BSSINFO_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_BSSINFO_EVENTID\n", DBGARG));
++ status = wmi_bssInfo_event_rx(wmip, datap, len);
++ A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
++ break;
++ case (WMI_REGDOMAIN_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_REGDOMAIN_EVENTID\n", DBGARG));
++ status = wmi_regDomain_event_rx(wmip, datap, len);
++ break;
++ case (WMI_PSTREAM_TIMEOUT_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_PSTREAM_TIMEOUT_EVENTID\n", DBGARG));
++ status = wmi_pstream_timeout_event_rx(wmip, datap, len);
++ /* pstreams are fatpipe abstractions that get implicitly created.
++ * User apps only deal with thinstreams. creation of a thinstream
++ * by the user or data traffic flow in an AC triggers implicit
++ * pstream creation. Do we need to send this event to App..?
++ * no harm in sending it.
++ */
++ A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
++ break;
++ case (WMI_NEIGHBOR_REPORT_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_NEIGHBOR_REPORT_EVENTID\n", DBGARG));
++ status = wmi_neighborReport_event_rx(wmip, datap, len);
++ break;
++ case (WMI_SCAN_COMPLETE_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_SCAN_COMPLETE_EVENTID\n", DBGARG));
++ status = wmi_scanComplete_rx(wmip, datap, len);
++ A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
++ break;
++ case (WMI_CMDERROR_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_CMDERROR_EVENTID\n", DBGARG));
++ status = wmi_errorEvent_rx(wmip, datap, len);
++ break;
++ case (WMI_REPORT_STATISTICS_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_REPORT_STATISTICS_EVENTID\n", DBGARG));
++ status = wmi_statsEvent_rx(wmip, datap, len);
++ break;
++ case (WMI_RSSI_THRESHOLD_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_RSSI_THRESHOLD_EVENTID\n", DBGARG));
++ status = wmi_rssiThresholdEvent_rx(wmip, datap, len);
++ break;
++ case (WMI_ERROR_REPORT_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_ERROR_REPORT_EVENTID\n", DBGARG));
++ status = wmi_reportErrorEvent_rx(wmip, datap, len);
++ A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
++ break;
++ case (WMI_OPT_RX_FRAME_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_OPT_RX_FRAME_EVENTID\n", DBGARG));
++ status = wmi_opt_frame_event_rx(wmip, datap, len);
++ break;
++ case (WMI_REPORT_ROAM_TBL_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_REPORT_ROAM_TBL_EVENTID\n", DBGARG));
++ status = wmi_roam_tbl_event_rx(wmip, datap, len);
++ break;
++ case (WMI_EXTENSION_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_EXTENSION_EVENTID\n", DBGARG));
++ status = wmi_control_rx_xtnd(wmip, osbuf);
++ break;
++ case (WMI_CAC_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_CAC_EVENTID\n", DBGARG));
++ status = wmi_cac_event_rx(wmip, datap, len);
++ break;
++ case (WMI_REPORT_ROAM_DATA_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_REPORT_ROAM_DATA_EVENTID\n", DBGARG));
++ status = wmi_roam_data_event_rx(wmip, datap, len);
++ break;
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++ case (WMI_TEST_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_TEST_EVENTID\n", DBGARG));
++ status = wmi_tcmd_test_report_rx(wmip, datap, len);
++ break;
++#endif
++ case (WMI_GET_FIXRATES_CMDID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_GET_FIXRATES_CMDID\n", DBGARG));
++ status = wmi_ratemask_reply_rx(wmip, datap, len);
++ break;
++ case (WMI_TX_RETRY_ERR_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_TX_RETRY_ERR_EVENTID\n", DBGARG));
++ status = wmi_txRetryErrEvent_rx(wmip, datap, len);
++ A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
++ break;
++ case (WMI_SNR_THRESHOLD_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_SNR_THRESHOLD_EVENTID\n", DBGARG));
++ status = wmi_snrThresholdEvent_rx(wmip, datap, len);
++ A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
++ break;
++ case (WMI_LQ_THRESHOLD_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_LQ_THRESHOLD_EVENTID\n", DBGARG));
++ status = wmi_lqThresholdEvent_rx(wmip, datap, len);
++ A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
++ break;
++ case (WMI_APLIST_EVENTID):
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("Received APLIST Event\n"));
++ status = wmi_aplistEvent_rx(wmip, datap, len);
++ break;
++ case (WMI_GET_KEEPALIVE_CMDID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_GET_KEEPALIVE_CMDID\n", DBGARG));
++ status = wmi_keepalive_reply_rx(wmip, datap, len);
++ break;
++ case (WMI_GET_WOW_LIST_EVENTID):
++ status = wmi_get_wow_list_event_rx(wmip, datap, len);
++ break;
++ case (WMI_GET_PMKID_LIST_EVENTID):
++ A_DPRINTF(DBG_WMI, (DBGFMT "WMI_GET_PMKID_LIST Event\n", DBGARG));
++ status = wmi_get_pmkid_list_event_rx(wmip, datap, len);
++ break;
++ default:
++ A_DPRINTF(DBG_WMI|DBG_ERROR,
++ (DBGFMT "Unknown id 0x%x\n", DBGARG, id));
++ wmip->wmi_stats.cmd_id_err++;
++ status = A_ERROR;
++ break;
++ }
++
++ A_NETBUF_FREE(osbuf);
++
++ return status;
++}
++
++static A_STATUS
++wmi_ready_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_READY_EVENT *ev = (WMI_READY_EVENT *)datap;
++
++ if (len < sizeof(WMI_READY_EVENT)) {
++ return A_EINVAL;
++ }
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++ wmip->wmi_ready = TRUE;
++ A_WMI_READY_EVENT(wmip->wmi_devt, ev->macaddr, ev->phyCapability);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_connect_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_CONNECT_EVENT *ev;
++
++ if (len < sizeof(WMI_CONNECT_EVENT)) {
++ return A_EINVAL;
++ }
++ ev = (WMI_CONNECT_EVENT *)datap;
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "freq %d bssid %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
++ DBGARG, ev->channel,
++ ev->bssid[0], ev->bssid[1], ev->bssid[2],
++ ev->bssid[3], ev->bssid[4], ev->bssid[5]));
++
++ A_MEMCPY(wmip->wmi_bssid, ev->bssid, ATH_MAC_LEN);
++
++ A_WMI_CONNECT_EVENT(wmip->wmi_devt, ev->channel, ev->bssid,
++ ev->listenInterval, ev->beaconInterval,
++ ev->networkType, ev->beaconIeLen,
++ ev->assocReqLen, ev->assocRespLen,
++ ev->assocInfo);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_regDomain_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_REG_DOMAIN_EVENT *ev;
++
++ if (len < sizeof(*ev)) {
++ return A_EINVAL;
++ }
++ ev = (WMI_REG_DOMAIN_EVENT *)datap;
++
++ A_WMI_REGDOMAIN_EVENT(wmip->wmi_devt, ev->regDomain);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_neighborReport_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_NEIGHBOR_REPORT_EVENT *ev;
++ int numAps;
++
++ if (len < sizeof(*ev)) {
++ return A_EINVAL;
++ }
++ ev = (WMI_NEIGHBOR_REPORT_EVENT *)datap;
++ numAps = ev->numberOfAps;
++
++ if (len < (int)(sizeof(*ev) + ((numAps - 1) * sizeof(WMI_NEIGHBOR_INFO)))) {
++ return A_EINVAL;
++ }
++
++ A_WMI_NEIGHBORREPORT_EVENT(wmip->wmi_devt, numAps, ev->neighbor);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_disconnect_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_DISCONNECT_EVENT *ev;
++
++ if (len < sizeof(WMI_DISCONNECT_EVENT)) {
++ return A_EINVAL;
++ }
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ ev = (WMI_DISCONNECT_EVENT *)datap;
++
++ A_MEMZERO(wmip->wmi_bssid, sizeof(wmip->wmi_bssid));
++
++ A_WMI_DISCONNECT_EVENT(wmip->wmi_devt, ev->disconnectReason, ev->bssid,
++ ev->assocRespLen, ev->assocInfo, ev->protocolReasonStatus);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_tkip_micerr_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_TKIP_MICERR_EVENT *ev;
++
++ if (len < sizeof(*ev)) {
++ return A_EINVAL;
++ }
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ ev = (WMI_TKIP_MICERR_EVENT *)datap;
++ A_WMI_TKIP_MICERR_EVENT(wmip->wmi_devt, ev->keyid, ev->ismcast);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_bssInfo_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ bss_t *bss;
++ WMI_BSS_INFO_HDR *bih;
++ A_UINT8 *buf;
++ A_UINT32 nodeCachingAllowed;
++
++ if (len <= sizeof(WMI_BSS_INFO_HDR)) {
++ return A_EINVAL;
++ }
++
++ A_WMI_BSSINFO_EVENT_RX(wmip->wmi_devt, datap, len);
++ /* What is driver config for wlan node caching? */
++ if(ar6000_get_driver_cfg(wmip->wmi_devt,
++ AR6000_DRIVER_CFG_GET_WLANNODECACHING,
++ &nodeCachingAllowed) != A_OK) {
++ return A_EINVAL;
++ }
++
++ if(!nodeCachingAllowed) {
++ return A_OK;
++ }
++
++
++ bih = (WMI_BSS_INFO_HDR *)datap;
++ buf = datap + sizeof(WMI_BSS_INFO_HDR);
++ len -= sizeof(WMI_BSS_INFO_HDR);
++
++ A_DPRINTF(DBG_WMI2, (DBGFMT "bssInfo event - ch %u, rssi %02x, "
++ "bssid \"%02x:%02x:%02x:%02x:%02x:%02x\"\n", DBGARG,
++ bih->channel, (unsigned char) bih->rssi, bih->bssid[0],
++ bih->bssid[1], bih->bssid[2], bih->bssid[3], bih->bssid[4],
++ bih->bssid[5]));
++
++ if(wps_enable && (bih->frameType == PROBERESP_FTYPE) ) {
++ printk("%s() A_OK 2\n", __FUNCTION__);
++ return A_OK;
++ }
++
++ bss = wlan_find_node(&wmip->wmi_scan_table, bih->bssid);
++ if (bss != NULL) {
++ /*
++ * Free up the node. Not the most efficient process given
++ * we are about to allocate a new node but it is simple and should be
++ * adequate.
++ */
++ wlan_node_reclaim(&wmip->wmi_scan_table, bss);
++ }
++
++ bss = wlan_node_alloc(&wmip->wmi_scan_table, len);
++ if (bss == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ bss->ni_snr = bih->snr;
++ bss->ni_rssi = bih->rssi;
++ A_ASSERT(bss->ni_buf != NULL);
++ A_MEMCPY(bss->ni_buf, buf, len);
++
++ if (wlan_parse_beacon(bss->ni_buf, len, &bss->ni_cie) != A_OK) {
++ wlan_node_free(bss);
++ return A_EINVAL;
++ }
++
++ /*
++ * Update the frequency in ie_chan, overwriting of channel number
++ * which is done in wlan_parse_beacon
++ */
++ bss->ni_cie.ie_chan = bih->channel;
++ wlan_setup_node(&wmip->wmi_scan_table, bss, bih->bssid);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_opt_frame_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ bss_t *bss;
++ WMI_OPT_RX_INFO_HDR *bih;
++ A_UINT8 *buf;
++
++ if (len <= sizeof(WMI_OPT_RX_INFO_HDR)) {
++ return A_EINVAL;
++ }
++
++ bih = (WMI_OPT_RX_INFO_HDR *)datap;
++ buf = datap + sizeof(WMI_OPT_RX_INFO_HDR);
++ len -= sizeof(WMI_OPT_RX_INFO_HDR);
++
++ A_DPRINTF(DBG_WMI2, (DBGFMT "opt frame event %2.2x:%2.2x\n", DBGARG,
++ bih->bssid[4], bih->bssid[5]));
++
++ bss = wlan_find_node(&wmip->wmi_scan_table, bih->bssid);
++ if (bss != NULL) {
++ /*
++ * Free up the node. Not the most efficient process given
++ * we are about to allocate a new node but it is simple and should be
++ * adequate.
++ */
++ wlan_node_reclaim(&wmip->wmi_scan_table, bss);
++ }
++
++ bss = wlan_node_alloc(&wmip->wmi_scan_table, len);
++ if (bss == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ bss->ni_snr = bih->snr;
++ bss->ni_cie.ie_chan = bih->channel;
++ A_ASSERT(bss->ni_buf != NULL);
++ A_MEMCPY(bss->ni_buf, buf, len);
++ wlan_setup_node(&wmip->wmi_scan_table, bss, bih->bssid);
++
++ return A_OK;
++}
++
++ /* This event indicates inactivity timeout of a fatpipe(pstream)
++ * at the target
++ */
++static A_STATUS
++wmi_pstream_timeout_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_PSTREAM_TIMEOUT_EVENT *ev;
++
++ if (len < sizeof(WMI_PSTREAM_TIMEOUT_EVENT)) {
++ return A_EINVAL;
++ }
++
++ A_DPRINTF(DBG_WMI, (DBGFMT "wmi_pstream_timeout_event_rx\n", DBGARG));
++
++ ev = (WMI_PSTREAM_TIMEOUT_EVENT *)datap;
++
++ /* When the pstream (fat pipe == AC) timesout, it means there were no
++ * thinStreams within this pstream & it got implicitly created due to
++ * data flow on this AC. We start the inactivity timer only for
++ * implicitly created pstream. Just reset the host state.
++ */
++ /* Set the activeTsids for this AC to 0 */
++ LOCK_WMI(wmip);
++ wmip->wmi_streamExistsForAC[ev->trafficClass]=0;
++ wmip->wmi_fatPipeExists &= ~(1 << ev->trafficClass);
++ UNLOCK_WMI(wmip);
++
++ /*Indicate inactivity to driver layer for this fatpipe (pstream)*/
++ A_WMI_STREAM_TX_INACTIVE(wmip->wmi_devt, ev->trafficClass);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_bitrate_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_BIT_RATE_CMD *reply;
++ A_INT32 rate;
++
++ if (len < sizeof(WMI_BIT_RATE_CMD)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_BIT_RATE_CMD *)datap;
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "Enter - rateindex %d\n", DBGARG, reply->rateIndex));
++
++ if (reply->rateIndex == RATE_AUTO) {
++ rate = RATE_AUTO;
++ } else {
++ rate = wmi_rateTable[(A_UINT32) reply->rateIndex];
++ }
++
++ A_WMI_BITRATE_RX(wmip->wmi_devt, rate);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_ratemask_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_FIX_RATES_CMD *reply;
++
++ if (len < sizeof(WMI_BIT_RATE_CMD)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_FIX_RATES_CMD *)datap;
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "Enter - fixed rate mask %x\n", DBGARG, reply->fixRateMask));
++
++ A_WMI_RATEMASK_RX(wmip->wmi_devt, reply->fixRateMask);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_channelList_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_CHANNEL_LIST_REPLY *reply;
++
++ if (len < sizeof(WMI_CHANNEL_LIST_REPLY)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_CHANNEL_LIST_REPLY *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_CHANNELLIST_RX(wmip->wmi_devt, reply->numChannels,
++ reply->channelList);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_txPwr_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_TX_PWR_REPLY *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_TX_PWR_REPLY *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_TXPWR_RX(wmip->wmi_devt, reply->dbM);
++
++ return A_OK;
++}
++static A_STATUS
++wmi_keepalive_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_GET_KEEPALIVE_CMD *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_GET_KEEPALIVE_CMD *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_KEEPALIVE_RX(wmip->wmi_devt, reply->configured);
++
++ return A_OK;
++}
++
++
++static A_STATUS
++wmi_dset_open_req_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMIX_DSETOPENREQ_EVENT *dsetopenreq;
++
++ if (len < sizeof(WMIX_DSETOPENREQ_EVENT)) {
++ return A_EINVAL;
++ }
++ dsetopenreq = (WMIX_DSETOPENREQ_EVENT *)datap;
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "Enter - dset_id=0x%x\n", DBGARG, dsetopenreq->dset_id));
++ A_WMI_DSET_OPEN_REQ(wmip->wmi_devt,
++ dsetopenreq->dset_id,
++ dsetopenreq->targ_dset_handle,
++ dsetopenreq->targ_reply_fn,
++ dsetopenreq->targ_reply_arg);
++
++ return A_OK;
++}
++
++#ifdef CONFIG_HOST_DSET_SUPPORT
++static A_STATUS
++wmi_dset_close_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMIX_DSETCLOSE_EVENT *dsetclose;
++
++ if (len < sizeof(WMIX_DSETCLOSE_EVENT)) {
++ return A_EINVAL;
++ }
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ dsetclose = (WMIX_DSETCLOSE_EVENT *)datap;
++ A_WMI_DSET_CLOSE(wmip->wmi_devt, dsetclose->access_cookie);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_dset_data_req_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMIX_DSETDATAREQ_EVENT *dsetdatareq;
++
++ if (len < sizeof(WMIX_DSETDATAREQ_EVENT)) {
++ return A_EINVAL;
++ }
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ dsetdatareq = (WMIX_DSETDATAREQ_EVENT *)datap;
++ A_WMI_DSET_DATA_REQ(wmip->wmi_devt,
++ dsetdatareq->access_cookie,
++ dsetdatareq->offset,
++ dsetdatareq->length,
++ dsetdatareq->targ_buf,
++ dsetdatareq->targ_reply_fn,
++ dsetdatareq->targ_reply_arg);
++
++ return A_OK;
++}
++#endif /* CONFIG_HOST_DSET_SUPPORT */
++
++static A_STATUS
++wmi_scanComplete_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_SCAN_COMPLETE_EVENT *ev;
++
++ ev = (WMI_SCAN_COMPLETE_EVENT *)datap;
++ A_WMI_SCANCOMPLETE_EVENT(wmip->wmi_devt, ev->status);
++
++ return A_OK;
++}
++
++/*
++ * Target is reporting a programming error. This is for
++ * developer aid only. Target only checks a few common violations
++ * and it is responsibility of host to do all error checking.
++ * Behavior of target after wmi error event is undefined.
++ * A reset is recommended.
++ */
++static A_STATUS
++wmi_errorEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_CMD_ERROR_EVENT *ev;
++
++ ev = (WMI_CMD_ERROR_EVENT *)datap;
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("Programming Error: cmd=%d ", ev->commandId));
++ switch (ev->errorCode) {
++ case (INVALID_PARAM):
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("Illegal Parameter\n"));
++ break;
++ case (ILLEGAL_STATE):
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("Illegal State\n"));
++ break;
++ case (INTERNAL_ERROR):
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("Internal Error\n"));
++ break;
++ }
++
++ return A_OK;
++}
++
++
++static A_STATUS
++wmi_statsEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_TARGET_STATS *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_TARGET_STATS *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_TARGETSTATS_EVENT(wmip->wmi_devt, reply);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_rssiThresholdEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_RSSI_THRESHOLD_EVENT *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_RSSI_THRESHOLD_EVENT *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_RSSI_THRESHOLD_EVENT(wmip->wmi_devt, reply->range, reply->rssi);
++
++ return A_OK;
++}
++
++
++static A_STATUS
++wmi_reportErrorEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_TARGET_ERROR_REPORT_EVENT *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_TARGET_ERROR_REPORT_EVENT *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_REPORT_ERROR_EVENT(wmip->wmi_devt, reply->errorVal);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_cac_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_CAC_EVENT *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_CAC_EVENT *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_CAC_EVENT(wmip->wmi_devt, reply->ac,
++ reply->cac_indication, reply->statusCode,
++ reply->tspecSuggestion);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_hbChallengeResp_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMIX_HB_CHALLENGE_RESP_EVENT *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMIX_HB_CHALLENGE_RESP_EVENT *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "wmi: challenge response event\n", DBGARG));
++
++ A_WMI_HBCHALLENGERESP_EVENT(wmip->wmi_devt, reply->cookie, reply->source);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_roam_tbl_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_TARGET_ROAM_TBL *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_TARGET_ROAM_TBL *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_ROAM_TABLE_EVENT(wmip->wmi_devt, reply);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_roam_data_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_TARGET_ROAM_DATA *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_TARGET_ROAM_DATA *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_ROAM_DATA_EVENT(wmip->wmi_devt, reply);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_txRetryErrEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_TX_RETRY_ERR_EVENT *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_TX_RETRY_ERR_EVENT *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_TX_RETRY_ERR_EVENT(wmip->wmi_devt);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_snrThresholdEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_SNR_THRESHOLD_EVENT *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_SNR_THRESHOLD_EVENT *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_SNR_THRESHOLD_EVENT_RX(wmip->wmi_devt, reply->range, reply->snr);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_lqThresholdEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_LQ_THRESHOLD_EVENT *reply;
++
++ if (len < sizeof(*reply)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_LQ_THRESHOLD_EVENT *)datap;
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_LQ_THRESHOLD_EVENT_RX(wmip->wmi_devt, reply->range, reply->lq);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_aplistEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ A_UINT16 ap_info_entry_size;
++ WMI_APLIST_EVENT *ev = (WMI_APLIST_EVENT *)datap;
++ WMI_AP_INFO_V1 *ap_info_v1;
++ A_UINT8 i;
++
++ if (len < sizeof(WMI_APLIST_EVENT)) {
++ return A_EINVAL;
++ }
++
++ if (ev->apListVer == APLIST_VER1) {
++ ap_info_entry_size = sizeof(WMI_AP_INFO_V1);
++ ap_info_v1 = (WMI_AP_INFO_V1 *)ev->apList;
++ } else {
++ return A_EINVAL;
++ }
++
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("Number of APs in APLIST Event is %d\n", ev->numAP));
++ if (len < (int)(sizeof(WMI_APLIST_EVENT) +
++ (ev->numAP - 1) * ap_info_entry_size))
++ {
++ return A_EINVAL;
++ }
++
++ /*
++ * AP List Ver1 Contents
++ */
++ for (i = 0; i < ev->numAP; i++) {
++ AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("AP#%d BSSID %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x "\
++ "Channel %d\n", i,
++ ap_info_v1->bssid[0], ap_info_v1->bssid[1],
++ ap_info_v1->bssid[2], ap_info_v1->bssid[3],
++ ap_info_v1->bssid[4], ap_info_v1->bssid[5],
++ ap_info_v1->channel));
++ ap_info_v1++;
++ }
++ return A_OK;
++}
++
++static A_STATUS
++wmi_dbglog_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ A_UINT32 dropped;
++
++ dropped = *((A_UINT32 *)datap);
++ datap += sizeof(dropped);
++ len -= sizeof(dropped);
++ A_WMI_DBGLOG_EVENT(wmip->wmi_devt, dropped, datap, len);
++ return A_OK;
++}
++
++#ifdef CONFIG_HOST_GPIO_SUPPORT
++static A_STATUS
++wmi_gpio_intr_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMIX_GPIO_INTR_EVENT *gpio_intr = (WMIX_GPIO_INTR_EVENT *)datap;
++
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "Enter - intrmask=0x%x input=0x%x.\n", DBGARG,
++ gpio_intr->intr_mask, gpio_intr->input_values));
++
++ A_WMI_GPIO_INTR_RX(gpio_intr->intr_mask, gpio_intr->input_values);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_gpio_data_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMIX_GPIO_DATA_EVENT *gpio_data = (WMIX_GPIO_DATA_EVENT *)datap;
++
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "Enter - reg=%d value=0x%x\n", DBGARG,
++ gpio_data->reg_id, gpio_data->value));
++
++ A_WMI_GPIO_DATA_RX(gpio_data->reg_id, gpio_data->value);
++
++ return A_OK;
++}
++
++static A_STATUS
++wmi_gpio_ack_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_GPIO_ACK_RX();
++
++ return A_OK;
++}
++#endif /* CONFIG_HOST_GPIO_SUPPORT */
++
++/*
++ * Called to send a wmi command. Command specific data is already built
++ * on osbuf and current osbuf->data points to it.
++ */
++A_STATUS
++wmi_cmd_send(struct wmi_t *wmip, void *osbuf, WMI_COMMAND_ID cmdId,
++ WMI_SYNC_FLAG syncflag)
++{
++#define IS_LONG_CMD(cmdId) ((cmdId == WMI_OPT_TX_FRAME_CMDID) || (cmdId == WMI_ADD_WOW_PATTERN_CMDID))
++ WMI_CMD_HDR *cHdr;
++ WMI_PRI_STREAM_ID streamID = WMI_CONTROL_PRI;
++
++ A_ASSERT(osbuf != NULL);
++
++ if (syncflag >= END_WMIFLAG) {
++ return A_EINVAL;
++ }
++
++ if ((syncflag == SYNC_BEFORE_WMIFLAG) || (syncflag == SYNC_BOTH_WMIFLAG)) {
++ /*
++ * We want to make sure all data currently queued is transmitted before
++ * the cmd execution. Establish a new sync point.
++ */
++ wmi_sync_point(wmip);
++ }
++
++ if (A_NETBUF_PUSH(osbuf, sizeof(WMI_CMD_HDR)) != A_OK) {
++ return A_NO_MEMORY;
++ }
++
++ cHdr = (WMI_CMD_HDR *)A_NETBUF_DATA(osbuf);
++ cHdr->commandId = cmdId;
++
++ /*
++ * Send cmd, some via control pipe, others via data pipe
++ */
++ if (IS_LONG_CMD(cmdId)) {
++ wmi_data_hdr_add(wmip, osbuf, CNTL_MSGTYPE);
++ // TODO ... these can now go through the control endpoint via HTC 2.0
++ streamID = WMI_BEST_EFFORT_PRI;
++ }
++ A_WMI_CONTROL_TX(wmip->wmi_devt, osbuf, streamID);
++
++ if ((syncflag == SYNC_AFTER_WMIFLAG) || (syncflag == SYNC_BOTH_WMIFLAG)) {
++ /*
++ * We want to make sure all new data queued waits for the command to
++ * execute. Establish a new sync point.
++ */
++ wmi_sync_point(wmip);
++ }
++ return (A_OK);
++#undef IS_LONG_CMD
++}
++
++A_STATUS
++wmi_cmd_send_xtnd(struct wmi_t *wmip, void *osbuf, WMI_COMMAND_ID cmdId,
++ WMI_SYNC_FLAG syncflag)
++{
++ WMIX_CMD_HDR *cHdr;
++
++ if (A_NETBUF_PUSH(osbuf, sizeof(WMIX_CMD_HDR)) != A_OK) {
++ return A_NO_MEMORY;
++ }
++
++ cHdr = (WMIX_CMD_HDR *)A_NETBUF_DATA(osbuf);
++ cHdr->commandId = cmdId;
++
++ return wmi_cmd_send(wmip, osbuf, WMI_EXTENSION_CMDID, syncflag);
++}
++
++A_STATUS
++wmi_connect_cmd(struct wmi_t *wmip, NETWORK_TYPE netType,
++ DOT11_AUTH_MODE dot11AuthMode, AUTH_MODE authMode,
++ CRYPTO_TYPE pairwiseCrypto, A_UINT8 pairwiseCryptoLen,
++ CRYPTO_TYPE groupCrypto,A_UINT8 groupCryptoLen,
++ int ssidLength, A_UCHAR *ssid,
++ A_UINT8 *bssid, A_UINT16 channel, A_UINT32 ctrl_flags)
++{
++ void *osbuf;
++ WMI_CONNECT_CMD *cc;
++
++ if ((pairwiseCrypto == NONE_CRYPT) && (groupCrypto != NONE_CRYPT)) {
++ return A_EINVAL;
++ }
++ if ((pairwiseCrypto != NONE_CRYPT) && (groupCrypto == NONE_CRYPT)) {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(WMI_CONNECT_CMD));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(WMI_CONNECT_CMD));
++
++ cc = (WMI_CONNECT_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cc, sizeof(*cc));
++
++ A_MEMCPY(cc->ssid, ssid, ssidLength);
++ cc->ssidLength = ssidLength;
++ cc->networkType = netType;
++ cc->dot11AuthMode = dot11AuthMode;
++ cc->authMode = authMode;
++ cc->pairwiseCryptoType = pairwiseCrypto;
++ cc->pairwiseCryptoLen = pairwiseCryptoLen;
++ cc->groupCryptoType = groupCrypto;
++ cc->groupCryptoLen = groupCryptoLen;
++ cc->channel = channel;
++ cc->ctrl_flags = ctrl_flags;
++
++ if (bssid != NULL) {
++ A_MEMCPY(cc->bssid, bssid, ATH_MAC_LEN);
++ }
++ if (wmi_set_keepalive_cmd(wmip, wmip->wmi_keepaliveInterval) != A_OK) {
++ return(A_ERROR);
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_CONNECT_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_reconnect_cmd(struct wmi_t *wmip, A_UINT8 *bssid, A_UINT16 channel)
++{
++ void *osbuf;
++ WMI_RECONNECT_CMD *cc;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(WMI_RECONNECT_CMD));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(WMI_RECONNECT_CMD));
++
++ cc = (WMI_RECONNECT_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cc, sizeof(*cc));
++
++ cc->channel = channel;
++
++ if (bssid != NULL) {
++ A_MEMCPY(cc->bssid, bssid, ATH_MAC_LEN);
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_RECONNECT_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_disconnect_cmd(struct wmi_t *wmip)
++{
++ void *osbuf;
++ A_STATUS status;
++
++ osbuf = A_NETBUF_ALLOC(0); /* no payload */
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ /* Bug fix for 24817(elevator bug) - the disconnect command does not
++ need to do a SYNC before.*/
++ status = (wmi_cmd_send(wmip, osbuf, WMI_DISCONNECT_CMDID,
++ NO_SYNC_WMIFLAG));
++
++ return status;
++}
++
++A_STATUS
++wmi_startscan_cmd(struct wmi_t *wmip, WMI_SCAN_TYPE scanType,
++ A_BOOL forceFgScan, A_BOOL isLegacy,
++ A_UINT32 homeDwellTime, A_UINT32 forceScanInterval)
++{
++ void *osbuf;
++ WMI_START_SCAN_CMD *sc;
++
++ if ((scanType != WMI_LONG_SCAN) && (scanType != WMI_SHORT_SCAN)) {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*sc));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*sc));
++
++ sc = (WMI_START_SCAN_CMD *)(A_NETBUF_DATA(osbuf));
++ sc->scanType = scanType;
++ sc->forceFgScan = forceFgScan;
++ sc->isLegacy = isLegacy;
++ sc->homeDwellTime = homeDwellTime;
++ sc->forceScanInterval = forceScanInterval;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_START_SCAN_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_scanparams_cmd(struct wmi_t *wmip, A_UINT16 fg_start_sec,
++ A_UINT16 fg_end_sec, A_UINT16 bg_sec,
++ A_UINT16 minact_chdw_msec, A_UINT16 maxact_chdw_msec,
++ A_UINT16 pas_chdw_msec,
++ A_UINT8 shScanRatio, A_UINT8 scanCtrlFlags,
++ A_UINT32 max_dfsch_act_time)
++{
++ void *osbuf;
++ WMI_SCAN_PARAMS_CMD *sc;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*sc));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*sc));
++
++ sc = (WMI_SCAN_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(sc, sizeof(*sc));
++ sc->fg_start_period = fg_start_sec;
++ sc->fg_end_period = fg_end_sec;
++ sc->bg_period = bg_sec;
++ sc->minact_chdwell_time = minact_chdw_msec;
++ sc->maxact_chdwell_time = maxact_chdw_msec;
++ sc->pas_chdwell_time = pas_chdw_msec;
++ sc->shortScanRatio = shScanRatio;
++ sc->scanCtrlFlags = scanCtrlFlags;
++ sc->max_dfsch_act_time = max_dfsch_act_time;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_SCAN_PARAMS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_bssfilter_cmd(struct wmi_t *wmip, A_UINT8 filter, A_UINT32 ieMask)
++{
++ void *osbuf;
++ WMI_BSS_FILTER_CMD *cmd;
++
++ if (filter >= LAST_BSS_FILTER) {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_BSS_FILTER_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->bssFilter = filter;
++ cmd->ieMask = ieMask;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_BSS_FILTER_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_probedSsid_cmd(struct wmi_t *wmip, A_UINT8 index, A_UINT8 flag,
++ A_UINT8 ssidLength, A_UCHAR *ssid)
++{
++ void *osbuf;
++ WMI_PROBED_SSID_CMD *cmd;
++
++ if (index > MAX_PROBED_SSID_INDEX) {
++ return A_EINVAL;
++ }
++ if (ssidLength > sizeof(cmd->ssid)) {
++ return A_EINVAL;
++ }
++ if ((flag & (DISABLE_SSID_FLAG | ANY_SSID_FLAG)) && (ssidLength > 0)) {
++ return A_EINVAL;
++ }
++ if ((flag & SPECIFIC_SSID_FLAG) && !ssidLength) {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_PROBED_SSID_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->entryIndex = index;
++ cmd->flag = flag;
++ cmd->ssidLength = ssidLength;
++ A_MEMCPY(cmd->ssid, ssid, ssidLength);
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_PROBED_SSID_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_listeninterval_cmd(struct wmi_t *wmip, A_UINT16 listenInterval, A_UINT16 listenBeacons)
++{
++ void *osbuf;
++ WMI_LISTEN_INT_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_LISTEN_INT_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->listenInterval = listenInterval;
++ cmd->numBeacons = listenBeacons;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_LISTEN_INT_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_bmisstime_cmd(struct wmi_t *wmip, A_UINT16 bmissTime, A_UINT16 bmissBeacons)
++{
++ void *osbuf;
++ WMI_BMISS_TIME_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_BMISS_TIME_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->bmissTime = bmissTime;
++ cmd->numBeacons = bmissBeacons;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_BMISS_TIME_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_associnfo_cmd(struct wmi_t *wmip, A_UINT8 ieType,
++ A_UINT8 ieLen, A_UINT8 *ieInfo)
++{
++ void *osbuf;
++ WMI_SET_ASSOC_INFO_CMD *cmd;
++ A_UINT16 cmdLen;
++
++ cmdLen = sizeof(*cmd) + ieLen - 1;
++ osbuf = A_NETBUF_ALLOC(cmdLen);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, cmdLen);
++
++ cmd = (WMI_SET_ASSOC_INFO_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, cmdLen);
++ cmd->ieType = ieType;
++ cmd->bufferSize = ieLen;
++ A_MEMCPY(cmd->assocInfo, ieInfo, ieLen);
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_ASSOC_INFO_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_powermode_cmd(struct wmi_t *wmip, A_UINT8 powerMode)
++{
++ void *osbuf;
++ WMI_POWER_MODE_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_POWER_MODE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->powerMode = powerMode;
++ wmip->wmi_powerMode = powerMode;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_POWER_MODE_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_ibsspmcaps_cmd(struct wmi_t *wmip, A_UINT8 pmEnable, A_UINT8 ttl,
++ A_UINT16 atim_windows, A_UINT16 timeout_value)
++{
++ void *osbuf;
++ WMI_IBSS_PM_CAPS_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_IBSS_PM_CAPS_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->power_saving = pmEnable;
++ cmd->ttl = ttl;
++ cmd->atim_windows = atim_windows;
++ cmd->timeout_value = timeout_value;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_IBSS_PM_CAPS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_pmparams_cmd(struct wmi_t *wmip, A_UINT16 idlePeriod,
++ A_UINT16 psPollNum, A_UINT16 dtimPolicy)
++{
++ void *osbuf;
++ WMI_POWER_PARAMS_CMD *pm;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*pm));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*pm));
++
++ pm = (WMI_POWER_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(pm, sizeof(*pm));
++ pm->idle_period = idlePeriod;
++ pm->pspoll_number = psPollNum;
++ pm->dtim_policy = dtimPolicy;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_POWER_PARAMS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_disctimeout_cmd(struct wmi_t *wmip, A_UINT8 timeout)
++{
++ void *osbuf;
++ WMI_DISC_TIMEOUT_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_DISC_TIMEOUT_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->disconnectTimeout = timeout;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_DISC_TIMEOUT_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_addKey_cmd(struct wmi_t *wmip, A_UINT8 keyIndex, CRYPTO_TYPE keyType,
++ A_UINT8 keyUsage, A_UINT8 keyLength, A_UINT8 *keyRSC,
++ A_UINT8 *keyMaterial, A_UINT8 key_op_ctrl,
++ WMI_SYNC_FLAG sync_flag)
++{
++ void *osbuf;
++ WMI_ADD_CIPHER_KEY_CMD *cmd;
++
++ if ((keyIndex > WMI_MAX_KEY_INDEX) || (keyLength > WMI_MAX_KEY_LEN) ||
++ (keyMaterial == NULL))
++ {
++ return A_EINVAL;
++ }
++
++ if ((WEP_CRYPT != keyType) && (NULL == keyRSC)) {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_ADD_CIPHER_KEY_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->keyIndex = keyIndex;
++ cmd->keyType = keyType;
++ cmd->keyUsage = keyUsage;
++ cmd->keyLength = keyLength;
++ A_MEMCPY(cmd->key, keyMaterial, keyLength);
++ if (NULL != keyRSC) {
++ A_MEMCPY(cmd->keyRSC, keyRSC, sizeof(cmd->keyRSC));
++ }
++ cmd->key_op_ctrl = key_op_ctrl;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_ADD_CIPHER_KEY_CMDID, sync_flag));
++}
++
++A_STATUS
++wmi_add_krk_cmd(struct wmi_t *wmip, A_UINT8 *krk)
++{
++ void *osbuf;
++ WMI_ADD_KRK_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_ADD_KRK_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ A_MEMCPY(cmd->krk, krk, WMI_KRK_LEN);
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_ADD_KRK_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_delete_krk_cmd(struct wmi_t *wmip)
++{
++ void *osbuf;
++
++ osbuf = A_NETBUF_ALLOC(0);
++
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_DELETE_KRK_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_deleteKey_cmd(struct wmi_t *wmip, A_UINT8 keyIndex)
++{
++ void *osbuf;
++ WMI_DELETE_CIPHER_KEY_CMD *cmd;
++
++ if (keyIndex > WMI_MAX_KEY_INDEX) {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_DELETE_CIPHER_KEY_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->keyIndex = keyIndex;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_DELETE_CIPHER_KEY_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_setPmkid_cmd(struct wmi_t *wmip, A_UINT8 *bssid, A_UINT8 *pmkId,
++ A_BOOL set)
++{
++ void *osbuf;
++ WMI_SET_PMKID_CMD *cmd;
++
++ if (bssid == NULL) {
++ return A_EINVAL;
++ }
++
++ if ((set == TRUE) && (pmkId == NULL)) {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_PMKID_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMCPY(cmd->bssid, bssid, sizeof(cmd->bssid));
++ if (set == TRUE) {
++ A_MEMCPY(cmd->pmkid, pmkId, sizeof(cmd->pmkid));
++ cmd->enable = PMKID_ENABLE;
++ } else {
++ A_MEMZERO(cmd->pmkid, sizeof(cmd->pmkid));
++ cmd->enable = PMKID_DISABLE;
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_PMKID_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_tkip_countermeasures_cmd(struct wmi_t *wmip, A_BOOL en)
++{
++ void *osbuf;
++ WMI_SET_TKIP_COUNTERMEASURES_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_TKIP_COUNTERMEASURES_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->cm_en = (en == TRUE)? WMI_TKIP_CM_ENABLE : WMI_TKIP_CM_DISABLE;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_TKIP_COUNTERMEASURES_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_akmp_params_cmd(struct wmi_t *wmip,
++ WMI_SET_AKMP_PARAMS_CMD *akmpParams)
++{
++ void *osbuf;
++ WMI_SET_AKMP_PARAMS_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++ cmd = (WMI_SET_AKMP_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->akmpInfo = akmpParams->akmpInfo;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_AKMP_PARAMS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_pmkid_list_cmd(struct wmi_t *wmip,
++ WMI_SET_PMKID_LIST_CMD *pmkInfo)
++{
++ void *osbuf;
++ WMI_SET_PMKID_LIST_CMD *cmd;
++ A_UINT16 cmdLen;
++ A_UINT8 i;
++
++ cmdLen = sizeof(pmkInfo->numPMKID) +
++ pmkInfo->numPMKID * sizeof(WMI_PMKID);
++
++ osbuf = A_NETBUF_ALLOC(cmdLen);
++
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, cmdLen);
++ cmd = (WMI_SET_PMKID_LIST_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->numPMKID = pmkInfo->numPMKID;
++
++ for (i = 0; i < cmd->numPMKID; i++) {
++ A_MEMCPY(&cmd->pmkidList[i], &pmkInfo->pmkidList[i],
++ WMI_PMKID_LEN);
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_PMKID_LIST_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_get_pmkid_list_cmd(struct wmi_t *wmip)
++{
++ void *osbuf;
++
++ osbuf = A_NETBUF_ALLOC(0); /* no payload */
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_GET_PMKID_LIST_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_dataSync_send(struct wmi_t *wmip, void *osbuf, WMI_PRI_STREAM_ID streamID)
++{
++ WMI_DATA_HDR *dtHdr;
++
++ A_ASSERT(streamID != WMI_CONTROL_PRI);
++ A_ASSERT(osbuf != NULL);
++
++ if (A_NETBUF_PUSH(osbuf, sizeof(WMI_DATA_HDR)) != A_OK) {
++ return A_NO_MEMORY;
++ }
++
++ dtHdr = (WMI_DATA_HDR *)A_NETBUF_DATA(osbuf);
++ dtHdr->info =
++ (SYNC_MSGTYPE & WMI_DATA_HDR_MSG_TYPE_MASK) << WMI_DATA_HDR_MSG_TYPE_SHIFT;
++
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter - streamID %d\n", DBGARG, streamID));
++
++ return (A_WMI_CONTROL_TX(wmip->wmi_devt, osbuf, streamID));
++}
++
++typedef struct _WMI_DATA_SYNC_BUFS {
++ A_UINT8 trafficClass;
++ void *osbuf;
++}WMI_DATA_SYNC_BUFS;
++
++static A_STATUS
++wmi_sync_point(struct wmi_t *wmip)
++{
++ void *cmd_osbuf;
++ WMI_DATA_SYNC_BUFS dataSyncBufs[WMM_NUM_AC];
++ A_UINT8 i,numPriStreams=0;
++ A_STATUS status;
++
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ memset(dataSyncBufs,0,sizeof(dataSyncBufs));
++
++ /* lock out while we walk through the priority list and assemble our local array */
++ LOCK_WMI(wmip);
++
++ for (i=0; i < WMM_NUM_AC ; i++) {
++ if (wmip->wmi_fatPipeExists & (1 << i)) {
++ numPriStreams++;
++ dataSyncBufs[numPriStreams-1].trafficClass = i;
++ }
++ }
++
++ UNLOCK_WMI(wmip);
++
++ /* dataSyncBufs is now filled with entries (starting at index 0) containing valid streamIDs */
++
++ do {
++ /*
++ * We allocate all network buffers needed so we will be able to
++ * send all required frames.
++ */
++ cmd_osbuf = A_NETBUF_ALLOC(0); /* no payload */
++ if (cmd_osbuf == NULL) {
++ status = A_NO_MEMORY;
++ break;
++ }
++
++ for (i=0; i < numPriStreams ; i++) {
++ dataSyncBufs[i].osbuf = A_NETBUF_ALLOC(0);
++ if (dataSyncBufs[i].osbuf == NULL) {
++ status = A_NO_MEMORY;
++ break;
++ }
++ } //end for
++
++ /*
++ * Send sync cmd followed by sync data messages on all endpoints being
++ * used
++ */
++ status = wmi_cmd_send(wmip, cmd_osbuf, WMI_SYNCHRONIZE_CMDID,
++ NO_SYNC_WMIFLAG);
++
++ if (A_FAILED(status)) {
++ break;
++ }
++ /* cmd buffer sent, we no longer own it */
++ cmd_osbuf = NULL;
++
++ for(i=0; i < numPriStreams; i++) {
++ A_ASSERT(dataSyncBufs[i].osbuf != NULL);
++
++ status = wmi_dataSync_send(wmip, dataSyncBufs[i].osbuf,
++ WMI_ACCESSCATEGORY_WMISTREAM(wmip,dataSyncBufs[i].trafficClass));
++
++ if (A_FAILED(status)) {
++ break;
++ }
++ /* we don't own this buffer anymore, NULL it out of the array so it
++ * won't get cleaned up */
++ dataSyncBufs[i].osbuf = NULL;
++ } //end for
++
++ } while(FALSE);
++
++ /* free up any resources left over (possibly due to an error) */
++
++ if (cmd_osbuf != NULL) {
++ A_NETBUF_FREE(cmd_osbuf);
++ }
++
++ for (i = 0; i < numPriStreams; i++) {
++ if (dataSyncBufs[i].osbuf != NULL) {
++ A_NETBUF_FREE(dataSyncBufs[i].osbuf);
++ }
++ }
++
++ return (status);
++}
++
++A_STATUS
++wmi_create_pstream_cmd(struct wmi_t *wmip, WMI_CREATE_PSTREAM_CMD *params)
++{
++ void *osbuf;
++ WMI_CREATE_PSTREAM_CMD *cmd;
++ A_UINT16 activeTsids=0;
++ A_UINT8 fatPipeExistsForAC=0;
++
++ /* Validate all the parameters. */
++ if( !((params->userPriority < 8) &&
++ (params->userPriority <= 0x7) &&
++ (convert_userPriority_to_trafficClass(params->userPriority) == params->trafficClass) &&
++ (params->trafficDirection == UPLINK_TRAFFIC ||
++ params->trafficDirection == DNLINK_TRAFFIC ||
++ params->trafficDirection == BIDIR_TRAFFIC) &&
++ (params->trafficType == TRAFFIC_TYPE_APERIODIC ||
++ params->trafficType == TRAFFIC_TYPE_PERIODIC ) &&
++ (params->voicePSCapability == DISABLE_FOR_THIS_AC ||
++ params->voicePSCapability == ENABLE_FOR_THIS_AC ||
++ params->voicePSCapability == ENABLE_FOR_ALL_AC) &&
++ (params->tsid == WMI_IMPLICIT_PSTREAM || params->tsid <= WMI_MAX_THINSTREAM)) )
++ {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "Sending create_pstream_cmd: ac=%d tsid:%d\n", DBGARG,
++ params->trafficClass, params->tsid));
++
++ cmd = (WMI_CREATE_PSTREAM_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ A_MEMCPY(cmd, params, sizeof(*cmd));
++
++ /* this is an implicitly created Fat pipe */
++ if (params->tsid == WMI_IMPLICIT_PSTREAM) {
++ LOCK_WMI(wmip);
++ fatPipeExistsForAC = (wmip->wmi_fatPipeExists & (1 << params->trafficClass));
++ wmip->wmi_fatPipeExists |= (1<<params->trafficClass);
++ UNLOCK_WMI(wmip);
++ } else {
++ /* this is an explicitly created thin stream within a fat pipe */
++ LOCK_WMI(wmip);
++ fatPipeExistsForAC = (wmip->wmi_fatPipeExists & (1 << params->trafficClass));
++ activeTsids = wmip->wmi_streamExistsForAC[params->trafficClass];
++ wmip->wmi_streamExistsForAC[params->trafficClass] |= (1<<params->tsid);
++ /* if a thinstream becomes active, the fat pipe automatically
++ * becomes active
++ */
++ wmip->wmi_fatPipeExists |= (1<<params->trafficClass);
++ UNLOCK_WMI(wmip);
++ }
++
++ /* Indicate activty change to driver layer only if this is the
++ * first TSID to get created in this AC explicitly or an implicit
++ * fat pipe is getting created.
++ */
++ if (!fatPipeExistsForAC) {
++ A_WMI_STREAM_TX_ACTIVE(wmip->wmi_devt, params->trafficClass);
++ }
++
++ /* mike: should be SYNC_BEFORE_WMIFLAG */
++ return (wmi_cmd_send(wmip, osbuf, WMI_CREATE_PSTREAM_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_delete_pstream_cmd(struct wmi_t *wmip, A_UINT8 trafficClass, A_UINT8 tsid)
++{
++ void *osbuf;
++ WMI_DELETE_PSTREAM_CMD *cmd;
++ A_STATUS status;
++ A_UINT16 activeTsids=0;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_DELETE_PSTREAM_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++
++ cmd->trafficClass = trafficClass;
++ cmd->tsid = tsid;
++
++ LOCK_WMI(wmip);
++ activeTsids = wmip->wmi_streamExistsForAC[trafficClass];
++ UNLOCK_WMI(wmip);
++
++ /* Check if the tsid was created & exists */
++ if (!(activeTsids & (1<<tsid))) {
++
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "TSID %d does'nt exist for trafficClass: %d\n", DBGARG, tsid, trafficClass));
++ /* TODO: return a more appropriate err code */
++ return A_ERROR;
++ }
++
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "Sending delete_pstream_cmd: trafficClass: %d tsid=%d\n", DBGARG, trafficClass, tsid));
++
++ status = (wmi_cmd_send(wmip, osbuf, WMI_DELETE_PSTREAM_CMDID,
++ SYNC_BEFORE_WMIFLAG));
++
++ LOCK_WMI(wmip);
++ wmip->wmi_streamExistsForAC[trafficClass] &= ~(1<<tsid);
++ activeTsids = wmip->wmi_streamExistsForAC[trafficClass];
++ UNLOCK_WMI(wmip);
++
++
++ /* Indicate stream inactivity to driver layer only if all tsids
++ * within this AC are deleted.
++ */
++ if(!activeTsids) {
++ A_WMI_STREAM_TX_INACTIVE(wmip->wmi_devt, trafficClass);
++ wmip->wmi_fatPipeExists &= ~(1<<trafficClass);
++ }
++
++ return status;
++}
++
++/*
++ * used to set the bit rate. rate is in Kbps. If rate == -1
++ * then auto selection is used.
++ */
++A_STATUS
++wmi_set_bitrate_cmd(struct wmi_t *wmip, A_INT32 rate)
++{
++ void *osbuf;
++ WMI_BIT_RATE_CMD *cmd;
++ A_INT8 index;
++
++ if (rate != -1) {
++ index = wmi_validate_bitrate(wmip, rate);
++ if(index == A_EINVAL){
++ return A_EINVAL;
++ }
++ } else {
++ index = -1;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_BIT_RATE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++
++ cmd->rateIndex = index;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_BITRATE_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_get_bitrate_cmd(struct wmi_t *wmip)
++{
++ void *osbuf;
++
++ osbuf = A_NETBUF_ALLOC(0); /* no payload */
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_GET_BITRATE_CMDID, NO_SYNC_WMIFLAG));
++}
++
++/*
++ * Returns TRUE iff the given rate index is legal in the current PHY mode.
++ */
++A_BOOL
++wmi_is_bitrate_index_valid(struct wmi_t *wmip, A_UINT32 rateIndex)
++{
++ WMI_PHY_MODE phyMode = wmip->wmi_phyMode;
++ A_BOOL isValid = TRUE;
++ switch(phyMode) {
++ case WMI_11A_MODE:
++ if ((rateIndex < MODE_A_SUPPORT_RATE_START) || (rateIndex > MODE_A_SUPPORT_RATE_STOP)) {
++ isValid = FALSE;
++ }
++ break;
++
++ case WMI_11B_MODE:
++ if ((rateIndex < MODE_B_SUPPORT_RATE_START) || (rateIndex > MODE_B_SUPPORT_RATE_STOP)) {
++ isValid = FALSE;
++ }
++ break;
++
++ case WMI_11GONLY_MODE:
++ if ((rateIndex < MODE_GONLY_SUPPORT_RATE_START) || (rateIndex > MODE_GONLY_SUPPORT_RATE_STOP)) {
++ isValid = FALSE;
++ }
++ break;
++
++ case WMI_11G_MODE:
++ case WMI_11AG_MODE:
++ if ((rateIndex < MODE_G_SUPPORT_RATE_START) || (rateIndex > MODE_G_SUPPORT_RATE_STOP)) {
++ isValid = FALSE;
++ }
++ break;
++
++ default:
++ A_ASSERT(FALSE);
++ break;
++ }
++
++ return isValid;
++}
++
++A_INT8
++wmi_validate_bitrate(struct wmi_t *wmip, A_INT32 rate)
++{
++ A_INT8 i;
++ if (rate != -1)
++ {
++ for (i=0;;i++)
++ {
++ if (wmi_rateTable[(A_UINT32) i] == 0) {
++ return A_EINVAL;
++ }
++ if (wmi_rateTable[(A_UINT32) i] == rate) {
++ break;
++ }
++ }
++ }
++ else{
++ i = -1;
++ }
++
++ if(wmi_is_bitrate_index_valid(wmip, i) != TRUE) {
++ return A_EINVAL;
++ }
++
++ return i;
++}
++
++A_STATUS
++wmi_set_fixrates_cmd(struct wmi_t *wmip, A_INT16 fixRatesMask)
++{
++ void *osbuf;
++ WMI_FIX_RATES_CMD *cmd;
++ A_UINT32 rateIndex;
++
++ /* Make sure all rates in the mask are valid in the current PHY mode */
++ for(rateIndex = 0; rateIndex < MAX_NUMBER_OF_SUPPORT_RATES; rateIndex++) {
++ if((1 << rateIndex) & (A_UINT32)fixRatesMask) {
++ if(wmi_is_bitrate_index_valid(wmip, rateIndex) != TRUE) {
++ A_DPRINTF(DBG_WMI, (DBGFMT "Set Fix Rates command failed: Given rate is illegal in current PHY mode\n", DBGARG));
++ return A_EINVAL;
++ }
++ }
++ }
++
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_FIX_RATES_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++
++ cmd->fixRateMask = fixRatesMask;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_FIXRATES_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_get_ratemask_cmd(struct wmi_t *wmip)
++{
++ void *osbuf;
++
++ osbuf = A_NETBUF_ALLOC(0); /* no payload */
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_GET_FIXRATES_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_get_channelList_cmd(struct wmi_t *wmip)
++{
++ void *osbuf;
++
++ osbuf = A_NETBUF_ALLOC(0); /* no payload */
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_GET_CHANNEL_LIST_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++/*
++ * used to generate a wmi sey channel Parameters cmd.
++ * mode should always be specified and corresponds to the phy mode of the
++ * wlan.
++ * numChan should alway sbe specified. If zero indicates that all available
++ * channels should be used.
++ * channelList is an array of channel frequencies (in Mhz) which the radio
++ * should limit its operation to. It should be NULL if numChan == 0. Size of
++ * array should correspond to numChan entries.
++ */
++A_STATUS
++wmi_set_channelParams_cmd(struct wmi_t *wmip, A_UINT8 scanParam,
++ WMI_PHY_MODE mode, A_INT8 numChan,
++ A_UINT16 *channelList)
++{
++ void *osbuf;
++ WMI_CHANNEL_PARAMS_CMD *cmd;
++ A_INT8 size;
++
++ size = sizeof (*cmd);
++
++ if (numChan) {
++ if (numChan > WMI_MAX_CHANNELS) {
++ return A_EINVAL;
++ }
++ size += sizeof(A_UINT16) * (numChan - 1);
++ }
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_CHANNEL_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++
++ wmip->wmi_phyMode = mode;
++ cmd->scanParam = scanParam;
++ cmd->phyMode = mode;
++ cmd->numChannels = numChan;
++ A_MEMCPY(cmd->channelList, channelList, numChan * sizeof(A_UINT16));
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_CHANNEL_PARAMS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_rssi_threshold_params(struct wmi_t *wmip,
++ WMI_RSSI_THRESHOLD_PARAMS_CMD *rssiCmd)
++{
++ void *osbuf;
++ A_INT8 size;
++ WMI_RSSI_THRESHOLD_PARAMS_CMD *cmd;
++ /* These values are in ascending order */
++ if( rssiCmd->thresholdAbove6_Val <= rssiCmd->thresholdAbove5_Val ||
++ rssiCmd->thresholdAbove5_Val <= rssiCmd->thresholdAbove4_Val ||
++ rssiCmd->thresholdAbove4_Val <= rssiCmd->thresholdAbove3_Val ||
++ rssiCmd->thresholdAbove3_Val <= rssiCmd->thresholdAbove2_Val ||
++ rssiCmd->thresholdAbove2_Val <= rssiCmd->thresholdAbove1_Val ||
++ rssiCmd->thresholdBelow6_Val <= rssiCmd->thresholdBelow5_Val ||
++ rssiCmd->thresholdBelow5_Val <= rssiCmd->thresholdBelow4_Val ||
++ rssiCmd->thresholdBelow4_Val <= rssiCmd->thresholdBelow3_Val ||
++ rssiCmd->thresholdBelow3_Val <= rssiCmd->thresholdBelow2_Val ||
++ rssiCmd->thresholdBelow2_Val <= rssiCmd->thresholdBelow1_Val) {
++
++ return A_EINVAL;
++ }
++
++ size = sizeof (*cmd);
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_RSSI_THRESHOLD_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++ A_MEMCPY(cmd, rssiCmd, sizeof(WMI_RSSI_THRESHOLD_PARAMS_CMD));
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_RSSI_THRESHOLD_PARAMS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_host_sleep_mode_cmd(struct wmi_t *wmip,
++ WMI_SET_HOST_SLEEP_MODE_CMD *hostModeCmd)
++{
++ void *osbuf;
++ A_INT8 size;
++ WMI_SET_HOST_SLEEP_MODE_CMD *cmd;
++
++ if( hostModeCmd->awake == hostModeCmd->asleep) {
++ return A_EINVAL;
++ }
++
++ size = sizeof (*cmd);
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_SET_HOST_SLEEP_MODE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++ A_MEMCPY(cmd, hostModeCmd, sizeof(WMI_SET_HOST_SLEEP_MODE_CMD));
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_HOST_SLEEP_MODE_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_wow_mode_cmd(struct wmi_t *wmip,
++ WMI_SET_WOW_MODE_CMD *wowModeCmd)
++{
++ void *osbuf;
++ A_INT8 size;
++ WMI_SET_WOW_MODE_CMD *cmd;
++
++ size = sizeof (*cmd);
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_SET_WOW_MODE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++ A_MEMCPY(cmd, wowModeCmd, sizeof(WMI_SET_WOW_MODE_CMD));
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_WOW_MODE_CMDID,
++ NO_SYNC_WMIFLAG));
++
++}
++
++A_STATUS
++wmi_get_wow_list_cmd(struct wmi_t *wmip,
++ WMI_GET_WOW_LIST_CMD *wowListCmd)
++{
++ void *osbuf;
++ A_INT8 size;
++ WMI_GET_WOW_LIST_CMD *cmd;
++
++ size = sizeof (*cmd);
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_GET_WOW_LIST_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++ A_MEMCPY(cmd, wowListCmd, sizeof(WMI_GET_WOW_LIST_CMD));
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_GET_WOW_LIST_CMDID,
++ NO_SYNC_WMIFLAG));
++
++}
++
++static A_STATUS
++wmi_get_wow_list_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++ WMI_GET_WOW_LIST_REPLY *reply;
++
++ if (len < sizeof(WMI_GET_WOW_LIST_REPLY)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_GET_WOW_LIST_REPLY *)datap;
++
++ A_WMI_WOW_LIST_EVENT(wmip->wmi_devt, reply->num_filters,
++ reply);
++
++ return A_OK;
++}
++
++A_STATUS wmi_add_wow_pattern_cmd(struct wmi_t *wmip,
++ WMI_ADD_WOW_PATTERN_CMD *addWowCmd,
++ A_UINT8* pattern, A_UINT8* mask,
++ A_UINT8 pattern_size)
++{
++ void *osbuf;
++ A_INT8 size;
++ WMI_ADD_WOW_PATTERN_CMD *cmd;
++ A_UINT8 *filter_mask = NULL;
++
++ size = sizeof (*cmd);
++
++ size += ((2 * addWowCmd->filter_size)* sizeof(A_UINT8));
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_ADD_WOW_PATTERN_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->filter_list_id = addWowCmd->filter_list_id;
++ cmd->filter_offset = addWowCmd->filter_offset;
++ cmd->filter_size = addWowCmd->filter_size;
++
++ A_MEMCPY(cmd->filter, pattern, addWowCmd->filter_size);
++
++ filter_mask = (A_UINT8*)(cmd->filter + cmd->filter_size);
++ A_MEMCPY(filter_mask, mask, addWowCmd->filter_size);
++
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_ADD_WOW_PATTERN_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_del_wow_pattern_cmd(struct wmi_t *wmip,
++ WMI_DEL_WOW_PATTERN_CMD *delWowCmd)
++{
++ void *osbuf;
++ A_INT8 size;
++ WMI_DEL_WOW_PATTERN_CMD *cmd;
++
++ size = sizeof (*cmd);
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_DEL_WOW_PATTERN_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++ A_MEMCPY(cmd, delWowCmd, sizeof(WMI_DEL_WOW_PATTERN_CMD));
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_DEL_WOW_PATTERN_CMDID,
++ NO_SYNC_WMIFLAG));
++
++}
++
++A_STATUS
++wmi_set_snr_threshold_params(struct wmi_t *wmip,
++ WMI_SNR_THRESHOLD_PARAMS_CMD *snrCmd)
++{
++ void *osbuf;
++ A_INT8 size;
++ WMI_SNR_THRESHOLD_PARAMS_CMD *cmd;
++ /* These values are in ascending order */
++ if( snrCmd->thresholdAbove4_Val <= snrCmd->thresholdAbove3_Val ||
++ snrCmd->thresholdAbove3_Val <= snrCmd->thresholdAbove2_Val ||
++ snrCmd->thresholdAbove2_Val <= snrCmd->thresholdAbove1_Val ||
++ snrCmd->thresholdBelow4_Val <= snrCmd->thresholdBelow3_Val ||
++ snrCmd->thresholdBelow3_Val <= snrCmd->thresholdBelow2_Val ||
++ snrCmd->thresholdBelow2_Val <= snrCmd->thresholdBelow1_Val) {
++
++ return A_EINVAL;
++ }
++
++ size = sizeof (*cmd);
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_SNR_THRESHOLD_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++ A_MEMCPY(cmd, snrCmd, sizeof(WMI_SNR_THRESHOLD_PARAMS_CMD));
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SNR_THRESHOLD_PARAMS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_clr_rssi_snr(struct wmi_t *wmip)
++{
++ void *osbuf;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(int));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_CLR_RSSI_SNR_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_lq_threshold_params(struct wmi_t *wmip,
++ WMI_LQ_THRESHOLD_PARAMS_CMD *lqCmd)
++{
++ void *osbuf;
++ A_INT8 size;
++ WMI_LQ_THRESHOLD_PARAMS_CMD *cmd;
++ /* These values are in ascending order */
++ if( lqCmd->thresholdAbove4_Val <= lqCmd->thresholdAbove3_Val ||
++ lqCmd->thresholdAbove3_Val <= lqCmd->thresholdAbove2_Val ||
++ lqCmd->thresholdAbove2_Val <= lqCmd->thresholdAbove1_Val ||
++ lqCmd->thresholdBelow4_Val <= lqCmd->thresholdBelow3_Val ||
++ lqCmd->thresholdBelow3_Val <= lqCmd->thresholdBelow2_Val ||
++ lqCmd->thresholdBelow2_Val <= lqCmd->thresholdBelow1_Val ) {
++
++ return A_EINVAL;
++ }
++
++ size = sizeof (*cmd);
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_LQ_THRESHOLD_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++ A_MEMCPY(cmd, lqCmd, sizeof(WMI_LQ_THRESHOLD_PARAMS_CMD));
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_LQ_THRESHOLD_PARAMS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_error_report_bitmask(struct wmi_t *wmip, A_UINT32 mask)
++{
++ void *osbuf;
++ A_INT8 size;
++ WMI_TARGET_ERROR_REPORT_BITMASK *cmd;
++
++ size = sizeof (*cmd);
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_TARGET_ERROR_REPORT_BITMASK *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++
++ cmd->bitmask = mask;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_TARGET_ERROR_REPORT_BITMASK_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_get_challenge_resp_cmd(struct wmi_t *wmip, A_UINT32 cookie, A_UINT32 source)
++{
++ void *osbuf;
++ WMIX_HB_CHALLENGE_RESP_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMIX_HB_CHALLENGE_RESP_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->cookie = cookie;
++ cmd->source = source;
++
++ return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_HB_CHALLENGE_RESP_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_config_debug_module_cmd(struct wmi_t *wmip, A_UINT16 mmask,
++ A_UINT16 tsr, A_BOOL rep, A_UINT16 size,
++ A_UINT32 valid)
++{
++ void *osbuf;
++ WMIX_DBGLOG_CFG_MODULE_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMIX_DBGLOG_CFG_MODULE_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->config.cfgmmask = mmask;
++ cmd->config.cfgtsr = tsr;
++ cmd->config.cfgrep = rep;
++ cmd->config.cfgsize = size;
++ cmd->config.cfgvalid = valid;
++
++ return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_DBGLOG_CFG_MODULE_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_get_stats_cmd(struct wmi_t *wmip)
++{
++ void *osbuf;
++
++ osbuf = A_NETBUF_ALLOC(0); /* no payload */
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_GET_STATISTICS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_addBadAp_cmd(struct wmi_t *wmip, A_UINT8 apIndex, A_UINT8 *bssid)
++{
++ void *osbuf;
++ WMI_ADD_BAD_AP_CMD *cmd;
++
++ if ((bssid == NULL) || (apIndex > WMI_MAX_BAD_AP_INDEX)) {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_ADD_BAD_AP_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->badApIndex = apIndex;
++ A_MEMCPY(cmd->bssid, bssid, sizeof(cmd->bssid));
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_ADD_BAD_AP_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_deleteBadAp_cmd(struct wmi_t *wmip, A_UINT8 apIndex)
++{
++ void *osbuf;
++ WMI_DELETE_BAD_AP_CMD *cmd;
++
++ if (apIndex > WMI_MAX_BAD_AP_INDEX) {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_DELETE_BAD_AP_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->badApIndex = apIndex;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_DELETE_BAD_AP_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_txPwr_cmd(struct wmi_t *wmip, A_UINT8 dbM)
++{
++ void *osbuf;
++ WMI_SET_TX_PWR_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_TX_PWR_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->dbM = dbM;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_TX_PWR_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_get_txPwr_cmd(struct wmi_t *wmip)
++{
++ void *osbuf;
++
++ osbuf = A_NETBUF_ALLOC(0); /* no payload */
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_GET_TX_PWR_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_switch_radio(struct wmi_t *wmip, A_UINT8 on)
++{
++ WMI_SCAN_PARAMS_CMD scParams = {0, 0, 0, 0, 0,
++ WMI_SHORTSCANRATIO_DEFAULT,
++ DEFAULT_SCAN_CTRL_FLAGS,
++ 0};
++
++ if (on) {
++ /* Enable foreground scanning */
++ if (wmi_scanparams_cmd(wmip, scParams.fg_start_period,
++ scParams.fg_end_period,
++ scParams.bg_period,
++ scParams.minact_chdwell_time,
++ scParams.maxact_chdwell_time,
++ scParams.pas_chdwell_time,
++ scParams.shortScanRatio,
++ scParams.scanCtrlFlags,
++ scParams.max_dfsch_act_time) != A_OK) {
++ return -EIO;
++ }
++ } else {
++ wmi_disconnect_cmd(wmip);
++ if (wmi_scanparams_cmd(wmip, 0xFFFF, 0, 0, 0,
++ 0, 0, 0, 0xFF, 0) != A_OK) {
++ return -EIO;
++ }
++ }
++
++ return A_OK;
++}
++
++
++A_UINT16
++wmi_get_mapped_qos_queue(struct wmi_t *wmip, A_UINT8 trafficClass)
++{
++ A_UINT16 activeTsids=0;
++
++ LOCK_WMI(wmip);
++ activeTsids = wmip->wmi_streamExistsForAC[trafficClass];
++ UNLOCK_WMI(wmip);
++
++ return activeTsids;
++}
++
++A_STATUS
++wmi_get_roam_tbl_cmd(struct wmi_t *wmip)
++{
++ void *osbuf;
++
++ osbuf = A_NETBUF_ALLOC(0); /* no payload */
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_GET_ROAM_TBL_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_get_roam_data_cmd(struct wmi_t *wmip, A_UINT8 roamDataType)
++{
++ void *osbuf;
++ A_UINT32 size = sizeof(A_UINT8);
++ WMI_TARGET_ROAM_DATA *cmd;
++
++ osbuf = A_NETBUF_ALLOC(size); /* no payload */
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_TARGET_ROAM_DATA *)(A_NETBUF_DATA(osbuf));
++ cmd->roamDataType = roamDataType;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_GET_ROAM_DATA_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_roam_ctrl_cmd(struct wmi_t *wmip, WMI_SET_ROAM_CTRL_CMD *p,
++ A_UINT8 size)
++{
++ void *osbuf;
++ WMI_SET_ROAM_CTRL_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_SET_ROAM_CTRL_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++
++ A_MEMCPY(cmd, p, size);
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_ROAM_CTRL_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_powersave_timers_cmd(struct wmi_t *wmip,
++ WMI_POWERSAVE_TIMERS_POLICY_CMD *pCmd,
++ A_UINT8 size)
++{
++ void *osbuf;
++ WMI_POWERSAVE_TIMERS_POLICY_CMD *cmd;
++
++ /* These timers can't be zero */
++ if(!pCmd->psPollTimeout || !pCmd->triggerTimeout ||
++ !(pCmd->apsdTimPolicy == IGNORE_TIM_ALL_QUEUES_APSD ||
++ pCmd->apsdTimPolicy == PROCESS_TIM_ALL_QUEUES_APSD) ||
++ !(pCmd->simulatedAPSDTimPolicy == IGNORE_TIM_SIMULATED_APSD ||
++ pCmd->simulatedAPSDTimPolicy == PROCESS_TIM_SIMULATED_APSD))
++ return A_EINVAL;
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, size);
++
++ cmd = (WMI_POWERSAVE_TIMERS_POLICY_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, size);
++
++ A_MEMCPY(cmd, pCmd, size);
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_POWERSAVE_TIMERS_POLICY_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++#ifdef CONFIG_HOST_GPIO_SUPPORT
++/* Send a command to Target to change GPIO output pins. */
++A_STATUS
++wmi_gpio_output_set(struct wmi_t *wmip,
++ A_UINT32 set_mask,
++ A_UINT32 clear_mask,
++ A_UINT32 enable_mask,
++ A_UINT32 disable_mask)
++{
++ void *osbuf;
++ WMIX_GPIO_OUTPUT_SET_CMD *output_set;
++ int size;
++
++ size = sizeof(*output_set);
++
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "Enter - set=0x%x clear=0x%x enb=0x%x dis=0x%x\n", DBGARG,
++ set_mask, clear_mask, enable_mask, disable_mask));
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++ A_NETBUF_PUT(osbuf, size);
++ output_set = (WMIX_GPIO_OUTPUT_SET_CMD *)(A_NETBUF_DATA(osbuf));
++
++ output_set->set_mask = set_mask;
++ output_set->clear_mask = clear_mask;
++ output_set->enable_mask = enable_mask;
++ output_set->disable_mask = disable_mask;
++
++ return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_GPIO_OUTPUT_SET_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++/* Send a command to the Target requesting state of the GPIO input pins */
++A_STATUS
++wmi_gpio_input_get(struct wmi_t *wmip)
++{
++ void *osbuf;
++
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ osbuf = A_NETBUF_ALLOC(0);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_GPIO_INPUT_GET_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++/* Send a command to the Target that changes the value of a GPIO register. */
++A_STATUS
++wmi_gpio_register_set(struct wmi_t *wmip,
++ A_UINT32 gpioreg_id,
++ A_UINT32 value)
++{
++ void *osbuf;
++ WMIX_GPIO_REGISTER_SET_CMD *register_set;
++ int size;
++
++ size = sizeof(*register_set);
++
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "Enter - reg=%d value=0x%x\n", DBGARG, gpioreg_id, value));
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++ A_NETBUF_PUT(osbuf, size);
++ register_set = (WMIX_GPIO_REGISTER_SET_CMD *)(A_NETBUF_DATA(osbuf));
++
++ register_set->gpioreg_id = gpioreg_id;
++ register_set->value = value;
++
++ return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_GPIO_REGISTER_SET_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++/* Send a command to the Target to fetch the value of a GPIO register. */
++A_STATUS
++wmi_gpio_register_get(struct wmi_t *wmip,
++ A_UINT32 gpioreg_id)
++{
++ void *osbuf;
++ WMIX_GPIO_REGISTER_GET_CMD *register_get;
++ int size;
++
++ size = sizeof(*register_get);
++
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter - reg=%d\n", DBGARG, gpioreg_id));
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++ A_NETBUF_PUT(osbuf, size);
++ register_get = (WMIX_GPIO_REGISTER_GET_CMD *)(A_NETBUF_DATA(osbuf));
++
++ register_get->gpioreg_id = gpioreg_id;
++
++ return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_GPIO_REGISTER_GET_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++/* Send a command to the Target acknowledging some GPIO interrupts. */
++A_STATUS
++wmi_gpio_intr_ack(struct wmi_t *wmip,
++ A_UINT32 ack_mask)
++{
++ void *osbuf;
++ WMIX_GPIO_INTR_ACK_CMD *intr_ack;
++ int size;
++
++ size = sizeof(*intr_ack);
++
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter ack_mask=0x%x\n", DBGARG, ack_mask));
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++ A_NETBUF_PUT(osbuf, size);
++ intr_ack = (WMIX_GPIO_INTR_ACK_CMD *)(A_NETBUF_DATA(osbuf));
++
++ intr_ack->ack_mask = ack_mask;
++
++ return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_GPIO_INTR_ACK_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++#endif /* CONFIG_HOST_GPIO_SUPPORT */
++
++A_STATUS
++wmi_set_access_params_cmd(struct wmi_t *wmip, A_UINT16 txop, A_UINT8 eCWmin,
++ A_UINT8 eCWmax, A_UINT8 aifsn)
++{
++ void *osbuf;
++ WMI_SET_ACCESS_PARAMS_CMD *cmd;
++
++ if ((eCWmin > WMI_MAX_CW_ACPARAM) || (eCWmax > WMI_MAX_CW_ACPARAM) ||
++ (aifsn > WMI_MAX_AIFSN_ACPARAM))
++ {
++ return A_EINVAL;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_ACCESS_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->txop = txop;
++ cmd->eCWmin = eCWmin;
++ cmd->eCWmax = eCWmax;
++ cmd->aifsn = aifsn;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_ACCESS_PARAMS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_retry_limits_cmd(struct wmi_t *wmip, A_UINT8 frameType,
++ A_UINT8 trafficClass, A_UINT8 maxRetries,
++ A_UINT8 enableNotify)
++{
++ void *osbuf;
++ WMI_SET_RETRY_LIMITS_CMD *cmd;
++
++ if ((frameType != MGMT_FRAMETYPE) && (frameType != CONTROL_FRAMETYPE) &&
++ (frameType != DATA_FRAMETYPE))
++ {
++ return A_EINVAL;
++ }
++
++ if (maxRetries > WMI_MAX_RETRIES) {
++ return A_EINVAL;
++ }
++
++ if (frameType != DATA_FRAMETYPE) {
++ trafficClass = 0;
++ }
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_RETRY_LIMITS_CMD *)(A_NETBUF_DATA(osbuf));
++ cmd->frameType = frameType;
++ cmd->trafficClass = trafficClass;
++ cmd->maxRetries = maxRetries;
++ cmd->enableNotify = enableNotify;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_RETRY_LIMITS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++void
++wmi_get_current_bssid(struct wmi_t *wmip, A_UINT8 *bssid)
++{
++ if (bssid != NULL) {
++ A_MEMCPY(bssid, wmip->wmi_bssid, ATH_MAC_LEN);
++ }
++}
++
++A_STATUS
++wmi_set_opt_mode_cmd(struct wmi_t *wmip, A_UINT8 optMode)
++{
++ void *osbuf;
++ WMI_SET_OPT_MODE_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_OPT_MODE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->optMode = optMode;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_OPT_MODE_CMDID,
++ SYNC_BOTH_WMIFLAG));
++}
++
++A_STATUS
++wmi_opt_tx_frame_cmd(struct wmi_t *wmip,
++ A_UINT8 frmType,
++ A_UINT8 *dstMacAddr,
++ A_UINT8 *bssid,
++ A_UINT16 optIEDataLen,
++ A_UINT8 *optIEData)
++{
++ void *osbuf;
++ WMI_OPT_TX_FRAME_CMD *cmd;
++ osbuf = A_NETBUF_ALLOC(optIEDataLen + sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, (optIEDataLen + sizeof(*cmd)));
++
++ cmd = (WMI_OPT_TX_FRAME_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, (optIEDataLen + sizeof(*cmd)-1));
++
++ cmd->frmType = frmType;
++ cmd->optIEDataLen = optIEDataLen;
++ //cmd->optIEData = (A_UINT8 *)((int)cmd + sizeof(*cmd));
++ A_MEMCPY(cmd->bssid, bssid, sizeof(cmd->bssid));
++ A_MEMCPY(cmd->dstAddr, dstMacAddr, sizeof(cmd->dstAddr));
++ A_MEMCPY(&cmd->optIEData[0], optIEData, optIEDataLen);
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_OPT_TX_FRAME_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_adhoc_bconIntvl_cmd(struct wmi_t *wmip, A_UINT16 intvl)
++{
++ void *osbuf;
++ WMI_BEACON_INT_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_BEACON_INT_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->beaconInterval = intvl;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_BEACON_INT_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++
++A_STATUS
++wmi_set_voice_pkt_size_cmd(struct wmi_t *wmip, A_UINT16 voicePktSize)
++{
++ void *osbuf;
++ WMI_SET_VOICE_PKT_SIZE_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_VOICE_PKT_SIZE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->voicePktSize = voicePktSize;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_VOICE_PKT_SIZE_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++
++A_STATUS
++wmi_set_max_sp_len_cmd(struct wmi_t *wmip, A_UINT8 maxSPLen)
++{
++ void *osbuf;
++ WMI_SET_MAX_SP_LEN_CMD *cmd;
++
++ /* maxSPLen is a two-bit value. If user trys to set anything
++ * other than this, then its invalid
++ */
++ if(maxSPLen & ~0x03)
++ return A_EINVAL;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_MAX_SP_LEN_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->maxSPLen = maxSPLen;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_MAX_SP_LEN_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_UINT8
++convert_userPriority_to_trafficClass(A_UINT8 userPriority)
++{
++ return (up_to_ac[userPriority & 0x7]);
++}
++
++A_UINT8
++wmi_get_power_mode_cmd(struct wmi_t *wmip)
++{
++ return wmip->wmi_powerMode;
++}
++
++A_STATUS
++wmi_verify_tspec_params(WMI_CREATE_PSTREAM_CMD *pCmd, A_BOOL tspecCompliance)
++{
++ return A_OK;
++}
++
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++static A_STATUS
++wmi_tcmd_test_report_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
++{
++
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ A_WMI_TCMD_RX_REPORT_EVENT(wmip->wmi_devt, datap, len);
++
++ return A_OK;
++}
++
++#endif /* CONFIG_HOST_TCMD_SUPPORT*/
++
++A_STATUS
++wmi_set_authmode_cmd(struct wmi_t *wmip, A_UINT8 mode)
++{
++ void *osbuf;
++ WMI_SET_AUTH_MODE_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_AUTH_MODE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->mode = mode;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_AUTH_MODE_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_reassocmode_cmd(struct wmi_t *wmip, A_UINT8 mode)
++{
++ void *osbuf;
++ WMI_SET_REASSOC_MODE_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_REASSOC_MODE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->mode = mode;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_REASSOC_MODE_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_lpreamble_cmd(struct wmi_t *wmip, A_UINT8 status)
++{
++ void *osbuf;
++ WMI_SET_LPREAMBLE_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_LPREAMBLE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->status = status;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_LPREAMBLE_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_rts_cmd(struct wmi_t *wmip, A_UINT16 threshold)
++{
++ void *osbuf;
++ WMI_SET_RTS_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_RTS_CMD*)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->threshold = threshold;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_RTS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_wmm_cmd(struct wmi_t *wmip, WMI_WMM_STATUS status)
++{
++ void *osbuf;
++ WMI_SET_WMM_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_WMM_CMD*)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->status = status;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_WMM_CMDID,
++ NO_SYNC_WMIFLAG));
++
++}
++
++A_STATUS
++wmi_set_wmm_txop(struct wmi_t *wmip, WMI_TXOP_CFG cfg)
++{
++ void *osbuf;
++ WMI_SET_WMM_TXOP_CMD *cmd;
++
++ if( !((cfg == WMI_TXOP_DISABLED) || (cfg == WMI_TXOP_ENABLED)) )
++ return A_EINVAL;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_WMM_TXOP_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->txopEnable = cfg;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_WMM_TXOP_CMDID,
++ NO_SYNC_WMIFLAG));
++
++}
++
++#ifdef CONFIG_HOST_TCMD_SUPPORT
++/* WMI layer doesn't need to know the data type of the test cmd.
++ This would be beneficial for customers like Qualcomm, who might
++ have different test command requirements from differnt manufacturers
++ */
++A_STATUS
++wmi_test_cmd(struct wmi_t *wmip, A_UINT8 *buf, A_UINT32 len)
++{
++ void *osbuf;
++ char *data;
++
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
++
++ osbuf= A_NETBUF_ALLOC(len);
++ if(osbuf == NULL)
++ {
++ return A_NO_MEMORY;
++ }
++ A_NETBUF_PUT(osbuf, len);
++ data = A_NETBUF_DATA(osbuf);
++ A_MEMCPY(data, buf, len);
++
++ return(wmi_cmd_send(wmip, osbuf, WMI_TEST_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++#endif
++
++A_STATUS
++wmi_set_bt_status_cmd(struct wmi_t *wmip, A_UINT8 streamType, A_UINT8 status)
++{
++ void *osbuf;
++ WMI_SET_BT_STATUS_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_BT_STATUS_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->streamType = streamType;
++ cmd->status = status;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_BT_STATUS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_bt_params_cmd(struct wmi_t *wmip, WMI_SET_BT_PARAMS_CMD* cmd)
++{
++ void *osbuf;
++ WMI_SET_BT_PARAMS_CMD* alloc_cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ alloc_cmd = (WMI_SET_BT_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(alloc_cmd, sizeof(*cmd));
++ A_MEMCPY(alloc_cmd, cmd, sizeof(*cmd));
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_BT_PARAMS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_get_keepalive_configured(struct wmi_t *wmip)
++{
++ void *osbuf;
++ WMI_GET_KEEPALIVE_CMD *cmd;
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++ cmd = (WMI_GET_KEEPALIVE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ return (wmi_cmd_send(wmip, osbuf, WMI_GET_KEEPALIVE_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_UINT8
++wmi_get_keepalive_cmd(struct wmi_t *wmip)
++{
++ return wmip->wmi_keepaliveInterval;
++}
++
++A_STATUS
++wmi_set_keepalive_cmd(struct wmi_t *wmip, A_UINT8 keepaliveInterval)
++{
++ void *osbuf;
++ WMI_SET_KEEPALIVE_CMD *cmd;
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*cmd));
++
++ cmd = (WMI_SET_KEEPALIVE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd->keepaliveInterval = keepaliveInterval;
++ wmip->wmi_keepaliveInterval = keepaliveInterval;
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_KEEPALIVE_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_appie_cmd(struct wmi_t *wmip, A_UINT8 mgmtFrmType, A_UINT8 ieLen,
++ A_UINT8 *ieInfo)
++{
++ void *osbuf;
++ WMI_SET_APPIE_CMD *cmd;
++ A_UINT16 cmdLen;
++
++ if (ieLen > WMI_MAX_IE_LEN) {
++ return A_ERROR;
++ }
++ cmdLen = sizeof(*cmd) + ieLen - 1;
++ osbuf = A_NETBUF_ALLOC(cmdLen);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, cmdLen);
++
++ cmd = (WMI_SET_APPIE_CMD *)(A_NETBUF_DATA(osbuf));
++ A_MEMZERO(cmd, cmdLen);
++
++ cmd->mgmtFrmType = mgmtFrmType;
++ cmd->ieLen = ieLen;
++ A_MEMCPY(cmd->ieInfo, ieInfo, ieLen);
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_APPIE_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_STATUS
++wmi_set_halparam_cmd(struct wmi_t *wmip, A_UINT8 *cmd, A_UINT16 dataLen)
++{
++ void *osbuf;
++ A_UINT8 *data;
++
++ osbuf = A_NETBUF_ALLOC(dataLen);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, dataLen);
++
++ data = A_NETBUF_DATA(osbuf);
++
++ A_MEMCPY(data, cmd, dataLen);
++
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_WHALPARAM_CMDID, NO_SYNC_WMIFLAG));
++}
++
++A_INT32
++wmi_get_rate(A_INT8 rateindex)
++{
++ if (rateindex == RATE_AUTO) {
++ return 0;
++ } else {
++ return(wmi_rateTable[(A_UINT32) rateindex]);
++ }
++}
++
++void
++wmi_node_return (struct wmi_t *wmip, bss_t *bss)
++{
++ if (NULL != bss)
++ {
++ wlan_node_return (&wmip->wmi_scan_table, bss);
++ }
++}
++
++bss_t *
++wmi_find_Ssidnode (struct wmi_t *wmip, A_UCHAR *pSsid,
++ A_UINT32 ssidLength, A_BOOL bIsWPA2)
++{
++ bss_t *node = NULL;
++ node = wlan_find_Ssidnode (&wmip->wmi_scan_table, pSsid,
++ ssidLength, bIsWPA2);
++ return node;
++}
++
++void
++wmi_free_allnodes(struct wmi_t *wmip)
++{
++ wlan_free_allnodes(&wmip->wmi_scan_table);
++}
++
++bss_t *
++wmi_find_node(struct wmi_t *wmip, const A_UINT8 *macaddr)
++{
++ bss_t *ni=NULL;
++ ni=wlan_find_node(&wmip->wmi_scan_table,macaddr);
++ return ni;
++}
++
++A_STATUS
++wmi_dset_open_reply(struct wmi_t *wmip,
++ A_UINT32 status,
++ A_UINT32 access_cookie,
++ A_UINT32 dset_size,
++ A_UINT32 dset_version,
++ A_UINT32 targ_handle,
++ A_UINT32 targ_reply_fn,
++ A_UINT32 targ_reply_arg)
++{
++ void *osbuf;
++ WMIX_DSETOPEN_REPLY_CMD *open_reply;
++
++ A_DPRINTF(DBG_WMI, (DBGFMT "Enter - wmip=0x%x\n", DBGARG, (int)wmip));
++
++ osbuf = A_NETBUF_ALLOC(sizeof(*open_reply));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ A_NETBUF_PUT(osbuf, sizeof(*open_reply));
++ open_reply = (WMIX_DSETOPEN_REPLY_CMD *)(A_NETBUF_DATA(osbuf));
++
++ open_reply->status = status;
++ open_reply->targ_dset_handle = targ_handle;
++ open_reply->targ_reply_fn = targ_reply_fn;
++ open_reply->targ_reply_arg = targ_reply_arg;
++ open_reply->access_cookie = access_cookie;
++ open_reply->size = dset_size;
++ open_reply->version = dset_version;
++
++ return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_DSETOPEN_REPLY_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
++static A_STATUS
++wmi_get_pmkid_list_event_rx(struct wmi_t *wmip, A_UINT8 *datap, A_UINT32 len)
++{
++ WMI_PMKID_LIST_REPLY *reply;
++ A_UINT32 expected_len;
++
++ if (len < sizeof(WMI_PMKID_LIST_REPLY)) {
++ return A_EINVAL;
++ }
++ reply = (WMI_PMKID_LIST_REPLY *)datap;
++ expected_len = sizeof(reply->numPMKID) + reply->numPMKID * WMI_PMKID_LEN;
++
++ if (len < expected_len) {
++ return A_EINVAL;
++ }
++
++ A_WMI_PMKID_LIST_EVENT(wmip->wmi_devt, reply->numPMKID,
++ reply->pmkidList);
++
++ return A_OK;
++}
++
++#ifdef CONFIG_HOST_DSET_SUPPORT
++A_STATUS
++wmi_dset_data_reply(struct wmi_t *wmip,
++ A_UINT32 status,
++ A_UINT8 *user_buf,
++ A_UINT32 length,
++ A_UINT32 targ_buf,
++ A_UINT32 targ_reply_fn,
++ A_UINT32 targ_reply_arg)
++{
++ void *osbuf;
++ WMIX_DSETDATA_REPLY_CMD *data_reply;
++ int size;
++
++ size = sizeof(*data_reply) + length;
++
++ A_DPRINTF(DBG_WMI,
++ (DBGFMT "Enter - length=%d status=%d\n", DBGARG, length, status));
++
++ osbuf = A_NETBUF_ALLOC(size);
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++ A_NETBUF_PUT(osbuf, size);
++ data_reply = (WMIX_DSETDATA_REPLY_CMD *)(A_NETBUF_DATA(osbuf));
++
++ data_reply->status = status;
++ data_reply->targ_buf = targ_buf;
++ data_reply->targ_reply_fn = targ_reply_fn;
++ data_reply->targ_reply_arg = targ_reply_arg;
++ data_reply->length = length;
++
++ if (status == A_OK) {
++ if (a_copy_from_user(data_reply->buf, user_buf, length)) {
++ return A_ERROR;
++ }
++ }
++
++ return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_DSETDATA_REPLY_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++#endif /* CONFIG_HOST_DSET_SUPPORT */
++
++A_STATUS
++wmi_set_wsc_status_cmd(struct wmi_t *wmip, A_UINT32 status)
++{
++ void *osbuf;
++ char *cmd;
++
++ wps_enable = status;
++
++ osbuf = a_netbuf_alloc(sizeof(1));
++ if (osbuf == NULL) {
++ return A_NO_MEMORY;
++ }
++
++ a_netbuf_put(osbuf, sizeof(1));
++
++ cmd = (char *)(a_netbuf_to_data(osbuf));
++
++ A_MEMZERO(cmd, sizeof(*cmd));
++ cmd[0] = (status?1:0);
++ return (wmi_cmd_send(wmip, osbuf, WMI_SET_WSC_STATUS_CMDID,
++ NO_SYNC_WMIFLAG));
++}
++
+diff --git a/drivers/ar6000/wmi/wmi_doc.h b/drivers/ar6000/wmi/wmi_doc.h
+new file mode 100644
+index 0000000..19cd938
+--- /dev/null
++++ b/drivers/ar6000/wmi/wmi_doc.h
+@@ -0,0 +1,4421 @@
++/*
++ *
++ * Copyright (c) 2004-2007 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++
++#if 0
++Wireless Module Interface (WMI) Documentaion
++
++ This section describes the format and the usage model for WMI control and
++ data messages between the host and the AR6000-based targets. The header
++ file include/wmi.h contains all command and event manifest constants as
++ well as structure typedefs for each set of command and reply parameters.
++
++Data Frames
++
++ The data payload transmitted and received by the target follows RFC-1042
++ encapsulation and thus starts with an 802.2-style LLC-SNAP header. The
++ WLAN module completes 802.11 encapsulation of the payload, including the
++ MAC header, FCS, and WLAN security related fields. At the interface to the
++ message transport (HTC), a data frame is encapsulated in a WMI message.
++
++WMI Message Structure
++
++ The WMI protocol leverages an 802.3-style Ethernet header in communicating
++ the source and destination information between the host and the AR6000
++ modules using a 14-byte 802.3 header ahead of the 802.2-style payload. In
++ addition, the WMI protocol adds a header to all data messages:
++
++ {
++ INT8 rssi
++ The RSSI of the received packet and its units are shown in db above the
++ noise floor, and the noise floor is shown in dbm.
++ UINT8 info
++ Contains information on message type and user priority. Message type
++ differentiates between a data packet and a synchronization message.
++ } WMI_DATA_HDR
++
++ User priority contains the 802.1d user priority info from host to target. Host
++ software translates the host Ethernet format to 802.3 format prior to Tx and
++ 802.3 format to host format in the Rx direction. The host does not transmit the
++ FCS that follows the data. MsgType differentiates between a regular data
++ packet (msgType=0) and a synchronization message (msgType=1).
++
++Data Endpoints
++
++ The AR6000 chipset provides several data endpoints to support quality of
++ service (QoS) and maintains separate queues and separate DMA engines for
++ each data endpoint. A data endpoint can be bi-directional.
++
++ Best effort (BE) class traffic uses the default data endpoint (2). The host can
++ establish up to two additional data endpoints for other traffic classes. Once
++ such a data endpoint is established, it sends and receives corresponding QoS
++ traffic in a manner similar to the default data endpoint.
++
++ If QoS is desired over the interconnect, host software must classify each data
++ packet and place it on the appropriate data endpoint. The information
++ required to classify data is generally available in-band as an 802.1p/q style
++ tag or as the ToS field in the IP header. The information may also be available
++ out-of-band depending on the host DDI.
++
++Connection States
++
++ Table B-1 describes the AR6000 WLAN connection states:
++
++ Table B-1. AR6000 Connection States
++
++Connection State
++ Description
++
++ DISCONNECTED
++ In this state, the AR6000 device is not connected to a wireless
++ network. The device is in this state after reset when it sends the
++ WIRELESS MODULE “READY” EVENT, after it processes a
++ DISCONNECT command, and when it loses its link with the
++ access point (AP) that it was connected to. The device signals a
++ transition to the DISCONNECTED state with a “DISCONNECT”
++ event.
++
++CONNECTED
++ In this state, the AR6000 device is connected to wireless networks.
++ The device enters this state after successfully processing a
++ CONNECT, which establishes a connection with a wireless
++ network. The device signals a transition to the CONNECTED state
++ with a “CONNECT” event.
++
++
++Message Types
++
++ WMI uses commands, replies, and events for the control and configuration of
++ the AR6000 device. The control protocol is asynchronous. Table B-2 describes
++ AR6000 message types:
++
++Table B-2. AR6000 Message Types
++
++Message Type
++ Description
++
++Commands
++ Control messages that flow from the host to the device
++
++Replies/Events
++ Control messages that flow from the device to the host.
++
++ The device issues a reply to some WMI commands, but not to others.
++ The payload in a reply is command-specific, and some commands do
++ not trigger a reply message at all. Events are control messages issued
++ by the device to signal the occurrence of an asynchronous event.
++
++
++WMI Message Format
++
++ All WMI control commands, replies and events use the header format:
++
++ WMI_CMD_HDR Header Format
++ {
++ UINT16 id
++ This 16-bit constant identifies which WMI command the host is issuing,
++ which command the target is replying to, or which event has occurred.
++ WMI_CMD_HDR
++ }
++
++
++ A variable-size command-, reply-, or event-specific payload follows the
++ header. Over the interconnect, all fields in control messages (including
++ WMI_CMD_HDR and the command specific payload) use 32-bit little Endian
++ byte ordering and fields are packed. The AR6000 device always executes
++ commands in order, and the host may send multiple commands without
++ waiting for previous commands to complete. A majority of commands are
++ processed to completion once received. Other commands trigger a longer
++ duration activity whose completion is signaled to the host through an event.
++
++Command Restrictions
++
++ Some commands may only be issued when the AR6000 device is in a certain
++ state. The host is required to wait for an event signaling a state transition
++ before such a command can be issued. For example, if a command requires
++ the device to be in the CONNECTED state, then the host is required to wait
++ for a “CONNECT” event before it issues that command.
++
++ The device ignores any commands inappropriate for its current state. If the
++ command triggers a reply, the device generates an error reply. Otherwise, the
++ device silently ignores the inappropriate command.
++
++Command and Data Synchronization
++
++ WMI provides a mechanism for a host to advise the device of necessary
++ synchronization between commands and data. The device implements
++ synchronization; no implicit synchronization exists between endpoints.
++
++ The host controls synchronization using the “SYNCHRONIZE” command
++ over the control channel and synchronization messages over data channels.
++ The device stops each data channel upon receiving a synchronization message
++ on that channel, processing all data packets received prior to that message.
++ After the device receives synchronization messages for each data endpoint
++ and the “SYNCHRONIZE” command, it resumes all channels.
++
++ When the host must guarantee a command executes before processing new
++ data packets, it first issues the command, then issues the “SYNCHRONIZE”
++ command and sends synchronization messages on data channels. When the
++ host must guarantee the device has processed all old data packets before a
++ processing a new command, it issues a “SYNCHRONIZE” command and
++ synchronization messages on all data channels, then issues the desired
++ command.
++
++
++
++WMI Commands
++
++ ADD_BAD_AP
++ Cause the AR6000 device to avoid a particular AP
++ ADD_CIPHER_KEY
++ Add or replace any of the four AR6000 encryption keys
++ ADD_WOW_PATTERN
++ Used to add a pattern to the WoW pattern list
++ CLR_RSSI_SNR
++ Clear the current calculated RSSI and SNR value
++ CONNECT_CMD
++ Request that the AR6000 device establish a wireless connection
++ with the specified SSID
++ CREATE_PSTREAM
++ Create prioritized data endpoint between the host and device
++ DELETE_BAD_AP
++ Clear an entry in the bad AP table
++ DELETE_CIPHER_KEY
++ Delete a previously added cipher key
++ DELETE_PSTREAM
++ Delete a prioritized data endpoint
++ DELETE_WOW_PATTERN
++ Remove a pre-specified pattern from the WoW pattern list
++ EXTENSION
++ WMI message interface command
++ GET_BIT_RATE
++ Retrieve rate most recently used by the AR6000
++ GET_CHANNEL_LIST
++ Retrieve list of channels used by the AR6000
++ GET_FIXRATES
++ Retrieves the rate-mask set via the SET_FIXRATES command.
++ GET_PMKID_LIST_CMD
++ Retrieve the firmware list of PMKIDs
++ GET_ROAM_DATA
++ Internal use for data collection; available in special build only
++ GET_ROAM_TBL
++ Retrieve the roaming table maintained on the target
++ GET_TARGET_STATS
++ Request that the target send the statistics it maintains
++ GET_TX_PWR
++ Retrieve the current AR6000 device Tx power levels
++ GET_WOW_LIST
++ Retrieve the current list of WoW patterns
++ LQ_THRESHOLD_PARAMS
++ Set the link quality thresholds
++ OPT_TX_FRAME
++ Send a special frame (special feature)
++ RECONNECT
++ Request a reconnection to a BSS
++ RSSI_THRESHOLD_PARAMS
++ Configure how the AR6000 device monitors and reports signal
++ strength (RSSI) of the connected BSS
++ SCAN_PARAMS
++ Determine dwell time and changes scanned channels
++ SET_ACCESS_PARAMS
++ Set access parameters for the wireless network
++ SET_ADHOC_BSSID
++ Set the BSSID for an ad hoc network
++ SET_AKMP_PARAMS
++ Set multiPMKID mode
++ SET_APPIE
++ Add application-specified IE to a management frame
++ SET_ASSOC_INFO
++ Specify the IEs the device should add to association or
++ reassociation requests
++ SET_AUTH_MODE
++ Set 802.11 authentication mode of reconnection
++ SET_BEACON_INT
++ Set the beacon interval for an ad hoc network
++ SET_BIT_RATE
++ Set the AR6000 to a specific fixed bit rate
++ SET_BMISS_TIME
++ Set the beacon miss time
++ SET_BSS_FILTER
++ Inform the AR6000 of network types about which it wants to
++ receive information using a “BSSINFO” event
++ SET_BT_PARAMS
++ Set the status of a Bluetooth stream (SCO or A2DP) or set
++ Bluetooth coexistence register parameters
++ SET_BT_STATUS
++ Set the status of a Bluetooth stream (SCO or A2DP)
++ SET_CHANNEL_PARAMETERS
++ Configure WLAN channel parameters
++ SET_DISC_TIMEOUT
++ Set the amount of time the AR6000 spends attempting to
++ reestablish a connection
++ SET_FIXRATES
++ Set the device to a specific fixed PHY rate (supported subset)
++ SET_HALPARAM
++ Internal AR6000 command to set certain hardware parameters
++ SET_HOST_SLEEP_MODE
++ Set the host mode to asleep or awake
++ SET_IBSS_PM_CAPS
++ Support a non-standard power management scheme for an
++ ad hoc network
++ SET_LISTEN_INT
++ Request a listen interval
++ SET_LPREAMBLE
++ Override the short preamble capability of the AR6000 device
++ SET_MAX_SP_LEN
++ Set the maximum service period
++ SET_OPT_MODE
++ Set the special mode on/off (special feature)
++ SET_PMKID
++ Set the pairwise master key ID (PMKID)
++ SET_PMKID_LIST_CMD
++ Configure the firmware list of PMKIDs
++ SET_POWER_MODE
++ Set guidelines on trade-off between power utilization
++ SET_POWER_PARAMS
++ Configure power parameters
++ SET_POWERSAVE_PARAMS
++ Set the two AR6000 power save timers
++ SET_PROBED_SSID
++ Provide list of SSIDs the device should seek
++ SET_REASSOC_MODE
++ Specify whether the disassociated frame should be sent upon
++ reassociation
++ SET_RETRY_LIMITS
++ Limit how many times the device tries to send a frame
++ SET_ROAM_CTRL
++ Control roaming behavior
++ SET_RTS
++ Determine when RTS should be sent
++ SET_SCAN_PARAMS
++ Set the AR6000 scan parameters
++ SET_TKIP_COUNTERMEASURES
++ Enable/disable reports of TKIP MIC errors
++ SET_TX_PWR
++ Specify the AR6000 device Tx power levels
++ SET_VOICE_PKT_SIZE
++ Set voice packet size
++ SET_WMM
++ Override the AR6000 WMM capability
++ SET_WMM_TXOP
++ Configure TxOP bursting when sending traffic to a WMM-
++ capable AP
++ SET_WOW_MODE
++ Enable/disable WoW mode
++ SET_WSC_STATUS
++ Enable/disable profile check in cserv when the WPS protocol
++ is in progress
++ SNR_THRESHOLD_PARAMS
++ Configure how the device monitors and reports SNR of BSS
++ START_SCAN
++ Start a long or short channel scan
++ SYNCHRONIZE
++ Force a synchronization point between command and data
++ paths
++ TARGET_REPORT_ERROR_BITMASK
++ Control “ERROR_REPORT” events from the AR6000
++
++
++
++
++Name
++ ADD_BAD_AP
++
++Synopsis
++ The host uses this command to cause the AR6000 to avoid a particular AP. The
++ AR6000 maintain a table with up to two APs to avoid. An ADD_BAD_AP command
++ adds or replaces the specified entry in this bad AP table.
++
++ If the AR6000 are currently connected to the AP specified in this command, they
++ disassociate.
++
++Command
++ wmiconfig eth1 --badap <bssid> <badApIndex>
++
++Command Parameters
++ UINT8 badApIndex Index [0...1] that identifies which entry in the
++ bad AP table to use
++
++
++ UINT8 bssid[6] MAC address of the AP to avoid
++
++Command Values
++ badApIndex = 0, 1 Entry in the bad AP table to use
++
++Reset Value
++ The bad AP table is cleared
++
++Restrictions
++ None
++
++See Also
++ “DELETE_BAD_AP” on page B-13
++
++=====================================================================
++Name
++ ADD_CIPHER_KEY
++
++Synopsis
++ The host uses this command to add/replace any of four encryption keys on the
++ AR6000. The ADD_CIPHER_KEY command is issued after the CONNECT event
++ has been received by the host for all dot11Auth modes except for SHARED_AUTH.
++ When the dot11AuthMode is SHARED_AUTH, then the ADD_CIPHER_KEY
++ command should be issued before the “CONNECT” command.
++
++Command
++ wmiconfig eth1 --cipherkey <keyIndex> <keyType> <keyUsage>
++ <keyLength> <keyopctrl> <keyRSC> <key>
++
++Command Parameters
++ UINT8 keyIndex Index (0...3) of the key to add/replace;
++ uniquely identifies the key
++ UINT8 keyType CRYPTO_TYPE
++ UINT8 keyUsage Specifies usage parameters of the key when
++ keyType = WEP_CRYPT
++ UINT8 keyLength Length of the key in bytes
++ UINT8 keyOpCtrl bit[0] = Initialize TSC (default),
++ bit[1] = Initialize RSC
++ UINT8 keyRSC[8] Key replay sequence counter (RSC) initial
++ value the device should use
++ UINT8 key[32] Key material used for this connection
++ Command Values
++ {
++ NONE_CRYPT = 1
++ WEP_CRYPT = 2
++ TKIP_CRYPT = 3
++ AES_CRYPT = 4
++ KEY_OP_INIT_TSC 0x01
++ KEY_OP_INIT_RSC 0x02
++ KEY_OP_INIT_VAL 0x03
++ Default is to Initialize the TSC
++ KEY_OP_VALID_MASK 0x04
++ Two operations defined
++ } CRYPTO_TYPE
++
++ {
++ PAIRWISE_USAGE = 0 Set if the key is used for unicast traffic only
++ GROUP_USAGE = 1 Set if the key is used to receive multicast
++ traffic (also set for static WEP keys)
++ TX_USAGE = 2 Set for the GROUP key used to transmit frames
++ All others are reserved
++ } KEY_USAGE
++
++Reset Value
++ The four available keys are disabled.
++
++Restrictions
++ The cipher should correspond to the encryption mode specified in the “CONNECT”
++ command.
++
++See Also
++ “DELETE_CIPHER_KEY”
++
++=====================================================================
++
++
++Name
++ ADD_WOW_PATTERN
++
++Synopsis
++ The host uses this command to add a pattern to the WoW pattern list; used for
++ pattern-matching for host wakeups by the WoW module. If the host mode is asleep
++ and WoW is enabled, all packets are matched against the existing WoW patterns. If a
++ packet matches any of the patterns specified, the target will wake up the host. All
++ non-matching packets are discarded by the target without being sent up to the host.
++
++Command
++ wmiconfig –addwowpattern <list-id> <filter-size> <filter-offset>
++ <pattern> <mask>
++
++Command Parameters
++ A_UINT8 filter_list_id ID of the list that is to include the new pattern
++ A_UINT8 filter_size Size of the new pattern
++ A_UINT8 filter_offset Offset at which the pattern matching for this
++ new pattern should begin at
++ A_UINT8 filter[1] Byte stream that contains both the pattern and
++ the mask of the new WoW wake-up pattern
++
++Reply Parameters
++ None
++
++Reset Value
++ None defined (default host mode is awake)
++
++Restrictions
++ None
++
++See Also
++ “DELETE_WOW_PATTERN”
++
++=====================================================================
++
++
++Name
++ CLR_RSSI_SNR
++
++Synopsis
++ Clears the current calculated RSSI and SNR value. RSSI and SNR are reported by
++ running-average value. This command will clear the history and have a fresh start
++ for the running-average mechanism.
++
++Command
++ wmiconfig eth1 --cleanRssiSnr
++
++Command Parameters
++ None
++
++Reply Parameters
++ None
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++=====================================================================
++
++Name
++ CONNECT_CMD
++
++Synopsis
++ New connect control information (connectCtrl) is added, with 32 possible modifiers.
++
++ CONNECT_SEND_REASSOC
++ Valid only for a host-controlled connection to a
++ particular AP. If this bit is set, a reassociation frame is
++ sent. If this bit is clear, an association request frame is
++ sent to the AP.
++
++ CONNECT_IGNORE_WPAx_GROUP_CIPHER
++ No group key is issued in the CONNECT command,
++ so use the group key advertised by the AP. In a target-
++ initiated roaming situation this allows a STA to roam
++ between APs that support different multicast ciphers.
++
++ CONNECT_PROFILE_MATCH_DONE
++ In a host-controlled connection case, it is possible that
++ during connect, firmware may not have the
++ information for a profile match (e.g, when the AP
++ supports hidden SSIDs and the device may not
++ transmit probe requests during connect). By setting
++ this bit in the connection control information, the
++ firmware waits for a beacon from the AP with the
++ BSSID supplied in the CONNECT command. No
++ additional profile checks are done.
++
++ CONNECT_IGNORE_AAC_BEACON
++ Ignore the Admission Capacity information in the
++ beacon of the AP
++
++ CONNECT_ASSOC_POLICY_USER
++ When set, the CONNECT_SEND_REASSOC setting
++ determines if an Assoc or Reassoc is sent to an AP
++
++Command
++ wmiconfig --setconnectctrl <ctrl flags bitmask>
++
++Command Parameters
++ typedef struct{
++ A_UINT8 networktype;
++ A_UINT8 dot11authmode;
++ A_UINT8 authmode;
++ A_UINT8 pairwiseCryptoType; /*CRYPTO_TYPE*/
++ A_UINT8 pairwiseCryptoLen;
++ A_UINT8 groupCryptoType; /*CRYPTO_TYPE*/
++ A_UINT8 groupCryptoLen;
++ A_UINT8 ssidLength;
++ A_UCHAR ssid[WMI_MAX_SSID_LEN];
++ A_UINT16 channel;
++ A_UINT8 bssid[AUTH_MAC_LEN];
++ A_UINT8 ctrl_flags; /*WMI_CONNECT_CTRL_FLAGS_BITS*/
++ } WMI_CONNECT_CMD;
++
++ ctrl flags bitmask
++ = 0x0001 CONNECT_ASSOC_POLICY_USER
++ Assoc frames are sent using the policy specified by
++ the flag
++ = 0x0002 CONNECT_SEND_REASSOC
++ Send Reassoc frame while connecting, otherwise send
++ assoc frames
++ = 0x0004 CONNECT_IGNORE_WPAx_GROUP_CIPHER
++ Ignore WPAx group cipher for WPA/WPA2
++ = 0x0008 CONNECT_PROFILE_MATCH_DONE
++ Ignore any profile check
++ = 0x0010 CONNECT_IGNORE_AAC_BEACON
++ Ignore the admission control information in the
++ beacon
++ ... CONNECT_CMD, continued
++ Command Values
++ typedef enum {
++ INFRA_NETWORK = 0x01,
++ ADHOC_NETWORK = 0x02,
++ ADHOC_CREATOR = 0x04,
++ } NETWORK_TYPE;
++
++ typedef enum {
++ OPEN_AUTH = 0x01,
++ SHARED_AUTH = 0x02,
++ LEAP_AUTH = 0x04,
++ } DOT11_AUTH_MODE;
++ typedef enum {
++ NONE_AUTH = 0x01,
++ WPA_AUTH = 0x02,
++ WPA_PSK_AUTH = 0x03,
++ WPA2_AUTH = 0x04,
++ WPA2_PSK_AUTH = 0x05,
++ WPA_AUTH_CCKM = 0x06,
++ WPA2_AUTH_CCKM = 0x07,
++ } AUTH_MODE;
++ typedef enum {
++ NONE_CRYPT = 0x01,
++ WEP_CRYPT = 0x02,
++ TKIP_CRYPT = 0x03,
++ AES_CRYPT = 0x04,
++ } CRYPTO_TYPE;
++ typedef enum {
++ CONNECT_ASSOC_POLICY_USER = 0x0001,
++ CONNECT_SEND_REASSOC = 0x0002,
++ CONNECT_IGNORE_WPAx_GROUP_CIPHER = 0x0004,
++ CONNECT_PROFILE_MATCH_DONE = 0x0008,
++ CONNECT_IGNORE_AAC_BEACON = 0x0010,
++ } WMI_CONNECT_CTRL_FLAGS_BITS;
++
++ pairwiseCryptoLen and groupCryptoLen are valid when the respective
++ CryptoTypesis WEP_CRYPT, otherwise this value should be 0. This is the length in
++ bytes.
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ CREATE_PSTREAM
++
++Synopsis
++ The host uses this command to create a new prioritized data endpoint between the
++ host and the AR6000 device that carries a prioritized stream of data. If the AP that the
++ device connects to requires TSPEC stream establishment, the device requests the
++ corresponding TSPEC with the AP. The maximum and minimum service interval
++ ranges from 0 – 0x7FFFFFFF (ms), where 0 = disabled. The device does not send a
++ reply event for this command, as it is always assumed the command has succeeded.
++ An AP admission control response comes to the host via a WMI_CAC_INDICATION
++ event, once the response for the ADDTS frame comes.
++
++ Examples of cases where reassociation is generated (when WMM) and cases where
++ ADDTS is generated (when WMM and enabling ACM) are when:
++ Changing UAPSD flags in WMM mode, reassociation is generated
++ Changing the interval of sending auto QoS Null frame in WMM mode;
++ reassociation is not generated
++ Issuing a command with same previous parameters in WMM mode and enabling
++ ACM, an ADDTS request is generated
++ Changing the interval of a QoS null frame sending in WMM mode and enabling
++ ACM, an ADDTS request is generated
++ Issuing the command in disconnected state, reassociation or ADDTS is not
++ generated but the parameters are available after (re)association
++
++Command
++ --createqos <user priority> <direction> <traffic class>
++<trafficType> <voice PS capability> <min service interval> <max
++service interval> <inactivity interval> <suspension interval>
++<service start time> <tsid> <nominal MSDU> <max MSDU> <min data
++rate> <mean data rate> <peak data rate> <max burst size> <delay
++bound> <min phy rate> <sba> <medium time> where:
++
++ <user priority>
++ 802.1D user priority range (0–7)
++ <direction>
++ = 0 Tx (uplink) traffic
++ = 1 Rx (downlink) traffic
++ = 2 Bi-directional traffic
++ <traffic class>
++ = 1 BK
++ = 2 VI
++ = 3 VO
++ <trafficType>
++ = 0 Aperiodic
++ = 1 Periodic
++ <voice PS capability>
++ Specifies whether the voice power save mechanism
++ (APSD if AP supports it or legacy/simulated APSD
++ [using PS-Poll]) should be used
++ = 0 Disable voice power save for traffic class
++ = 1 Enable APSD voice power save for traffic class
++ = 2 Enable voice power save for all traffic classes
++ <min service interval>
++ (In ms)
++ <max service interval>
++ Inactivity interval (in ms) (0 = Infinite)
++ <suspension interval>
++ (In ms)
++ <service start time>
++ Service start time
++ <tsid>
++ TSID range (0–15)
++ <nominal MSDU>
++ Nominal MAC SDU size
++ <max MSDU>
++ Maximum MAC SDU size
++ <min data rate>
++ Minimum data rate (in bps)
++ <mean data rate>
++ Mean data rate (in bps)
++ <peak data rate>
++ Peak data rate (in bps)
++ <max burst size>
++ Maximum burst size (in bps)
++ <delay bound>
++ Delay bound
++ <min phy rate>
++ Minimum PHY rate (in bps)
++ <sba>
++ Surplus bandwidth allowance
++ <medium time>
++ Medium time in TU of 32-ms periods per sec
++ ... CREATE_PSTREAM (continued)
++
++Command Parameters
++ UINT8 trafficClass TRAFFIC_CLASS value
++ UINT8 traffic
++ Direction
++ DIR_TYPE value
++ UINT8 rxQueueNum
++ AR6000 device mailbox index (2 or 3)
++ corresponding to the endpoint the host
++ wishes to use to receive packets for the
++ prioritized stream
++ UINT8 trafficType TRAFFIC_TYPE value
++ UINT8 voicePS
++Capability
++ VOICEPS_CAP_TYPE value
++ UINT8 tsid Traffic stream ID
++ UINT8 userPriority 802.1D user priority
++ UINT16 nominalMSDU Nominal MSDU in octets
++ UINT16 maxMSDU Maximum MSDU in octets
++ UINT32 minServiceInt Minimum service interval: the min.
++ period of traffic specified (in ms)
++ UINT32 maxServiceInt Maximum service interval: the max.
++ period of traffic specified (in ms)
++ UINT32 inactivityInt Indicates how many ms an established
++ stream is inactive before the prioritized
++ data endpoint is taken down and the
++ corresponding T-SPEC deleted
++ UINT32 suspensionInt Suspension interval (in ms)
++ UINT32 service StartTime Service start time
++ UINT32 minDataRate Minimum data rate (in bps)
++ UINT32 meanDataRate Mean data rate (in bps)
++ UINT32 peakDataRate Peak data rate (in bps)
++ UINT32 maxBurstSize
++ UINT32 delayBound
++ UINT32 minPhyRate Minimum PHY rate for TSPEC (in bps)
++ UINT32 sba Surplus bandwidth allowance
++ UINT32 mediumTime Medium TSPEC time (in units of 32 ms)
++Command Values
++ {
++ WMM_AC_BE = 0 Best Effort
++ WMM_AC_BK = 1 Background
++ WMM_AC_VI = 2 Video
++ WMM_AC_VO = 3 Voice
++ All other values reserved
++ } TRAFFIC_CLASS
++ {
++ UPLINK_TRAFFIC = 0 From the AR6000 device to the AP
++ DOWNLINK_TRAFFIC = 1 From the AP to the AR6000 device
++ BIDIR_TRAFFIC = 2 Bi-directional traffic
++ All other values reserved
++ } DIR_TYPE
++ {
++ DISABLE_FOR_THIS_AC = 0
++ ENABLE_FOR_THIS_AC = 1
++ ENABLE_FOR_ALL_AC = 2
++ All other values reserved
++ } VOICEPS_CAP_TYPE
++
++ ... CREATE_PSTREAM (continued)
++
++
++ VI BE BK Supported, Y/N?
++ 0 0 0 0 Y
++ 0 0 0 1 Y
++ 0 0 1 0 N
++ 0 0 1 1 N
++ 0 1 0 0 Y
++ 0 1 0 1 Y
++ 0 1 1 0 N
++ 0 1 1 1 N
++ 1 0 0 0 Y
++ 1 0 0 1 Y
++ 1 0 1 0 N
++ 1 1 0 0 N
++ 1 1 0 1 Y
++ 1 1 0 0 N
++ 1 1 1 0 N
++ 1 1 1 1 Y
++
++Reset Value
++ No pstream is present after reset; each of the BE, BK, VI,VO pstreams must be created
++ (either implicitly by data flow or explicitly by user)
++
++Restrictions
++ This command can only be issued when the device is in the CONNECTED state. If
++ the device receives the command while in DISCONNECTED state, it replies with a
++ failure indication. At most four prioritized data endpoints can be created, one for
++ each AC.
++
++See Also
++ “DELETE_PSTREAM”
++=====================================================================
++
++Name
++ DELETE_BAD_AP
++
++Synopsis
++ The host uses this command to clear a particular entry in the bad AP table
++
++Command
++ wmiconfig eth1 --rmAP [--num=<index>] // used to clear a badAP
++ entry. num is index from 0-3
++
++Command Parameters
++ UINT8 badApIndex Index [0...n] that identifies the entry in the bad
++ AP table to delete
++
++Command Values
++ badApIndex = 0, 1, 2, 3
++ Entry in the bad AP table
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++See Also
++ “ADD_BAD_AP”
++
++=====================================================================
++
++
++Name
++ DELETE_CIPHER_KEY
++
++Synopsis
++ The host uses this command to delete a key that was previously added with the
++ “ADD_CIPHER_KEY” command.
++
++Command
++ TBD
++
++Command Parameters
++ UINT8 keyIndex Index (0...3) of the key to be deleted
++
++Command Values
++ keyIndex = 0, 1,2, 3 Key to delete
++
++Reset Value
++ None
++
++Restrictions
++ The host should not delete a key that is currently in use by the AR6000.
++
++See Also
++ “ADD_CIPHER_KEY”
++
++=====================================================================
++
++Name
++ DELETE_PSTREAM
++
++Synopsis
++ The host uses this command to delete a prioritized data endpoint created by a
++ previous “CREATE_PSTREAM” command
++
++Command
++ --deleteqos <trafficClass> <tsid>, where:
++
++ <traffic class>
++ = 0 BE
++ = 1 BK
++ = 2 VI
++ = 3 VO
++ <tsid>
++ The TSpec ID; use the -qosqueue option
++ to get the active TSpec IDs for each traffic class
++
++Command Parameters
++ A_UINT8 trafficClass Indicate the traffic class of the stream
++ being deleted
++
++Command Values
++ {
++ WMM_AC_BE = 0 Best effort
++ WMM_AC_BK = 1 Background
++ WMM_AC_VI = 2 Video
++ WMM_AC_VO = 3 Voice
++ } TRAFFIC CLASS
++
++ 0-15 for TSID
++
++Reply Values
++ N/A
++
++Restrictions
++ This command should only be issued after a “CREATE_PSTREAM” command has
++ successfully created a prioritized stream
++
++See Also
++ “CREATE_PSTREAM”
++
++=====================================================================
++
++
++Name
++ DELETE_WOW_PATTERN
++
++Synopsis
++ The host uses this command to remove a pre-specified pattern from the
++ WoW pattern list.
++
++Command
++ wmiconfig –delwowpattern <list-id> <pattern-id>
++
++Command Parameters
++ A_UINT8 filter_list_id ID of the list that contains the WoW filter
++ pattern to delete
++ A_UINT8 filter_id ID of the WoW filter pattern to delete
++
++Reply Parameters
++ None
++
++
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++See Also
++ “ADD_WOW_PATTERN”
++
++=====================================================================
++
++
++Name
++ EXTENSION
++
++Synopsis
++ The WMI message interface is used mostly for wireless control messages to a wireless
++ module applicable to wireless module management regardless of the target platform
++ implementation. However, some commands only peripherally related to wireless
++ management are desired during operation. These wireless extension commands may
++ be platform-specific or implementation-dependent.
++
++Command
++ N/A
++
++Command Parameters
++ Command-specific
++
++Command Values
++ Command-specific
++
++Reply Parameters
++ Command-specific
++
++Reset Values
++ None defined
++
++Restrictions
++ None defined
++
++=====================================================================
++
++
++Name
++ GET_BIT_RATE
++
++Synopsis
++ Used by the host to obtain the rate most recently used by the AR6000 device
++
++Command
++ wmiconfig eth1 --getfixrates
++
++Command Parameters
++ None
++
++
++
++Reply Parameters
++ INT8
++ rateIndex
++ See the “SET_BIT_RATE” command
++
++Reset Values
++ None
++
++Restrictions
++ This command should only be used during development/debug; it is not intended
++for use in production. It is only valid when the device is in the CONNECTED state
++
++See Also
++ “SET_BIT_RATE”
++
++=====================================================================
++
++
++Name
++ GET_CHANNEL_LIST
++
++Synopsis
++ Used by the host uses to retrieve the list of channels that can be used by the device
++ while in the current wireless mode and in the current regulatory domain.
++
++Command
++ TBD
++
++Command Parameters
++ None
++
++Reply Parameters
++ UINT8 reserved Reserved
++ UINT8 numberOfChannels Number of channels the reply contains
++ UINT16 channelList[numberOfChannels] Array of channel frequencies (in MHz)
++
++Reset Values
++ None defined
++
++Restrictions
++ The maximum number of channels that can be reported are 32
++
++=====================================================================
++
++
++Name
++ GET_FIXRATES
++
++Synopsis
++ Clears the current calculated RSSI and SNR value. RSSI and SNR are reported by
++ running-average value. This command will clear the history and have a fresh start for
++ the running-average mechanism.
++
++Synopsis
++ This returns rate-mask set via WMI_SET_FIXRATES to retrieve the current fixed rate
++ that the AR6001 or AR6001 is using. See “SET_FIXRATES”.
++
++Command
++ wmiconfig eth1 --getfixrates
++
++Command Parameters
++ A_UINT16 fixRateMask; Note: if this command is used prior to
++ using WMI_SET_FIXRATES, AR6000
++ returns 0xffff as fixRateMask, indicating
++ all the rates are enabled
++
++Reply Parameters
++ None
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++See Also
++ “SET_FIXRATES”
++
++=====================================================================
++
++
++
++Name
++ GET_PMKID_LIST_CMD
++
++Synopsis
++ Retrieves the list of PMKIDs on the firmware. The
++ WMI_GET_PMKID_LIST_EVENT is generated by the firmware.
++
++Command
++ TBD
++
++Command Parameters
++
++Reset Values
++ None
++
++Restrictions
++ None
++
++See Also
++ SET_PMKID_LIST_CMD GET_PMKID_LIST_EVENT
++
++=====================================================================
++
++
++Name
++ GET_ROAM_TBL
++
++Synopsis
++ Retrieve the roaming table maintained on the target. The response is reported
++ asynchronously through the ROAM_TBL_EVENT.
++
++Command
++ wmiconfig --getroamtable <roamctrl> <info>
++
++Command Parameters
++ A_UINT8 roamCtrlType;
++ A_UINT16 roamMode
++ A_UINT16 numEntries
++ WMI_BSS_ROAM_INFO bssRoamInfo[1]
++
++Reply Value
++ Reported asynchronously through the ROAM_TBL_EVENT
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++See Also
++ SET_KEEPALIVE
++
++=====================================================================
++
++
++Name
++ GET_TARGET_STATS
++
++Synopsis
++ The host uses this command to request that the target send the statistics that it
++ maintains. The statistics obtained from the target are accrued in the host every time
++ the GET_TARGET_STATS command is issued. The --clearStats option is added to
++ clear the target statistics maintained in the host.
++
++Command
++ wmiconfig --getTargetStats --clearStats
++
++Command Parameters
++ TARGET_STATS targetStats
++ WMI_TARGET_STATS
++ UINT8 clearStats
++
++
++Reply Value
++ RSSI return value (0–100)
++
++Reset Values
++ All statistics are cleared (zeroed)
++
++Restrictions
++ The --getTargetStats option must be used; the --clearStats option is also available also
++
++
++=====================================================================
++
++Name
++ GET_TX_PWR
++
++Synopsis
++ The host uses this command to retrieve the current Tx power level
++
++Command
++ wmiconfig -i eth1 --getpower
++
++Command Parameters
++ None
++
++Reply Parameters
++ UINT16 dbM The current Tx power level specified in dbM
++
++Reset Values
++ The maximum permitted by the regulatory domain
++
++Restrictions
++ None
++
++See Also
++ “SET_TX_PWR”
++
++=====================================================================
++
++
++Name
++ GET_WOW_LIST
++
++Synopsis
++ The host uses this command to retrieve the current list of WoW patterns.
++
++Command
++ wmiconfig –getwowlist <list-id>
++
++Command Parameters
++ A_UINT8 filter_list_id ID of the list of WoW patterns to retrieve
++
++Reply Value(s)
++ A_UINT16 num_filters Number of WoW patterns contained in the list
++ A_UINT8 wow_mode Current mode of WoW (enabled or disabled)
++ A_UINT8 host_mode Current host mode (asleep or awake)
++ WOW_FILTER wow_filters[1]
++ Contents of the WoW filter pattern list
++ (contains mask, pattern, offset and size
++ information for each of the patterns)
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++See Also
++ “SET_WSC_STATUS”
++
++=====================================================================
++
++
++Name
++ LQ_THRESHOLD_PARAMS
++
++Synopsis
++ Sets Link Quality thresholds, the sampling will happen at every unicast data frame
++ Tx if a certain threshold is met, and the corresponding event will be sent to the host.
++
++Command
++ --lqThreshold <enable> <upper_threshold_1> ...
++ <upper_threshold_4> <lower_threshold_1> ... <lower_threshold_4>
++
++Command Parameters
++ <enable> = 0 Disable link quality sampling
++ = 1 Enable link quality sampling
++ <upper_threshold_x> Above thresholds (value in [0,100]), in
++ ascending order
++ <lower_threshold_x> Below thresholds (value in [0,100]), in
++ ascending order
++
++Command Values
++ See command parameters
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ OPT_TX_FRAME
++
++Synopsis
++ Special feature, sends a special frame.
++
++Command
++ wmiconfig --sendframe <frmType> <dstaddr> <bssid> <optIEDatalen>
++ <optIEData>
++
++Command Parameters
++ {
++ A_UINT16 optIEDataLen;
++ A_UINT8 frmType;
++ A_UINT8 dstAddr[ATH_MAC_LEN];
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_UINT8 optIEData[1];
++ } WMI_OPT_TX_FRAME_CMD;
++
++Command Values
++ <frmtype> = 1 Probe request frame
++ = 2 Probe response frame
++ = 3 CPPP start
++ = 4 CPPP stop
++
++Reset Value
++ None defined
++
++Restrictions
++ Send a special frame only when special mode is on.
++
++=====================================================================
++
++
++Name
++ RECONNECT
++
++Synopsis
++ This command requests a reconnection to a BSS to which the AR6000 device was
++ formerly connected
++
++Command
++ TBD
++
++Command Parameters
++ UINT16 channel Provides a hint as to which channel was
++ used for a previous connection
++ UINT8 bssid[6] If set, indicates which BSSID to connect to
++
++Command Values
++ None
++
++Reset Values
++ None
++
++Restrictions
++ None
++
++See Also
++ “CONNECT_CMD”
++
++=====================================================================
++
++
++Name
++ RSSI_THRESHOLD_PARAMS
++
++Synopsis
++ Configures how the AR6000 device monitors and reports signal strength (RSSI) of the
++ connected BSS, which is used as a link quality metric. The four RSSI threshold sets (in
++ dbM) of the host specification divide the signal strength range into six segments.
++ When signal strength increases or decreases across one of the boundaries, an
++ RSSI_THRESHOLD event is signaled to the host. The host may then choose to take
++ action (such as influencing roaming).
++
++Command
++ wmiconfig eth1 --rssiThreshold <weight> <pollTime>
++ <above_threshold_val_1> ... <above_threshold_tag_6>
++ <above_threshold_val_6>
++ <below_threshold_tag_1> <below_threshold_val_1> ...
++ <below_threshold_tag_6> <below_threshold_val_6>
++
++Command Parameters
++ UINT8 weight Range in [1, 16] used to calculate average RSSI
++ UINT32 pollTime RSSI (signal strength) sampling frequency in
++ seconds (if pollTime = 0, single strength
++ sampling is disabled)
++ USER_RSS__THOLD tholds[12] Thresholds (6 x 2)
++
++Command Values
++ None defined
++
++Reset Values
++ pollTime is 0, and sampling is disabled
++
++Restrictions
++ Can only be issued if the AR6000 device is connected
++
++
++=====================================================================
++
++Name
++ SCAN_PARAMS
++
++Synopsis
++ The minact parameter determines the minimum active channel dwell time, within
++ which if the STA receives any beacon, it remains on that channel until the maxact
++ channel dwell time. If the STA does not receive a beacon within the minact dwell
++ time, it switches to scan the next channel.
++
++Command
++ wmiconfig -scan -minact=<ms> --maxact=<ms>
++
++Command Parameters
++ UINT16 maxact Channel dwell time (in ms), default = 0
++ UINT16 minact Channel dwell time (in ms), default = 105
++
++Command Values
++ See channel parameters
++
++Reset Values
++ None defined
++
++Restrictions
++ The minact value should be greater than 0; maxact should be between 5–65535 ms
++ and greater than minact
++
++=====================================================================
++
++
++Name
++ SET_ACCESS_PARAMS
++
++Synopsis
++ Allows the host to set access parameters for the wireless network. A thorough
++ understanding of IEEE 802.11 is required to properly manipulate these parameters.
++
++Command
++ wmiconfig eth1 --acparams --txop <limit> --cwmin <0-15>
++ --cwmax <0-15> --aifsn<0-15>
++
++Command Parameters
++ UINT16 txop The maximum time (expressed in units of
++ 32 ms) the device can spend transmitting
++ after acquiring the right to transmit
++ UINT8 eCWmin Minimum contention window
++ UINT8 eCWmax Maximum contention window
++ UINT8 aifsn The arbitration inter-frame space number
++
++Command Values
++ None
++
++Reset Values
++ Reasonable defaults that vary, between endpoints (prioritized streams)
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_ADHOC_BSSID
++
++Synopsis
++ Allows the host to set the BSSID for an ad hoc network. If a network with this BSSID
++ is not found, the target creates an ad hoc network with this BSSID after the connect
++ WMI command is triggered (e.g., by the SIOCSIWESSID IOCTL).
++
++Command
++ wmiconfig eth1 --adhocbssid <bssid>
++
++Command Parameters
++ A_UINT8 bssid[ATH_MAC_LEN] BSSID is specified in xx:xx:xx:xx:xx:xx format
++
++Command Values
++ None
++
++Reset Values
++ None
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_AKMP_PARAMS
++
++Synopsis
++ Enables or disables multi PMKID mode.
++
++Command
++ wmiconfig eth1 --setakmp --multipmkid=<on/off>
++
++Command Parameters
++ typedef struct {
++ A_UINT32 akmpInfo;
++ } WMI_SET_AKMP_PARAMS_CMD;
++
++Command Values
++ akmpInfo;
++ bit[0] = 0
++ MultiPMKID mode is disabled and PMKIDs that
++ were set using the WMI_SET_PMKID_CMD are
++ used in the [Re]AssocRequest frame.
++ bit[0] = 1
++ MultiPMKID mode is enabled and PMKIDs issued
++ by the WMI_SET_PMKID_LIST_CMD are used in
++ the next [Re]AssocRequest sent to the AP.
++
++Reset Values
++ MultiPMKID mode is disabled
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_APPIE
++
++Synopsis
++ Add an application-specified IE to a management frame. The maximum length is
++ 76 bytes. Including the length and the element ID, this translates to 78 bytes.
++
++Command
++ wmiconfig --setappie <frame> <IE>, where:
++
++ frame
++ One of beacon, probe, respon, assoc
++
++ IE
++ A hex string beginning with DD (if = 0, no
++ IE is sent in the management frame)
++
++Command Parameters
++ mgmtFrmType;
++ A WMI_MGMT_FRAME_TYPE
++
++ ieLen;
++ Length of the IE to add to the GMT frame
++
++Command Values
++ None
++
++Reset Value
++ None defined
++
++Restrictions
++ Supported only for the probe request and association request management frame
++types. Also, only one IE can be added per management frame type.
++
++=====================================================================
++
++
++Name
++ SET_ASSOC_INFO
++
++Synopsis
++ The host uses this command to specify any information elements (IEs) it wishes the
++ AR6000 device to add to all future association and reassociation requests. IEs must be
++ correct and are used as is by the device. IEs specified through this command are
++ cleared with a DISCONNECT.
++
++Command
++ wmiconfig eth1 --setAssocIe <IE>
++
++Command Parameters
++ UINT8 ieType Used directly in 802.11 frames
++ UINT8 bufferSize Size of assocInfo (in bytes) ranging from
++ 0–240. If = 0, previously set IEs are cleared.
++ UINT8 assocInfo[bufferSize] Used directly in 802.11 frames
++
++Command Values
++ None
++
++Reset Values
++ IEs are cleared
++
++Restrictions
++ This command can only be issued in the DISCONNECTED state
++
++=====================================================================
++
++
++Name
++ SET_AUTHMODE
++
++Synopsis
++ Sets the 802.11 authentication mode of reconnection
++
++Command
++ wmiconfig eth1 --setauthmode <mode>
++
++Command Parameters
++ UINT8 mode
++
++Command Values
++ mode = 0x00 Proceed with authentication during reconnect
++ = 0x01 Do not proceed with authentication during reconnect
++
++Reset Values
++ Authentication
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_BEACON_INT
++
++Synopsis
++ Sets the beacon interval for an ad hoc network. Beacon interval selection may have an
++ impact on power savings. To some degree, a longer interval reduces power
++ consumption but also decreases throughput. A thorough understanding of IEEE
++ 802.11 ad hoc networks is required to use this command effectively.
++
++Command
++ wmiconfig eth1 --ibssconintv
++
++Command Parameters
++ UINT16 beaconInterval Specifies the beacon interval in TU units (1024 ms)
++
++Command Values
++ None
++
++Reset Values
++ The default beacon interval is 100 TUs (102.4 ms)
++
++Restrictions
++ This command can only be issued before the AR6000 device starts an ad hoc network
++
++See Also
++ “SET_IBSS_PM_CAPS”
++
++=====================================================================
++
++
++Name
++ SET_BIT_RATE
++
++Synopsis
++ The host uses this command to set the AR6000 device to a specific fixed rate.
++
++Command
++ wmiconfig eth1 --setfixrates <rate_0> ... <rate_n>
++
++Command Parameters
++ INT8 rateIndex
++ A WMI_BIT_RATE value
++ {
++ RATE_AUTO = -1
++ RATE_1Mb = 0
++ RATE_2Mb = 1
++ RATE_5_5M = 2
++ RATE_11Mb = 3
++ RATE_6Mb = 4
++ RATE_9Mb = 5
++ RATE_12Mb = 6
++ RATE_18Mb = 7
++ RATE_24Mb = 8
++ RATE_36Mb = 9
++ RATE_48Mb = 10
++ RATE_54Mb = 11
++ } WMI_BIT_RATE
++
++
++Command Values
++ See command parameters
++
++Reset Values
++ The dynamic rate is determined by the AR6000 device
++
++Restrictions
++ This command is intended for use only during development/debug; it is not
++intended for use in production
++
++See Also
++ “GET_BIT_RATE”
++
++=====================================================================
++
++
++Name
++ SET_BMISS_TIME
++
++Synopsis
++ This command sets the beacon miss (BMISS) time, which the AR6000 hardware use
++ to recognize missed beacons. When an excessive number (15) of consecutive beacons
++ are missed, the AR6000 consider switching to a different BSS. The time can be
++ specified in number of beacons or in TUs.
++
++Command(s)
++ wmiconfig eth1 --setbmissbeacons=<val>
++ wmiconfig eth1 --setbmisstime=<val>
++
++Command Parameters
++ UINT16 bmissTime Specifies the beacon miss time
++ [1000...5000] in TUs (1024 ms)
++ UINT16 bmissbeacons Specifies the number of beacons [5...50]
++
++Command Values
++ None
++
++Reset Values
++ bmissTime is 1500 TUs (1536 ms)
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_BSS_FILTER
++
++Synopsis
++ The host uses this to inform the AR6000 device of the types of networks about which
++ it wants to receive information from the “BSSINFO” event. As the device performs
++ either foreground or background scans, it applies the filter and sends “BSSINFO”
++ events only for the networks that pass the filter. If any of the bssFilter or the ieMask
++ filter matches, a BSS Info is sent to the host. The ieMask currently is used as a match
++ for the IEs in the beacons, probe reponses and channel switch action management
++ frame. See also “Scan and Roam” on page C-1.
++
++ The BSS filter command has been enhanced to support IE based filtering. The IEs can
++ be specified as a bitmask through this command using this enum.
++
++Command
++ wmiconfig eth1 –filter = <filter> --ieMask 0x<mask>
++
++Command Parameters
++ UINT8 BssFilter
++
++ Command Values
++ typedef struct {
++ A_UINT8 bssFilter; See WMI_BSS_FILTER
++ A_UINT32 ieMask;
++ } __ATTRIB_PACK WMI_BSS_FILTER_CMD;
++
++ The ieMask can take this combination of values:
++
++ enum {
++ BSS_ELEMID_CHANSWITCH = 0x01
++ BSS_ELEMID_ATHEROS = 0x02,
++ }
++
++Reply Value
++ None
++
++Reset Value
++ BssFilter = NONE_BSS_FILTER (0)
++
++Restrictions
++ None
++
++See Also
++ “CONNECT_CMD”
++
++=====================================================================
++
++
++Name
++ SET_BT_PARAMS
++
++Synopsis
++ This command is used to set the status of a Bluetooth stream or set Bluetooth
++ coexistence register parameters. The stream may be an SCO or an A2DP stream and
++ its status can be started/stopped/suspended/resumed.
++
++Command
++ wmiconfig –setBTparams <paramType> <params>
++
++Command Parameters
++ struct {
++ union {
++ BT_PARAMS_SCO scoParams;
++ BT_PARAMS_A2DP a2dpParams;
++ BT_PARAMS_MISC miscParams;
++ BT_COEX_REGS regs;
++ } info;
++ A_UINT8 paramType;
++ struct {
++ A_UINT8 noSCOPkts; Number of SCO packets between consecutive PS-POLLs
++ A_UINT8 pspollTimeout;
++ A_UINT8 stompbt;
++ } BT_PARAMS_SCO;
++ struct {
++ A2DP BT stream parameters
++ A_UINT32 period;
++ A_UINT32 dutycycle;
++ A_UINT8 stompbt;
++ } BT_PARAMS_A2DP;
++ struct {
++ union {
++ WLAN_PROTECT_POLICY_TYPE protectParams;
++ A_UINT16 wlanCtrlFlags;
++ }info;
++ A_UINT8 paramType;
++ } BT_PARAMS_MISC;
++ struct {
++ BT coexistence registers values
++ A_UINT32 mode; Coexistence mode
++ A_UINT32 scoWghts; WLAN and BT weights
++ A_UINT32 a2dpWghts;
++ A_UINT32 genWghts;
++ A_UINT32 mode2; Coexistence mode2
++ A_UINT8 setVal;
++ } BT_COEX_REGS;
++
++Command Values
++ None defined
++
++Reset Value
++ None
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_BT_STATUS
++
++Synopsis
++ Sets the status of a Bluetooth stream. The stream may be a SCO or an A2DP stream
++ and its status can be started/stopped/suspended/resumed.
++
++Command
++ wmiconfig –setBTstatus <streamType> <status>
++
++Command Parameters
++ {
++ A_UINT8 streamType; Stream type
++ A_UINT8 status; Stream status
++ }WMI_SET_BT_STATUS_CMD;
++
++Command Values
++ {
++ BT_STREAM_UNDEF = 0
++ BT_STREAM_SCO
++ SCO stream
++ BT_STREAM_A2DP
++ A2DP stream
++ BT_STREAM_MAX
++ } BT_STREAM_TYPE;
++
++ {
++ BT_STATUS_UNDEF = 0
++ BT_STATUS_START
++ BT_STATUS_STOP
++ BT_STATUS_RESUME
++ BT_STATUS_SUSPEND
++ BT_STATUS_MAX
++ } BT_STREAM_STATUS;
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_CHANNEL_PARAMETERS
++
++Synopsis
++ Configures various WLAN parameters related to channels, sets the wireless mode,
++ and can restrict the AR6000 device to a subset of available channels. The list of
++ available channels varies depending on the wireless mode and the regulatory
++ domain. The device never operates on a channel outside of its regulatory domain. The
++ device starts to scan the list of channels right after this command.
++
++Command
++ wmiconfig eth1 --wmode <mode> <list>
++
++Command Parameters
++ UINT8 phyMode See Values below.
++ UINT8 numberOfChannels
++ Number of channels in the channel array that
++ follows. If = 0, then the device uses all of the
++ channels permitted by the regulatory domain
++ and by the specified phyMode.
++ UINT16 channel[numberOfChannels]
++ Array listing the subset of channels (expressed
++ as frequencies in MHz) the host wants the
++ device to use. Any channel not permitted by
++ the specified phyMode or by the specified
++ regulatory domain is ignored by the device.
++
++Command Values
++ phyMode = {
++ Wireless mode
++ 11a = 0x01
++ 11g = 0x02
++ 11ag = 0x03
++ 11b = 0x04
++ 11g only = 0x05
++ }
++
++Reset Values
++ phyMode
++ 11ag
++ 802.11a/g modules
++ 11g
++ 802.11g module
++ channels
++ Defaults to all channels permitted by the
++ current regulatory domain.
++
++Restrictions
++ This command, if issued, should be issued soon after reset and prior to the first
++ connection. This command should only be issued in the DISCONNECTED state.
++
++=====================================================================
++
++
++Name
++ SET_DISC_TIMEOUT
++
++Synopsis
++ The host uses this command to configure the amount of time that the AR6000 should
++ spend when it attempts to reestablish a connection after losing link with its current
++ BSS. If this time limit is exceeded, the AR6000 send a “DISCONNECT” event. After
++ sending the “DISCONNECT” event the AR6000 continues to attempt to reestablish a
++ connection, but they do so at the interval corresponding to a foreground scan as
++ established by the “SET_SCAN_PARAMS” command.
++
++ A timeout value of 0 indicates that the AR6000 will disable all autonomous roaming,
++ so that the AR6000 will not perform any scans after sending a “DISCONNECT”
++ event to the host. The state is maintained until a shutdown or host sets different
++ timeout value from 0.
++
++Command
++ wmiconfig eth1 --disc=<timeout in seconds>
++
++Command Parameters
++ UINT8 disconnectTimeout
++ Specifies the time limit (in seconds) after
++ which a failure to reestablish a connection
++ results in a “DISCONNECT” event
++
++Command Values
++ None
++
++Reset Values
++ disconnectTimeout is 10 seconds
++
++Restrictions
++ This command can only be issued while in a DISCONNECTED state
++
++=====================================================================
++
++
++Name
++ SET_FIXRATES
++
++Synopsis
++ By default, the AR6000 device uses all PHY rates based on mode of operation. If the
++ host application requires the device to use subset of supported rates, it can set those
++ rates with this command. In 802.11g mode, the AR6000 device takes the entire
++ 802.11g basic rate set and the rates specified with this command and uses it as the
++ supported rate set.
++
++ This rate set is advertised in the probe request and the assoc/re-assoc request as
++ supported rates. Upon successful association, the device modifies the rate set pool
++ using the: intersection of AP-supported rates with the union of the 802.11g basic rate
++ set and rates set using this command. The device picks transmission rates from this
++ pool based on a rate control algorithm.
++
++Command
++ TBD
++
++Command Parameters
++ A_UINT16 fixRateMask;
++ The individual bit is an index for rate table,
++ and setting the that index to 1 would set that
++ corresponding rate. E.g., fixRateMask = 9
++ (1001) sets 1 Mbps and 11 Mbps.
++
++Command Values
++ None
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++See Also
++ “GET_FIXRATES”
++
++=====================================================================
++
++
++Name
++ SET_WHAL_PARAM
++
++Synopsis
++ An internal AR6000 command that is used to set certain hardware parameters. The
++ description of this command is in $WORKAREA/include/halapi.h.
++
++Command
++ TBD
++
++Command Parameters
++ ATH_HAL_SETCABTO_CMDID
++ Sets the timeout waiting for the multicast
++ traffic after a DTIM beacon (in TUs).
++
++Command Values
++ None
++
++Reset Value
++ Default = 10 TUs
++
++Restrictions
++ This command should be executed before issuing a connect command.
++
++=====================================================================
++
++
++Name
++ SET_HOST_SLEEP_MODE
++
++Synopsis
++ The host uses this command to set the host mode to asleep or awake. All packets are
++ delivered to the host when the host mode is awake. When host mode is asleep, only if
++ WoW is enabled and the incoming packet matches one of the specified WoW
++ patterns, will the packet be delivered to the host. The host will also be woken up by
++ the target for pattern-matching packets and important events.
++
++Command
++ wmiconfig –sethostmode=<asleep/awake>
++
++Command Parameters
++ A_BOOL awake Set the host mode to awake
++ A_BOOL asleep Set the host mode to asleep
++
++Command Values
++ 1 = awake, 0 = asleep
++
++Reset Value
++ None defined (default host mode is awake)
++
++Restrictions
++ None
++
++
++=====================================================================
++
++Name
++ SET_IBSS_PM_CAPS
++
++Synopsis
++ Used to support a non-standard power management scheme for an ad hoc wireless
++ network consisting of up to eight stations (STAs) that support this form of power
++ saving (e.g., Atheros-based STAs). A thorough understanding of IEEE 802.11 ad hoc
++ networks is required to use this command effectively.
++
++Command
++ wmiconfig eth1 --ibsspmcaps --ps=<enable/disable>
++ --aw=<ATIM Windows in ms>
++ --ttl=<Time to live in number of beacon periods>
++ --to=<timeout in ms>
++
++Command Parameters
++ UINT8 power_saving
++ = 0
++ The non-standard power saving scheme is
++ disabled and maximum throughput (with no
++ power saving) is obtained.
++
++ = 1
++ Ad hoc power saving scheme is enabled (but
++ throughput may be decreased)
++
++ UINT16 atim_windows
++ Specifies the length (in ms) of the ad hoc traffic
++ indication message (ATIM) windows used in an ad
++ hoc network. All Atheros-based STAs that join the
++ network use this duration ATIM window.
++
++ The duration is communicated between wireless
++ STAs through an IE in beacons and probe responses.
++
++ The host sets atim_windows to control trade-offs
++ between power use and throughput. The value
++ chosen should be based on the beacon interval (see
++ the “SET_BEACON_INT” command) on the
++ expected number of STAs in the IBSS, and on the
++ amount of traffic and traffic patterns between STAs.
++
++ UINT16 timeout_value
++ Specifies the timeout (in ms). The value is the same
++ for all ad hoc connections, but tracks separately for
++ each.
++
++ Applicable only for a beacon period and used to
++ derive actual timeout values on the Tx and Rx sides.
++ On the Tx side, the value defines a window during
++ which the STA accepts the frame(s) from the host for a
++ particular connection. Until closed, the window
++ restarts with every frame received from the host. On
++ the Rx side, indicates the time until which the STA
++ continues accepting frames from a particular
++ connection. The value resets with every frame
++ received. The value can be used to determine the
++ trade off between throughput and power.
++ Default = 10 ms
++
++ UINT8 ttl
++ Specifies the value in number of beacon periods. The
++ value is used to set a limit on the time until which a
++ frame is kept alive in the AR6001 before being
++ discarded. Default = 5
++
++Command Values
++ None
++
++Reset Values
++ By default, power_saving is enabled with atim_window = 20 ms
++
++Restrictions
++ Can only be issued before the AR6000 starts an ad hoc network
++
++See Also
++ “SET_BEACON_INT”
++
++=====================================================================
++
++
++
++Name
++ SET_LISTEN_INT
++
++Synopsis
++ The host uses this command to request a listen interval, which determines how often
++ the AR6000 device should wake up and listen for traffic. The listen interval can be set
++ by the TUs or by the number of beacons. The device may not be able to comply with
++ the request (e.g., if the beacon interval is greater than the requested listen interval, the
++ device sets the listen interval to the beacon interval). The actual listen interval used
++ by the device is available in the “CONNECT” event.
++
++Command
++ wmiconfig eth1 --listen=<#of TUs, can range from 15 to 3000>
++
++ --listenbeacons=<#of beacons, can range from 1 to 50>
++
++Command Parameters
++ UINT16 listenInterval
++ Specifies the listen interval in Kms
++ (1024 ms), ranging from 100 to 1000
++
++ UINT16 listenbeacons
++ Specifies the listen interval in beacons,
++ ranging from 1 to 50
++
++Command Values
++ None
++
++Reset Values
++ The device sets the listen interval equal to the beacon interval of the AP it associates
++ to.
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_LPREAMBLE
++
++Synopsis
++ Overrides the short preamble capability of the AR6000 device
++
++Command
++ TBD
++
++Command Parameters
++ WMI_LPREAMBLE_DISABLED
++ The device is short-preamble capable
++
++ WMI_LPREAMBLE_ENABLED
++ The device supports only the long-
++ preamble mode
++
++Command Values
++ None
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++
++=====================================================================
++
++Name
++ SET_MAX_SP_LEN
++
++Synopsis
++ Set the maximum service period; indicates the number of packets the AR6001 can
++ receive from the AP when triggered
++
++Command
++ wmiconfig eth1 --setMaxSPLength <maxSPLen>
++
++Command Parameters
++ UINT8 maxSPLen
++ An APSD_SP_LEN_TYPE value
++
++Command Values
++ {
++ DELIVER_ALL_PKT = 0x0
++ DELIVER_2_PKT = 0x1
++ DELIVER_4_PKT = 0x2
++ DELIVER_6_PKT = 0x3
++ }APSD_SP_LEN_TYPE
++
++
++Reset Values
++ maxSPLen is DELIVER_ALL_PKT
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_OPT_MODE
++
++Synopsis
++ Special feature, sets the special mode on/off
++
++Command
++ wmiconfig eth1 --mode <mode>
++ Set the optional mode, where mode is special or off
++
++Command Parameters
++ enum {
++ SPECIAL_OFF
++ SPECIAL_ON
++ } OPT_MODE_TYPE;
++
++Command Values
++
++Reset Value
++ Mode = Off
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_PMKID
++
++Synopsis
++ The host uses this command to enable or disable a pairwise master key ID (PMKID)
++ in the AR6000 PMKID cache. The AR6000 clears its PMKID cache on receipt of a
++ DISCONNECT command from the host. Individual entries in the cache might be
++ deleted as the AR6000 detect new APs and decides to remove old ones.
++
++Command
++ wmiconfig eth1 --setbsspmkid --bssid=<aabbccddeeff>
++ --bsspmkid=<pmkid>
++
++Command Parameters
++ UINT8 bssid[6]
++ The MAC address of the AP that the
++ PMKID corresponds to (6 bytes in hex
++ format)
++
++ UINT8 enable
++ Either PMKID_DISABLE (0) to disable
++ the PMKID or PMKID_ENABLE (1) to
++ enable it (16 bytes in hex format)
++
++ UINT8 pmkid[16]
++ Meaningful only if enable is
++ PMKID_ENABLE, when it is the PMKID
++ that the AR6000 should use on the next
++ reassociation with the specified AP
++
++Command Values
++ enable
++ = 0 (disable), 1 (enable)
++ PKMID enabled/disabled
++
++Reset Values
++ None defined
++
++Restrictions
++ Only supported in infrastructure networks
++
++=====================================================================
++
++
++Name
++ SET_PMKID_LIST_CMD
++
++Synopsis
++ Configures the list of PMKIDs on the firmware.
++
++Command
++ wmiconfig --setpmkidlist --numpmkid=<n> --pmkid=<pmkid_1>
++ ... --pmkid=<pmkid_n>
++
++ Where n is the number of pmkids (maximum = 8) and pmkid_i is the ith pmkid (16
++ bytes in hex format)
++
++Command Parameters
++ {
++ A_UINT8 pmkid[WMI_PMKID_LEN];
++ } __ATTRIB_PACK WMI_PMKID;
++
++ {
++ A_UINT32 numPMKID;
++ WMI_PMKID pmkidList[WMI_MAX_PMKID_CACHE];
++ } __ATTRIB_PACK WMI_SET_PMKID_LIST_CMD;
++
++Command Values
++ None
++
++Reset Values
++ None
++
++Restrictions
++ Supported only in infrastructure modes
++
++=====================================================================
++
++
++Name
++ SET_POWER_MODE
++
++Synopsis
++ The host uses this command to provide the AR6000 device with guidelines on the
++ desired trade-off between power utilization and performance.
++
++ In normal power mode, the device enters a sleep state if they have nothing to do,
++ which conserves power but may cost performance as it can take up to 2 ms to
++ resume operation after leaving sleep state.
++
++ In maximum performance mode, the device never enters sleep state, thus no time
++ is spent waking up, resulting in higher power consumption and better
++ performance.
++
++Command
++ TBD
++
++Command Parameters
++ UINT8 powerMode
++ WMI_POWER_MODE value
++ {
++ REC_POWER = 1
++ (Recommended setting) Tries to conserve
++ power without sacrificing performance
++ MAX_PERF_POWER = 2
++ Setting that maximizes performance at
++ the expense of power
++
++ All other values are reserved
++ } WMI_POWER_MODE
++
++Command Values
++ See command parameters
++
++Reset Values
++ powerMode is REC_POWER
++
++Restrictions
++ This command should only be issued in the DISCONNECTED state for the
++ infrastructure network.
++
++ For a PM-disabled ad hoc network, the power mode should remain in
++ MAX_PERF_POWER.
++
++ For a PM-enabled ad hoc network, the device can have REC_POWER or
++ MAX_PERF_POWER set, but either way it must follow the power save ad hoc
++ protocol. The host can change power modes in the CONNECTED state.
++
++ Host changes to the PS setting when the STA is off the home channel take no effect
++ and cause a TARGET_PM_FAIL event.
++
++=====================================================================
++
++
++Name
++ SET_POWER_PARAMS
++
++Synopsis
++ The host uses this command to configure power parameters
++
++Command
++ wmiconfig eth1 --pmparams --it=<ms> --np=<number of PS POLL>
++ --dp=<DTIM policy: ignore/normal/stick>
++
++Command Parameters
++ UINT16 idle_period
++ Length of time (in ms) the AR6000 device
++ remains awake after frame Rx/Tx before going
++ to SLEEP state
++
++ UINT16 pspoll_number
++ The number of PowerSavePoll (PS-poll)
++ messages the device should send before
++ notifying the AP it is awake
++
++ UINT16 dtim_policy
++ A WMI_POWER_PARAMS_CMD value
++
++ {
++ IGNORE_DTIM =1
++ The device does not listen to any content after
++ beacon (CAB) traffic
++ NORMAL_DTIM = 2
++ DTIM period follows the listen interval (e.g., if
++ the listen interval is 4 and the DTIM period is 2,
++ the device wakes up every fourth beacon)
++ STICK_DTIM = 3
++ Device attempt to receive all CAB traffic (e.g., if
++ the DTIM period is 2 and the listen interval is 4,
++ the device wakes up every second beacon)
++ } WMI_POWER_PARAMS_CMD
++
++Command Parameters
++ See command parameters
++
++Reset Values
++ idle_period
++ 200 ms
++
++ pspoll_number
++ = 1
++
++ dtim_policy
++ = NORMAL_DTIM
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_POWERSAVE_PARAMS
++
++Synopsis
++ Set the two AR6000 power save timers (PS-POLL timer and APSD trigger timer) and
++ the two ASPD TIM policies
++
++Command
++ wmiconfig eth1--psparams --psPollTimer=<psPollTimeout in ms>
++ --triggerTimer=<triggerTimeout in ms> --apsdTimPolicy=<ignore/
++ adhere> --simulatedAPSDTimPolicy=<ignore/adhere>
++
++Command Parameters
++ typedef struct {
++ A_UINT16 psPollTimeout;
++ Timeout (in ms) after sending PS-POLL; the
++ AR6000 device sleeps if it does not receive a
++ data packet from the AP
++
++ A_UINT16 triggerTimeout;
++ Timeout (in ms) after sending a trigger; the
++ device sleeps if it does not receive any data
++ or null frame from the AP
++
++ APSD_TIM_POLICY apsdTimPolicy;
++ TIM behavior with queue APSD enabled
++
++ APSD_TIM_POLICY simulatedAPSD
++
++ TimPolicy;
++ TIM behavior with simulated APSD
++ enabled
++
++ typedef enum {
++ IGNORE_TIM_ALL_QUEUES_APSD = 0,
++ PROCESS_TIM_ALL_QUEUES_APSD = 1,
++ IGNORE_TIM_SIMULATED_APSD = 2,
++ POWERSAVE_TIMERS_POLICY = 3,
++ } APSD_TIM_POLICY;
++
++Command Values
++ None
++
++Reset Values
++ psPollTimeout is 50 ms; triggerTimeout is 10 ms;
++ apsdTimPolicy = IGNORE_TIM_ALL_QUEUES_APSD;
++ simulatedAPSDTimPolicy = POWERSAVE_TIMERS_POLICY
++
++Restrictions
++ When this command is used, all parameters must be set; this command does not
++ allow setting only one parameter.
++
++=====================================================================
++
++
++Name
++ SET_PROBED_SSID
++
++Synopsis
++ The host uses this command to provide a list of up to MAX_PROBED_SSID_INDEX
++ (six) SSIDs that the AR6000 device should actively look for. It lists the active SSID
++ table. By default, the device actively looks for only the SSID specified in the
++ “CONNECT_CMD” command, and only when the regulatory domain allows active
++ probing. With this command, specified SSIDs are probed for, even if they are hidden.
++
++Command
++ wmiconfig eth1 --ssid=<ssid> [--num=<index>]
++
++Command Parameters
++ {
++ A_UINT8 numSsids
++ A number from 0 to
++ MAX_PROBED_SSID_INDEX indicating
++ the active SSID table entry index for this
++ command (if the specified entry index
++ already has an SSID, the SSID specified in
++ this command replaces it)
++
++ WMI_PROBED_SSID_INFO probedSSID[1]
++ } WMI_PROBED_SSID_CMD
++
++ {
++ A_UINT8 flag
++ WMI_SSID_FLAG indicates the current
++ entry in the active SSID table
++ A_UINT8 ssidLength
++ Length of the specified SSID in bytes.
++ If = 0, the entry corresponding to the
++ index is erased
++ A_UINT8 ssid[32]
++ SSID string actively probed for when
++ permitted by the regulatory domain
++ } WMI_PROBED_SSID_INFO
++
++Command Values
++ WMI_SSID_FLAG
++ {
++ DISABLE_SSID_FLAG = 0
++ Disables entry
++ SPECIFIC_SSID_FLAG = 1
++ Probes specified SSID
++ ANY_SSID_FLAG = 2
++ Probes for any SSID
++ } WMI_SSID_FLAG
++
++Reset Value
++ The entries are unused.
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_REASSOC_MODE
++
++Synopsis
++ Specify whether the disassociated frame should be sent or not upon reassociation.
++
++Command
++ wmiconfig eth1 --setreassocmode <mode>
++
++Command Parameters
++ UINT8 mode
++
++Command Values
++ mode
++ = 0x00
++ Send disassoc to a previously connected AP
++ upon reassociation
++ = 0x01
++ Do not send disassoc to previously connected
++ AP upon reassociation
++
++Reset Values
++ None defined
++
++Restrictions
++ None
++
++
++=====================================================================
++
++Name
++ SET_RETRY_LIMITS
++
++Synopsis
++ Allows the host to influence the number of times that the AR6000 device should
++ attempt to send a frame before they give up.
++
++Command
++ wmiconfig --setretrylimits <frameType> <trafficClass> <maxRetries>
++ <enableNotify>
++
++Command Parameters
++ {
++ UINT8 frameType
++ A WMI_FRAMETYPE specifying
++ which type of frame is of interest.
++ UINT8 trafficClass
++ Specifies a traffic class (see
++ “CREATE_PSTREAM”). This
++ parameter is only significant when
++ frameType = DATA_FRAMETYPE.
++ UINT8 maxRetries
++ Maximum number of times the
++ device attempts to retry a frame Tx,
++ ranging from WMI_MIN_RETRIES
++ (2) to WMI_MAX_RETRIES (15). If
++ the special value 0 is used,
++ maxRetries is set to 15.
++ A_UINT8 enableNotify
++ Notify when enabled
++ } WMI_RETRY_LIMIT_INFO
++
++ {
++ A_UINT8 numEntries
++ WMI_RETRY_LIMIT_INFO retryLimitInfo[1]
++ } WMI_SET_RETRY_LIMITS_CMD
++
++Command Values
++ {
++ MGMT_FRAMETYPE = 0 Management frame
++ CONTROL_FRAMETYPE = 1 Control frame
++ DATA_FRAMETYPE = 2 Data frame
++ } WMI_FRAMETYPE
++
++Reset Values
++ Retries are set to 15
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_ROAM_CTRL
++
++Synopsis
++ Affects how the AR6000 device selects a BSS. The host uses this command to set and
++ enable low RSSI scan parameters. The time period of low RSSI background scan is
++ mentioned in scan period. Low RSSI scan is triggered when the current RSSI
++ threshold (75% of current RSSI) is equal to or less than scan threshold.
++
++ Low RSSI roam is triggered when the current RSSI threshold falls below the roam
++ threshold and roams to a better AP by the end of the scan cycle. During Low RSSI
++ roam, if the STA finds a new AP with an RSSI greater than roam RSSI to floor, during
++ scan, it roams immediately to it instead of waiting for the end of the scan cycle. See
++ also “Scan and Roam” on page C-1.
++
++Command
++ wmiconfig --roam <roamctrl> <info>, where info is <scan period>
++ <scan threshold> <roam threshold> <roam rssi floor>
++
++Command Parameters
++ A_UINT8 roamCtrlType;
++
++Command Values
++ WMI_FORCE_ROAM = 1
++ Roam to the specified BSSID
++
++ WMI_SET_ROAM_MODE = 2
++ Default, progd bias, no roam
++
++ WMI_SET_HOST_BIAS = 3
++ Set the host bias
++
++ WMI_SET_LOWRSSI_SCAN_PARAMS = 4
++ Info parameters
++
++ A_UINT8 bssid[ATH_MAC_LEN];
++ WMI_FORCE_ROAM
++
++ A_UINT8 roamMode;
++ WMI_SET_ROAM_MODE
++
++ A_UINT8 bssBiasInfo;
++ WMI_SET_HOST_BIAS
++
++ A_UINT16 lowrssi_scan_period;
++ WMI_SET_LOWRSSI_SCAN_PARAMS
++
++ A_INT16
++ lowrssi_scan_threshold;
++ WMI_SET_LOWRSSI_SCAN_PARAMS
++
++ A_INT16 lowrssi_roam_threshold;
++ WMI_SET_LOWRSSI_SCAN_PARAMS
++
++ A_UINT8 roam_rssi_floor;
++ WMI_SET_LOWRSSI_SCAN_PARAMS
++
++Reset Value
++ None defined (default lowrssi scan is disabled. Enabled only when scan period is set.)
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_RTS
++
++Synopsis
++ Decides when RTS should be sent.
++
++Command
++ wmiconfig eth1 --setRTS <pkt length threshold>
++
++Command Parameters
++ A_UINT16
++ threshold;
++ Command parameter threshold in bytes. An RTS is
++ sent if the data length is more than this threshold.
++ The default is to NOT send RTS.
++
++Command Values
++ None
++
++Reset Value
++ Not to send RTS.
++
++Restrictions
++ None
++
++
++=====================================================================
++
++Name
++ SET_SCAN_PARAMS
++
++Synopsis
++ The host uses this command to set the AR6000 scan parameters, including the duty
++ cycle for both foreground and background scanning. Foreground scanning takes
++ place when the AR6000 device is not connected, and discovers all available wireless
++ networks to find the best BSS to join. Background scanning takes place when the
++ device is already connected to a network and scans for potential roaming candidates
++ and maintains them in order of best to worst. A second priority of background
++ scanning is to find new wireless networks.
++
++ The device initiates a scan when necessary. For example, a foreground scan is always
++ started on receipt of a “CONNECT_CMD” command or when the device cannot find
++ a BSS to connect to. Foreground scanning is disabled by default until receipt of a
++ CONNECT command. Background scanning is enabled by default and occurs every
++ 60 seconds after the device is connected.
++
++ The device implements a binary backoff interval for foreground scanning when it
++ enters the DISCONNECTED state after losing connectivity with an AP or when a
++ CONNECT command is received. The first interval is ForegroundScanStartPeriod,
++ which doubles after each scan until the interval reaches ForegroundScanEndPeriod.
++ If the host terminates a connection with DISCONNECT, the foreground scan period
++ is ForegroundScanEndPeriod. All scan intervals are measured from the time a full
++ scan ends to the time the next full scan starts. The host starts a scan by issuing a
++ “START_SCAN” command. See also “Scan and Roam” on page C-1.
++
++Command
++ wmiconfig eth1 --scan --fgstart=<sec> --fgend=<sec> --bg=<sec> --
++ act=<msec> --pas=<msec> --sr=<short scan ratio> --scanctrlflags
++ <connScan> <scanConnected> <activeScan> <reportBSSINFO>
++
++Command Parameters
++ UINT16 fgStartPeriod
++ First interval used by the device when it
++ disconnects from an AP or receives a
++ CONNECT command, specified in seconds (0–
++ 65535). If = 0, the device uses the reset value.
++ If = 65535, the device disables foreground
++ scanning.
++
++ UINT16 fgEndPeriod
++ The maximum interval the device waits between
++ foreground scans specified in seconds (from
++ ForegroundScanStartPeriod to 65535). If = 0, the
++ device uses the reset value.
++
++ UINT16 bgScanPeriod
++ The period of background scan specified in
++ seconds (0–65535). By default, it is set to the reset
++ value of 60 seconds. If 0 or 65535 is specified, the
++ device disables background scanning.
++
++ UINT16 maxactChDwellTime
++ The period of time the device stays on a
++ particular channel while active scanning. It is
++ specified in ms (10–65535). If the special value of
++ 0 is specified, the device uses the reset value.
++
++ UINT16 PasChDwellTime
++ The period of time the device remains on a
++ particular channel while passive scanning. It is
++ specified in ms (10–65535). If the special value of
++ 0 is specified, the device uses the reset value.
++
++ UINT8 shortScanRatio
++ Number of short scans to perform for each
++ long scan.
++
++ UINT8 scanCtrlFlasgs
++
++ UINT16 minactChDwellTime
++ Specified in ms
++
++ UINT32 maxDFSchActTime
++ The maximum time a DFS channel can stay
++ active before being marked passive, specified in
++ ms.
++
++Command Values
++ None
++
++Reset Values
++ ForegroundScanStart
++Period
++ 1 sec
++
++ ForegroundScanEndPeriod
++ 60 sec
++
++ BackgroundScanPeriod
++ 60 sec
++
++ ActiveChannelDwellTime
++ 105 ms
++
++=====================================================================
++
++
++Name
++ SET_TKIP_COUNTERMEASURES
++
++Synopsis
++ The host issues this command to tell the target whether to enable or disable TKIP
++ countermeasures.
++
++Command
++ TBD
++
++Command Parameters
++ UINT8 WMI_TKIP_CM_ENABLE
++ Enables the countermeasures
++
++
++ UINT8 TKIP_CM_DISABLE
++ Disables the countermeasures
++
++Command Values
++ None
++
++Reset Values
++ By default, TKIP MIC reporting is disabled
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_TX_PWR
++
++Synopsis
++ The host uses this command to specify the Tx power level of the AR6000. Cannot be
++ used to exceed the power limit permitted by the regulatory domain. The maximum
++ output power is limited in the chip to 31.5 dBm; the range is 0 – 31.5 dbm.
++
++Command
++ wmiconfig --power <dbM>
++
++Command Parameters
++ UINT8 dbM
++ The desired Tx power specified in dbM.
++ If = 0, the device chooses the maximum
++ permitted by the regulatory domain.
++
++Command Values
++ None
++
++Reset Values
++ The maximum permitted by the regulatory domain
++
++Restrictions
++ None
++
++See Also
++ “GET_TX_PWR”
++
++
++=====================================================================
++
++Name
++ SET_VOICE_PKT_SIZE
++
++Synopsis
++ If an AP does not support WMM, it has no way to differentiate voice from data.
++ Because the voice packet is typically small, packet in size less than voicePktSize are
++ assumed to be voice, otherwise it is treated as data.
++
++Command
++ wmiconfig eth1 --setVoicePktSize <size-in-bytes>
++
++Command Parameters
++ UINT16 voicePktSize
++ Packet size in octets
++
++Command Values
++ None
++
++Reset Values
++ voicePktSize default is 400 bytes
++
++Restrictions
++ No effect if WMM is unavailable
++
++
++=====================================================================
++
++Name
++ SET_WMM
++
++Synopsis
++ Overrides the AR6000 device WMM capability
++
++Command
++ wmiconfig eth1 --setwmm <enable>
++
++Command Parameters
++ WMI_WMM_ENABLED
++ Enables WMM
++
++ WMI_WMM_DISABLED
++ Disables WMM support
++
++Command Values
++ 0 = disabled
++ 1 = enabled
++
++Reset Value
++ WMM Disabled
++
++Restrictions
++ None
++
++
++=====================================================================
++
++Name
++ SET_WMM_TXOP
++
++Synopsis
++ Configures TxOP Bursting when sending traffic to a WMM capable AP
++
++Command
++ wmiconfig eth1 --txopbursting <burstEnable>
++
++ <burstEnable>
++ = 0
++ Disallow TxOp bursting
++
++ = 1
++ Allow TxOp bursting
++
++Command Parameters
++ txopEnable
++ = WMI_TXOP_DISABLED
++ Disabled
++
++ = WMI_TXOP_ENABLED
++ Enabled
++
++Command Values
++ txopEnable
++ = 0 Disabled
++
++ = 1 Enabled
++
++Reset Value
++ Bursting is off by default
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ SET_WOW_MODE
++
++Synopsis
++ The host uses this command to enable or disable the WoW mode. When WoW mode
++ is enabled and the host is asleep, pattern matching takes place at the target level.
++ Only packets that match any of the pre-specified WoW filter patterns, will be passed
++ up to the host. The host will also be woken up by the target. Packets which do not
++ match any of the WoW patterns are discarded.
++
++Command
++ wmiconfig –setwowmode <enable/disable>
++
++Command Parameters
++ A_BOOL enable_wow
++ Enable or disable WoW:
++
++Command Values
++ = 0
++ Disable WoW
++
++ = 1
++ Enable WoW
++
++Reset Value
++ None defined (default WoW mode is disabled).
++
++Restrictions
++ None
++
++See Also
++ “GET_WOW_LIST”
++
++
++=====================================================================
++
++Name
++ SET_WSC_STATUS
++
++Synopsis
++ The supplicant uses this command to inform the target about the status of the WSC
++ registration protocol. During the WSC registration protocol, a flag is set so the target
++ bypasses some of the checks in the CSERV module. At the end of the registration, this
++ flag is reset.
++
++Command
++ N/A
++
++Command Parameters
++ A_BOOL status
++ = 1 WSC registration in progress
++ = 0 WSC protocol not running
++
++Reply Parameters
++ None
++
++Reset Value
++ None defined (default = 0)
++
++Restrictions
++ None
++
++
++=====================================================================
++
++Name
++ SNR_THRESHOLD_PARAMS
++
++Synopsis
++ Configures how the AR6000 device monitors and reports SNR of the connected BSS,
++ used as a link quality metric.
++
++Command
++ --snrThreshold <weight> <upper_threshold_1> ...
++ <upper_threshold_4> <lower_threshold_1> ... <lower_threshold_4>
++ <pollTimer>
++
++Command Parameters
++ <weight>
++ Share with rssiThreshold. Range in [1, 16], used
++ in the formula to calculate average RSSI
++
++ <upper_threshold_x>
++ Above thresholds expressed in db, in ascending
++ order
++
++ <lower_threshold_x>
++ Below thresholds expressed in db, in ascending
++ order
++
++ <pollTimer>
++ The signal strength sampling frequency in
++ seconds. If polltime = 0, signal strength
++ sampling is disabled
++
++Command Values
++ None
++
++Reset Value
++ None defined
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ START_SCAN
++
++Synopsis
++ The host uses this command to start a long or short channel scan. All future scans are
++ relative to the time the AR6000 device processes this command. The device performs
++ a channel scan on receipt of this command, even if a scan was already in progress.
++ The host uses this command when it wishes to refresh its cached database of wireless
++ networks. The isLegacy field will be removed (0 for now) because it is achieved by
++ setting CONNECT_PROFILE_MATCH_DONE in the CONNECT command. See also
++ “Scan and Roam”
++
++Command
++ wmiconfig eth1 --startscan <scan type> <forcefgscan> 0
++ <homeDwellTime> <forceScanInterval>
++
++Command Parameters
++ UINT8 scanType
++ WMI_SCAN_TYPE
++
++Command Values
++ {
++ WMI_LONG_SCAN =0x0
++ Requests a full scan
++ WMI_SHORT_SCAN =0x1
++ Requests a short scan
++ } WMI_SCAN_TYPE
++
++ A_BOOL forceFgScan
++ forceFgScan
++ = 0
++ Disable the foreground scan
++
++ forceFgScan
++ = 1
++ Forces a foreground scan
++
++ A_UINT32 homeDwellTime
++ Maximum duration in the home
++ channel (in ms)
++
++ A_UINT32 forceScanInterval
++ Time interval between scans (in ms)
++
++ A_UINT32 scanType
++ WMI_SCAN_TYPE
++
++Reset Value
++ Disable forcing foreground scan
++
++Restrictions
++ isLegacy field will no longer be supported (pass as 0 for now)
++
++
++=====================================================================
++
++Name
++ SYNCHRONIZE
++
++Synopsis
++ The host uses this command to force a synchronization point between the command
++ and data paths
++
++Command
++ TBD
++
++Command Parameters
++ None
++
++
++
++Command Values
++ None
++
++
++
++Reset Values
++ None
++
++
++
++Restrictions
++ None
++
++
++=====================================================================
++
++Name
++ TARGET_ERROR_REPORT_BITMASK
++
++Synopsis
++ Allows the host to control “ERROR_REPORT” events from the AR6000 device.
++
++ If error reporting is disabled for an error type, a count of errors of that type is
++ maintained by the device.
++
++ If error reporting is enabled for an error type, an “ERROR_REPORT” event is
++ sent when an error occurs and the error report bit is cleared.
++
++ Error counts for each error type are available through the “GET_TARGET_STATS”
++ command.
++
++Command
++ wmiconfig eth1 --setErrorReportingBitmask
++
++Command Parameters
++ UINT32 bitmask
++ Represents the set of
++ WMI_TARGET_ERROR_VAL error types
++ enabled for reporting
++
++Command Values
++ {
++ WMI_TARGET_PM_ERR_FAIL = 0x00000001
++ Power save fails (only two cases):
++ Retry out of null function/QoS null
++ function to associated AP for PS
++ indication'
++ Host changes the PS setting when
++ STA is off home channel
++
++ WMI_TARGET_KEY_NOT_FOUND = 0x00000002
++ No cipher key
++ WMI_TARGET_DECRYPTION_ERR = 0x00000004
++ Decryption error
++ WMI_TARGET_BMISS = 0x00000008
++ Beacon miss
++ WMI_PSDISABLE_NODE_JOIN = 0x00000010
++ A non-PS-enabled STA joined the
++ PS-enabled network
++ WMI_TARGET_COM_ERR = 0x00000020
++ Host/target communication error
++ WMI_TARGET_FATAL_ERR = 0x00000040
++ Fatal error
++ } WMI_TARGET_ERROR_VAL
++
++Reset Values
++ Bitmask is 0, and all error reporting is disabled
++
++Restrictions
++ None
++
++
++=====================================================================
++WMI Events
++
++Event
++ Description
++ Page
++
++
++BSSINFO
++ Contains information describing BSSs collected during a scan
++
++CAC_EVENTID
++ Indicates signalling events in admission control
++
++CMDERROR
++ The AR6000 device encounters an error while attempting to process
++ a command
++
++CONNECT
++ The device has connected to a wireless network
++
++DISCONNECT
++ The device lost connectivity with a wireless network
++
++ERROR_REPORT
++ An error has occurred for which the host previously requested
++ notification with the command
++ “TARGET_ERROR_REPORT_BITMASK”
++
++EXTENSION
++ WMI extension event
++
++GET_PMKID_LIST_EVENT
++ Created in response to a “GET_PMKID_LIST_CMD” command
++
++GET_WOW_LIST_EVENT
++ Response to the wmiconfig “GET_WOW_LIST” command to
++ retrieve the configured WoW patterns
++
++NEIGHBOR_REPORT
++ Neighbor APs that match the current profile were detected
++
++OPT_RX_FRAME_EVENT
++ (Special feature) informs the host of the reception of a special frame
++
++PSTREAM_TIMEOUT
++ A prioritized stream has been idle for a specified interval
++
++READY
++ The AR6000 device is ready to accept commands
++
++REGDOMAIN
++ The regulatory domain has changed
++
++REPORT_ROAM_DATA_EVENT
++ Reports the roam time calculations made by the device
++ (generated with a special build)
++ —
++
++REPORT_STATISTICS
++ Reply to a “GET_TARGET_STATS” command
++
++ROAM_TBL_EVENT
++ Reports the roam table
++
++RSSI_THRESHOLD
++ Signal strength from the connected AP has crossed the threshold
++ defined in the “RSSI_THRESHOLD_PARAMS” command
++
++SCAN_COMPLETE_EVENT
++ A scan has completed (added status SCAN_ABORTED in release 2.0)
++
++TEST_EVENT
++ Event generated by the TCMD
++
++TKIP_MICERROR
++ TKIP MIC errors were detected
++
++=====================================================================
++
++Name
++ BSSINFO
++
++Synopsis
++ Contains information describing one or more BSSs as collected during a scan.
++ Information includes the BSSID, SSID, RSSI, network type, channel, supported rates,
++ and IEs. BSSINFO events are sent only after the device receives a beacon or probe-
++ response frame that pass the filter specified in the “SET_BSS_FILTER” command.
++ BSSINFO events consist of a small header followed by a copy of the beacon or probe
++ response frame. The 802.11 header is not present. For formats of beacon and probe-
++ response frames please consult the IEEE 802.11 specification.
++
++ The beacons or probe responses containing the IE specified by the
++ WMI_BSS_FILTER_CMD are passed to the host through the
++ WMI_BSSINFO_EVENT. The event carries a 32-bit bitmask that indicates the IEs that
++ were detected in the management frame. The frame type field has been extended to
++ indicate action management frames. This would be helpful to route these frames
++ through the same event mechanism as used by the beacon processing function.
++
++ If the bssFilter in the SET_BSS_FILTER matches, then the ieMask is not relevant
++ because the BSSINFO event is sent to the host. If the bssFilter doesnot match in the
++ beacons/probe respones, then the ieMask match dictates whether the BSSINFO
++ event is sent to the host. In the case of action management frames, the ieMask is the
++ filter that is applied.
++
++Event ID
++ 0x1004
++
++Event Parameters
++ typedef struct {
++ A_UINT16 channel;
++ Specifies the frequency (in MHz) where the
++ frame was received
++ A_UINT8 frameType;
++ A WMI_BI_FTYPE value
++ A_UINT8 snr;
++ A_INT16 rssi;
++ Indicates signal strength
++ A_UINT8 bssid[ATH_MAC_LEN];
++ A_UINT32 ieMask;
++ } _ATTRIB_PACK_WMI_BSS_INFO_HDR;
++
++ Beacon or Probe Response Frame
++
++Event Values
++ {
++ BEACON_FTYPE = 0x1
++ Indicates a beacon frame
++ PROBERESP_FTYPE
++ Indicates a probe response frame
++ ACTION_MGMT_FTYPE
++ } WMI_BI_FTYPE
++
++=====================================================================
++
++Name
++ CAC_EVENTID
++
++Synopsis
++ Indicates signalling events in admission control. Events are generated when
++ admission is accepted, rejected, or deleted by either the host or the AP. If the AP does
++ not respond to an admission request within a timeout of 500 ms, an event is
++ generated to the host.
++
++Event ID
++ 0x1011
++
++Event Parameters
++ UINT8
++ ac
++ Access class pertaining to the
++signalling
++
++ UINT8 cac_indication
++ Type of indication; indications are
++ listed in WMI_CAC_INDICATION
++
++ UINT8 statusCode
++ AP response status code for a
++ request
++
++ UINT8 tspecSuggestion[63]
++ Suggested TSPEC from AP
++
++Event Values
++ {
++ CAC_INDICATION_ADMISSION = 0x00
++ CAC_INDICATION_ADMISSION_RESP = 0x01
++ CAC_INDICATION_DELETE = 0x02
++ CAC_INDICATION_NO_RESP = 0x03
++ } WMI_CAC_INDICATION
++
++
++=====================================================================
++
++
++Name
++ CMDERROR
++
++Synopsis
++ Indicates that the AR6000 device encountered an error while attempting to process a
++ command. This error is fatal and indicates that the device requires a reset.
++
++Event ID
++ 0x1005
++
++Event Parameters
++ UINT16 commandId
++ Corresponds to the command which generated
++ the error
++ UINT8 errorCode
++ A WMI_ERROR_CODE value
++
++Event Values
++ {
++ INVALID_PARAM = 1
++ Invalid parameter
++ ILLEGAL_STATE = 2
++ Illegal state
++ INTERNAL_ERROR = 3
++ Internal Error
++ All other values reserved
++ } WMI_ERROR_CODE
++
++
++=====================================================================
++
++
++Name
++ CONNECT
++
++Synopsis
++ Signals that the AR6000 connected to a wireless network. Connection occurs due to a
++ “CONNECT” command or roaming to a new AP. For infrastructure networks, shows
++ that the AR6000 successfully performed 802.11 authentication and AP association.
++
++Event ID
++ 0x1002
++
++Event Parameters
++ UINT16 channel
++ Channel frequency (in MHz) of the network the
++ AR6000 are connected to
++
++ UINT8 bssid[6]
++ MAC address of the AP the AR6000 are
++ connected to or the BSSID of the ad hoc
++ network
++
++ UINT16 listenInterval
++ Listen interval (in Kms) that the AR6000 are
++ using
++
++ UINT 8 beaconIeLen
++ Length (in bytes) of the beacon IEs
++
++ UINT8 assocInfo
++ Pointer to an array containing beacon IEs,
++ followed first by association request IEs then by
++ association response IEs
++
++ UINT8 assocReqLen
++ Length (in bytes) of the assocReqIEs array
++
++ UINT8 assocRespLen
++ Length (in bytes) of the assocRespIEs array
++
++Event Values
++ None defined
++
++=====================================================================
++
++
++Name
++ DISCONNECT
++
++Synopsis
++ Signals that the AR6000 device lost connectivity with the wireless network.
++ DISCONENCT is generated when the device fails to complete a “CONNECT”
++ command or as a result of a transition from a connected state to disconnected state.
++
++ After sending the “DISCONNECT” event the device continually tries to re-establish
++ a connection. A LOST_LINK occurs when STA cannot receive beacons within the
++ specified time for the SET_BMISS_TIME command.
++
++Event ID
++ 0x1003
++
++Event Parameters
++ UINT8 disconnect
++ Reason
++ A WMI_DISCONNECT_REASON value
++
++ UINT8 bssid[6]
++ Indicates which BSS the device was connected to
++
++ UINT8 assocRespLen
++ Length of the 802.11 association response frame
++ that triggered this event, or 0 if not applicable
++
++ UINT8 assocInfo[assocRespLen]
++ Copy of the 802.11 association response frame
++
++Event Values
++ {
++ NO_NETWORK_AVAIL =0x01
++ Indicates that the device was unable to
++ establish or find the desired network
++ LOST_LINK =0x02
++ Indicates the devices is no longer receiving
++ beacons from the BSS it was previously
++ connected to
++
++ DISCONNECT_CMD =0x03
++ Indicates a “DISCONNECT” command was
++ processed
++ BSS_DISCONNECTED =0x04
++ Indicates the BSS explicitly disconnected the
++ device. Possible mechanisms include the AP
++ sending 802.11 management frames
++ (e.g., disassociate or deauthentication
++ messages).
++ AUTH_FAILED =0x05
++ Indicates that the device failed 802.11
++ authentication with the BSS
++ ASSOC_FAILED =0x06
++ Indicates that the device failed 802.11
++ association with the BSS
++ NO_RESOURCES_AVAIL =0x07
++ Indicates that a connection failed because the
++ AP had insufficient resources to complete the
++ connection
++ CSERV_DISCONNECT =0x08
++ Indicates that the device’s connection services
++ module decided to disconnect from a BSS,
++ which can happen for a variety of reasons (e.g.,
++ the host marks the current connected AP as a
++ bad AP).
++ INVALID_PROFILE =0x0A
++ Indicates that an attempt was made to
++ reconnect to a BSS that no longer matches the
++ current profile
++ All other values are reserved
++ } WMI_DISCONNECT_REASON
++
++
++=====================================================================
++
++
++Name
++ ERROR_REPORT
++
++Synopsis
++ Signals that a type of error has occurred for which the host previously requested
++ notification through the “TARGET_ERROR_REPORT_BITMASK” command.
++
++Event ID
++ 0x100D
++
++Event Parameters
++ UINT32 errorVal
++ WMI_TARGET_ERROR_VAL value. See
++ “TARGET_ERROR_REPORT_BITMASK”.
++
++Event Values
++ errorVal
++ = 0x00000001
++ Power save fails
++
++ = 0x00000002
++ No cipher key
++
++ = 0x00000004
++ Decryption error
++
++ = 0x00000008
++ Beacon miss
++
++ = 0x00000010
++ A non-power save disabled node has joined
++ the PS-enabled network
++
++
++=====================================================================
++
++
++Name
++ EXTENSION
++
++Synopsis
++ The WMI is used mostly for wireless control messages to a wireless module that
++ apply to wireless module management regardless of the target platform
++ implementation. However, some events peripherally related to wireless management
++ are desired during operation. These wireless extension events may be platform-
++ specific or implementation-dependent. See “WMI Extension Commands”
++
++
++Event ID
++ 0x1010
++
++
++=====================================================================
++
++
++Name
++ GET_PMKID_LIST_EVENT
++
++Synopsis
++ Generated by firmware in response to a “GET_PMKID_LIST_CMD” command.
++
++Event Parameters
++ typedef struct {
++ A_UINT32 numPMKID;
++ Contains the number of PMKIDs in the reply
++ WMI_PMKID pmkidList[1];
++ } __ATTRIB_PACK WMI_PMKID_LIST_REPLY;
++
++Event Values
++ None
++
++
++=====================================================================
++
++
++Name
++ GET_WOW_LIST_EVENT
++
++Synopsis
++ Response to the wmiconfig –getwowlist command to retrieve the configured Wake on
++ Wireless patterns
++
++Event ID
++ 0x10018
++
++Event Parameters
++ {
++
++ A_UINT8 num_filters
++ Total number of patterns in the list
++ A_UINT8 this_filter_num
++ The filter number
++ A_UINT8 wow_mode
++ Shows whether WoW is enabled or disabled
++ A_UINT8 host_mode
++ Shows whether the host is asleep or awake
++ WOW_FILTER wow_filters[1]
++ List of WoW filters (pattern and mask data bytes)
++ } WMI_GET_WOW_LIST_REPLY;
++
++ {
++ Each wow_filter_list element shows:
++ A_UINT8 wow_valid_filter
++ Whether the filter is valid
++ A_UINT8 wow_filter_list_id
++ Filter List ID (23 = default)
++ A_UINT8 wow_filter_size
++ Size in bytes of the filter
++ A_UINT8 wow_filter_offset
++ Offset of the pattern to search in the data packet
++ A_UINT8 wow_filter_mask[MASK_SIZE]
++ The mask to be applied to the pattern
++ A_UINT8 wow_filter_pattern[WOW_PATTERN_SIZE]
++ The pattern that to match to wake up the host
++ } WOW_FILTER
++
++Event Values
++ None
++
++=====================================================================
++
++
++
++Name
++ NEIGHBOR_REPORT
++
++Synopsis
++ Indicates the existence of neighbor APs that match the current profile. The host uses
++ this event to populate the PMKID cache on the AR6000 and/or to perform
++ preauthentication. This event is only generated in infrastructure mode.
++
++ A total of numberOfAps pairs of bssid/bssFlags exist, one pair for each AP.
++
++Event ID
++ 0x1008
++
++Event Parameters
++ UINT8 numberOfAps
++ The number of APs reported about in
++ this event
++ {
++ UINT8 bssid[6]
++ MAC address of a neighbor AP
++ UINT8 bssFlags
++ A WMI_BSS_FLAGS value
++ }[numberOfAps]
++
++
++Event Values
++ {
++ WMI_DEFAULT_BSS_FLAGS = 0
++ Logical OR of 1 or more
++ WMI_BSS_FLAGS
++ WMI_PREAUTH_CAPABLE_BSS
++ = 1
++ Indicates that this AP is capable of
++ preauthentication
++ WMI_PMKID_VALID_BSS
++ = 2
++ Indicates that the AR6000 have a
++ valid pairwise master key for this AP
++ } WMI_BSS_FLAGS
++
++
++=====================================================================
++
++
++
++Name
++ OPT_RX_FRAME_EVENT
++
++Synopsis
++ Special feature, informs host of the reception of a special frame.
++
++Event ID
++ 0x100E
++
++Event Parameters
++ {
++ A_UINT16 channel;
++ A_UINT8 frameType;
++ A_INT8 snr;
++ A_UINT8 srcAddr[ATH_MAC_LEN];
++ A_UINT8 bssid[ATH_MAC_LEN];
++ }WMI_OPT_RX_INFO_HDR
++
++Event Values
++ None
++
++=====================================================================
++
++
++
++Name
++ PSTREAM_TIMEOUT
++
++Synopsis
++ Indicates that a priority stream that got created as a result of priority-marked data
++ flow (priority marked in IP TOS) being idle for the default inactivity interval period
++ (specified in the “CREATE_PSTREAM” command) used for priority streams created
++ implicitly by the driver. This event is not indicated for user-created priority streams.
++ User-created priority streams exist until the users delete them explicitly. They do not
++ timeout due to data inactivity.
++
++Event ID
++ 0x1007
++
++Event Parameters
++ A_UINT8
++ trafficClass
++ Indicated the traffic class of priority
++ stream that timed out
++
++Event Values
++ {
++ WMM_AC_BE = 0
++ Best effort
++ WMM_AC_BK = 1
++ Background
++ WMM_AC_VI = 2
++ Video
++ WMM_AC_VO = 3
++ Voice
++ } TRAFFIC CLASS
++
++
++=====================================================================
++
++Name
++ READY
++
++Synopsis
++ Indicates that the AR6000 device is prepared to accept commands. It is sent once after
++ power on or reset. It also indicates the MAC address of the device.
++
++Event ID
++ 0x1001
++
++Event Parameters
++ UINT8 macAddr[6]
++ Device MAC address
++ UINT8 phyCapability
++ A WMI_PHY_CAPABILITY value. Indicates the
++ capabilities of the device wireless module’s radio
++
++Event Values
++ {
++ WMI_11A_CAPABILITY = 1
++ WMI_11G_CAPABILITY = 2
++ WMI_11AG_CAPABILITY = 3
++ } WMI_PHY_CAPABILITY
++
++
++=====================================================================
++
++Name
++ REGDOMAIN
++
++Synopsis
++ Indicates that the regulatory domain has changed. It initially occurs when the
++ AR6000 device reads the board data information. The regulatory domain can also
++ change when the device is a world-mode SKU. In this case, the regulatory domain is
++ based on the country advertised by APs per the IEEE 802.11d specification. A
++ potential side effect of a regulatory domain change is a change in the list of available
++ channels. Any channel restrictions that exist as a result of a previous
++ “SET_CHANNEL_PARAMETERS” command are lifted.
++
++Event ID
++ 0x1006
++
++Event Parameters
++ UINT32 regDomain
++ The range of 0x0000 – 0x00FF
++ corresponds to an ISO country code.
++
++ Other regCodes are reserved for world
++ mode settings and specific regulatory
++ domains.
++
++Event Values
++ None
++
++
++=====================================================================
++
++
++
++Name
++ REPORT_STATISTICS
++
++Synopsis
++ A reply to a “GET_TARGET_STATS” command.
++
++Event ID
++ 0x100B
++
++Event Parameters
++ When the statistics are sent to the host, the AR6001 clear them so that a new set of
++ statistics are collected for the next report.
++
++ UINT32 tx_packets
++ UINT32 tx_bytes
++ UINT32 tx_unicast_pkts
++ UINT32 tx_unicast_bytes
++ UINT32 tx_multicast_pkts
++ UINT32 tx_multicast_bytes
++ UINT32 tx_broadcast_pkts
++ UINT32 tx_broadcast_bytes
++ UINT32 tx_rts_success_cnt
++ UINT32 tx_packet_per_ac[4]
++ Tx packets per AC: [0] = BE, [1] = BK,
++ [2] = VI, [3] = VO
++ UINT32 tx_errors
++ Number of packets which failed Tx, due
++ to all failures
++ ... REPORT_STATISTICS, continued
++ UINT32 tx_failed_cnt
++ Number of data packets that failed Tx
++ UINT32 tx_retry_cnt
++ Number of Tx retries for all packets
++ UINT32 tx_rts_fail_cnt
++ Number of RTS Tx failed count
++ UINT32 rx_packets
++ UINT32 rx_bytes
++ UINT32 rx_unicast_pkts
++ UINT32 rx_unicast_bytes
++ UINT32 rx_multicast_pkts
++ UINT32 rx_multicast_bytes
++ UINT32 rx_broadcast_pkts
++ UINT32 rx_broadcast_bytes
++ UINT32 rx_fragment_pkt
++ Number of fragmented packets received
++ UINT32 rx_errors
++ Number of Rx errors due to all failures
++ UINT32 rx_crcerr
++ Number of Rx errors due to CRC errors
++ UINT32 rx_key_cache_miss
++ Number of Rx errors due to a key not
++ being plumbed
++ UINT32 rx_decrypt_err
++ Number of Rx errors due to decryption
++ failure
++ UINT32 rx_duplicate_frames
++ Number of duplicate frames received
++ UINT32 tkip_local_mic_failure
++ Number of TKIP MIC errors detected
++ UINT32 tkip_counter_measures_invoked
++ Number of times TKIP countermeasures
++ were invoked
++ UINT32 tkip_replays
++ Number of frames that replayed a TKIP
++ encrypted frame received earlier
++ UINT32 tkip_format_errors
++ Number of frames that did not conform
++ to the TKIP frame format
++ UINT32 ccmp_format_errors
++ Number of frames that did not conform
++ to the CCMP frame format
++ UINT32 ccmp_replays
++ Number of frames that replayed a CCMP
++ encrypted frame received earlier
++ UINT32 power_save_failure_cnt
++ Number of failures that occurred when
++ the AR6001 could not go to sleep
++ UINT32 cs_bmiss_cnt
++ Number of BMISS interrupts since
++ connection
++ UINT32 cs_lowRssi_cnt
++ Number of the times the RSSI went below
++ the low RSSI threshold
++ UINT16 cs_connect_cnt
++ Number of connection times
++ UINT16 cs_disconnect_cnt
++ Number of disconnection times
++ UINT8 cs_aveBeacon_rssi
++ The current averaged value of the RSSI
++ from the beacons of the connected BSS
++ UINT8 cs_lastRoam_msec
++ Time that the last roaming took, in ms.
++ This time is the difference between
++ roaming start and actual connection.
++
++Event Values
++ None defined
++
++
++=====================================================================
++
++Name
++ ROAM_TBL_EVENT
++
++Synopsis
++ Reports the roam table, which contains the current roam mode and this information
++ for every BSS:
++
++Event ID
++ 0x100F
++
++Event Parameters
++ A_UINT8 bssid[ATH_MAC_LEN];
++ BSSID
++ A_UINT8 rssi
++ Averaged RSSI
++ A_UINT8 rssidt
++ Change in RSSI
++ A_UINT8 last_rssi
++ Last recorded RSSI
++ A_UINT8 roam_util
++ Utility value used in roaming decision
++ A_UINT8 util
++ Base utility with the BSS
++ A_UINT8 bias
++ Host configured for this BSS
++
++Event Values
++ roamMode
++ Current roam mode
++
++ = 1
++ RSSI based roam
++
++ = 2
++ Host bias-based roam
++
++ = 3
++ Lock to the current BSS
++
++ = 4
++ Autonomous roaming disabled
++
++
++=====================================================================
++
++Name
++ RSSI_THRESHOLD
++
++Synopsis
++ Alerts the host that the signal strength from the connected AP has crossed a
++ interesting threshold as defined in a previous “RSSI_THRESHOLD_PARAMS”
++ command.
++
++Event ID
++ 0x100C
++
++Event Parameters
++ UINT8 range
++ A WMI_RSSI_THRESHOLD_VAL
++ value, which indicates the range of
++ the average signal strength
++
++Event Values
++ {
++ WMI_RSSI_LOWTHRESHOLD_BELOW_LOWERVAL = 1
++ WMI_RSSI_LOWTHRESHOLD_LOWERVAL = 2
++ WMI_RSSI_LOWTHRESHOLD_UPPERVAL = 3
++ WMI_RSSI_HIGHTHRESHOLD_LOWERVAL = 4
++ WMI_RSSI_HIGHTHRESHOLD_HIGHERVAL = 5
++ } WMI_RSSI_THRESHOLD_VAL
++
++
++=====================================================================
++
++Name
++ SCAN_COMPLETE_EVENT
++
++Synopsis
++ Indicates the scan status. if the Scan was not completed, this event is generated with
++ the status A_ECANCELED.
++
++Event ID
++ 0x100A
++
++Event Parameters
++ A_UINT8 scanStatus
++
++Event Values
++ {
++ #define SCAN_ABORTED 16
++ #define SCAN_COMPLETED 0
++ A_UINT8 scanStatus
++ A_OK or A_ECANCELED
++ } WMI_SCAN_COMPLETE_EVENT;
++
++
++=====================================================================
++
++Name
++ TEST_EVENT
++
++Synopsis
++ The TCMD application uses a single WMI event (WMI_TEST_EVENTID) to
++ communicate events from target to host. The events are parsed by the TCMD
++ application and WMI layer is oblivious of it.
++
++Event ID
++ 0x1016
++
++Event Parameters
++ WMI_TEST_EVENTID
++
++
++Event Values
++ None
++
++
++=====================================================================
++
++
++
++Name
++ TKIP_MICERR
++
++Synopsis
++ Indicates that TKIP MIC errors were detected.
++
++Event ID
++ 0x1009
++
++Event Parameters
++ UINT8 keyid
++ Indicates the TKIP key ID
++
++ UINT8 ismcast
++ 0 = Unicast
++ 1 = Multicast
++
++Event Values
++ See event parameters
++
++=====================================================================
++
++WMI Extension Commands
++
++The WMI EXTENSION command is used to multiplex a collection of
++commands that:
++
++ Are not generic wireless commands
++ May be implementation-specific
++ May be target platform-specific
++ May be optional for a host implementation
++
++ An extension command is sent to the AR6000 targets like any other WMI
++command message and uses the WMI_EXTENSION. The first field of the
++payload for this EXTENSION command is another commandId, sometimes
++called the subcommandId, which indicates which extension command is
++being used. A subcommandId-specific payload follows the subcommandId.
++
++All extensions (subcommandIds) are listed in the header file include/wmix.h.
++See also “WMI Extension Events” on page B-58.
++
++
++WMI Extension Commands
++
++
++GPIO_INPUT_GET
++ Read GPIO pins configured for input
++
++GPIO_INTR_ACK
++ Acknowledge and re-arm GPIO interrupts reported earlier
++
++GPIO_OUTPUT_SET
++ Manage output on GPIO pins configured for output
++
++GPIO_REGISTER_GET
++ Read an arbitrary GPIO register
++
++GPIO_REGISTER_SET
++ Dynamically change GPIO configuration
++
++SET_LQTHRESHOLD
++ Set link quality thresholds; the sampling happens at every unicast
++ data frame Tx, if certain thresholds are met, and corresponding
++ events are sent to the host
++
++
++=====================================================================
++
++Name
++ GPIO_INPUT_GET
++
++Synopsis
++ Allows the host to read GPIO pins that are configured for input. The values read are
++ returned through a “GPIO_DATA” extension event.
++
++NOTE: Support for GPIO is optional.
++
++Command
++ N/A
++
++Command Parameters
++ None
++
++
++
++Reply Parameters
++ None
++
++
++Reset Value
++ None
++
++
++
++Restrictions
++ None
++
++=====================================================================
++
++
++Name
++ GPIO_INTR_ACK
++
++Synopsis
++ The host uses this command to acknowledge and to re-arm GPIO interrupts reported
++ through an earlier “GPIO_INTR” extension event. A single “GPIO_INTR_ACK”
++ command should be used to acknowledge all GPIO interrupts that the host knows to
++ be outstanding (if pending interrupts are not acknowledged through
++ “GPIO_INTR_ACK”, another “GPIO_INTR” extension event is raised).
++
++NOTE: Support for GPIO is optional.
++
++Command
++ N/A
++
++Command Parameters
++ UINT32 ack_mask
++ A mask of interrupting GPIO pins (e.g., ack_mask
++ bit [3] acknowledges an interrupt from the pin GPIO3).
++
++Command Values
++ None
++
++Reset Value
++ None
++
++Restrictions
++ The host should acknowledge only interrupts about which it was notified.
++
++
++=====================================================================
++
++Name
++ GPIO_OUTPUT_SET
++
++Synopsis
++ Manages output on GPIO pins configured for output.
++
++ Conflicts between set_mask and clear_mask or enable_mask and disable_mask result
++ in undefined behavior.
++
++NOTE: Support for GPIO is optional.
++
++Command
++ N/A
++
++Command Parameters
++ UINT32 set_mask
++ Specifies which pins should drive a 1 out
++ UINT32 clear_mask
++ Specifies which pins should drive a 0 out
++ UINT32 enable_mask
++ Specifies which pins should be enabled for output
++ UINT32 disable_mask
++ Specifies which pins should be disabled for output
++
++Command Values
++ None
++
++
++Reset Value
++ None
++
++
++Restrictions
++ None
++
++
++
++=====================================================================
++
++
++Name
++ GPIO_REGISTER_GET
++
++Synopsis
++ Allows the host to read an arbitrary GPIO register. It is intended for use during
++ bringup/debug. The target responds to this command with a “GPIO_DATA” event.
++
++NOTE: Support for GPIO is optional.
++
++Command
++ N/A
++
++Command Parameters
++ UINT32
++ gpioreg_id
++ Specifies a GPIO register identifier, as defined
++in include/AR6000/AR6000_gpio.h
++
++Reply Parameters
++ None
++
++Reset Value
++ N/A
++
++Restrictions
++ None
++
++
++=====================================================================
++
++Name
++ GPIO_REGISTER_SET
++
++Synopsis
++ Allows the host to dynamically change GPIO configuration (usually handled
++ statically through the GPIO configuration DataSet).
++
++NOTE: Support for GPIO is optional.
++
++Command
++ N/A
++
++Command Parameters
++ UINT32 gpioreg_id
++ Specifies a GPIO register identifier, as defined in
++ include/AR6000/AR6000_gpio.h
++ UINT32 value
++ Specifies a value to write to the specified
++ GPIO register
++
++Command Values
++ None
++
++
++Reset Value
++ Initial hardware configuration is as defined in the AR6001 or AR6002 ROCmTM
++ Single-Chip MAC/BB/Radio for 2.4/5 GHz Embedded WLAN Applications data sheet. This
++ configuration is modified by the GPIO Configuration DataSet, if one exists.
++
++Restrictions
++ None
++
++
++=====================================================================
++
++
++Name
++ SET_LQTHRESHOLD
++
++Synopsis
++ Set link quality thresholds, the sampling happens at every unicast data frame Tx, if
++ certain threshold is met, corresponding event will be sent to host.
++
++Command
++ wmiconfig eth1 --lqThreshold <enable> <upper_threshold_1>...
++ <upper_threshold_4> <lower_threshold_1>... <lower_threshold_4>
++
++Command Parameters
++ A_UINT8 enable;
++ A_UINT8 thresholdAbove1_Val;
++ A_UINT8 thresholdAbove2_Val;
++ A_UINT8 thresholdAbove3_Val;
++ A_UINT8 thresholdAbove4_Val;
++ A_UINT8 thresholdBelow1_Val;
++ A_UINT8 thresholdBelow2_Val;
++ A_UINT8 thresholdBelow3_Val;
++ A_UINT8 thresholdBelow4_Val;
++
++Command Values
++ enable
++ = 0
++ Disable link quality sampling
++
++ = 1
++ Enable link quality sampling
++
++
++ thresholdAbove_Val
++ [1...4]
++ Above thresholds (value in [0,100]), in ascending
++ order threshold
++
++ Below_Val [1...4] = below thresholds (value
++ in [0,100]), in ascending order
++
++Reset Values
++ None
++
++Restrictions
++ None
++
++=====================================================================
++WMI Extension Events
++
++The WMI EXTENSION event is used for a collection of events that:
++
++ Are not generic wireless events
++ May be implementation-specific
++ May be target platform-specific
++ May be optional for a host implementation
++
++ An extension event is sent from the AR6000 device targets to the host just like
++any other WMI event message, using the WMI_EXTENSION_EVENTID. The
++first field of the payload for this “EXTENSION” event is another commandId
++(sometimes called the subcommandId) that indicates which “EXTENSION”
++event is being used. A subcommandId-specific payload follows the
++subcommandId.
++
++All extensions (subcommandIds) are listed in the header file include/wmix.h.
++See also “WMI Extension Commands” on page B-55.
++
++
++WMI Extension Events
++
++
++GPIO_ACK
++ Acknowledges a host set command has been processed by the device
++
++GPIO_DATA
++ Response to a host’s request for data
++
++GPIO_INTR
++ Signals that GPIO interrupts are pending
++
++
++=====================================================================
++
++Name
++ GPIO_ACK
++
++Synopsis
++ Acknowledges that a host set command (either “GPIO_OUTPUT_SET” or
++ “GPIO_REGISTER_SET”) has been processed by the AR6000 device.
++
++NOTE: Support for GPIO is optional.
++
++Event ID
++ N/A
++
++Event Parameters
++ None
++
++
++Event Values
++ None
++
++=====================================================================
++
++
++Name
++ GPIO_DATA
++
++Synopsis
++ The AR6000 device uses this event to respond to the host’s earlier request for data
++ (through either a “GPIO_REGISTER_GET” or a “GPIO_INPUT_GET” command).
++
++NOTE: Support for GPIO is optional.
++
++Event ID
++ N/A
++
++Event Parameters
++ UINT32 value
++ Holds the data of interest, which is either a register value
++ (in the case of “GPIO_REGISTER_GET”) or a mask of
++ pin inputs (in the case of “GPIO_INPUT_GET”).
++ UINT32 reg_id
++ Indicates which register was read (in the case of
++ “GPIO_REGISTER_GET”) or is GPIO_ID_NONE (in the
++ case of “GPIO_INPUT_GET”)
++
++Event Values
++ None
++
++
++=====================================================================
++
++
++
++Name
++ GPIO_INTR
++
++Synopsis
++ The AR6000 device raises this event to signal that GPIO interrupts are pending.
++ These GPIOs may be interrupts that occurred after the last “GPIO_INTR_ACK”
++ command was issued, or may be GPIO interrupts that the host failed to acknowledge
++ in the last “GPIO_INTR_ACK”. The AR6000 will not raise another GPIO_INTR
++ event until this event is acknowledged through a “GPIO_INTR_ACK” command.
++
++NOTE: Support for GPIO is optional.
++
++Event ID
++ N/A
++
++Event Parameters
++ UINT32 intr_mask
++ Indicates which GPIO interrupts are currently pending
++
++ UINT32 input_values
++ A recent copy of the GPIO input values, taken at the
++ time the most recent GPIO interrupt was processed
++
++Event Values
++ None
++
++
++
++=====================================================================
++#endif
+diff --git a/drivers/ar6000/wmi/wmi_host.h b/drivers/ar6000/wmi/wmi_host.h
+new file mode 100644
+index 0000000..57844bc
+--- /dev/null
++++ b/drivers/ar6000/wmi/wmi_host.h
+@@ -0,0 +1,71 @@
++#ifndef _WMI_HOST_H_
++#define _WMI_HOST_H_
++/*
++ * Copyright (c) 2004-2006 Atheros Communications Inc.
++ * All rights reserved.
++ *
++ * This file contains local definitios for the wmi host module.
++ *
++ * $Id: //depot/sw/releases/olca2.0-GPL/host/wmi/wmi_host.h#1 $
++ *
++ *
++ * 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;
++ *
++ * Software distributed under the License is distributed on an "AS
++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
++ * implied. See the License for the specific language governing
++ * rights and limitations under the License.
++ *
++ *
++ *
++ */
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++struct wmi_stats {
++ A_UINT32 cmd_len_err;
++ A_UINT32 cmd_id_err;
++};
++
++struct wmi_t {
++ A_BOOL wmi_ready;
++ A_BOOL wmi_numQoSStream;
++ A_UINT8 wmi_wmiStream2AcMapping[WMI_PRI_MAX_COUNT];
++ WMI_PRI_STREAM_ID wmi_ac2WmiStreamMapping[WMM_NUM_AC];
++ A_UINT16 wmi_streamExistsForAC[WMM_NUM_AC];
++ A_UINT8 wmi_fatPipeExists;
++ void *wmi_devt;
++ struct wmi_stats wmi_stats;
++ struct ieee80211_node_table wmi_scan_table;
++ A_UINT8 wmi_bssid[ATH_MAC_LEN];
++ A_UINT8 wmi_powerMode;
++ A_UINT8 wmi_phyMode;
++ A_UINT8 wmi_keepaliveInterval;
++ A_MUTEX_T wmi_lock;
++};
++
++#define WMI_INIT_WMISTREAM_AC_MAP(w) \
++{ (w)->wmi_wmiStream2AcMapping[WMI_BEST_EFFORT_PRI] = WMM_AC_BE; \
++ (w)->wmi_wmiStream2AcMapping[WMI_LOW_PRI] = WMM_AC_BK; \
++ (w)->wmi_wmiStream2AcMapping[WMI_HIGH_PRI] = WMM_AC_VI; \
++ (w)->wmi_wmiStream2AcMapping[WMI_HIGHEST_PRI] = WMM_AC_VO; \
++ (w)->wmi_ac2WmiStreamMapping[WMM_AC_BE] = WMI_BEST_EFFORT_PRI; \
++ (w)->wmi_ac2WmiStreamMapping[WMM_AC_BK] = WMI_LOW_PRI; \
++ (w)->wmi_ac2WmiStreamMapping[WMM_AC_VI] = WMI_HIGH_PRI; \
++ (w)->wmi_ac2WmiStreamMapping[WMM_AC_VO] = WMI_HIGHEST_PRI; }
++
++#define WMI_WMISTREAM_ACCESSCATEGORY(w,s) (w)->wmi_wmiStream2AcMapping[s]
++#define WMI_ACCESSCATEGORY_WMISTREAM(w,ac) (w)->wmi_ac2WmiStreamMapping[ac]
++
++#define LOCK_WMI(w) A_MUTEX_LOCK(&(w)->wmi_lock);
++#define UNLOCK_WMI(w) A_MUTEX_UNLOCK(&(w)->wmi_lock);
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _WMI_HOST_H_ */
+diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
+index d3b2953..fea341e 100644
+--- a/drivers/gpio/Kconfig
++++ b/drivers/gpio/Kconfig
+@@ -75,6 +75,12 @@ config GPIO_BASIC_MMIO
+ help
+ Say yes here to support basic memory-mapped GPIO controllers.
+
++config GPIO_GLAMO
++ tristate "Glamo GPIO support"
++ depends on MFD_GLAMO
++ help
++ Say yes here to support GPIO functionality of the Smedia Glamo.
++
+ config GPIO_IT8761E
+ tristate "IT8761E GPIO support"
+ depends on GPIOLIB
+@@ -294,6 +300,13 @@ config GPIO_ADP5588_IRQ
+ Say yes here to enable the adp5588 to be used as an interrupt
+ controller. It requires the driver to be built in the kernel.
+
++config GPIO_PCF50633
++ tristate "GPIO support for NXP PCF50633"
++ depends on MFD_PCF50633
++ help
++ Say yes here if you want to include support GPIO for pins on
++ the PCF50633 chip.
++
+ comment "PCI GPIO expanders:"
+
+ config GPIO_CS5535
+diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
+index becef59..d5f3c31 100644
+--- a/drivers/gpio/Makefile
++++ b/drivers/gpio/Makefile
+@@ -11,6 +11,7 @@ obj-$(CONFIG_GPIOLIB) += gpiolib.o
+ obj-$(CONFIG_GPIO_ADP5520) += adp5520-gpio.o
+ obj-$(CONFIG_GPIO_ADP5588) += adp5588-gpio.o
+ obj-$(CONFIG_GPIO_BASIC_MMIO) += basic_mmio_gpio.o
++obj-$(CONFIG_GPIO_GLAMO) += glamo-gpio.o
+ obj-$(CONFIG_GPIO_LANGWELL) += langwell_gpio.o
+ obj-$(CONFIG_GPIO_MAX730X) += max730x.o
+ obj-$(CONFIG_GPIO_MAX7300) += max7300.o
+@@ -43,3 +44,4 @@ obj-$(CONFIG_GPIO_SX150X) += sx150x.o
+ obj-$(CONFIG_GPIO_VX855) += vx855_gpio.o
+ obj-$(CONFIG_GPIO_ML_IOH) += ml_ioh_gpio.o
+ obj-$(CONFIG_AB8500_GPIO) += ab8500-gpio.o
++obj-$(CONFIG_GPIO_PCF50633) += pcf50633-gpio.o
+diff --git a/drivers/gpio/glamo-gpio.c b/drivers/gpio/glamo-gpio.c
+new file mode 100644
+index 0000000..1e9986b
+--- /dev/null
++++ b/drivers/gpio/glamo-gpio.c
+@@ -0,0 +1,250 @@
++/* Smedia Glamo 336x/337x gpio driver
++ *
++ * (C) 2009,2011 Lars-Peter Clausen <lars@metafoo.de>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ */
++
++#include <linux/io.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/platform_device.h>
++#include <linux/slab.h>
++#include <linux/spinlock.h>
++
++#include <linux/gpio.h>
++#include <linux/mfd/glamo.h>
++#include <linux/mfd/glamo-core.h>
++#include <linux/mfd/glamo-regs.h>
++
++#define GLAMO_NR_GPIO 21
++#define GLAMO_NR_GPIO_REGS DIV_ROUND_UP(GLAMO_NR_GPIO, 4)
++
++#define GLAMO_GPIO_REG(x) (((x) * 2) + GLAMO_REG_GPIO_GEN1)
++
++struct glamo_gpio {
++ struct glamo_core *glamo;
++ struct gpio_chip chip;
++ uint16_t saved_regs[GLAMO_NR_GPIO_REGS];
++};
++
++#define GLAMO_GPIO_REG_GPIO(gpio) GLAMO_GPIO_REG((gpio) >> 2)
++#define GLAMO_GPIO_BIT(gpio, offset) BIT(((gpio) & 0x3) + (offset))
++#define GLAMO_GPIO_DIRECTION_BIT(gpio) GLAMO_GPIO_BIT((gpio), 0)
++#define GLAMO_GPIO_OUTPUT_BIT(gpio) GLAMO_GPIO_BIT((gpio), 4)
++#define GLAMO_GPIO_INPUT_BIT(gpio) GLAMO_GPIO_BIT((gpio), 8)
++#define GLAMO_GPIO_FUNC_BIT(gpio) GLAMO_GPIO_BIT((gpio), 12)
++
++
++static inline struct glamo_core *chip_to_glamo(struct gpio_chip *chip)
++{
++ return container_of(chip, struct glamo_gpio, chip)->glamo;
++}
++
++static void glamo_gpio_modify_reg(struct gpio_chip *chip, unsigned offset,
++ uint16_t set, uint16_t clear)
++{
++ struct glamo_core *glamo = chip_to_glamo(chip);
++ void __iomem *reg = glamo->base + GLAMO_GPIO_REG_GPIO(offset);
++ uint16_t tmp;
++
++ spin_lock(&glamo->lock);
++ tmp = readw(reg);
++ tmp |= set;
++ tmp &= ~clear;
++ writew(tmp, reg);
++ spin_unlock(&glamo->lock);
++}
++
++static void glamo_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
++{
++ uint16_t mask = GLAMO_GPIO_OUTPUT_BIT(offset);
++ glamo_gpio_modify_reg(chip, offset, value ? mask : 0, value ? 0 : mask);
++}
++
++static int glamo_gpio_get(struct gpio_chip *chip, unsigned offset)
++{
++ struct glamo_core *glamo = chip_to_glamo(chip);
++ void __iomem *reg = glamo->base + GLAMO_GPIO_REG_GPIO(offset);
++
++ return !!(readw(reg) & GLAMO_GPIO_INPUT_BIT(offset));
++}
++
++static int glamo_gpio_request(struct gpio_chip *chip, unsigned offset)
++{
++ glamo_gpio_modify_reg(chip, offset, GLAMO_GPIO_FUNC_BIT(offset), 0);
++
++ return 0;
++}
++
++static void glamo_gpio_free(struct gpio_chip *chip, unsigned offset)
++{
++ glamo_gpio_modify_reg(chip, offset, 0, GLAMO_GPIO_FUNC_BIT(offset));
++}
++
++static int glamo_gpio_direction_output(struct gpio_chip *chip, unsigned offset,
++ int value)
++{
++ uint16_t output_mask = GLAMO_GPIO_OUTPUT_BIT(offset);
++ uint16_t set, clear;
++
++ clear = GLAMO_GPIO_DIRECTION_BIT(offset);
++
++ if (value) {
++ set = output_mask;
++ } else {
++ set = 0;
++ clear |= output_mask;
++ }
++
++ glamo_gpio_modify_reg(chip, offset, set, clear);
++
++ return 0;
++}
++
++static int glamo_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
++{
++ glamo_gpio_modify_reg(chip, offset, GLAMO_GPIO_DIRECTION_BIT(offset), 0);
++
++ return 0;
++}
++
++static const struct __devinit gpio_chip glamo_gpio_chip = {
++ .label = "glamo",
++ .request = glamo_gpio_request,
++ .free = glamo_gpio_free,
++ .direction_input = glamo_gpio_direction_input,
++ .direction_output = glamo_gpio_direction_output,
++ .get = glamo_gpio_get,
++ .set = glamo_gpio_set,
++ .base = -1,
++ .ngpio = GLAMO_NR_GPIO,
++ .owner = THIS_MODULE,
++};
++
++static int __devinit glamo_gpio_probe(struct platform_device *pdev)
++{
++ struct glamo_platform_data *pdata = pdev->dev.parent->platform_data;
++ struct glamo_gpio *glamo_gpio;
++ int ret;
++
++ glamo_gpio = kzalloc(sizeof(*glamo_gpio), GFP_KERNEL);
++ if (!glamo_gpio)
++ return -ENOMEM;
++
++ glamo_gpio->glamo = dev_get_drvdata(pdev->dev.parent);
++ glamo_gpio->chip = glamo_gpio_chip;
++ glamo_gpio->chip.dev = &pdev->dev;
++ if (pdata && pdata->gpio_data)
++ glamo_gpio->chip.base = pdata->gpio_data->base;
++
++ ret = gpiochip_add(&glamo_gpio->chip);
++
++ if (ret) {
++ dev_err(&pdev->dev, "Could not register gpio chip: %d\n", ret);
++ goto err;
++ }
++
++ platform_set_drvdata(pdev, glamo_gpio);
++
++ return 0;
++err:
++ kfree(glamo_gpio);
++ return ret;
++}
++
++static int __devexit glamo_gpio_remove(struct platform_device *pdev)
++{
++ struct glamo_gpio *glamo_gpio = platform_get_drvdata(pdev);
++ int ret;
++
++ ret = gpiochip_remove(&glamo_gpio->chip);
++ if (!ret)
++ goto done;
++
++ platform_set_drvdata(pdev, NULL);
++ kfree(glamo_gpio);
++
++done:
++ return ret;
++}
++
++#ifdef CONFIG_PM_SLEEP
++
++static int glamo_gpio_suspend(struct device *dev)
++{
++ struct glamo_gpio *glamo_gpio = dev_get_drvdata(dev);
++ struct glamo_core *glamo = glamo_gpio->glamo;
++ uint16_t *saved_regs = glamo_gpio->saved_regs;
++ int i;
++
++ spin_lock(&glamo->lock);
++ for (i = 0; i < GLAMO_NR_GPIO_REGS; ++i)
++ saved_regs[i] = readw(glamo->base + GLAMO_GPIO_REG(i));
++ spin_unlock(&glamo->lock);
++
++ return 0;
++}
++
++static int glamo_gpio_resume(struct device *dev)
++{
++ struct glamo_gpio *glamo_gpio = dev_get_drvdata(dev);
++ struct glamo_core *glamo = glamo_gpio->glamo;
++ uint16_t *saved_regs = glamo_gpio->saved_regs;
++ int i;
++
++ spin_lock(&glamo->lock);
++ for (i = 0; i < GLAMO_NR_GPIO_REGS; ++i)
++ writew(saved_regs[i], glamo->base + GLAMO_GPIO_REG(i));
++ spin_unlock(&glamo->lock);
++ return 0;
++}
++
++static SIMPLE_DEV_PM_OPS(glamo_pm_ops, glamo_gpio_suspend, glamo_gpio_resume);
++
++#define GLAMO_GPIO_PM_OPS (&glamo_pm_ops)
++
++#else
++#define GLAMO_GPIO_PM_OPS NULL
++#endif
++
++static struct platform_driver glamo_gpio_driver = {
++ .probe = glamo_gpio_probe,
++ .remove = __devexit_p(glamo_gpio_remove),
++ .driver = {
++ .name = "glamo-gpio",
++ .owner = THIS_MODULE,
++ .pm = GLAMO_GPIO_PM_OPS,
++ },
++};
++
++static int __init glamo_gpio_init(void)
++{
++ return platform_driver_register(&glamo_gpio_driver);
++}
++module_init(glamo_gpio_init);
++
++static void __exit glamo_gpio_exit(void)
++{
++ platform_driver_unregister(&glamo_gpio_driver);
++}
++module_exit(glamo_gpio_exit);
++
++MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
++MODULE_DESCRIPTION("GPIO interface for the Glamo multimedia device");
++MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:glamo-gpio");
+diff --git a/drivers/gpio/pcf50633-gpio.c b/drivers/gpio/pcf50633-gpio.c
+new file mode 100644
+index 0000000..eb044e8
+--- /dev/null
++++ b/drivers/gpio/pcf50633-gpio.c
+@@ -0,0 +1,228 @@
++/* NXP PCF50633 GPIO Driver
++ *
++ * (C) 2006-2008 by Openmoko, Inc.
++ * Author: Balaji Rao <balajirrao@openmoko.org>
++ * Copyright 2010, Lars-Peter Clausen <lars@metafoo.de>
++ * All rights reserved.
++ *
++ * Broken down from monstrous PCF50633 driver mainly by
++ * Harald Welte, Andy Green and Werner Almesberger
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License as published by the
++ * Free Software Foundation; either version 2 of the License, or (at your
++ * option) any later version.
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/slab.h>
++#include <linux/platform_device.h>
++
++#include <linux/mfd/pcf50633/core.h>
++#include <linux/mfd/pcf50633/gpio.h>
++#include <linux/gpio.h>
++
++#define PCF50633_REG_GPIOCTL 0x13
++#define PCF50633_REG_GPIOCFG(x) (0x14 + (x))
++
++enum pcf50633_regulator_id {
++ PCF50633_REGULATOR_AUTO,
++ PCF50633_REGULATOR_DOWN1,
++ PCF50633_REGULATOR_DOWN2,
++ PCF50633_REGULATOR_LDO1,
++ PCF50633_REGULATOR_LDO2,
++ PCF50633_REGULATOR_LDO3,
++ PCF50633_REGULATOR_LDO4,
++ PCF50633_REGULATOR_LDO5,
++ PCF50633_REGULATOR_LDO6,
++ PCF50633_REGULATOR_HCLDO,
++ PCF50633_REGULATOR_MEMLDO,
++};
++
++#define PCF50633_REG_AUTOOUT 0x1a
++#define PCF50633_REG_DOWN1OUT 0x1e
++#define PCF50633_REG_DOWN2OUT 0x22
++#define PCF50633_REG_MEMLDOOUT 0x26
++#define PCF50633_REG_LDO1OUT 0x2d
++#define PCF50633_REG_LDO2OUT 0x2f
++#define PCF50633_REG_LDO3OUT 0x31
++#define PCF50633_REG_LDO4OUT 0x33
++#define PCF50633_REG_LDO5OUT 0x35
++#define PCF50633_REG_LDO6OUT 0x37
++#define PCF50633_REG_HCLDOOUT 0x39
++
++static const u8 pcf50633_regulator_registers[PCF50633_NUM_REGULATORS] = {
++ [PCF50633_REGULATOR_AUTO] = PCF50633_REG_AUTOOUT,
++ [PCF50633_REGULATOR_DOWN1] = PCF50633_REG_DOWN1OUT,
++ [PCF50633_REGULATOR_DOWN2] = PCF50633_REG_DOWN2OUT,
++ [PCF50633_REGULATOR_MEMLDO] = PCF50633_REG_MEMLDOOUT,
++ [PCF50633_REGULATOR_LDO1] = PCF50633_REG_LDO1OUT,
++ [PCF50633_REGULATOR_LDO2] = PCF50633_REG_LDO2OUT,
++ [PCF50633_REGULATOR_LDO3] = PCF50633_REG_LDO3OUT,
++ [PCF50633_REGULATOR_LDO4] = PCF50633_REG_LDO4OUT,
++ [PCF50633_REGULATOR_LDO5] = PCF50633_REG_LDO5OUT,
++ [PCF50633_REGULATOR_LDO6] = PCF50633_REG_LDO6OUT,
++ [PCF50633_REGULATOR_HCLDO] = PCF50633_REG_HCLDOOUT,
++};
++
++struct pcf50633_gpio {
++ struct pcf50633 *pcf;
++ struct gpio_chip chip;
++};
++
++static inline struct pcf50633 *gpio_chip_to_pcf50633(struct gpio_chip *chip)
++{
++ struct pcf50633 *pcf = dev_to_pcf50633(chip->dev->parent);
++ return pcf;
++}
++
++static void pcf50633_gpio_set_value(struct gpio_chip *chip, unsigned gpio, int value)
++{
++ struct pcf50633 *pcf = gpio_chip_to_pcf50633(chip);
++ u8 reg;
++
++ reg = PCF50633_REG_GPIOCFG(gpio);
++
++ pcf50633_reg_set_bit_mask(pcf, reg, 0x07, value ? 0x7 : 0x0);
++}
++
++static int pcf50633_gpio_get_value(struct gpio_chip *chip, unsigned gpio)
++{
++ struct pcf50633 *pcf = gpio_chip_to_pcf50633(chip);
++ return pcf50633_reg_read(pcf, PCF50633_REG_GPIOCFG(gpio)) >> 3;
++}
++
++
++static int pcf50633_gpio_direction_output(struct gpio_chip *chip, unsigned gpio,
++ int value)
++{
++ struct pcf50633 *pcf = gpio_chip_to_pcf50633(chip);
++ int ret;
++
++ ret = pcf50633_gpio_set_config(pcf, pcf->pdata->gpio_base + gpio,
++ PCF50633_GPIO_CONFIG_OUTPUT);
++ if (!ret)
++ pcf50633_gpio_set_value(chip, gpio, value);
++
++ return ret;
++}
++
++static int pcf50633_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
++{
++ return -ENOSYS;
++}
++
++int pcf50633_gpio_set_config(struct pcf50633 *pcf, unsigned gpio,
++ enum pcf50633_gpio_config config)
++{
++ u8 reg;
++ u8 direction;
++ int ret;
++
++ gpio -= pcf->pdata->gpio_base;
++
++ if (gpio < 3) {
++ direction = (config == PCF50633_GPIO_CONFIG_INPUT) ? (1 << gpio) : 0;
++ ret = pcf50633_reg_set_bit_mask(pcf, PCF50633_REG_GPIOCTL, (1 << gpio),
++ direction);
++ if (ret) {
++ return ret;
++ }
++ } else if (gpio > 3 || config == PCF50633_GPIO_CONFIG_INPUT) {
++ return -EINVAL;
++ }
++
++ if (config != PCF50633_GPIO_CONFIG_INPUT) {
++ reg = PCF50633_REG_GPIOCFG(gpio);
++ ret = pcf50633_reg_set_bit_mask(pcf, reg, 0x0f, config);
++ }
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(pcf50633_gpio_set_config);
++
++int pcf50633_gpio_power_supply_set(struct pcf50633 *pcf,
++ int gpio, int regulator, int on)
++{
++ u8 reg, val, mask;
++
++ gpio -= pcf->pdata->gpio_base;
++
++ /* the *ENA register is always one after the *OUT register */
++ reg = pcf50633_regulator_registers[regulator] + 1;
++
++ val = !!on << (gpio - PCF50633_GPIO1);
++ mask = 1 << (gpio - PCF50633_GPIO1);
++
++ return pcf50633_reg_set_bit_mask(pcf, reg, mask, val);
++}
++EXPORT_SYMBOL_GPL(pcf50633_gpio_power_supply_set);
++
++
++static int __devinit pcf50633_gpio_probe(struct platform_device *pdev)
++{
++ struct pcf50633 *pcf = dev_to_pcf50633(pdev->dev.parent);
++ struct pcf50633_gpio *pcf_gpio;
++
++ pcf_gpio = kzalloc(sizeof(*pcf_gpio), GFP_KERNEL);
++
++ if (!pcf_gpio)
++ return -ENOMEM;
++
++ pcf_gpio->pcf = pcf;
++
++ pcf_gpio->chip.direction_input = pcf50633_gpio_direction_input;
++ pcf_gpio->chip.direction_output = pcf50633_gpio_direction_output;
++ pcf_gpio->chip.get = pcf50633_gpio_get_value;
++ pcf_gpio->chip.set = pcf50633_gpio_set_value;
++
++ pcf_gpio->chip.base = pcf->pdata->gpio_base;
++ pcf_gpio->chip.ngpio = 4;
++ pcf_gpio->chip.label = dev_name(pcf->dev);
++ pcf_gpio->chip.can_sleep = 1;
++ pcf_gpio->chip.owner = THIS_MODULE;
++ pcf_gpio->chip.dev = &pdev->dev;
++
++ platform_set_drvdata(pdev, pcf_gpio);
++
++ return gpiochip_add(&pcf_gpio->chip);
++}
++
++static int __devexit pcf50633_gpio_remove(struct platform_device *pdev)
++{
++ struct pcf50633_gpio *pcf_gpio = platform_get_drvdata(pdev);
++
++ gpiochip_remove(&pcf_gpio->chip);
++
++ platform_set_drvdata(pdev, NULL);
++ kfree(pcf_gpio);
++
++ return 0;
++}
++
++static struct platform_driver pcf50633_gpio_driver = {
++ .probe = pcf50633_gpio_probe,
++ .remove = __devexit_p(pcf50633_gpio_remove),
++ .driver = {
++ .name = "pcf50633-gpio",
++ .owner = THIS_MODULE,
++ },
++};
++
++int __init pcf50633_gpio_init(void)
++{
++ return platform_driver_register(&pcf50633_gpio_driver);
++}
++module_init(pcf50633_gpio_init);
++
++void __exit pcf50633_gpio_exit(void)
++{
++ platform_driver_unregister(&pcf50633_gpio_driver);
++}
++module_exit(pcf50633_gpio_exit);
++
++MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
++MODULE_DESCRIPTION("GPIO driver for the PCF50633");
++MODULE_LICENSE("GPL");
+diff --git a/drivers/input/misc/pcf50633-input.c b/drivers/input/misc/pcf50633-input.c
+index 9556273..983d5c8 100644
+--- a/drivers/input/misc/pcf50633-input.c
++++ b/drivers/input/misc/pcf50633-input.c
+@@ -20,6 +20,7 @@
+ #include <linux/device.h>
+ #include <linux/platform_device.h>
+ #include <linux/input.h>
++#include <linux/interrupt.h>
+ #include <linux/slab.h>
+
+ #include <linux/mfd/pcf50633/core.h>
+@@ -31,26 +32,27 @@
+ struct pcf50633_input {
+ struct pcf50633 *pcf;
+ struct input_dev *input_dev;
++ int irq_pressed;
++ int irq_released;
+ };
+
+-static void
+-pcf50633_input_irq(int irq, void *data)
++static irqreturn_t pcf50633_input_irq(int irq, void *data)
+ {
+- struct pcf50633_input *input;
++ struct pcf50633_input *input = data;
+ int onkey_released;
+
+- input = data;
+-
+ /* We report only one event depending on the key press status */
+ onkey_released = pcf50633_reg_read(input->pcf, PCF50633_REG_OOCSTAT)
+ & PCF50633_OOCSTAT_ONKEY;
+
+- if (irq == PCF50633_IRQ_ONKEYF && !onkey_released)
++ if (irq == input->irq_pressed && !onkey_released)
+ input_report_key(input->input_dev, KEY_POWER, 1);
+- else if (irq == PCF50633_IRQ_ONKEYR && onkey_released)
++ else if (irq == input->irq_released && onkey_released)
+ input_report_key(input->input_dev, KEY_POWER, 0);
+
+ input_sync(input->input_dev);
++
++ return IRQ_HANDLED;
+ }
+
+ static int __devinit pcf50633_input_probe(struct platform_device *pdev)
+@@ -58,7 +60,22 @@ static int __devinit pcf50633_input_probe(struct platform_device *pdev)
+ struct pcf50633_input *input;
+ struct input_dev *input_dev;
+ int ret;
++ int irq_released;
++ int irq_pressed;
++
++ irq_released = platform_get_irq_byname(pdev, "ONKEYR");
++ if (irq_released <= 0) {
++ dev_err(&pdev->dev, "Failed to get released irq: %d\n",
++ irq_released);
++ return irq_released ?: -EINVAL;
++ }
+
++ irq_pressed = platform_get_irq_byname(pdev, "ONKEYF");
++ if (irq_pressed <= 0) {
++ dev_err(&pdev->dev, "Failed to get pressed irq: %d\n",
++ irq_pressed);
++ return irq_pressed ?: -EINVAL;
++ }
+
+ input = kzalloc(sizeof(*input), GFP_KERNEL);
+ if (!input)
+@@ -85,20 +102,41 @@ static int __devinit pcf50633_input_probe(struct platform_device *pdev)
+ kfree(input);
+ return ret;
+ }
+- pcf50633_register_irq(input->pcf, PCF50633_IRQ_ONKEYR,
+- pcf50633_input_irq, input);
+- pcf50633_register_irq(input->pcf, PCF50633_IRQ_ONKEYF,
+- pcf50633_input_irq, input);
++
++ ret = request_threaded_irq(irq_released, NULL, pcf50633_input_irq, 0,
++ "onkey released", input);
++ if (ret) {
++ dev_err(&pdev->dev, "Failed to request released irq: %d\n", ret);
++ goto err_input_unregister;
++ }
++ ret = request_threaded_irq(irq_pressed, NULL, pcf50633_input_irq, 0,
++ "onkey pressed", input);
++ if (ret) {
++ dev_err(&pdev->dev, "Failed to request pressed irq: %d\n", ret);
++ goto err_free_irq;
++ }
++
++ input->irq_released = irq_released;
++ input->irq_pressed = irq_pressed;
++
+
+ return 0;
++
++err_free_irq:
++ free_irq(irq_pressed, input);
++err_input_unregister:
++ input_unregister_device(input->input_dev);
++ kfree(input);
++
++ return ret;
+ }
+
+ static int __devexit pcf50633_input_remove(struct platform_device *pdev)
+ {
+ struct pcf50633_input *input = platform_get_drvdata(pdev);
+
+- pcf50633_free_irq(input->pcf, PCF50633_IRQ_ONKEYR);
+- pcf50633_free_irq(input->pcf, PCF50633_IRQ_ONKEYF);
++ free_irq(input->irq_released, input);
++ free_irq(input->irq_pressed, input);
+
+ input_unregister_device(input->input_dev);
+ kfree(input);
+diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c
+index 666daf7..46fac25 100644
+--- a/drivers/leds/leds-pwm.c
++++ b/drivers/leds/leds-pwm.c
+@@ -26,8 +26,8 @@
+ struct led_pwm_data {
+ struct led_classdev cdev;
+ struct pwm_device *pwm;
+- unsigned int active_low;
+- unsigned int period;
++ struct led_pwm *led;
++ struct device *parent;
+ };
+
+ static void led_pwm_set(struct led_classdev *led_cdev,
+@@ -35,8 +35,13 @@ static void led_pwm_set(struct led_classdev *led_cdev,
+ {
+ struct led_pwm_data *led_dat =
+ container_of(led_cdev, struct led_pwm_data, cdev);
++ struct device *parent = led_dat->parent;
++ struct led_pwm_platform_data *pdata = parent->platform_data;
+ unsigned int max = led_dat->cdev.max_brightness;
+- unsigned int period = led_dat->period;
++ unsigned int period = led_dat->led->pwm_period_ns;
++
++ if (pdata->notify)
++ brightness = pdata->notify(parent, led_dat->led, brightness);
+
+ if (brightness == 0) {
+ pwm_config(led_dat->pwm, 0, period);
+@@ -77,18 +82,28 @@ static int led_pwm_probe(struct platform_device *pdev)
+
+ led_dat->cdev.name = cur_led->name;
+ led_dat->cdev.default_trigger = cur_led->default_trigger;
+- led_dat->active_low = cur_led->active_low;
+- led_dat->period = cur_led->pwm_period_ns;
+ led_dat->cdev.brightness_set = led_pwm_set;
+ led_dat->cdev.brightness = LED_OFF;
+ led_dat->cdev.max_brightness = cur_led->max_brightness;
+ led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
+
++ led_dat->led = cur_led;
++ led_dat->parent = &pdev->dev;
++
+ ret = led_classdev_register(&pdev->dev, &led_dat->cdev);
+ if (ret < 0) {
+ pwm_free(led_dat->pwm);
+ goto err;
+ }
++
++ if (pdata->init) {
++ ret = pdata->init(&pdev->dev, cur_led);
++ if (ret < 0) {
++ led_classdev_unregister(&led_dat->cdev);
++ pwm_free(led_dat->pwm);
++ goto err;
++ }
++ }
+ }
+
+ platform_set_drvdata(pdev, leds_data);
+@@ -98,6 +113,8 @@ static int led_pwm_probe(struct platform_device *pdev)
+ err:
+ if (i > 0) {
+ for (i = i - 1; i >= 0; i--) {
++ if (pdata->exit)
++ pdata->exit(&pdev->dev, &pdata->leds[i]);
+ led_classdev_unregister(&leds_data[i].cdev);
+ pwm_free(leds_data[i].pwm);
+ }
+@@ -117,6 +134,8 @@ static int __devexit led_pwm_remove(struct platform_device *pdev)
+ leds_data = platform_get_drvdata(pdev);
+
+ for (i = 0; i < pdata->num_leds; i++) {
++ if (pdata->exit)
++ pdata->exit(&pdev->dev, &pdata->leds[i]);
+ led_classdev_unregister(&leds_data[i].cdev);
+ pwm_free(leds_data[i].pwm);
+ }
+diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
+index 3ed3ff0..9b2b1bb 100644
+--- a/drivers/mfd/Kconfig
++++ b/drivers/mfd/Kconfig
+@@ -448,6 +448,7 @@ config MFD_WM8994
+
+ config MFD_PCF50633
+ tristate "Support for NXP PCF50633"
++ select MFD_CORE
+ depends on I2C
+ help
+ Say yes here if you have NXP PCF50633 chip on your board.
+@@ -477,13 +478,6 @@ config PCF50633_ADC
+ Say yes here if you want to include support for ADC in the
+ NXP PCF50633 chip.
+
+-config PCF50633_GPIO
+- tristate "Support for NXP PCF50633 GPIO"
+- depends on MFD_PCF50633
+- help
+- Say yes here if you want to include support GPIO for pins on
+- the PCF50633 chip.
+-
+ config ABX500_CORE
+ bool "ST-Ericsson ABX500 Mixed Signal Circuit register functions"
+ default y if ARCH_U300 || ARCH_U8500
+@@ -602,6 +596,14 @@ config LPC_SCH
+ LPC bridge function of the Intel SCH provides support for
+ System Management Bus and General Purpose I/O.
+
++config MFD_GLAMO
++ bool "Smedia Glamo 336x/337x support"
++ select MFD_CORE
++ help
++ This enables the core driver for the Smedia Glamo 336x/337x
++ multi-function device. It includes irq_chip demultiplex as
++ well as clock / power management and GPIO support.
++
+ config MFD_RDC321X
+ tristate "Support for RDC-R321x southbridge"
+ select MFD_CORE
+diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
+index 419caa9..fb5f307 100644
+--- a/drivers/mfd/Makefile
++++ b/drivers/mfd/Makefile
+@@ -6,6 +6,8 @@
+ obj-$(CONFIG_MFD_88PM860X) += 88pm860x.o
+ obj-$(CONFIG_MFD_SM501) += sm501.o
+ obj-$(CONFIG_MFD_ASIC3) += asic3.o tmio_core.o
++obj-$(CONFIG_MFD_SH_MOBILE_SDHI) += sh_mobile_sdhi.o
++obj-$(CONFIG_MFD_GLAMO) += glamo-core.o
+
+ obj-$(CONFIG_HTC_EGPIO) += htc-egpio.o
+ obj-$(CONFIG_HTC_PASIC3) += htc-pasic3.o
+@@ -68,7 +70,6 @@ obj-$(CONFIG_MFD_MAX8998) += max8998.o max8998-irq.o
+ pcf50633-objs := pcf50633-core.o pcf50633-irq.o
+ obj-$(CONFIG_MFD_PCF50633) += pcf50633.o
+ obj-$(CONFIG_PCF50633_ADC) += pcf50633-adc.o
+-obj-$(CONFIG_PCF50633_GPIO) += pcf50633-gpio.o
+ obj-$(CONFIG_ABX500_CORE) += abx500-core.o
+ obj-$(CONFIG_AB3100_CORE) += ab3100-core.o
+ obj-$(CONFIG_AB3100_OTP) += ab3100-otp.o
+diff --git a/drivers/mfd/glamo-core.c b/drivers/mfd/glamo-core.c
+new file mode 100644
+index 0000000..c9b2ae5
+--- /dev/null
++++ b/drivers/mfd/glamo-core.c
+@@ -0,0 +1,1274 @@
++/* Smedia Glamo 3362 driver
++ *
++ * (C) 2007 by Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * (C) 2009, Lars-Peter Clausen <lars@metafoo.de>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/string.h>
++#include <linux/mm.h>
++#include <linux/delay.h>
++#include <linux/init.h>
++#include <linux/irq.h>
++#include <linux/interrupt.h>
++#include <linux/workqueue.h>
++#include <linux/platform_device.h>
++#include <linux/kernel_stat.h>
++#include <linux/spinlock.h>
++#include <linux/mfd/core.h>
++#include <linux/mfd/glamo.h>
++#include <linux/mfd/glamo-regs.h>
++#include <linux/mfd/glamo-core.h>
++#include <linux/io.h>
++#include <linux/slab.h>
++#include <linux/debugfs.h>
++#include <linux/seq_file.h>
++#include <linux/uaccess.h>
++
++#include <linux/pm.h>
++
++#define GLAMO_MEM_REFRESH_COUNT 0x100
++
++#define GLAMO_NR_IRQS 9
++
++#define GLAMO_IRQ_HOSTBUS 0
++#define GLAMO_IRQ_JPEG 1
++#define GLAMO_IRQ_MPEG 2
++#define GLAMO_IRQ_MPROC1 3
++#define GLAMO_IRQ_MPROC0 4
++#define GLAMO_IRQ_CMDQUEUE 5
++#define GLAMO_IRQ_2D 6
++#define GLAMO_IRQ_MMC 7
++#define GLAMO_IRQ_RISC 8
++
++/*
++ * Glamo internal settings
++ *
++ * We run the memory interface from the faster PLLB on 2.6.28 kernels and
++ * above. Couple of GTA02 users report trouble with memory bus when they
++ * upgraded from 2.6.24. So this parameter allows reversion to 2.6.24
++ * scheme if their Glamo chip needs it.
++ *
++ * you can override the faster default on kernel commandline using
++ *
++ * glamo3362.slow_memory=1
++ *
++ * for example
++ */
++
++static int slow_memory;
++module_param(slow_memory, int, 0644);
++
++struct reg_range {
++ int start;
++ int count;
++ char *name;
++ unsigned dump:1;
++};
++
++static const struct reg_range reg_range[] = {
++ { 0x0000, 0x76, "General", 1 },
++ { 0x0200, 0x18, "Host Bus", 1 },
++ { 0x0300, 0x38, "Memory", 1 },
++/* { 0x0400, 0x100, "Sensor", 0 }, */
++/* { 0x0500, 0x300, "ISP", 0 }, */
++/* { 0x0800, 0x400, "JPEG", 0 }, */
++/* { 0x0c00, 0xcc, "MPEG", 0 }, */
++ { 0x1100, 0xb2, "LCD 1", 0 },
++ { 0x1200, 0x64, "LCD 2", 0 },
++ { 0x1400, 0x42, "MMC", 0 },
++/* { 0x1500, 0x080, "MPU 0", 0 },
++ { 0x1580, 0x080, "MPU 1", 0 },
++ { 0x1600, 0x080, "Cmd Queue", 0 },
++ { 0x1680, 0x080, "RISC CPU", 0 },*/
++ { 0x1700, 0x400, "2D Unit", 0 },
++/* { 0x1b00, 0x900, "3D Unit", 0 }, */
++};
++
++static inline void __reg_write(struct glamo_core *glamo,
++ uint16_t reg, uint16_t val)
++{
++ writew(val, glamo->base + reg);
++}
++
++void glamo_reg_write(struct glamo_core *glamo,
++ uint16_t reg, uint16_t val)
++{
++ spin_lock(&glamo->lock);
++ __reg_write(glamo, reg, val);
++ spin_unlock(&glamo->lock);
++}
++EXPORT_SYMBOL_GPL(glamo_reg_write);
++
++
++static inline uint16_t __reg_read(struct glamo_core *glamo,
++ uint16_t reg)
++{
++ return readw(glamo->base + reg);
++}
++
++uint16_t glamo_reg_read(struct glamo_core *glamo, uint16_t reg)
++{
++ uint16_t val;
++ spin_lock(&glamo->lock);
++ val = __reg_read(glamo, reg);
++ spin_unlock(&glamo->lock);
++
++ return val;
++}
++EXPORT_SYMBOL_GPL(glamo_reg_read);
++
++static void __reg_set_bit_mask(struct glamo_core *glamo,
++ uint16_t reg, uint16_t mask,
++ uint16_t val)
++{
++ uint16_t tmp;
++
++ val &= mask;
++
++ tmp = __reg_read(glamo, reg);
++ tmp &= ~mask;
++ tmp |= val;
++ __reg_write(glamo, reg, tmp);
++}
++
++static void reg_set_bit_mask(struct glamo_core *glamo,
++ uint16_t reg, uint16_t mask,
++ uint16_t val)
++{
++ spin_lock(&glamo->lock);
++ __reg_set_bit_mask(glamo, reg, mask, val);
++ spin_unlock(&glamo->lock);
++}
++
++static inline void __reg_set_bit(struct glamo_core *glamo,
++ uint16_t reg, uint16_t bit)
++{
++ uint16_t tmp;
++ tmp = __reg_read(glamo, reg);
++ tmp |= bit;
++ __reg_write(glamo, reg, tmp);
++}
++
++static inline void __reg_clear_bit(struct glamo_core *glamo,
++ uint16_t reg, uint16_t bit)
++{
++ uint16_t tmp;
++ tmp = __reg_read(glamo, reg);
++ tmp &= ~bit;
++ __reg_write(glamo, reg, tmp);
++}
++
++/***********************************************************************
++ * resources of sibling devices
++ ***********************************************************************/
++
++static struct resource glamo_fb_resources[] = {
++ {
++ .name = "glamo-fb-regs",
++ .start = GLAMO_REGOFS_LCD,
++ .end = GLAMO_REGOFS_MMC - 1,
++ .flags = IORESOURCE_MEM,
++ }, {
++ .name = "glamo-fb-mem",
++ .start = GLAMO_OFFSET_FB,
++ .end = GLAMO_OFFSET_FB + GLAMO_FB_SIZE - 1,
++ .flags = IORESOURCE_MEM,
++ },
++};
++
++static struct resource glamo_mmc_resources[] = {
++ {
++ .name = "glamo-mmc-regs",
++ .start = GLAMO_REGOFS_MMC,
++ .end = GLAMO_REGOFS_MPROC0 - 1,
++ .flags = IORESOURCE_MEM
++ }, {
++ .name = "glamo-mmc-mem",
++ .start = GLAMO_OFFSET_FB + GLAMO_FB_SIZE,
++ .end = GLAMO_OFFSET_FB + GLAMO_FB_SIZE +
++ GLAMO_MMC_BUFFER_SIZE - 1,
++ .flags = IORESOURCE_MEM
++ }, {
++ .start = GLAMO_IRQ_MMC,
++ .end = GLAMO_IRQ_MMC,
++ .flags = IORESOURCE_IRQ,
++ },
++};
++
++enum glamo_cells {
++ GLAMO_CELL_FB,
++ GLAMO_CELL_MMC,
++ GLAMO_CELL_GPIO,
++};
++
++static const struct mfd_cell glamo_cells[] = {
++ [GLAMO_CELL_FB] = {
++ .name = "glamo-fb",
++ .num_resources = ARRAY_SIZE(glamo_fb_resources),
++ .resources = glamo_fb_resources,
++ },
++ [GLAMO_CELL_MMC] = {
++ .name = "glamo-mci",
++ .num_resources = ARRAY_SIZE(glamo_mmc_resources),
++ .resources = glamo_mmc_resources,
++ },
++ [GLAMO_CELL_GPIO] = {
++ .name = "glamo-gpio",
++ },
++};
++
++/***********************************************************************
++ * IRQ demultiplexer
++ ***********************************************************************/
++static inline unsigned int glamo_irq_bit(struct glamo_core *glamo,
++ struct irq_data *data)
++{
++ return BIT(data->irq - glamo->irq_base);
++}
++
++static void glamo_ack_irq(struct irq_data *data)
++{
++ struct glamo_core *glamo = irq_data_get_irq_chip_data(data);
++ /* clear interrupt source */
++ __reg_write(glamo, GLAMO_REG_IRQ_CLEAR, glamo_irq_bit(glamo, data));
++}
++
++static void glamo_mask_irq(struct irq_data *data)
++{
++ struct glamo_core *glamo = irq_data_get_irq_chip_data(data);
++
++ /* clear bit in enable register */
++ __reg_clear_bit(glamo, GLAMO_REG_IRQ_ENABLE, glamo_irq_bit(glamo, data));
++}
++
++static void glamo_unmask_irq(struct irq_data *data)
++{
++ struct glamo_core *glamo = irq_data_get_irq_chip_data(data);
++
++ /* set bit in enable register */
++ __reg_set_bit(glamo, GLAMO_REG_IRQ_ENABLE, glamo_irq_bit(glamo, data));
++}
++
++static struct irq_chip glamo_irq_chip = {
++ .name = "glamo",
++ .irq_ack = glamo_ack_irq,
++ .irq_mask = glamo_mask_irq,
++ .irq_unmask = glamo_unmask_irq,
++};
++
++static irqreturn_t glamo_irq_handler(int irq, void *devid)
++{
++ struct glamo_core *glamo = devid;
++ uint16_t irqstatus;
++ int i;
++
++ irqstatus = __reg_read(glamo, GLAMO_REG_IRQ_STATUS);
++ for (i = 0; i < 9; ++i) {
++ if (irqstatus & BIT(i))
++ generic_handle_irq(glamo->irq_base + i);
++ }
++
++ return IRQ_HANDLED;
++}
++
++struct glamo_engine_reg_set {
++ uint16_t reg;
++ uint16_t mask_suspended;
++ uint16_t mask_enabled;
++};
++
++/*
++debugfs
++*/
++
++#ifdef CONFIG_DEBUG_FS
++static ssize_t debugfs_regs_write(struct file *file,
++ const char __user *user_buf,
++ size_t count, loff_t *ppos)
++{
++ struct glamo_core *glamo = ((struct seq_file *)file->private_data)->private;
++ char buf[14];
++ unsigned int reg;
++ unsigned int val;
++ int buf_size;
++
++ buf_size = min(count, sizeof(buf) - 1);
++ if (copy_from_user(buf, user_buf, buf_size))
++ return -EFAULT;
++ if (sscanf(buf, "%x %x", &reg, &val) != 2)
++ return -EFAULT;
++
++ dev_info(&glamo->pdev->dev, "reg %#02x <-- %#04x\n", reg, val);
++
++ glamo_reg_write(glamo, reg, val);
++
++ return count;
++}
++
++static int glamo_show_regs(struct seq_file *s, void *pos)
++{
++ struct glamo_core *glamo = s->private;
++ const struct reg_range *rr = reg_range;
++ int i, n;
++
++ spin_lock(&glamo->lock);
++ for (i = 0; i < ARRAY_SIZE(reg_range); ++i, ++rr) {
++ if (!rr->dump)
++ continue;
++ seq_printf(s, "\n%s\n", rr->name);
++ for (n = rr->start; n < rr->start + rr->count; n += 2) {
++ if ((n & 15) == 0)
++ seq_printf(s, "\n%04X: ", n);
++ seq_printf(s, "%04x ", __reg_read(glamo, n));
++ }
++ seq_printf(s, "\n");
++ }
++ spin_unlock(&glamo->lock);
++
++ return 0;
++}
++
++static int debugfs_open_file(struct inode *inode, struct file *file)
++{
++ return single_open(file, glamo_show_regs, inode->i_private);
++}
++
++static const struct file_operations debugfs_regs_ops = {
++ .open = debugfs_open_file,
++ .read = seq_read,
++ .llseek = seq_lseek,
++ .write = debugfs_regs_write,
++ .release = single_release,
++};
++
++static void glamo_init_debugfs(struct glamo_core *glamo)
++{
++ glamo->debugfs_dir = debugfs_create_dir("glamo3362", NULL);
++ if (glamo->debugfs_dir)
++ debugfs_create_file("regs", S_IRUGO | S_IWUSR,
++ glamo->debugfs_dir,
++ glamo, &debugfs_regs_ops);
++ else
++ dev_warn(&glamo->pdev->dev, "Failed to set up debugfs.\n");
++}
++
++static void glamo_exit_debugfs(struct glamo_core *glamo)
++{
++ if (glamo->debugfs_dir)
++ debugfs_remove_recursive(glamo->debugfs_dir);
++}
++#else
++static void glamo_init_debugfs(struct glamo_core *glamo)
++{
++}
++
++static void glamo_exit_debugfs(struct glamo_core *glamo)
++{
++}
++#endif
++
++struct glamo_engine_desc {
++ const char *name;
++ uint16_t hostbus;
++ const struct glamo_engine_reg_set *regs;
++ size_t num_regs;
++};
++
++static const struct glamo_engine_reg_set glamo_lcd_regs[] = {
++ { GLAMO_REG_CLOCK_LCD,
++ GLAMO_CLOCK_LCD_EN_M5CLK |
++ GLAMO_CLOCK_LCD_DG_M5CLK |
++ GLAMO_CLOCK_LCD_EN_DMCLK,
++
++ GLAMO_CLOCK_LCD_EN_DHCLK |
++ GLAMO_CLOCK_LCD_EN_DCLK
++ },
++ { GLAMO_REG_CLOCK_GEN5_1,
++ GLAMO_CLOCK_GEN51_EN_DIV_DMCLK,
++
++ GLAMO_CLOCK_GEN51_EN_DIV_DHCLK |
++ GLAMO_CLOCK_GEN51_EN_DIV_DCLK
++ }
++};
++
++static const struct glamo_engine_reg_set glamo_mmc_regs[] = {
++ { GLAMO_REG_CLOCK_MMC,
++ GLAMO_CLOCK_MMC_EN_M9CLK |
++ GLAMO_CLOCK_MMC_DG_M9CLK,
++
++ GLAMO_CLOCK_MMC_EN_TCLK |
++ GLAMO_CLOCK_MMC_DG_TCLK
++ },
++ { GLAMO_REG_CLOCK_GEN5_1,
++ 0,
++ GLAMO_CLOCK_GEN51_EN_DIV_TCLK
++ }
++};
++
++static const struct glamo_engine_reg_set glamo_2d_regs[] = {
++ { GLAMO_REG_CLOCK_2D,
++ GLAMO_CLOCK_2D_EN_M7CLK |
++ GLAMO_CLOCK_2D_DG_M7CLK,
++
++ GLAMO_CLOCK_2D_EN_GCLK |
++ GLAMO_CLOCK_2D_DG_GCLK
++ },
++ { GLAMO_REG_CLOCK_GEN5_1,
++ 0,
++ GLAMO_CLOCK_GEN51_EN_DIV_GCLK,
++ }
++};
++
++static const struct glamo_engine_reg_set glamo_cmdq_regs[] = {
++ { GLAMO_REG_CLOCK_2D,
++ GLAMO_CLOCK_2D_EN_M6CLK,
++ 0
++ },
++};
++
++#define GLAMO_ENGINE(xname, xhostbus, xregs) { \
++ .name = xname, \
++ .hostbus = xhostbus, \
++ .num_regs = ARRAY_SIZE(xregs), \
++ .regs = xregs, \
++}
++
++static const struct glamo_engine_desc glamo_engines[] = {
++ [GLAMO_ENGINE_LCD] = GLAMO_ENGINE("LCD", GLAMO_HOSTBUS2_MMIO_EN_LCD,
++ glamo_lcd_regs),
++ [GLAMO_ENGINE_MMC] = GLAMO_ENGINE("MMC", GLAMO_HOSTBUS2_MMIO_EN_MMC,
++ glamo_mmc_regs),
++ [GLAMO_ENGINE_2D] = GLAMO_ENGINE("2D", GLAMO_HOSTBUS2_MMIO_EN_2D,
++ glamo_2d_regs),
++ [GLAMO_ENGINE_CMDQ] = GLAMO_ENGINE("CMDQ", GLAMO_HOSTBUS2_MMIO_EN_CQ,
++ glamo_cmdq_regs),
++};
++
++static inline const char *glamo_engine_name(enum glamo_engine engine)
++{
++ return glamo_engines[engine].name;
++}
++
++/***********************************************************************
++ * 'engine' support
++ ***********************************************************************/
++
++int __glamo_engine_enable(struct glamo_core *glamo, enum glamo_engine engine)
++{
++ int i;
++ const struct glamo_engine_desc *engine_desc = &glamo_engines[engine];
++ const struct glamo_engine_reg_set *reg;
++
++ switch (engine) {
++ case GLAMO_ENGINE_LCD:
++ case GLAMO_ENGINE_MMC:
++ case GLAMO_ENGINE_2D:
++ case GLAMO_ENGINE_CMDQ:
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ reg = engine_desc->regs;
++
++ __reg_set_bit(glamo, GLAMO_REG_HOSTBUS(2),
++ engine_desc->hostbus);
++ for (i = engine_desc->num_regs; i; --i, ++reg)
++ __reg_set_bit(glamo, reg->reg,
++ reg->mask_suspended | reg->mask_enabled);
++
++ return 0;
++}
++
++int glamo_engine_enable(struct glamo_core *glamo, enum glamo_engine engine)
++{
++ int ret = 0;
++
++ spin_lock(&glamo->lock);
++
++ if (glamo->engine_state[engine] != GLAMO_ENGINE_ENABLED) {
++ ret = __glamo_engine_enable(glamo, engine);
++ if (!ret)
++ glamo->engine_state[engine] = GLAMO_ENGINE_ENABLED;
++ }
++
++ spin_unlock(&glamo->lock);
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(glamo_engine_enable);
++
++int __glamo_engine_disable(struct glamo_core *glamo, enum glamo_engine engine)
++{
++ int i;
++ const struct glamo_engine_desc *engine_desc = &glamo_engines[engine];
++ const struct glamo_engine_reg_set *reg;
++
++ switch (engine) {
++ case GLAMO_ENGINE_LCD:
++ case GLAMO_ENGINE_MMC:
++ case GLAMO_ENGINE_2D:
++ case GLAMO_ENGINE_CMDQ:
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ reg = engine_desc->regs;
++
++ __reg_clear_bit(glamo, GLAMO_REG_HOSTBUS(2),
++ engine_desc->hostbus);
++ for (i = engine_desc->num_regs; i; --i, ++reg)
++ __reg_clear_bit(glamo, reg->reg,
++ reg->mask_suspended | reg->mask_enabled);
++
++ return 0;
++}
++int glamo_engine_disable(struct glamo_core *glamo, enum glamo_engine engine)
++{
++ int ret = 0;
++
++ spin_lock(&glamo->lock);
++
++ if (glamo->engine_state[engine] != GLAMO_ENGINE_DISABLED) {
++ ret = __glamo_engine_disable(glamo, engine);
++ if (!ret)
++ glamo->engine_state[engine] = GLAMO_ENGINE_DISABLED;
++ }
++
++ spin_unlock(&glamo->lock);
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(glamo_engine_disable);
++
++int __glamo_engine_suspend(struct glamo_core *glamo, enum glamo_engine engine)
++{
++ int i;
++ const struct glamo_engine_desc *engine_desc = &glamo_engines[engine];
++ const struct glamo_engine_reg_set *reg;
++
++ switch (engine) {
++ case GLAMO_ENGINE_LCD:
++ case GLAMO_ENGINE_MMC:
++ case GLAMO_ENGINE_2D:
++ case GLAMO_ENGINE_CMDQ:
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ reg = engine_desc->regs;
++
++ __reg_set_bit(glamo, GLAMO_REG_HOSTBUS(2),
++ engine_desc->hostbus);
++ for (i = engine_desc->num_regs; i; --i, ++reg) {
++ __reg_set_bit(glamo, reg->reg, reg->mask_suspended);
++ __reg_clear_bit(glamo, reg->reg, reg->mask_enabled);
++ }
++
++ return 0;
++}
++
++int glamo_engine_suspend(struct glamo_core *glamo, enum glamo_engine engine)
++{
++ int ret = 0;
++
++ spin_lock(&glamo->lock);
++
++ if (glamo->engine_state[engine] != GLAMO_ENGINE_SUSPENDED) {
++ ret = __glamo_engine_suspend(glamo, engine);
++ if (!ret)
++ glamo->engine_state[engine] = GLAMO_ENGINE_SUSPENDED;
++ }
++
++ spin_unlock(&glamo->lock);
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(glamo_engine_suspend);
++
++static const struct glamo_script reset_regs[] = {
++ [GLAMO_ENGINE_LCD] = {
++ GLAMO_REG_CLOCK_LCD, GLAMO_CLOCK_LCD_RESET
++ },
++ [GLAMO_ENGINE_MMC] = {
++ GLAMO_REG_CLOCK_MMC, GLAMO_CLOCK_MMC_RESET
++ },
++ [GLAMO_ENGINE_CMDQ] = {
++ GLAMO_REG_CLOCK_2D, GLAMO_CLOCK_2D_CQ_RESET
++ },
++ [GLAMO_ENGINE_2D] = {
++ GLAMO_REG_CLOCK_2D, GLAMO_CLOCK_2D_RESET
++ },
++ [GLAMO_ENGINE_JPEG] = {
++ GLAMO_REG_CLOCK_JPEG, GLAMO_CLOCK_JPEG_RESET
++ },
++};
++
++void glamo_engine_reset(struct glamo_core *glamo, enum glamo_engine engine)
++{
++ uint16_t reg = reset_regs[engine].reg;
++ uint16_t val = reset_regs[engine].val;
++
++ if (engine >= ARRAY_SIZE(reset_regs)) {
++ dev_warn(&glamo->pdev->dev, "unknown engine %u ", engine);
++ return;
++ }
++
++ spin_lock(&glamo->lock);
++ __reg_set_bit(glamo, reg, val);
++ __reg_clear_bit(glamo, reg, val);
++ spin_unlock(&glamo->lock);
++}
++EXPORT_SYMBOL_GPL(glamo_engine_reset);
++
++int glamo_pll_rate(struct glamo_core *glamo,
++ enum glamo_pll pll)
++{
++ uint16_t reg;
++ unsigned int osci = glamo->pdata->osci_clock_rate;
++
++ switch (pll) {
++ case GLAMO_PLL1:
++ reg = __reg_read(glamo, GLAMO_REG_PLL_GEN1);
++ break;
++ case GLAMO_PLL2:
++ reg = __reg_read(glamo, GLAMO_REG_PLL_GEN3);
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ return (int)osci * (int)reg;
++}
++EXPORT_SYMBOL_GPL(glamo_pll_rate);
++
++int glamo_engine_reclock(struct glamo_core *glamo,
++ enum glamo_engine engine,
++ int hz)
++{
++ int pll;
++ uint16_t reg, mask, div;
++
++ if (!hz)
++ return -EINVAL;
++
++ switch (engine) {
++ case GLAMO_ENGINE_LCD:
++ pll = GLAMO_PLL1;
++ reg = GLAMO_REG_CLOCK_GEN7;
++ mask = 0xff;
++ break;
++ case GLAMO_ENGINE_MMC:
++ pll = GLAMO_PLL1;
++ reg = GLAMO_REG_CLOCK_GEN8;
++ mask = 0xff;
++ break;
++ default:
++ dev_warn(&glamo->pdev->dev,
++ "reclock of engine 0x%x not supported\n", engine);
++ return -EINVAL;
++ break;
++ }
++
++ pll = glamo_pll_rate(glamo, pll);
++
++ div = pll / hz;
++
++ if (div != 0 && pll / div <= hz)
++ --div;
++
++ if (div > mask)
++ div = mask;
++
++ dev_dbg(&glamo->pdev->dev,
++ "PLL %d, kHZ %d, div %d\n", pll, hz / 1000, div);
++
++ reg_set_bit_mask(glamo, reg, mask, div);
++ mdelay(5); /* wait some time to stabilize */
++
++ return pll / (div + 1);
++}
++EXPORT_SYMBOL_GPL(glamo_engine_reclock);
++
++/***********************************************************************
++ * script support
++ ***********************************************************************/
++
++#define GLAMO_SCRIPT_END 0xffff
++#define GLAMO_SCRIPT_WAIT 0xfffe
++#define GLAMO_SCRIPT_LOCK_PLL 0xfffd
++
++/*
++ * couple of people reported artefacts with 2.6.28 changes, this
++ * allows reversion to 2.6.24 settings
++*/
++static const uint16_t reg_0x200[] = {
++ 0xe03, /* 0 waits on Async BB R & W, Use PLL 2 for mem bus */
++ 0xef0, /* 3 waits on Async BB R & W, Use PLL 1 for mem bus */
++ 0xea0, /* 2 waits on Async BB R & W, Use PLL 1 for mem bus */
++ 0xe50, /* 1 waits on Async BB R & W, Use PLL 1 for mem bus */
++ 0xe00, /* 0 waits on Async BB R & W, Use PLL 1 for mem bus */
++ 0xef3, /* 3 waits on Async BB R & W, Use PLL 2 for mem bus */
++ 0xea3, /* 2 waits on Async BB R & W, Use PLL 2 for mem bus */
++ 0xe53, /* 1 waits on Async BB R & W, Use PLL 2 for mem bus */
++};
++
++static int glamo_run_script(struct glamo_core *glamo,
++ const struct glamo_script *script, int len,
++ int may_sleep)
++{
++ int i;
++ uint16_t status;
++ const struct glamo_script *line = script;
++
++ for (i = 0; i < len; ++i, ++line) {
++ switch (line->reg) {
++ case GLAMO_SCRIPT_END:
++ return 0;
++ case GLAMO_SCRIPT_WAIT:
++ if (may_sleep)
++ msleep(line->val);
++ else
++ mdelay(line->val * 4);
++ break;
++ case GLAMO_SCRIPT_LOCK_PLL:
++ /* spin until PLLs lock */
++ do {
++ status = __reg_read(glamo, GLAMO_REG_PLL_GEN5);
++ } while ((status & 3) != 3);
++ break;
++ case 0x200:
++ __reg_write(glamo, line->reg,
++ reg_0x200[slow_memory & 0x7]);
++ break;
++ default:
++ __reg_write(glamo, line->reg, line->val);
++ break;
++ }
++ }
++
++ return 0;
++}
++
++static const struct glamo_script glamo_init_script[] = {
++ { GLAMO_REG_CLOCK_HOST, 0x1000 },
++ { GLAMO_SCRIPT_WAIT, 2 },
++ { GLAMO_REG_CLOCK_MEMORY, 0x1000 },
++ { GLAMO_REG_CLOCK_MEMORY, 0x2000 },
++ { GLAMO_REG_CLOCK_LCD, 0x1000 },
++ { GLAMO_REG_CLOCK_MMC, 0x1000 },
++ { GLAMO_REG_CLOCK_ISP, 0x1000 },
++ { GLAMO_REG_CLOCK_ISP, 0x3000 },
++ { GLAMO_REG_CLOCK_JPEG, 0x1000 },
++ { GLAMO_REG_CLOCK_3D, 0x1000 },
++ { GLAMO_REG_CLOCK_3D, 0x3000 },
++ { GLAMO_REG_CLOCK_2D, 0x1000 },
++ { GLAMO_REG_CLOCK_2D, 0x3000 },
++ { GLAMO_REG_CLOCK_RISC1, 0x1000 },
++ { GLAMO_REG_CLOCK_MPEG, 0x1000 },
++ { GLAMO_REG_CLOCK_MPEG, 0x3000 },
++ { GLAMO_REG_CLOCK_MPROC, 0x1000 /*0x100f*/ },
++ { GLAMO_SCRIPT_WAIT, 2 },
++ { GLAMO_REG_CLOCK_HOST, 0x0000 },
++ { GLAMO_REG_CLOCK_MEMORY, 0x0000 },
++ { GLAMO_REG_CLOCK_LCD, 0x0000 },
++ { GLAMO_REG_CLOCK_MMC, 0x0000 },
++ { GLAMO_REG_PLL_GEN1, 0x05db }, /* 48MHz */
++ { GLAMO_REG_PLL_GEN3, 0x0aba }, /* 90MHz */
++ { GLAMO_SCRIPT_LOCK_PLL, 0 },
++ /*
++ * b9 of this register MUST be zero to get any interrupts on INT#
++ * the other set bits enable all the engine interrupt sources
++ */
++ { GLAMO_REG_IRQ_ENABLE, 0x0100 },
++ { GLAMO_REG_CLOCK_GEN6, 0x2000 },
++ { GLAMO_REG_CLOCK_GEN7, 0x0101 },
++ { GLAMO_REG_CLOCK_GEN8, 0x0100 },
++ { GLAMO_REG_CLOCK_HOST, 0x000d },
++ /*
++ * b7..b4 = 0 = no wait states on read or write
++ * b0 = 1 select PLL2 for Host interface, b1 = enable it
++ */
++ { GLAMO_REG_HOSTBUS(1), 0x0e03 /* this is replaced by script parser */ },
++ { GLAMO_REG_HOSTBUS(2), 0x07ff }, /* TODO: Disable all */
++ { GLAMO_REG_HOSTBUS(10), 0x0000 },
++ { GLAMO_REG_HOSTBUS(11), 0x4000 },
++ { GLAMO_REG_HOSTBUS(12), 0xf00e },
++
++ /* S-Media recommended "set tiling mode to 512 mode for memory access
++ * more efficiency when 640x480" */
++ { GLAMO_REG_MEM_TYPE, 0x0c74 }, /* 8MB, 16 word pg wr+rd */
++ { GLAMO_REG_MEM_GEN, 0xafaf }, /* 63 grants min + max */
++
++ { GLAMO_REG_MEM_TIMING1, 0x0108 },
++ { GLAMO_REG_MEM_TIMING2, 0x0010 }, /* Taa = 3 MCLK */
++ { GLAMO_REG_MEM_TIMING3, 0x0000 },
++ { GLAMO_REG_MEM_TIMING4, 0x0000 }, /* CE1# delay fall/rise */
++ { GLAMO_REG_MEM_TIMING5, 0x0000 }, /* UB# LB# */
++ { GLAMO_REG_MEM_TIMING6, 0x0000 }, /* OE# */
++ { GLAMO_REG_MEM_TIMING7, 0x0000 }, /* WE# */
++ { GLAMO_REG_MEM_TIMING8, 0x1002 }, /* MCLK delay, was 0x1000 */
++ { GLAMO_REG_MEM_TIMING9, 0x6006 },
++ { GLAMO_REG_MEM_TIMING10, 0x00ff },
++ { GLAMO_REG_MEM_TIMING11, 0x0001 },
++ { GLAMO_REG_MEM_POWER1, 0x0020 },
++ { GLAMO_REG_MEM_POWER2, 0x0000 },
++ { GLAMO_REG_MEM_DRAM1, 0x0000 },
++ { GLAMO_SCRIPT_WAIT, 1 },
++ { GLAMO_REG_MEM_DRAM1, 0xc100 },
++ { GLAMO_SCRIPT_WAIT, 1 },
++ { GLAMO_REG_MEM_DRAM1, 0xe100 },
++ { GLAMO_REG_MEM_DRAM2, 0x01d6 },
++ { GLAMO_REG_CLOCK_MEMORY, 0x000b },
++};
++
++/* Find out if we can support this version of the Glamo chip */
++static int __devinit glamo_supported(struct glamo_core *glamo)
++{
++ uint16_t dev_id, rev_id;
++
++ dev_id = __reg_read(glamo, GLAMO_REG_DEVICE_ID);
++ rev_id = __reg_read(glamo, GLAMO_REG_REVISION_ID);
++
++ switch (dev_id) {
++ case 0x3650:
++ switch (rev_id) {
++ case GLAMO_CORE_REV_A2:
++ break;
++ case GLAMO_CORE_REV_A0:
++ case GLAMO_CORE_REV_A1:
++ case GLAMO_CORE_REV_A3:
++ dev_warn(&glamo->pdev->dev, "untested core revision "
++ "%04x, your mileage may vary\n", rev_id);
++ break;
++ default:
++ dev_warn(&glamo->pdev->dev, "unknown glamo revision "
++ "%04x, your mileage may vary\n", rev_id);
++ }
++ break;
++ default:
++ dev_err(&glamo->pdev->dev, "unsupported Glamo device %04x\n",
++ dev_id);
++ return 0;
++ }
++
++ dev_dbg(&glamo->pdev->dev, "Detected Glamo core %04x Revision %04x "
++ "(%uHz CPU / %uHz Memory)\n", dev_id, rev_id,
++ glamo_pll_rate(glamo, GLAMO_PLL1),
++ glamo_pll_rate(glamo, GLAMO_PLL2));
++
++ return 1;
++}
++
++static int __devinit glamo_probe(struct platform_device *pdev)
++{
++ int ret = 0, n, irq, irq_base;
++ struct glamo_core *glamo;
++ struct resource *mem;
++
++ glamo = kmalloc(GFP_KERNEL, sizeof(*glamo));
++ if (!glamo)
++ return -ENOMEM;
++
++ for (n = 0; n < __NUM_GLAMO_ENGINES; n++)
++ glamo->engine_state[n] = GLAMO_ENGINE_DISABLED;
++
++ spin_lock_init(&glamo->lock);
++
++ glamo->pdev = pdev;
++ mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ glamo->irq = platform_get_irq(pdev, 0);
++ glamo->pdata = pdev->dev.platform_data;
++
++ if (glamo->irq < 0) {
++ ret = glamo->irq;
++ dev_err(&pdev->dev, "Failed to get platform irq: %d\n", ret);
++ goto err_free;
++ }
++
++ if (!mem) {
++ dev_err(&pdev->dev, "Failed to get platform memory\n");
++ ret = -ENOENT;
++ goto err_free;
++ }
++
++ if (!glamo->pdata) {
++ dev_err(&pdev->dev, "Missing platform data\n");
++ ret = -ENOENT;
++ goto err_free;
++ }
++
++ irq_base = irq_alloc_descs(-1, 0, GLAMO_NR_IRQS, 0);
++ if (irq_base < 0) {
++ dev_err(&pdev->dev, "Failed to allocate irqs: %d\n", irq_base);
++ goto err_free;
++ }
++ glamo->irq_base = irq_base;
++
++
++ /* only request the generic, hostbus and memory controller registers */
++ glamo->mem = request_mem_region(mem->start, GLAMO_REGOFS_VIDCAP,
++ pdev->name);
++
++ if (!glamo->mem) {
++ dev_err(&pdev->dev, "Failed to request io memory region\n");
++ ret = -ENOENT;
++ goto err_irq_free_descs;
++ }
++
++ glamo->base = ioremap(glamo->mem->start, resource_size(glamo->mem));
++ if (!glamo->base) {
++ dev_err(&pdev->dev, "Failed to ioremap() memory region\n");
++ goto err_release_mem_region;
++ }
++
++ /* confirm it isn't insane version */
++ if (!glamo_supported(glamo)) {
++ dev_err(&pdev->dev,
++ "This version of the Glamo is not supported\n");
++ goto err_iounmap;
++ }
++
++ platform_set_drvdata(pdev, glamo);
++
++ /* debugfs */
++ glamo_init_debugfs(glamo);
++
++ /* init the chip with canned register set */
++ glamo_run_script(glamo, glamo_init_script,
++ ARRAY_SIZE(glamo_init_script), 1);
++
++ /*
++ * finally set the mfd interrupts up
++ */
++ for (irq = irq_base; irq < irq_base + GLAMO_NR_IRQS; ++irq) {
++#ifdef CONFIG_ARM
++ set_irq_flags(irq, IRQF_VALID);
++#else
++ irq_set_noprobe(irq);
++#endif
++ irq_set_chip_data(irq, glamo);
++ irq_set_chip_and_handler(irq, &glamo_irq_chip,
++ handle_level_irq);
++ }
++
++ ret = request_any_context_irq(glamo->irq, glamo_irq_handler,
++ IRQF_TRIGGER_FALLING, "glamo irq demux", glamo);
++ if (ret) {
++ dev_err(&pdev->dev, "Failed to request irq: %d\n", ret);
++ goto err_free_irqs;
++ }
++
++ ret = mfd_add_devices(&pdev->dev, pdev->id, glamo_cells,
++ ARRAY_SIZE(glamo_cells), mem, glamo->irq_base);
++
++ if (ret) {
++ dev_err(&pdev->dev, "Failed to add child devices: %d\n", ret);
++ goto err_free_irq;
++ }
++
++ dev_info(&glamo->pdev->dev, "Glamo core PLL1: %uHz, PLL2: %uHz\n",
++ glamo_pll_rate(glamo, GLAMO_PLL1),
++ glamo_pll_rate(glamo, GLAMO_PLL2));
++
++ return 0;
++
++err_free_irq:
++ free_irq(glamo->irq, glamo);
++err_free_irqs:
++ for (irq = irq_base; irq < irq_base + GLAMO_NR_IRQS; ++irq) {
++ irq_set_chip(irq, NULL);
++#ifdef CONFIG_ARM
++ set_irq_flags(irq, 0);
++#else
++ irq_set_probe(irq);
++#endif
++ irq_set_chip_data(irq, NULL);
++ }
++err_iounmap:
++ iounmap(glamo->base);
++err_release_mem_region:
++ release_mem_region(glamo->mem->start, resource_size(glamo->mem));
++err_irq_free_descs:
++ irq_free_descs(irq_base, GLAMO_NR_IRQS);
++err_free:
++ platform_set_drvdata(pdev, NULL);
++ kfree(glamo);
++
++ return ret;
++}
++
++static int __devexit glamo_remove(struct platform_device *pdev)
++{
++ struct glamo_core *glamo = platform_get_drvdata(pdev);
++ int irq;
++ int irq_base = glamo->irq_base;
++
++ glamo_exit_debugfs(glamo);
++
++ mfd_remove_devices(&pdev->dev);
++
++ free_irq(glamo->irq, glamo);
++
++ for (irq = irq_base; irq < irq_base + GLAMO_NR_IRQS; ++irq) {
++#ifdef CONFIG_ARM
++ set_irq_flags(irq, 0);
++#else
++ irq_set_noprobe();
++#endif
++ irq_set_chip(irq, NULL);
++ irq_set_chip_data(irq, NULL);
++ }
++
++ platform_set_drvdata(pdev, NULL);
++ iounmap(glamo->base);
++ release_mem_region(glamo->mem->start, resource_size(glamo->mem));
++ irq_free_descs(irq_base, GLAMO_NR_IRQS);
++ kfree(glamo);
++
++ return 0;
++}
++
++#ifdef CONFIG_PM
++#if 0
++static struct glamo_script glamo_resume_script[] = {
++
++ { GLAMO_REG_PLL_GEN1, 0x05db }, /* 48MHz */
++ { GLAMO_REG_PLL_GEN3, 0x0aba }, /* 90MHz */
++ { GLAMO_REG_DFT_GEN6, 1 },
++ { 0xfffe, 100 },
++ { 0xfffd, 0 },
++ { 0x200, 0x0e03 },
++
++ /*
++ * b9 of this register MUST be zero to get any interrupts on INT#
++ * the other set bits enable all the engine interrupt sources
++ */
++ { GLAMO_REG_IRQ_ENABLE, 0x01ff },
++ { GLAMO_REG_CLOCK_HOST, 0x0018 },
++ { GLAMO_REG_CLOCK_GEN5_1, 0x18b1 },
++
++ { GLAMO_REG_MEM_DRAM1, 0x0000 },
++ { 0xfffe, 1 },
++ { GLAMO_REG_MEM_DRAM1, 0xc100 },
++ { 0xfffe, 1 },
++ { GLAMO_REG_MEM_DRAM1, 0xe100 },
++ { GLAMO_REG_MEM_DRAM2, 0x01d6 },
++ { GLAMO_REG_CLOCK_MEMORY, 0x000b },
++};
++#endif
++
++#if 0
++static void glamo_power(struct glamo_core *glamo)
++{
++ unsigned long flags;
++
++ spin_lock_irqsave(&glamo->lock, flags);
++
++ /*
++Power management
++static const REG_VALUE_MASK_TYPE reg_powerOn[] =
++{
++ { REG_GEN_DFT6, REG_BIT_ALL, REG_DATA(1u << 0) },
++ { REG_GEN_PLL3, 0u, REG_DATA(1u << 13) },
++ { REG_GEN_MEM_CLK, REG_BIT_ALL, REG_BIT_EN_MOCACLK },
++ { REG_MEM_DRAM2, 0u, REG_BIT_EN_DEEP_POWER_DOWN },
++ { REG_MEM_DRAM1, 0u, REG_BIT_SELF_REFRESH }
++};
++
++static const REG_VALUE_MASK_TYPE reg_powerStandby[] =
++{
++ { REG_MEM_DRAM1, REG_BIT_ALL, REG_BIT_SELF_REFRESH },
++ { REG_GEN_MEM_CLK, 0u, REG_BIT_EN_MOCACLK },
++ { REG_GEN_PLL3, REG_BIT_ALL, REG_DATA(1u << 13) },
++ { REG_GEN_DFT5, REG_BIT_ALL, REG_DATA(1u << 0) }
++};
++
++static const REG_VALUE_MASK_TYPE reg_powerSuspend[] =
++{
++ { REG_MEM_DRAM2, REG_BIT_ALL, REG_BIT_EN_DEEP_POWER_DOWN },
++ { REG_GEN_MEM_CLK, 0u, REG_BIT_EN_MOCACLK },
++ { REG_GEN_PLL3, REG_BIT_ALL, REG_DATA(1u << 13) },
++ { REG_GEN_DFT5, REG_BIT_ALL, REG_DATA(1u << 0) }
++};
++*/
++ switch (new_state) {
++ case GLAMO_POWER_ON:
++
++ /*
++ * glamo state on resume is nondeterministic in some
++ * fundamental way, it has also been observed that the
++ * Glamo reset pin can get asserted by, eg, touching it with
++ * a scope probe. So the only answer is to roll with it and
++ * force an external reset on the Glamo during resume.
++ */
++
++
++ break;
++
++ case GLAMO_POWER_SUSPEND:
++
++ break;
++ }
++ spin_unlock_irqrestore(&glamo->lock, flags);
++}
++#endif
++
++static int glamo_suspend(struct device *dev)
++{
++ struct glamo_core *glamo = dev_get_drvdata(dev);
++ int n;
++
++ spin_lock(&glamo->lock);
++
++ glamo->saved_irq_mask = __reg_read(glamo, GLAMO_REG_IRQ_ENABLE);
++
++ /* nuke interrupts */
++ __reg_write(glamo, GLAMO_REG_IRQ_ENABLE, 0x200);
++
++ /* take down each engine before we kill mem and pll */
++ for (n = 0; n < __NUM_GLAMO_ENGINES; n++) {
++ if (glamo->engine_state[n] != GLAMO_ENGINE_DISABLED)
++ __glamo_engine_disable(glamo, n);
++ }
++
++ /* enable self-refresh */
++
++ __reg_write(glamo, GLAMO_REG_MEM_DRAM1,
++ GLAMO_MEM_DRAM1_EN_DRAM_REFRESH |
++ GLAMO_MEM_DRAM1_EN_GATE_CKE |
++ GLAMO_MEM_DRAM1_SELF_REFRESH |
++ GLAMO_MEM_REFRESH_COUNT);
++ __reg_write(glamo, GLAMO_REG_MEM_DRAM1,
++ GLAMO_MEM_DRAM1_EN_MODEREG_SET |
++ GLAMO_MEM_DRAM1_EN_DRAM_REFRESH |
++ GLAMO_MEM_DRAM1_EN_GATE_CKE |
++ GLAMO_MEM_DRAM1_SELF_REFRESH |
++ GLAMO_MEM_REFRESH_COUNT);
++
++ /* force RAM into deep powerdown */
++ __reg_write(glamo, GLAMO_REG_MEM_DRAM2,
++ GLAMO_MEM_DRAM2_DEEP_PWRDOWN |
++ (7 << 6) | /* tRC */
++ (1 << 4) | /* tRP */
++ (1 << 2) | /* tRCD */
++ 2); /* CAS latency */
++
++ /* disable clocks to memory */
++ __reg_write(glamo, GLAMO_REG_CLOCK_MEMORY, 0);
++
++ /* all dividers from OSCI */
++ __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_GEN5_1, 0x400, 0x400);
++
++ /* PLL2 into bypass */
++ __reg_set_bit_mask(glamo, GLAMO_REG_PLL_GEN3, 1 << 12, 1 << 12);
++
++ __reg_write(glamo, GLAMO_BASIC_MMC_EN_TCLK_DLYA1, 0x0e00);
++
++ /* kill PLLS 1 then 2 */
++ __reg_write(glamo, GLAMO_REG_DFT_GEN5, 0x0001);
++ __reg_set_bit_mask(glamo, GLAMO_REG_PLL_GEN3, 1 << 13, 1 << 13);
++
++ spin_unlock(&glamo->lock);
++
++ return 0;
++}
++
++static int glamo_resume(struct device *dev)
++{
++ struct glamo_core *glamo = dev_get_drvdata(dev);
++ int n;
++
++ (glamo->pdata->glamo_external_reset)(0);
++ udelay(10);
++ (glamo->pdata->glamo_external_reset)(1);
++ mdelay(5);
++
++ spin_lock(&glamo->lock);
++
++ glamo_run_script(glamo, glamo_init_script,
++ ARRAY_SIZE(glamo_init_script), 0);
++
++
++ for (n = 0; n < __NUM_GLAMO_ENGINES; n++) {
++ switch (glamo->engine_state[n]) {
++ case GLAMO_ENGINE_SUSPENDED:
++ __glamo_engine_suspend(glamo, n);
++ break;
++ case GLAMO_ENGINE_ENABLED:
++ __glamo_engine_enable(glamo, n);
++ break;
++ default:
++ break;
++ }
++ }
++
++ __reg_write(glamo, GLAMO_REG_IRQ_ENABLE, glamo->saved_irq_mask);
++
++ spin_unlock(&glamo->lock);
++
++ return 0;
++}
++
++static const struct dev_pm_ops glamo_pm_ops = {
++ .suspend = glamo_suspend,
++ .resume = glamo_resume,
++ .poweroff = glamo_suspend,
++ .restore = glamo_resume,
++};
++
++#define GLAMO_PM_OPS (&glamo_pm_ops)
++
++#else
++#define GLAMO_PM_OPS NULL
++#endif
++
++static struct platform_driver glamo_driver = {
++ .probe = glamo_probe,
++ .remove = __devexit_p(glamo_remove),
++ .driver = {
++ .name = "glamo3362",
++ .owner = THIS_MODULE,
++ .pm = GLAMO_PM_OPS,
++ },
++};
++
++static int __init glamo_init(void)
++{
++ return platform_driver_register(&glamo_driver);
++}
++module_init(glamo_init);
++
++static void __exit glamo_exit(void)
++{
++ platform_driver_unregister(&glamo_driver);
++}
++module_exit(glamo_exit);
++
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
++MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
++MODULE_DESCRIPTION("Smedia Glamo 3362 core/resource driver");
++MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:glamo3362");
+diff --git a/drivers/mfd/pcf50633-adc.c b/drivers/mfd/pcf50633-adc.c
+index aed0d2a..54a78c1 100644
+--- a/drivers/mfd/pcf50633-adc.c
++++ b/drivers/mfd/pcf50633-adc.c
+@@ -24,6 +24,8 @@
+ #include <linux/platform_device.h>
+ #include <linux/completion.h>
+
++#include <linux/interrupt.h>
++
+ #include <linux/mfd/pcf50633/core.h>
+ #include <linux/mfd/pcf50633/adc.h>
+
+@@ -49,13 +51,9 @@ struct pcf50633_adc {
+ int queue_head;
+ int queue_tail;
+ struct mutex queue_mutex;
++ int irq;
+ };
+
+-static inline struct pcf50633_adc *__to_adc(struct pcf50633 *pcf)
+-{
+- return platform_get_drvdata(pcf->adc_pdev);
+-}
+-
+ static void adc_setup(struct pcf50633 *pcf, int channel, int avg)
+ {
+ channel &= PCF50633_ADCC1_ADCMUX_MASK;
+@@ -71,7 +69,7 @@ static void adc_setup(struct pcf50633 *pcf, int channel, int avg)
+
+ static void trigger_next_adc_job_if_any(struct pcf50633 *pcf)
+ {
+- struct pcf50633_adc *adc = __to_adc(pcf);
++ struct pcf50633_adc *adc = pcf->adc;
+ int head;
+
+ head = adc->queue_head;
+@@ -85,7 +83,7 @@ static void trigger_next_adc_job_if_any(struct pcf50633 *pcf)
+ static int
+ adc_enqueue_request(struct pcf50633 *pcf, struct pcf50633_adc_request *req)
+ {
+- struct pcf50633_adc *adc = __to_adc(pcf);
++ struct pcf50633_adc *adc = pcf->adc;
+ int head, tail;
+
+ mutex_lock(&adc->queue_mutex);
+@@ -170,7 +168,7 @@ static int adc_result(struct pcf50633 *pcf)
+ return result;
+ }
+
+-static void pcf50633_adc_irq(int irq, void *data)
++static irqreturn_t pcf50633_adc_irq(int irq, void *data)
+ {
+ struct pcf50633_adc *adc = data;
+ struct pcf50633 *pcf = adc->pcf;
+@@ -184,7 +182,7 @@ static void pcf50633_adc_irq(int irq, void *data)
+ if (WARN_ON(!req)) {
+ dev_err(pcf->dev, "pcf50633-adc irq: ADC queue empty!\n");
+ mutex_unlock(&adc->queue_mutex);
+- return;
++ return IRQ_HANDLED;
+ }
+ adc->queue[head] = NULL;
+ adc->queue_head = (head + 1) &
+@@ -197,25 +195,49 @@ static void pcf50633_adc_irq(int irq, void *data)
+
+ req->callback(pcf, req->callback_param, res);
+ kfree(req);
++
++ return IRQ_HANDLED;
+ }
+
+ static int __devinit pcf50633_adc_probe(struct platform_device *pdev)
+ {
++ struct pcf50633 *pcf = dev_to_pcf50633(pdev->dev.parent);
+ struct pcf50633_adc *adc;
++ int irq;
++ int ret;
+
+ adc = kzalloc(sizeof(*adc), GFP_KERNEL);
+ if (!adc)
+ return -ENOMEM;
+
+- adc->pcf = dev_to_pcf50633(pdev->dev.parent);
++ adc->pcf = pcf;
+ platform_set_drvdata(pdev, adc);
+
+- pcf50633_register_irq(adc->pcf, PCF50633_IRQ_ADCRDY,
+- pcf50633_adc_irq, adc);
++ irq = platform_get_irq(pdev, 0);
++ if (irq <= 0) {
++ ret = irq;
++ dev_err(&pdev->dev, "Failed to get irq: %d\n", ret);
++ goto err_free;
++ }
+
+ mutex_init(&adc->queue_mutex);
+
++ ret = request_threaded_irq(irq, NULL, pcf50633_adc_irq, 0,
++ dev_name(&pdev->dev), adc);
++ if (ret) {
++ dev_err(&pdev->dev, "Failed to request irq: %d\n", ret);
++ goto err_free;
++ }
++
++ adc->irq = irq;
++
++ pcf->adc = adc;
++
+ return 0;
++
++err_free:
++ kfree(adc);
++ return ret;
+ }
+
+ static int __devexit pcf50633_adc_remove(struct platform_device *pdev)
+@@ -223,7 +245,9 @@ static int __devexit pcf50633_adc_remove(struct platform_device *pdev)
+ struct pcf50633_adc *adc = platform_get_drvdata(pdev);
+ int i, head;
+
+- pcf50633_free_irq(adc->pcf, PCF50633_IRQ_ADCRDY);
++ adc->pcf->adc = NULL;
++
++ free_irq(adc->irq, adc);
+
+ mutex_lock(&adc->queue_mutex);
+ head = adc->queue_head;
+diff --git a/drivers/mfd/pcf50633-core.c b/drivers/mfd/pcf50633-core.c
+index 57868416..165a3f3 100644
+--- a/drivers/mfd/pcf50633-core.c
++++ b/drivers/mfd/pcf50633-core.c
+@@ -24,6 +24,8 @@
+ #include <linux/pm.h>
+ #include <linux/slab.h>
+
++#include <linux/mfd/core.h>
++
+ #include <linux/mfd/pcf50633/core.h>
+
+ static int __pcf50633_read(struct pcf50633 *pcf, u8 reg, int num, u8 *data)
+@@ -51,7 +53,7 @@ static int __pcf50633_write(struct pcf50633 *pcf, u8 reg, int num, u8 *data)
+
+ }
+
+-/* Read a block of up to 32 regs */
++/* Read a block of upto 32 regs */
+ int pcf50633_read_block(struct pcf50633 *pcf, u8 reg,
+ int nr_regs, u8 *data)
+ {
+@@ -65,7 +67,7 @@ int pcf50633_read_block(struct pcf50633 *pcf, u8 reg,
+ }
+ EXPORT_SYMBOL_GPL(pcf50633_read_block);
+
+-/* Write a block of up to 32 regs */
++/* Write a block of upto 32 regs */
+ int pcf50633_write_block(struct pcf50633 *pcf , u8 reg,
+ int nr_regs, u8 *data)
+ {
+@@ -209,27 +211,6 @@ static struct attribute_group pcf_attr_group = {
+ .attrs = pcf_sysfs_entries,
+ };
+
+-static void
+-pcf50633_client_dev_register(struct pcf50633 *pcf, const char *name,
+- struct platform_device **pdev)
+-{
+- int ret;
+-
+- *pdev = platform_device_alloc(name, -1);
+- if (!*pdev) {
+- dev_err(pcf->dev, "Falied to allocate %s\n", name);
+- return;
+- }
+-
+- (*pdev)->dev.parent = pcf->dev;
+-
+- ret = platform_device_add(*pdev);
+- if (ret) {
+- dev_err(pcf->dev, "Failed to register %s: %d\n", name, ret);
+- platform_device_put(*pdev);
+- *pdev = NULL;
+- }
+-}
+
+ #ifdef CONFIG_PM_SLEEP
+ static int pcf50633_suspend(struct device *dev)
+@@ -251,12 +232,166 @@ static int pcf50633_resume(struct device *dev)
+
+ static SIMPLE_DEV_PM_OPS(pcf50633_pm, pcf50633_suspend, pcf50633_resume);
+
++#define PCF50633_CELL(_name) \
++ { \
++ .name = _name, \
++ .id = -1, \
++ } \
++
++#define PCF50633_CELL_RESOURCES(_name, _resources) \
++ { \
++ .name = _name, \
++ .num_resources = ARRAY_SIZE(_resources), \
++ .resources = _resources, \
++ .id = -1, \
++ } \
++
++#define PCF50633_CELL_ID(_name, _id) \
++ { \
++ .name = _name, \
++ .id = _id, \
++ } \
++
++static struct resource pcf50633_adc_resources[] = {
++ {
++ .start = PCF50633_IRQ_ADCRDY,
++ .end = PCF50633_IRQ_ADCRDY,
++ .flags = IORESOURCE_IRQ,
++ .name = "ADCRDY",
++ }
++};
++
++static struct resource pcf50633_input_resources[] = {
++ {
++ .start = PCF50633_IRQ_ONKEYR,
++ .end = PCF50633_IRQ_ONKEYR,
++ .flags = IORESOURCE_IRQ,
++ .name = "ONKEYR",
++ },
++ {
++ .start = PCF50633_IRQ_ONKEYF,
++ .end = PCF50633_IRQ_ONKEYF,
++ .flags = IORESOURCE_IRQ,
++ .name = "ONKEYF",
++ }
++};
++
++static struct resource pcf50633_rtc_resources[] = {
++ {
++ .start = PCF50633_IRQ_ALARM,
++ .end = PCF50633_IRQ_ALARM,
++ .flags = IORESOURCE_IRQ,
++ .name = "ALARM",
++ },
++ {
++ .start = PCF50633_IRQ_SECOND,
++ .end = PCF50633_IRQ_SECOND,
++ .flags = IORESOURCE_IRQ,
++ .name = "SECOND",
++ }
++};
++
++static struct resource pcf50633_mbc_resources[] = {
++ {
++ .start = PCF50633_IRQ_ADPINS,
++ .end = PCF50633_IRQ_ADPINS,
++ .flags = IORESOURCE_IRQ,
++ .name = "ADPINS",
++ },
++ {
++ .start = PCF50633_IRQ_ADPREM,
++ .end = PCF50633_IRQ_ADPREM,
++ .flags = IORESOURCE_IRQ,
++ .name = "ADPREM",
++ },
++ {
++ .start = PCF50633_IRQ_USBINS,
++ .end = PCF50633_IRQ_USBINS,
++ .flags = IORESOURCE_IRQ,
++ .name = "USBINS",
++ },
++ {
++ .start = PCF50633_IRQ_USBREM,
++ .end = PCF50633_IRQ_USBREM,
++ .flags = IORESOURCE_IRQ,
++ .name = "USBREM",
++ },
++ {
++ .start = PCF50633_IRQ_BATFULL,
++ .end = PCF50633_IRQ_BATFULL,
++ .flags = IORESOURCE_IRQ,
++ .name = "BATFULL",
++ },
++ {
++ .start = PCF50633_IRQ_CHGHALT,
++ .end = PCF50633_IRQ_CHGHALT,
++ .flags = IORESOURCE_IRQ,
++ .name = "CHGHALT",
++ },
++ {
++ .start = PCF50633_IRQ_THLIMON,
++ .end = PCF50633_IRQ_THLIMON,
++ .flags = IORESOURCE_IRQ,
++ .name = "THLIMON",
++ },
++ {
++ .start = PCF50633_IRQ_THLIMOFF,
++ .end = PCF50633_IRQ_THLIMOFF,
++ .flags = IORESOURCE_IRQ,
++ .name = "THLIMOFF",
++ },
++ {
++ .start = PCF50633_IRQ_USBLIMON,
++ .end = PCF50633_IRQ_USBLIMON,
++ .flags = IORESOURCE_IRQ,
++ .name = "USBLIMON",
++ },
++ {
++ .start = PCF50633_IRQ_USBLIMOFF,
++ .end = PCF50633_IRQ_USBLIMOFF,
++ .flags = IORESOURCE_IRQ,
++ .name = "USBLIMOFF",
++ },
++ {
++ .start = PCF50633_IRQ_LOWSYS,
++ .end = PCF50633_IRQ_LOWSYS,
++ .flags = IORESOURCE_IRQ,
++ .name = "LOWSYS",
++ },
++ {
++ .start = PCF50633_IRQ_LOWBAT,
++ .end = PCF50633_IRQ_LOWBAT,
++ .flags = IORESOURCE_IRQ,
++ .name = "LOWBAT",
++ },
++};
++
++static struct mfd_cell pcf50633_cells[] = {
++ PCF50633_CELL_RESOURCES("pcf50633-input", pcf50633_input_resources),
++ PCF50633_CELL_RESOURCES("pcf50633-rtc", pcf50633_rtc_resources),
++ PCF50633_CELL_RESOURCES("pcf50633-mbc", pcf50633_mbc_resources),
++ PCF50633_CELL_RESOURCES("pcf50633-adc", pcf50633_adc_resources),
++ PCF50633_CELL("pcf50633-backlight"),
++ PCF50633_CELL("pcf50633-gpio"),
++ PCF50633_CELL_ID("pcf50633-regltr", 0),
++ PCF50633_CELL_ID("pcf50633-regltr", 1),
++ PCF50633_CELL_ID("pcf50633-regltr", 2),
++ PCF50633_CELL_ID("pcf50633-regltr", 3),
++ PCF50633_CELL_ID("pcf50633-regltr", 4),
++ PCF50633_CELL_ID("pcf50633-regltr", 5),
++ PCF50633_CELL_ID("pcf50633-regltr", 6),
++ PCF50633_CELL_ID("pcf50633-regltr", 7),
++ PCF50633_CELL_ID("pcf50633-regltr", 8),
++ PCF50633_CELL_ID("pcf50633-regltr", 9),
++ PCF50633_CELL_ID("pcf50633-regltr", 10),
++};
++
+ static int __devinit pcf50633_probe(struct i2c_client *client,
+ const struct i2c_device_id *ids)
+ {
+ struct pcf50633 *pcf;
+ struct pcf50633_platform_data *pdata = client->dev.platform_data;
+- int i, ret;
++ int ret;
+ int version, variant;
+
+ if (!client->irq) {
+@@ -287,36 +422,15 @@ static int __devinit pcf50633_probe(struct i2c_client *client,
+ dev_info(pcf->dev, "Probed device version %d variant %d\n",
+ version, variant);
+
+- pcf50633_irq_init(pcf, client->irq);
+-
+- /* Create sub devices */
+- pcf50633_client_dev_register(pcf, "pcf50633-input",
+- &pcf->input_pdev);
+- pcf50633_client_dev_register(pcf, "pcf50633-rtc",
+- &pcf->rtc_pdev);
+- pcf50633_client_dev_register(pcf, "pcf50633-mbc",
+- &pcf->mbc_pdev);
+- pcf50633_client_dev_register(pcf, "pcf50633-adc",
+- &pcf->adc_pdev);
+- pcf50633_client_dev_register(pcf, "pcf50633-backlight",
+- &pcf->bl_pdev);
+-
+-
+- for (i = 0; i < PCF50633_NUM_REGULATORS; i++) {
+- struct platform_device *pdev;
+-
+- pdev = platform_device_alloc("pcf50633-regltr", i);
+- if (!pdev) {
+- dev_err(pcf->dev, "Cannot create regulator %d\n", i);
+- continue;
+- }
+-
+- pdev->dev.parent = pcf->dev;
+- platform_device_add_data(pdev, &pdata->reg_init_data[i],
+- sizeof(pdata->reg_init_data[i]));
+- pcf->regulator_pdev[i] = pdev;
++ ret = pcf50633_irq_init(pcf, client->irq);
++ if (ret)
++ goto err_free;
+
+- platform_device_add(pdev);
++ ret = mfd_add_devices(pcf->dev, 0, pcf50633_cells,
++ ARRAY_SIZE(pcf50633_cells), NULL, pcf->irq_base);
++ if (ret) {
++ dev_err(pcf->dev, "Failed to add mfd cells.\n");
++ goto err_irq_free;
+ }
+
+ ret = sysfs_create_group(&client->dev.kobj, &pcf_attr_group);
+@@ -328,6 +442,8 @@ static int __devinit pcf50633_probe(struct i2c_client *client,
+
+ return 0;
+
++err_irq_free:
++ pcf50633_irq_free(pcf);
+ err_free:
+ kfree(pcf);
+
+@@ -337,19 +453,12 @@ err_free:
+ static int __devexit pcf50633_remove(struct i2c_client *client)
+ {
+ struct pcf50633 *pcf = i2c_get_clientdata(client);
+- int i;
+
+ sysfs_remove_group(&client->dev.kobj, &pcf_attr_group);
+- pcf50633_irq_free(pcf);
+
+- platform_device_unregister(pcf->input_pdev);
+- platform_device_unregister(pcf->rtc_pdev);
+- platform_device_unregister(pcf->mbc_pdev);
+- platform_device_unregister(pcf->adc_pdev);
+- platform_device_unregister(pcf->bl_pdev);
++ mfd_remove_devices(pcf->dev);
+
+- for (i = 0; i < PCF50633_NUM_REGULATORS; i++)
+- platform_device_unregister(pcf->regulator_pdev[i]);
++ pcf50633_irq_free(pcf);
+
+ kfree(pcf);
+
+diff --git a/drivers/mfd/pcf50633-gpio.c b/drivers/mfd/pcf50633-gpio.c
+deleted file mode 100644
+index 9ab19a8..0000000
+--- a/drivers/mfd/pcf50633-gpio.c
++++ /dev/null
+@@ -1,121 +0,0 @@
+-/* NXP PCF50633 GPIO Driver
+- *
+- * (C) 2006-2008 by Openmoko, Inc.
+- * Author: Balaji Rao <balajirrao@openmoko.org>
+- * All rights reserved.
+- *
+- * Broken down from monstrous PCF50633 driver mainly by
+- * Harald Welte, Andy Green and Werner Almesberger
+- *
+- * This program is free software; you can redistribute it and/or modify it
+- * under the terms of the GNU General Public License as published by the
+- * Free Software Foundation; either version 2 of the License, or (at your
+- * option) any later version.
+- *
+- */
+-
+-#include <linux/kernel.h>
+-#include <linux/module.h>
+-
+-#include <linux/mfd/pcf50633/core.h>
+-#include <linux/mfd/pcf50633/gpio.h>
+-
+-enum pcf50633_regulator_id {
+- PCF50633_REGULATOR_AUTO,
+- PCF50633_REGULATOR_DOWN1,
+- PCF50633_REGULATOR_DOWN2,
+- PCF50633_REGULATOR_LDO1,
+- PCF50633_REGULATOR_LDO2,
+- PCF50633_REGULATOR_LDO3,
+- PCF50633_REGULATOR_LDO4,
+- PCF50633_REGULATOR_LDO5,
+- PCF50633_REGULATOR_LDO6,
+- PCF50633_REGULATOR_HCLDO,
+- PCF50633_REGULATOR_MEMLDO,
+-};
+-
+-#define PCF50633_REG_AUTOOUT 0x1a
+-#define PCF50633_REG_DOWN1OUT 0x1e
+-#define PCF50633_REG_DOWN2OUT 0x22
+-#define PCF50633_REG_MEMLDOOUT 0x26
+-#define PCF50633_REG_LDO1OUT 0x2d
+-#define PCF50633_REG_LDO2OUT 0x2f
+-#define PCF50633_REG_LDO3OUT 0x31
+-#define PCF50633_REG_LDO4OUT 0x33
+-#define PCF50633_REG_LDO5OUT 0x35
+-#define PCF50633_REG_LDO6OUT 0x37
+-#define PCF50633_REG_HCLDOOUT 0x39
+-
+-static const u8 pcf50633_regulator_registers[PCF50633_NUM_REGULATORS] = {
+- [PCF50633_REGULATOR_AUTO] = PCF50633_REG_AUTOOUT,
+- [PCF50633_REGULATOR_DOWN1] = PCF50633_REG_DOWN1OUT,
+- [PCF50633_REGULATOR_DOWN2] = PCF50633_REG_DOWN2OUT,
+- [PCF50633_REGULATOR_MEMLDO] = PCF50633_REG_MEMLDOOUT,
+- [PCF50633_REGULATOR_LDO1] = PCF50633_REG_LDO1OUT,
+- [PCF50633_REGULATOR_LDO2] = PCF50633_REG_LDO2OUT,
+- [PCF50633_REGULATOR_LDO3] = PCF50633_REG_LDO3OUT,
+- [PCF50633_REGULATOR_LDO4] = PCF50633_REG_LDO4OUT,
+- [PCF50633_REGULATOR_LDO5] = PCF50633_REG_LDO5OUT,
+- [PCF50633_REGULATOR_LDO6] = PCF50633_REG_LDO6OUT,
+- [PCF50633_REGULATOR_HCLDO] = PCF50633_REG_HCLDOOUT,
+-};
+-
+-int pcf50633_gpio_set(struct pcf50633 *pcf, int gpio, u8 val)
+-{
+- u8 reg;
+-
+- reg = gpio - PCF50633_GPIO1 + PCF50633_REG_GPIO1CFG;
+-
+- return pcf50633_reg_set_bit_mask(pcf, reg, 0x07, val);
+-}
+-EXPORT_SYMBOL_GPL(pcf50633_gpio_set);
+-
+-u8 pcf50633_gpio_get(struct pcf50633 *pcf, int gpio)
+-{
+- u8 reg, val;
+-
+- reg = gpio - PCF50633_GPIO1 + PCF50633_REG_GPIO1CFG;
+- val = pcf50633_reg_read(pcf, reg) & 0x07;
+-
+- return val;
+-}
+-EXPORT_SYMBOL_GPL(pcf50633_gpio_get);
+-
+-int pcf50633_gpio_invert_set(struct pcf50633 *pcf, int gpio, int invert)
+-{
+- u8 val, reg;
+-
+- reg = gpio - PCF50633_GPIO1 + PCF50633_REG_GPIO1CFG;
+- val = !!invert << 3;
+-
+- return pcf50633_reg_set_bit_mask(pcf, reg, 1 << 3, val);
+-}
+-EXPORT_SYMBOL_GPL(pcf50633_gpio_invert_set);
+-
+-int pcf50633_gpio_invert_get(struct pcf50633 *pcf, int gpio)
+-{
+- u8 reg, val;
+-
+- reg = gpio - PCF50633_GPIO1 + PCF50633_REG_GPIO1CFG;
+- val = pcf50633_reg_read(pcf, reg);
+-
+- return val & (1 << 3);
+-}
+-EXPORT_SYMBOL_GPL(pcf50633_gpio_invert_get);
+-
+-int pcf50633_gpio_power_supply_set(struct pcf50633 *pcf,
+- int gpio, int regulator, int on)
+-{
+- u8 reg, val, mask;
+-
+- /* the *ENA register is always one after the *OUT register */
+- reg = pcf50633_regulator_registers[regulator] + 1;
+-
+- val = !!on << (gpio - PCF50633_GPIO1);
+- mask = 1 << (gpio - PCF50633_GPIO1);
+-
+- return pcf50633_reg_set_bit_mask(pcf, reg, mask, val);
+-}
+-EXPORT_SYMBOL_GPL(pcf50633_gpio_power_supply_set);
+-
+-MODULE_LICENSE("GPL");
+diff --git a/drivers/mfd/pcf50633-irq.c b/drivers/mfd/pcf50633-irq.c
+index 1b0192f..4b8269c 100644
+--- a/drivers/mfd/pcf50633-irq.c
++++ b/drivers/mfd/pcf50633-irq.c
+@@ -2,7 +2,7 @@
+ *
+ * (C) 2006-2008 by Openmoko, Inc.
+ * Author: Harald Welte <laforge@openmoko.org>
+- * Balaji Rao <balajirrao@openmoko.org>
++ * Balaji Rao <balajirrao@openmoko.org>
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+@@ -12,6 +12,7 @@
+ *
+ */
+
++#include <linux/irq.h>
+ #include <linux/interrupt.h>
+ #include <linux/kernel.h>
+ #include <linux/mutex.h>
+@@ -25,92 +26,63 @@
+ #define PCF50633_MBCS1_USBPRES 0x01
+ #define PCF50633_MBCS1_ADAPTPRES 0x01
+
+-int pcf50633_register_irq(struct pcf50633 *pcf, int irq,
+- void (*handler) (int, void *), void *data)
++static void pcf50633_irq_lock(struct irq_data *data)
+ {
+- if (irq < 0 || irq >= PCF50633_NUM_IRQ || !handler)
+- return -EINVAL;
++ struct pcf50633 *pcf = irq_data_get_irq_chip_data(data);
+
+- if (WARN_ON(pcf->irq_handler[irq].handler))
+- return -EBUSY;
+-
+- mutex_lock(&pcf->lock);
+- pcf->irq_handler[irq].handler = handler;
+- pcf->irq_handler[irq].data = data;
+- mutex_unlock(&pcf->lock);
+-
+- return 0;
++ mutex_lock(&pcf->irq_lock);
+ }
+-EXPORT_SYMBOL_GPL(pcf50633_register_irq);
+
+-int pcf50633_free_irq(struct pcf50633 *pcf, int irq)
++static void pcf50633_irq_sync_unlock(struct irq_data *data)
+ {
+- if (irq < 0 || irq >= PCF50633_NUM_IRQ)
+- return -EINVAL;
++ struct pcf50633 *pcf = irq_data_get_irq_chip_data(data);
++ unsigned int i;
+
+- mutex_lock(&pcf->lock);
+- pcf->irq_handler[irq].handler = NULL;
+- mutex_unlock(&pcf->lock);
++ for (i = 0; i < ARRAY_SIZE(pcf->mask_regs); ++i) {
++ if (pcf->mask_regs[i] == pcf->mask_regs_cur[i])
++ continue;
+
+- return 0;
++ pcf->mask_regs[i] = pcf->mask_regs_cur[i];
++ pcf50633_reg_write(pcf, PCF50633_REG_INT1M + i,
++ pcf->mask_regs[i]);
++ }
++
++ mutex_unlock(&pcf->irq_lock);
+ }
+-EXPORT_SYMBOL_GPL(pcf50633_free_irq);
+
+-static int __pcf50633_irq_mask_set(struct pcf50633 *pcf, int irq, u8 mask)
++static void pcf50633_irq_mask(struct irq_data *data)
+ {
+- u8 reg, bit;
+- int ret = 0, idx;
++ struct pcf50633 *pcf = irq_data_get_irq_chip_data(data);
++ int irq = data->irq;
++ u8 bit;
++ int idx;
+
+ idx = irq >> 3;
+- reg = PCF50633_REG_INT1M + idx;
+ bit = 1 << (irq & 0x07);
+
+- pcf50633_reg_set_bit_mask(pcf, reg, bit, mask ? bit : 0);
+-
+- mutex_lock(&pcf->lock);
+-
+- if (mask)
+- pcf->mask_regs[idx] |= bit;
+- else
+- pcf->mask_regs[idx] &= ~bit;
+-
+- mutex_unlock(&pcf->lock);
+-
+- return ret;
++ pcf->mask_regs[idx] |= bit;
+ }
+
+-int pcf50633_irq_mask(struct pcf50633 *pcf, int irq)
++static void pcf50633_irq_unmask(struct irq_data *data)
+ {
+- dev_dbg(pcf->dev, "Masking IRQ %d\n", irq);
++ struct pcf50633 *pcf = irq_data_get_irq_chip_data(data);
++ int irq = data->irq;
++ u8 bit;
++ int idx;
+
+- return __pcf50633_irq_mask_set(pcf, irq, 1);
+-}
+-EXPORT_SYMBOL_GPL(pcf50633_irq_mask);
+-
+-int pcf50633_irq_unmask(struct pcf50633 *pcf, int irq)
+-{
+- dev_dbg(pcf->dev, "Unmasking IRQ %d\n", irq);
++ idx = irq >> 3;
++ bit = 1 << (irq & 0x07);
+
+- return __pcf50633_irq_mask_set(pcf, irq, 0);
++ pcf->mask_regs[idx] &= ~bit;
+ }
+-EXPORT_SYMBOL_GPL(pcf50633_irq_unmask);
+
+-int pcf50633_irq_mask_get(struct pcf50633 *pcf, int irq)
+-{
+- u8 reg, bits;
+-
+- reg = irq >> 3;
+- bits = 1 << (irq & 0x07);
+-
+- return pcf->mask_regs[reg] & bits;
+-}
+-EXPORT_SYMBOL_GPL(pcf50633_irq_mask_get);
+-
+-static void pcf50633_irq_call_handler(struct pcf50633 *pcf, int irq)
+-{
+- if (pcf->irq_handler[irq].handler)
+- pcf->irq_handler[irq].handler(irq, pcf->irq_handler[irq].data);
+-}
++static struct irq_chip pcf50633_irq_chip = {
++ .name = "pcf50633-irq",
++ .irq_mask = pcf50633_irq_mask,
++ .irq_unmask = pcf50633_irq_unmask,
++ .irq_bus_lock = pcf50633_irq_lock,
++ .irq_bus_sync_unlock = pcf50633_irq_sync_unlock,
++};
+
+ /* Maximum amount of time ONKEY is held before emergency action is taken */
+ #define PCF50633_ONKEY1S_TIMEOUT 8
+@@ -214,13 +186,16 @@ static irqreturn_t pcf50633_irq(int irq, void *data)
+ pcf_int[1] &= ~(PCF50633_INT2_ONKEYR | PCF50633_INT2_ONKEYF);
+ }
+
++ irq = pcf->irq_base;
+ for (i = 0; i < ARRAY_SIZE(pcf_int); i++) {
+ /* Unset masked interrupts */
+ pcf_int[i] &= ~pcf->mask_regs[i];
+
+- for (j = 0; j < 8 ; j++)
++ for (j = 0; j < 8 ; j++) {
+ if (pcf_int[i] & (1 << j))
+- pcf50633_irq_call_handler(pcf, (i * 8) + j);
++ handle_nested_irq(irq);
++ ++irq;
++ }
+ }
+
+ out:
+@@ -240,15 +215,6 @@ int pcf50633_irq_suspend(struct pcf50633 *pcf)
+ * henceforth */
+ disable_irq(pcf->irq);
+
+- /* Save the masks */
+- ret = pcf50633_read_block(pcf, PCF50633_REG_INT1M,
+- ARRAY_SIZE(pcf->suspend_irq_masks),
+- pcf->suspend_irq_masks);
+- if (ret < 0) {
+- dev_err(pcf->dev, "error saving irq masks\n");
+- goto out;
+- }
+-
+ /* Write wakeup irq masks */
+ for (i = 0; i < ARRAY_SIZE(res); i++)
+ res[i] = ~pcf->pdata->resumers[i];
+@@ -272,8 +238,8 @@ int pcf50633_irq_resume(struct pcf50633 *pcf)
+
+ /* Write the saved mask registers */
+ ret = pcf50633_write_block(pcf, PCF50633_REG_INT1M,
+- ARRAY_SIZE(pcf->suspend_irq_masks),
+- pcf->suspend_irq_masks);
++ ARRAY_SIZE(pcf->mask_regs),
++ pcf->mask_regs);
+ if (ret < 0)
+ dev_err(pcf->dev, "Error restoring saved suspend masks\n");
+
+@@ -286,33 +252,61 @@ int pcf50633_irq_resume(struct pcf50633 *pcf)
+
+ int pcf50633_irq_init(struct pcf50633 *pcf, int irq)
+ {
++ int irq_base;
+ int ret;
++ int i;
+
++ irq_base = irq_alloc_descs(-1, 0, PCF50633_NUM_IRQ, 0);
++ if (irq_base < 0) {
++ dev_err(pcf->dev, "Failed to allocate irq descs: %d\n", irq_base);
++ return irq_base;
++ }
++
++ mutex_init(&pcf->irq_lock);
+ pcf->irq = irq;
++ pcf->irq_base = irq_base;
++
++ /* Mask all irqs */
++ for (i = 0; i < 5; ++i)
++ pcf->mask_regs[i] = 0xff;
+
+- /* Enable all interrupts except RTC SECOND */
+- pcf->mask_regs[0] = 0x80;
+- pcf50633_reg_write(pcf, PCF50633_REG_INT1M, pcf->mask_regs[0]);
+- pcf50633_reg_write(pcf, PCF50633_REG_INT2M, 0x00);
+- pcf50633_reg_write(pcf, PCF50633_REG_INT3M, 0x00);
+- pcf50633_reg_write(pcf, PCF50633_REG_INT4M, 0x00);
+- pcf50633_reg_write(pcf, PCF50633_REG_INT5M, 0x00);
++ ret = pcf50633_write_block(pcf, PCF50633_REG_INT1M,
++ ARRAY_SIZE(pcf->mask_regs), pcf->mask_regs);
++ if (ret < 0)
++ goto err_irq_free_descs;
++
++
++ for (i = irq_base; i < irq_base + PCF50633_NUM_IRQ; ++i) {
++ irq_set_chip_data(i, pcf);
++ irq_set_nested_thread(i, 1);
++ irq_set_chip_and_handler(i, &pcf50633_irq_chip, handle_simple_irq);
++ irq_modify_status(i, IRQ_NOREQUEST, IRQ_NOPROBE);
++ }
+
+ ret = request_threaded_irq(irq, NULL, pcf50633_irq,
+ IRQF_TRIGGER_LOW | IRQF_ONESHOT,
+ "pcf50633", pcf);
+
+- if (ret)
++ if (ret) {
+ dev_err(pcf->dev, "Failed to request IRQ %d\n", ret);
++ goto err_irq_free_descs;
++ }
+
+ if (enable_irq_wake(irq) < 0)
+ dev_err(pcf->dev, "IRQ %u cannot be enabled as wake-up source"
+ "in this hardware revision", irq);
+
++
++ return 0;
++
++err_irq_free_descs:
++ irq_free_descs(pcf->irq_base, PCF50633_NUM_IRQ);
++
+ return ret;
+ }
+
+ void pcf50633_irq_free(struct pcf50633 *pcf)
+ {
+ free_irq(pcf->irq, pcf);
++ irq_free_descs(pcf->irq_base, PCF50633_NUM_IRQ);
+ }
+diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
+index 61d233a..4b530ae 100644
+--- a/drivers/mmc/card/block.c
++++ b/drivers/mmc/card/block.c
+@@ -79,6 +79,13 @@ struct mmc_blk_data {
+
+ static DEFINE_MUTEX(open_lock);
+
++enum mmc_blk_status {
++ MMC_BLK_SUCCESS = 0,
++ MMC_BLK_RETRY,
++ MMC_BLK_DATA_ERR,
++ MMC_BLK_CMD_ERR,
++};
++
+ module_param(perdev_minors, int, 0444);
+ MODULE_PARM_DESC(perdev_minors, "Minors numbers to allocate per device");
+
+@@ -165,13 +172,6 @@ static const struct block_device_operations mmc_bdops = {
+ .owner = THIS_MODULE,
+ };
+
+-struct mmc_blk_request {
+- struct mmc_request mrq;
+- struct mmc_command cmd;
+- struct mmc_command stop;
+- struct mmc_data data;
+-};
+-
+ static u32 mmc_sd_num_wr_blocks(struct mmc_card *card)
+ {
+ int err;
+@@ -331,200 +331,341 @@ out:
+ return err ? 0 : 1;
+ }
+
+-static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *req)
++static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq,
++ struct mmc_card *card,
++ int disable_multi,
++ struct mmc_queue *mq)
+ {
+- struct mmc_blk_data *md = mq->data;
+- struct mmc_card *card = md->queue.card;
+- struct mmc_blk_request brq;
+- int ret = 1, disable_multi = 0;
++ u32 readcmd, writecmd;
++ struct mmc_blk_request *brq = &mqrq->brq;
++ struct request *req = mqrq->req;
+
+- mmc_claim_host(card->host);
++ memset(brq, 0, sizeof(struct mmc_blk_request));
+
+- do {
+- struct mmc_command cmd;
+- u32 readcmd, writecmd, status = 0;
+-
+- memset(&brq, 0, sizeof(struct mmc_blk_request));
+- brq.mrq.cmd = &brq.cmd;
+- brq.mrq.data = &brq.data;
+-
+- brq.cmd.arg = blk_rq_pos(req);
+- if (!mmc_card_blockaddr(card))
+- brq.cmd.arg <<= 9;
+- brq.cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC;
+- brq.data.blksz = 512;
+- brq.stop.opcode = MMC_STOP_TRANSMISSION;
+- brq.stop.arg = 0;
+- brq.stop.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC;
+- brq.data.blocks = blk_rq_sectors(req);
++ brq->mrq.cmd = &brq->cmd;
++ brq->mrq.data = &brq->data;
+
+- /*
+- * The block layer doesn't support all sector count
+- * restrictions, so we need to be prepared for too big
+- * requests.
+- */
+- if (brq.data.blocks > card->host->max_blk_count)
+- brq.data.blocks = card->host->max_blk_count;
++ brq->cmd.arg = blk_rq_pos(req);
++ if (!mmc_card_blockaddr(card))
++ brq->cmd.arg <<= 9;
++ brq->cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC;
++ brq->data.blksz = 512;
++ brq->stop.opcode = MMC_STOP_TRANSMISSION;
++ brq->stop.arg = 0;
++ brq->stop.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC;
++ brq->data.blocks = blk_rq_sectors(req);
+
+- /*
+- * After a read error, we redo the request one sector at a time
+- * in order to accurately determine which sectors can be read
+- * successfully.
++ /*
++ * The block layer doesn't support all sector count
++ * restrictions, so we need to be prepared for too big
++ * requests.
++ */
++ if (brq->data.blocks > card->host->max_blk_count)
++ brq->data.blocks = card->host->max_blk_count;
++
++ /*
++ * After a read error, we redo the request one sector at a time
++ * in order to accurately determine which sectors can be read
++ * successfully.
++ */
++ if (disable_multi && brq->data.blocks > 1)
++ brq->data.blocks = 1;
++
++ if (brq->data.blocks > 1) {
++ /* SPI multiblock writes terminate using a special
++ * token, not a STOP_TRANSMISSION request.
+ */
+- if (disable_multi && brq.data.blocks > 1)
+- brq.data.blocks = 1;
++ if (!mmc_host_is_spi(card->host)
++ || rq_data_dir(req) == READ)
++ brq->mrq.stop = &brq->stop;
++ readcmd = MMC_READ_MULTIPLE_BLOCK;
++ writecmd = MMC_WRITE_MULTIPLE_BLOCK;
++ } else {
++ brq->mrq.stop = NULL;
++ readcmd = MMC_READ_SINGLE_BLOCK;
++ writecmd = MMC_WRITE_BLOCK;
++ }
++ if (rq_data_dir(req) == READ) {
++ brq->cmd.opcode = readcmd;
++ brq->data.flags |= MMC_DATA_READ;
++ } else {
++ brq->cmd.opcode = writecmd;
++ brq->data.flags |= MMC_DATA_WRITE;
++ }
+
+- if (brq.data.blocks > 1) {
+- /* SPI multiblock writes terminate using a special
+- * token, not a STOP_TRANSMISSION request.
+- */
+- if (!mmc_host_is_spi(card->host)
+- || rq_data_dir(req) == READ)
+- brq.mrq.stop = &brq.stop;
+- readcmd = MMC_READ_MULTIPLE_BLOCK;
+- writecmd = MMC_WRITE_MULTIPLE_BLOCK;
+- } else {
+- brq.mrq.stop = NULL;
+- readcmd = MMC_READ_SINGLE_BLOCK;
+- writecmd = MMC_WRITE_BLOCK;
++ mmc_set_data_timeout(&brq->data, card);
++
++ brq->data.sg = mqrq->sg;
++ brq->data.sg_len = mmc_queue_map_sg(mq, mqrq);
++
++ /*
++ * Adjust the sg list so it is the same size as the
++ * request.
++ */
++ if (brq->data.blocks != blk_rq_sectors(req)) {
++ int i, data_size = brq->data.blocks << 9;
++ struct scatterlist *sg;
++
++ for_each_sg(brq->data.sg, sg, brq->data.sg_len, i) {
++ data_size -= sg->length;
++ if (data_size <= 0) {
++ sg->length += data_size;
++ i++;
++ break;
++ }
+ }
+- if (rq_data_dir(req) == READ) {
+- brq.cmd.opcode = readcmd;
+- brq.data.flags |= MMC_DATA_READ;
+- } else {
+- brq.cmd.opcode = writecmd;
+- brq.data.flags |= MMC_DATA_WRITE;
++ brq->data.sg_len = i;
++ }
++
++ mmc_queue_bounce_pre(mqrq);
++}
++
++static enum mmc_blk_status mmc_blk_get_status(struct mmc_blk_request *brq,
++ struct request *req,
++ struct mmc_card *card,
++ struct mmc_blk_data *md)
++{
++ struct mmc_command cmd;
++ u32 status;
++ enum mmc_blk_status ret = MMC_BLK_SUCCESS;
++
++ /*
++ * Check for errors here, but don't jump to cmd_err
++ * until later as we need to wait for the card to leave
++ * programming mode even when things go wrong.
++ */
++ if (brq->cmd.error || brq->data.error || brq->stop.error) {
++ if (brq->data.blocks > 1 && rq_data_dir(req) == READ) {
++ /* Redo read one sector at a time */
++ printk(KERN_WARNING "%s: retrying using single "
++ "block read, brq %p\n",
++ req->rq_disk->disk_name, brq);
++ ret = MMC_BLK_RETRY;
++ goto out;
+ }
++ status = get_card_status(card, req);
++ }
+
+- mmc_set_data_timeout(&brq.data, card);
++ if (brq->cmd.error) {
++ printk(KERN_ERR "%s: error %d sending read/write "
++ "command, response %#x, card status %#x\n",
++ req->rq_disk->disk_name, brq->cmd.error,
++ brq->cmd.resp[0], status);
++ }
+
+- brq.data.sg = mq->sg;
+- brq.data.sg_len = mmc_queue_map_sg(mq);
++ if (brq->data.error) {
++ if (brq->data.error == -ETIMEDOUT && brq->mrq.stop)
++ /* 'Stop' response contains card status */
++ status = brq->mrq.stop->resp[0];
++ printk(KERN_ERR "%s: error %d transferring data,"
++ " sector %u, nr %u, card status %#x\n",
++ req->rq_disk->disk_name, brq->data.error,
++ (unsigned)blk_rq_pos(req),
++ (unsigned)blk_rq_sectors(req), status);
++ }
+
+- /*
+- * Adjust the sg list so it is the same size as the
+- * request.
+- */
+- if (brq.data.blocks != blk_rq_sectors(req)) {
+- int i, data_size = brq.data.blocks << 9;
+- struct scatterlist *sg;
+-
+- for_each_sg(brq.data.sg, sg, brq.data.sg_len, i) {
+- data_size -= sg->length;
+- if (data_size <= 0) {
+- sg->length += data_size;
+- i++;
+- break;
+- }
++ if (brq->stop.error) {
++ printk(KERN_ERR "%s: error %d sending stop command, "
++ "response %#x, card status %#x\n",
++ req->rq_disk->disk_name, brq->stop.error,
++ brq->stop.resp[0], status);
++ }
++
++ if (!mmc_host_is_spi(card->host) && rq_data_dir(req) != READ) {
++ do {
++ int err;
++
++ cmd.opcode = MMC_SEND_STATUS;
++ cmd.arg = card->rca << 16;
++ cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
++ err = mmc_wait_for_cmd(card->host, &cmd, 5);
++ if (err) {
++ printk(KERN_ERR "%s: error %d requesting status\n",
++ req->rq_disk->disk_name, err);
++ ret = MMC_BLK_CMD_ERR;
++ goto out;
+ }
+- brq.data.sg_len = i;
++ /*
++ * Some cards mishandle the status bits,
++ * so make sure to check both the busy
++ * indication and the card state.
++ */
++ } while (!(cmd.resp[0] & R1_READY_FOR_DATA) ||
++ (R1_CURRENT_STATE(cmd.resp[0]) == 7));
++
++#if 0
++ if (cmd.resp[0] & ~0x00000900)
++ printk(KERN_ERR "%s: status = %08x\n",
++ req->rq_disk->disk_name, cmd.resp[0]);
++ if (mmc_decode_status(cmd.resp)) {
++ ret = MMC_BLK_CMD_ERR;
++ goto out;
+ }
+
+- mmc_queue_bounce_pre(mq);
++#endif
++ }
+
+- mmc_wait_for_req(card->host, &brq.mrq);
++ if (brq->cmd.error || brq->stop.error || brq->data.error) {
++ if (rq_data_dir(req) == READ)
++ ret = MMC_BLK_DATA_ERR;
++ else
++ ret = MMC_BLK_CMD_ERR;
++ }
++ out:
++ return ret;
+
+- mmc_queue_bounce_post(mq);
++}
+
++static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc)
++{
++ struct mmc_blk_data *md = mq->data;
++ struct mmc_card *card = md->queue.card;
++ struct mmc_blk_request *brqc = &mq->mqrq_cur->brq;
++ struct mmc_blk_request *brqp = &mq->mqrq_prev->brq;
++ struct mmc_queue_req *mqrqp = mq->mqrq_prev;
++ struct request *rqp = mqrqp->req;
++ int ret = 0;
++ int disable_multi = 0;
++ enum mmc_blk_status status;
++
++ if (!rqc && !rqp)
++ return 0;
++
++ if (rqc) {
++ /* Claim host for the first request in a serie of requests */
++ if (!rqp)
++ mmc_claim_host(card->host);
++
++ /* Prepare a new request */
++ mmc_blk_rw_rq_prep(mq->mqrq_cur, card, 0, mq);
++ mmc_pre_req(card->host, &brqc->mrq, !rqp);
++ }
++ do {
+ /*
+- * Check for errors here, but don't jump to cmd_err
+- * until later as we need to wait for the card to leave
+- * programming mode even when things go wrong.
++ * If there is an ongoing request, indicated by rqp, wait for
++ * it to finish before starting a new one.
+ */
+- if (brq.cmd.error || brq.data.error || brq.stop.error) {
+- if (brq.data.blocks > 1 && rq_data_dir(req) == READ) {
+- /* Redo read one sector at a time */
+- printk(KERN_WARNING "%s: retrying using single "
+- "block read\n", req->rq_disk->disk_name);
+- disable_multi = 1;
+- continue;
+- }
+- status = get_card_status(card, req);
++ if (rqp)
++ mmc_wait_for_req_done(&brqp->mrq);
++ else {
++ /* start a new asynchronous request */
++ mmc_start_req(card->host, &brqc->mrq);
++ goto out;
+ }
+-
+- if (brq.cmd.error) {
+- printk(KERN_ERR "%s: error %d sending read/write "
+- "command, response %#x, card status %#x\n",
+- req->rq_disk->disk_name, brq.cmd.error,
+- brq.cmd.resp[0], status);
++ status = mmc_blk_get_status(brqp, rqp, card, md);
++ if (status != MMC_BLK_SUCCESS) {
++ mmc_post_req(card->host, &brqp->mrq, -EINVAL);
++ mmc_queue_bounce_post(mqrqp);
++ if (rqc)
++ mmc_post_req(card->host, &brqc->mrq, -EINVAL);
+ }
+
+- if (brq.data.error) {
+- if (brq.data.error == -ETIMEDOUT && brq.mrq.stop)
+- /* 'Stop' response contains card status */
+- status = brq.mrq.stop->resp[0];
+- printk(KERN_ERR "%s: error %d transferring data,"
+- " sector %u, nr %u, card status %#x\n",
+- req->rq_disk->disk_name, brq.data.error,
+- (unsigned)blk_rq_pos(req),
+- (unsigned)blk_rq_sectors(req), status);
+- }
++ switch (status) {
++ case MMC_BLK_SUCCESS:
++ /*
++ * A block was successfully transferred.
++ */
+
+- if (brq.stop.error) {
+- printk(KERN_ERR "%s: error %d sending stop command, "
+- "response %#x, card status %#x\n",
+- req->rq_disk->disk_name, brq.stop.error,
+- brq.stop.resp[0], status);
+- }
++ /*
++ * All data is transferred without errors.
++ * Defer mmc post processing and _blk_end_request
++ * until after the new request is started.
++ */
++ if (blk_rq_bytes(rqp) == brqp->data.bytes_xfered)
++ break;
+
+- if (!mmc_host_is_spi(card->host) && rq_data_dir(req) != READ) {
+- do {
+- int err;
+-
+- cmd.opcode = MMC_SEND_STATUS;
+- cmd.arg = card->rca << 16;
+- cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
+- err = mmc_wait_for_cmd(card->host, &cmd, 5);
+- if (err) {
+- printk(KERN_ERR "%s: error %d requesting status\n",
+- req->rq_disk->disk_name, err);
+- goto cmd_err;
+- }
+- /*
+- * Some cards mishandle the status bits,
+- * so make sure to check both the busy
+- * indication and the card state.
+- */
+- } while (!(cmd.resp[0] & R1_READY_FOR_DATA) ||
+- (R1_CURRENT_STATE(cmd.resp[0]) == 7));
++ mmc_post_req(card->host, &brqp->mrq, 0);
++ mmc_queue_bounce_post(mqrqp);
+
+-#if 0
+- if (cmd.resp[0] & ~0x00000900)
+- printk(KERN_ERR "%s: status = %08x\n",
+- req->rq_disk->disk_name, cmd.resp[0]);
+- if (mmc_decode_status(cmd.resp))
+- goto cmd_err;
+-#endif
+- }
++ spin_lock_irq(&md->lock);
++ ret = __blk_end_request(rqp, 0,
++ brqp->data.bytes_xfered);
++ spin_unlock_irq(&md->lock);
+
+- if (brq.cmd.error || brq.stop.error || brq.data.error) {
+- if (rq_data_dir(req) == READ) {
+- /*
+- * After an error, we redo I/O one sector at a
+- * time, so we only reach here after trying to
+- * read a single sector.
+- */
+- spin_lock_irq(&md->lock);
+- ret = __blk_end_request(req, -EIO, brq.data.blksz);
+- spin_unlock_irq(&md->lock);
+- continue;
+- }
++ if (rqc)
++ mmc_post_req(card->host, &brqc->mrq, -EINVAL);
++ break;
++ case MMC_BLK_CMD_ERR:
+ goto cmd_err;
++ break;
++ case MMC_BLK_RETRY:
++ disable_multi = 1;
++ ret = 1;
++ break;
++ case MMC_BLK_DATA_ERR:
++ /*
++ * After an error, we redo I/O one sector at a
++ * time, so we only reach here after trying to
++ * read a single sector.
++ */
++ spin_lock_irq(&md->lock);
++ ret = __blk_end_request(rqp, -EIO, brqp->data.blksz);
++ spin_unlock_irq(&md->lock);
++ if (rqc && !ret)
++ mmc_pre_req(card->host, &brqc->mrq, false);
++ break;
+ }
+
+- /*
+- * A block was successfully transferred.
+- */
++ if (ret) {
++ /*
++ * In case of a none complete request
++ * prepare it again and resend.
++ */
++ mmc_blk_rw_rq_prep(mqrqp, card, disable_multi, mq);
++ mmc_pre_req(card->host, &brqp->mrq, true);
++ mmc_start_req(card->host, &brqp->mrq);
++ if (rqc)
++ mmc_pre_req(card->host, &brqc->mrq, false);
++ }
++ } while (ret);
++
++ /* Previous request is completed, start the new request if any */
++ if (rqc)
++ mmc_start_req(card->host, &brqc->mrq);
++
++ /*
++ * Post process the previous request while the new request is active.
++ * In case of error the reuqest is already ended.
++ */
++ if (status == MMC_BLK_SUCCESS) {
++ mmc_post_req(card->host, &brqp->mrq, 0);
++ mmc_queue_bounce_post(mqrqp);
++
+ spin_lock_irq(&md->lock);
+- ret = __blk_end_request(req, 0, brq.data.bytes_xfered);
++ ret = __blk_end_request(rqp, 0, brqp->data.bytes_xfered);
+ spin_unlock_irq(&md->lock);
+- } while (ret);
+
+- mmc_release_host(card->host);
++ if (ret) {
++ /* If this happen it is a bug */
++ printk(KERN_ERR "[%s] BUG: rq_bytes %d xfered %d\n",
++ __func__, blk_rq_bytes(rqp),
++ brqp->data.bytes_xfered);
++ goto cmd_err;
++ }
++ }
++
++ /* 1 indicates one request has been completed */
++ ret = 1;
++ out:
++ /*
++ * TODO: Find out if it is OK to only release host after the
++ * last request. For the last request the current request
++ * is NULL, which means no requests are pending.
++ */
++ /* Release host for the last request in a serie of requests */
++ if (!rqc)
++ mmc_release_host(card->host);
+
+- return 1;
++ /* Current request becomes previous request and vice versa. */
++ mqrqp->brq.mrq.data = NULL;
++ mqrqp->req = NULL;
++ mq->mqrq_prev = mq->mqrq_cur;
++ mq->mqrq_cur = mqrqp;
++
++ return ret;
+
+ cmd_err:
++
+ /*
+ * If this is an SD card and we're writing, we can first
+ * mark the known good sectors as ok.
+@@ -539,12 +680,12 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *req)
+ blocks = mmc_sd_num_wr_blocks(card);
+ if (blocks != (u32)-1) {
+ spin_lock_irq(&md->lock);
+- ret = __blk_end_request(req, 0, blocks << 9);
++ ret = __blk_end_request(rqp, 0, blocks << 9);
+ spin_unlock_irq(&md->lock);
+ }
+ } else {
+ spin_lock_irq(&md->lock);
+- ret = __blk_end_request(req, 0, brq.data.bytes_xfered);
++ ret = __blk_end_request(rqp, 0, brqp->data.bytes_xfered);
+ spin_unlock_irq(&md->lock);
+ }
+
+@@ -552,15 +693,27 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *req)
+
+ spin_lock_irq(&md->lock);
+ while (ret)
+- ret = __blk_end_request(req, -EIO, blk_rq_cur_bytes(req));
++ ret = __blk_end_request(rqp, -EIO, blk_rq_cur_bytes(rqp));
+ spin_unlock_irq(&md->lock);
+
++ if (rqc) {
++ mmc_claim_host(card->host);
++ mmc_pre_req(card->host, &brqc->mrq, false);
++ mmc_start_req(card->host, &brqc->mrq);
++ }
++
++ /* Current request becomes previous request and vice versa. */
++ mqrqp->brq.mrq.data = NULL;
++ mqrqp->req = NULL;
++ mq->mqrq_prev = mq->mqrq_cur;
++ mq->mqrq_cur = mqrqp;
++
+ return 0;
+ }
+
+ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
+ {
+- if (req->cmd_flags & REQ_DISCARD) {
++ if (req && req->cmd_flags & REQ_DISCARD) {
+ if (req->cmd_flags & REQ_SECURE)
+ return mmc_blk_issue_secdiscard_rq(mq, req);
+ else
+diff --git a/drivers/mmc/card/mmc_test.c b/drivers/mmc/card/mmc_test.c
+index abc1a63..8f7ffad 100644
+--- a/drivers/mmc/card/mmc_test.c
++++ b/drivers/mmc/card/mmc_test.c
+@@ -22,6 +22,7 @@
+ #include <linux/debugfs.h>
+ #include <linux/uaccess.h>
+ #include <linux/seq_file.h>
++#include <linux/random.h>
+
+ #define RESULT_OK 0
+ #define RESULT_FAIL 1
+@@ -51,10 +52,12 @@ struct mmc_test_pages {
+ * struct mmc_test_mem - allocated memory.
+ * @arr: array of allocations
+ * @cnt: number of allocations
++ * @size_min_cmn: lowest common size in array of allocations
+ */
+ struct mmc_test_mem {
+ struct mmc_test_pages *arr;
+ unsigned int cnt;
++ unsigned int size_min_cmn;
+ };
+
+ /**
+@@ -148,6 +151,21 @@ struct mmc_test_card {
+ struct mmc_test_general_result *gr;
+ };
+
++enum mmc_test_prep_media {
++ MMC_TEST_PREP_NONE = 0,
++ MMC_TEST_PREP_WRITE_FULL = 1 << 0,
++ MMC_TEST_PREP_ERASE = 1 << 1,
++};
++
++struct mmc_test_multiple_rw {
++ unsigned int *bs;
++ unsigned int len;
++ unsigned int size;
++ bool do_write;
++ bool do_nonblock_req;
++ enum mmc_test_prep_media prepare;
++};
++
+ /*******************************************************************/
+ /* General helper functions */
+ /*******************************************************************/
+@@ -307,6 +325,7 @@ static struct mmc_test_mem *mmc_test_alloc_mem(unsigned long min_sz,
+ unsigned long max_seg_page_cnt = DIV_ROUND_UP(max_seg_sz, PAGE_SIZE);
+ unsigned long page_cnt = 0;
+ unsigned long limit = nr_free_buffer_pages() >> 4;
++ unsigned int min_cmn = 0;
+ struct mmc_test_mem *mem;
+
+ if (max_page_cnt > limit)
+@@ -350,6 +369,12 @@ static struct mmc_test_mem *mmc_test_alloc_mem(unsigned long min_sz,
+ mem->arr[mem->cnt].page = page;
+ mem->arr[mem->cnt].order = order;
+ mem->cnt += 1;
++ if (!min_cmn)
++ min_cmn = PAGE_SIZE << order;
++ else
++ min_cmn = min(min_cmn,
++ (unsigned int) (PAGE_SIZE << order));
++
+ if (max_page_cnt <= (1UL << order))
+ break;
+ max_page_cnt -= 1UL << order;
+@@ -360,6 +385,7 @@ static struct mmc_test_mem *mmc_test_alloc_mem(unsigned long min_sz,
+ break;
+ }
+ }
++ mem->size_min_cmn = min_cmn;
+
+ return mem;
+
+@@ -386,7 +412,6 @@ static int mmc_test_map_sg(struct mmc_test_mem *mem, unsigned long sz,
+ do {
+ for (i = 0; i < mem->cnt; i++) {
+ unsigned long len = PAGE_SIZE << mem->arr[i].order;
+-
+ if (len > sz)
+ len = sz;
+ if (len > max_seg_sz)
+@@ -725,6 +750,94 @@ static int mmc_test_check_broken_result(struct mmc_test_card *test,
+ }
+
+ /*
++ * Tests nonblock transfer with certain parameters
++ */
++static void mmc_test_nonblock_reset(struct mmc_request *mrq,
++ struct mmc_command *cmd,
++ struct mmc_command *stop,
++ struct mmc_data *data)
++{
++ memset(mrq, 0, sizeof(struct mmc_request));
++ memset(cmd, 0, sizeof(struct mmc_command));
++ memset(data, 0, sizeof(struct mmc_data));
++ memset(stop, 0, sizeof(struct mmc_command));
++
++ mrq->cmd = cmd;
++ mrq->data = data;
++ mrq->stop = stop;
++}
++static int mmc_test_nonblock_transfer(struct mmc_test_card *test,
++ struct scatterlist *sg, unsigned sg_len,
++ unsigned dev_addr, unsigned blocks,
++ unsigned blksz, int write, int count)
++{
++ struct mmc_request mrq1;
++ struct mmc_command cmd1;
++ struct mmc_command stop1;
++ struct mmc_data data1;
++
++ struct mmc_request mrq2;
++ struct mmc_command cmd2;
++ struct mmc_command stop2;
++ struct mmc_data data2;
++
++ struct mmc_request *cur_mrq;
++ struct mmc_request *prev_mrq;
++ int i;
++ int ret = 0;
++
++ if (!test->card->host->ops->pre_req ||
++ !test->card->host->ops->post_req)
++ return -RESULT_UNSUP_HOST;
++
++ mmc_test_nonblock_reset(&mrq1, &cmd1, &stop1, &data1);
++ mmc_test_nonblock_reset(&mrq2, &cmd2, &stop2, &data2);
++
++ cur_mrq = &mrq1;
++ prev_mrq = NULL;
++
++ for (i = 0; i < count; i++) {
++ mmc_test_prepare_mrq(test, cur_mrq, sg, sg_len, dev_addr,
++ blocks, blksz, write);
++ mmc_pre_req(test->card->host, cur_mrq, !prev_mrq);
++
++ if (prev_mrq) {
++ mmc_wait_for_req_done(prev_mrq);
++ mmc_test_wait_busy(test);
++ ret = mmc_test_check_result(test, prev_mrq);
++ if (ret)
++ goto err;
++ }
++
++ mmc_start_req(test->card->host, cur_mrq);
++
++ if (prev_mrq)
++ mmc_post_req(test->card->host, prev_mrq, 0);
++
++ prev_mrq = cur_mrq;
++ if (cur_mrq == &mrq1) {
++ mmc_test_nonblock_reset(&mrq2, &cmd2, &stop2, &data2);
++ cur_mrq = &mrq2;
++ } else {
++ mmc_test_nonblock_reset(&mrq1, &cmd1, &stop1, &data1);
++ cur_mrq = &mrq1;
++ }
++ dev_addr += blocks;
++ }
++
++ mmc_wait_for_req_done(prev_mrq);
++ mmc_test_wait_busy(test);
++ ret = mmc_test_check_result(test, prev_mrq);
++ if (ret)
++ goto err;
++ mmc_post_req(test->card->host, prev_mrq, 0);
++
++ return ret;
++err:
++ return ret;
++}
++
++/*
+ * Tests a basic transfer with certain parameters
+ */
+ static int mmc_test_simple_transfer(struct mmc_test_card *test,
+@@ -1351,14 +1464,17 @@ static int mmc_test_area_transfer(struct mmc_test_card *test,
+ }
+
+ /*
+- * Map and transfer bytes.
++ * Map and transfer bytes for multiple transfers.
+ */
+-static int mmc_test_area_io(struct mmc_test_card *test, unsigned long sz,
+- unsigned int dev_addr, int write, int max_scatter,
+- int timed)
++static int mmc_test_area_io_seq(struct mmc_test_card *test, unsigned long sz,
++ unsigned int dev_addr, int write,
++ int max_scatter, int timed, int count,
++ bool nonblock)
+ {
+ struct timespec ts1, ts2;
+- int ret;
++ int ret = 0;
++ int i;
++ struct mmc_test_area *t = &test->area;
+
+ /*
+ * In the case of a maximally scattered transfer, the maximum transfer
+@@ -1382,8 +1498,15 @@ static int mmc_test_area_io(struct mmc_test_card *test, unsigned long sz,
+
+ if (timed)
+ getnstimeofday(&ts1);
++ if (nonblock)
++ ret = mmc_test_nonblock_transfer(test, t->sg, t->sg_len,
++ dev_addr, t->blocks, 512, write, count);
++ else
++ for (i = 0; i < count && ret == 0; i++) {
++ ret = mmc_test_area_transfer(test, dev_addr, write);
++ dev_addr += sz >> 9;
++ }
+
+- ret = mmc_test_area_transfer(test, dev_addr, write);
+ if (ret)
+ return ret;
+
+@@ -1391,11 +1514,19 @@ static int mmc_test_area_io(struct mmc_test_card *test, unsigned long sz,
+ getnstimeofday(&ts2);
+
+ if (timed)
+- mmc_test_print_rate(test, sz, &ts1, &ts2);
++ mmc_test_print_avg_rate(test, sz, count, &ts1, &ts2);
+
+ return 0;
+ }
+
++static int mmc_test_area_io(struct mmc_test_card *test, unsigned long sz,
++ unsigned int dev_addr, int write, int max_scatter,
++ int timed)
++{
++ return mmc_test_area_io_seq(test, sz, dev_addr, write, max_scatter,
++ timed, 1, false);
++}
++
+ /*
+ * Write the test area entirely.
+ */
+@@ -1956,6 +2087,144 @@ static int mmc_test_large_seq_write_perf(struct mmc_test_card *test)
+ return mmc_test_large_seq_perf(test, 1);
+ }
+
++static int mmc_test_rw_multiple(struct mmc_test_card *test,
++ struct mmc_test_multiple_rw *tdata,
++ unsigned int reqsize, unsigned int size)
++{
++ unsigned int dev_addr;
++ struct mmc_test_area *t = &test->area;
++ int ret = 0;
++ int max_reqsize = max(t->mem->size_min_cmn *
++ min(t->max_segs, t->mem->cnt), t->max_tfr);
++
++ /* Set up test area */
++ if (size > mmc_test_capacity(test->card) / 2 * 512)
++ size = mmc_test_capacity(test->card) / 2 * 512;
++ if (reqsize > max_reqsize)
++ reqsize = max_reqsize;
++ dev_addr = mmc_test_capacity(test->card) / 4;
++ if ((dev_addr & 0xffff0000))
++ dev_addr &= 0xffff0000; /* Round to 64MiB boundary */
++ else
++ dev_addr &= 0xfffff800; /* Round to 1MiB boundary */
++ if (!dev_addr)
++ goto err;
++
++ /* prepare test area */
++ if (mmc_can_erase(test->card) &&
++ tdata->prepare & MMC_TEST_PREP_ERASE) {
++ ret = mmc_erase(test->card, dev_addr,
++ size / 512, MMC_SECURE_ERASE_ARG);
++ if (ret)
++ ret = mmc_erase(test->card, dev_addr,
++ size / 512, MMC_ERASE_ARG);
++ if (ret)
++ goto err;
++ }
++
++ /* Run test */
++ ret = mmc_test_area_io_seq(test, reqsize, dev_addr,
++ tdata->do_write, 0, 1, size / reqsize,
++ tdata->do_nonblock_req);
++ if (ret)
++ goto err;
++
++ return ret;
++ err:
++ printk(KERN_INFO "[%s] error\n", __func__);
++ return ret;
++}
++
++static int mmc_test_rw_multiple_size(struct mmc_test_card *test,
++ struct mmc_test_multiple_rw *rw)
++{
++ int ret = 0;
++ int i;
++
++ for (i = 0 ; i < rw->len && ret == 0; i++) {
++ ret = mmc_test_rw_multiple(test, rw, rw->bs[i], rw->size);
++ if (ret)
++ break;
++ }
++ return ret;
++}
++
++/*
++ * Multiple blocking write 4k to 4 MB chunks
++ */
++static int mmc_test_profile_mult_write_blocking_perf(struct mmc_test_card *test)
++{
++ unsigned int bs[] = {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16,
++ 1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22};
++ struct mmc_test_multiple_rw test_data = {
++ .bs = bs,
++ .size = 128*1024*1024,
++ .len = ARRAY_SIZE(bs),
++ .do_write = true,
++ .do_nonblock_req = false,
++ .prepare = MMC_TEST_PREP_ERASE,
++ };
++
++ return mmc_test_rw_multiple_size(test, &test_data);
++};
++
++/*
++ * Multiple none blocking write 4k to 4 MB chunks
++ */
++static int mmc_test_profile_mult_write_nonblock_perf(struct mmc_test_card *test)
++{
++ unsigned int bs[] = {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16,
++ 1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22};
++ struct mmc_test_multiple_rw test_data = {
++ .bs = bs,
++ .size = 128*1024*1024,
++ .len = ARRAY_SIZE(bs),
++ .do_write = true,
++ .do_nonblock_req = true,
++ .prepare = MMC_TEST_PREP_ERASE,
++ };
++
++ return mmc_test_rw_multiple_size(test, &test_data);
++}
++
++/*
++ * Multiple blocking read 4k to 4 MB chunks
++ */
++static int mmc_test_profile_mult_read_blocking_perf(struct mmc_test_card *test)
++{
++ unsigned int bs[] = {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16,
++ 1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22};
++ struct mmc_test_multiple_rw test_data = {
++ .bs = bs,
++ .size = 128*1024*1024,
++ .len = ARRAY_SIZE(bs),
++ .do_write = false,
++ .do_nonblock_req = false,
++ .prepare = MMC_TEST_PREP_NONE,
++ };
++
++ return mmc_test_rw_multiple_size(test, &test_data);
++}
++
++/*
++ * Multiple none blocking read 4k to 4 MB chunks
++ */
++static int mmc_test_profile_mult_read_nonblock_perf(struct mmc_test_card *test)
++{
++ unsigned int bs[] = {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16,
++ 1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22};
++ struct mmc_test_multiple_rw test_data = {
++ .bs = bs,
++ .size = 128*1024*1024,
++ .len = ARRAY_SIZE(bs),
++ .do_write = false,
++ .do_nonblock_req = true,
++ .prepare = MMC_TEST_PREP_NONE,
++ };
++
++ return mmc_test_rw_multiple_size(test, &test_data);
++}
++
+ static const struct mmc_test_case mmc_test_cases[] = {
+ {
+ .name = "Basic write (no data verification)",
+@@ -2223,6 +2492,33 @@ static const struct mmc_test_case mmc_test_cases[] = {
+ .cleanup = mmc_test_area_cleanup,
+ },
+
++ {
++ .name = "Write performance with blocking req 4k to 4MB",
++ .prepare = mmc_test_area_prepare,
++ .run = mmc_test_profile_mult_write_blocking_perf,
++ .cleanup = mmc_test_area_cleanup,
++ },
++
++ {
++ .name = "Write performance with none blocking req 4k to 4MB",
++ .prepare = mmc_test_area_prepare,
++ .run = mmc_test_profile_mult_write_nonblock_perf,
++ .cleanup = mmc_test_area_cleanup,
++ },
++
++ {
++ .name = "Read performance with blocking req 4k to 4MB",
++ .prepare = mmc_test_area_prepare,
++ .run = mmc_test_profile_mult_read_blocking_perf,
++ .cleanup = mmc_test_area_cleanup,
++ },
++
++ {
++ .name = "Read performance with none blocking req 4k to 4MB",
++ .prepare = mmc_test_area_prepare,
++ .run = mmc_test_profile_mult_read_nonblock_perf,
++ .cleanup = mmc_test_area_cleanup,
++ },
+ };
+
+ static DEFINE_MUTEX(mmc_test_lock);
+@@ -2447,6 +2743,32 @@ static const struct file_operations mmc_test_fops_test = {
+ .release = single_release,
+ };
+
++static int mtf_testlist_show(struct seq_file *sf, void *data)
++{
++ int i;
++
++ mutex_lock(&mmc_test_lock);
++
++ for (i = 0; i < ARRAY_SIZE(mmc_test_cases); i++)
++ seq_printf(sf, "%d:\t%s\n", i+1, mmc_test_cases[i].name);
++
++ mutex_unlock(&mmc_test_lock);
++
++ return 0;
++}
++
++static int mtf_testlist_open(struct inode *inode, struct file *file)
++{
++ return single_open(file, mtf_testlist_show, inode->i_private);
++}
++
++static const struct file_operations mmc_test_fops_testlist = {
++ .open = mtf_testlist_open,
++ .read = seq_read,
++ .llseek = seq_lseek,
++ .release = single_release,
++};
++
+ static void mmc_test_free_file_test(struct mmc_card *card)
+ {
+ struct mmc_test_dbgfs_file *df, *dfs;
+@@ -2476,6 +2798,10 @@ static int mmc_test_register_file_test(struct mmc_card *card)
+ file = debugfs_create_file("test", S_IWUSR | S_IRUGO,
+ card->debugfs_root, card, &mmc_test_fops_test);
+
++ if (card->debugfs_root)
++ file = debugfs_create_file("testlist", S_IRUGO,
++ card->debugfs_root, card, &mmc_test_fops_testlist);
++
+ if (IS_ERR_OR_NULL(file)) {
+ dev_err(&card->dev,
+ "Can't create file. Perhaps debugfs is disabled.\n");
+diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c
+index 2ae7275..2b14d1c 100644
+--- a/drivers/mmc/card/queue.c
++++ b/drivers/mmc/card/queue.c
+@@ -56,9 +56,10 @@ static int mmc_queue_thread(void *d)
+ spin_lock_irq(q->queue_lock);
+ set_current_state(TASK_INTERRUPTIBLE);
+ req = blk_fetch_request(q);
+- mq->req = req;
++ mq->mqrq_cur->req = req;
+ spin_unlock_irq(q->queue_lock);
+
++ mq->issue_fn(mq, req);
+ if (!req) {
+ if (kthread_should_stop()) {
+ set_current_state(TASK_RUNNING);
+@@ -71,7 +72,6 @@ static int mmc_queue_thread(void *d)
+ }
+ set_current_state(TASK_RUNNING);
+
+- mq->issue_fn(mq, req);
+ } while (1);
+ up(&mq->thread_sem);
+
+@@ -97,10 +97,25 @@ static void mmc_request(struct request_queue *q)
+ return;
+ }
+
+- if (!mq->req)
++ if (!mq->mqrq_cur->req)
+ wake_up_process(mq->thread);
+ }
+
++struct scatterlist *mmc_alloc_sg(int sg_len, int *err)
++{
++ struct scatterlist *sg;
++
++ sg = kmalloc(sizeof(struct scatterlist)*sg_len, GFP_KERNEL);
++ if (!sg)
++ *err = -ENOMEM;
++ else {
++ *err = 0;
++ sg_init_table(sg, sg_len);
++ }
++
++ return sg;
++}
++
+ /**
+ * mmc_init_queue - initialise a queue structure.
+ * @mq: mmc queue
+@@ -114,6 +129,8 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock
+ struct mmc_host *host = card->host;
+ u64 limit = BLK_BOUNCE_HIGH;
+ int ret;
++ struct mmc_queue_req *mqrq_cur = &mq->mqrq[0];
++ struct mmc_queue_req *mqrq_prev = &mq->mqrq[1];
+
+ if (mmc_dev(host)->dma_mask && *mmc_dev(host)->dma_mask)
+ limit = *mmc_dev(host)->dma_mask;
+@@ -123,8 +140,11 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock
+ if (!mq->queue)
+ return -ENOMEM;
+
++ memset(&mq->mqrq_cur, 0, sizeof(mq->mqrq_cur));
++ memset(&mq->mqrq_prev, 0, sizeof(mq->mqrq_prev));
++ mq->mqrq_cur = mqrq_cur;
++ mq->mqrq_prev = mqrq_prev;
+ mq->queue->queuedata = mq;
+- mq->req = NULL;
+
+ blk_queue_prep_rq(mq->queue, mmc_prep_request);
+ queue_flag_set_unlocked(QUEUE_FLAG_NONROT, mq->queue);
+@@ -158,53 +178,64 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock
+ bouncesz = host->max_blk_count * 512;
+
+ if (bouncesz > 512) {
+- mq->bounce_buf = kmalloc(bouncesz, GFP_KERNEL);
+- if (!mq->bounce_buf) {
++ mqrq_cur->bounce_buf = kmalloc(bouncesz, GFP_KERNEL);
++ if (!mqrq_cur->bounce_buf) {
++ printk(KERN_WARNING "%s: unable to "
++ "allocate bounce cur buffer\n",
++ mmc_card_name(card));
++ }
++ mqrq_prev->bounce_buf = kmalloc(bouncesz, GFP_KERNEL);
++ if (!mqrq_prev->bounce_buf) {
+ printk(KERN_WARNING "%s: unable to "
+- "allocate bounce buffer\n",
++ "allocate bounce prev buffer\n",
+ mmc_card_name(card));
++ kfree(mqrq_cur->bounce_buf);
++ mqrq_cur->bounce_buf = NULL;
+ }
+ }
+
+- if (mq->bounce_buf) {
++ if (mqrq_cur->bounce_buf && mqrq_prev->bounce_buf) {
+ blk_queue_bounce_limit(mq->queue, BLK_BOUNCE_ANY);
+ blk_queue_max_hw_sectors(mq->queue, bouncesz / 512);
+ blk_queue_max_segments(mq->queue, bouncesz / 512);
+ blk_queue_max_segment_size(mq->queue, bouncesz);
+
+- mq->sg = kmalloc(sizeof(struct scatterlist),
+- GFP_KERNEL);
+- if (!mq->sg) {
+- ret = -ENOMEM;
++ mqrq_cur->sg = mmc_alloc_sg(1, &ret);
++ if (ret)
+ goto cleanup_queue;
+- }
+- sg_init_table(mq->sg, 1);
+
+- mq->bounce_sg = kmalloc(sizeof(struct scatterlist) *
+- bouncesz / 512, GFP_KERNEL);
+- if (!mq->bounce_sg) {
+- ret = -ENOMEM;
++ mqrq_cur->bounce_sg =
++ mmc_alloc_sg(bouncesz / 512, &ret);
++ if (ret)
++ goto cleanup_queue;
++
++ mqrq_prev->sg = mmc_alloc_sg(1, &ret);
++ if (ret)
++ goto cleanup_queue;
++
++ mqrq_prev->bounce_sg =
++ mmc_alloc_sg(bouncesz / 512, &ret);
++ if (ret)
+ goto cleanup_queue;
+- }
+- sg_init_table(mq->bounce_sg, bouncesz / 512);
+ }
+ }
+ #endif
+
+- if (!mq->bounce_buf) {
++ if (!mqrq_cur->bounce_buf && !mqrq_prev->bounce_buf) {
+ blk_queue_bounce_limit(mq->queue, limit);
+ blk_queue_max_hw_sectors(mq->queue,
+ min(host->max_blk_count, host->max_req_size / 512));
+ blk_queue_max_segments(mq->queue, host->max_segs);
+ blk_queue_max_segment_size(mq->queue, host->max_seg_size);
+
+- mq->sg = kmalloc(sizeof(struct scatterlist) *
+- host->max_segs, GFP_KERNEL);
+- if (!mq->sg) {
+- ret = -ENOMEM;
++ mqrq_cur->sg = mmc_alloc_sg(host->max_segs, &ret);
++ if (ret)
++ goto cleanup_queue;
++
++
++ mqrq_prev->sg = mmc_alloc_sg(host->max_segs, &ret);
++ if (ret)
+ goto cleanup_queue;
+- }
+- sg_init_table(mq->sg, host->max_segs);
+ }
+
+ sema_init(&mq->thread_sem, 1);
+@@ -219,16 +250,22 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock
+
+ return 0;
+ free_bounce_sg:
+- if (mq->bounce_sg)
+- kfree(mq->bounce_sg);
+- mq->bounce_sg = NULL;
++ kfree(mqrq_cur->bounce_sg);
++ mqrq_cur->bounce_sg = NULL;
++ kfree(mqrq_prev->bounce_sg);
++ mqrq_prev->bounce_sg = NULL;
++
+ cleanup_queue:
+- if (mq->sg)
+- kfree(mq->sg);
+- mq->sg = NULL;
+- if (mq->bounce_buf)
+- kfree(mq->bounce_buf);
+- mq->bounce_buf = NULL;
++ kfree(mqrq_cur->sg);
++ mqrq_cur->sg = NULL;
++ kfree(mqrq_cur->bounce_buf);
++ mqrq_cur->bounce_buf = NULL;
++
++ kfree(mqrq_prev->sg);
++ mqrq_prev->sg = NULL;
++ kfree(mqrq_prev->bounce_buf);
++ mqrq_prev->bounce_buf = NULL;
++
+ blk_cleanup_queue(mq->queue);
+ return ret;
+ }
+@@ -237,6 +274,8 @@ void mmc_cleanup_queue(struct mmc_queue *mq)
+ {
+ struct request_queue *q = mq->queue;
+ unsigned long flags;
++ struct mmc_queue_req *mqrq_cur = mq->mqrq_cur;
++ struct mmc_queue_req *mqrq_prev = mq->mqrq_prev;
+
+ /* Make sure the queue isn't suspended, as that will deadlock */
+ mmc_queue_resume(mq);
+@@ -250,16 +289,23 @@ void mmc_cleanup_queue(struct mmc_queue *mq)
+ blk_start_queue(q);
+ spin_unlock_irqrestore(q->queue_lock, flags);
+
+- if (mq->bounce_sg)
+- kfree(mq->bounce_sg);
+- mq->bounce_sg = NULL;
++ kfree(mqrq_cur->bounce_sg);
++ mqrq_cur->bounce_sg = NULL;
++
++ kfree(mqrq_cur->sg);
++ mqrq_cur->sg = NULL;
+
+- kfree(mq->sg);
+- mq->sg = NULL;
++ kfree(mqrq_cur->bounce_buf);
++ mqrq_cur->bounce_buf = NULL;
+
+- if (mq->bounce_buf)
+- kfree(mq->bounce_buf);
+- mq->bounce_buf = NULL;
++ kfree(mqrq_prev->bounce_sg);
++ mqrq_prev->bounce_sg = NULL;
++
++ kfree(mqrq_prev->sg);
++ mqrq_prev->sg = NULL;
++
++ kfree(mqrq_prev->bounce_buf);
++ mqrq_prev->bounce_buf = NULL;
+
+ mq->card = NULL;
+ }
+@@ -312,27 +358,27 @@ void mmc_queue_resume(struct mmc_queue *mq)
+ /*
+ * Prepare the sg list(s) to be handed of to the host driver
+ */
+-unsigned int mmc_queue_map_sg(struct mmc_queue *mq)
++unsigned int mmc_queue_map_sg(struct mmc_queue *mq, struct mmc_queue_req *mqrq)
+ {
+ unsigned int sg_len;
+ size_t buflen;
+ struct scatterlist *sg;
+ int i;
+
+- if (!mq->bounce_buf)
+- return blk_rq_map_sg(mq->queue, mq->req, mq->sg);
++ if (!mqrq->bounce_buf)
++ return blk_rq_map_sg(mq->queue, mqrq->req, mqrq->sg);
+
+- BUG_ON(!mq->bounce_sg);
++ BUG_ON(!mqrq->bounce_sg);
+
+- sg_len = blk_rq_map_sg(mq->queue, mq->req, mq->bounce_sg);
++ sg_len = blk_rq_map_sg(mq->queue, mqrq->req, mqrq->bounce_sg);
+
+- mq->bounce_sg_len = sg_len;
++ mqrq->bounce_sg_len = sg_len;
+
+ buflen = 0;
+- for_each_sg(mq->bounce_sg, sg, sg_len, i)
++ for_each_sg(mqrq->bounce_sg, sg, sg_len, i)
+ buflen += sg->length;
+
+- sg_init_one(mq->sg, mq->bounce_buf, buflen);
++ sg_init_one(mqrq->sg, mqrq->bounce_buf, buflen);
+
+ return 1;
+ }
+@@ -341,19 +387,19 @@ unsigned int mmc_queue_map_sg(struct mmc_queue *mq)
+ * If writing, bounce the data to the buffer before the request
+ * is sent to the host driver
+ */
+-void mmc_queue_bounce_pre(struct mmc_queue *mq)
++void mmc_queue_bounce_pre(struct mmc_queue_req *mqrq)
+ {
+ unsigned long flags;
+
+- if (!mq->bounce_buf)
++ if (!mqrq->bounce_buf)
+ return;
+
+- if (rq_data_dir(mq->req) != WRITE)
++ if (rq_data_dir(mqrq->req) != WRITE)
+ return;
+
+ local_irq_save(flags);
+- sg_copy_to_buffer(mq->bounce_sg, mq->bounce_sg_len,
+- mq->bounce_buf, mq->sg[0].length);
++ sg_copy_to_buffer(mqrq->bounce_sg, mqrq->bounce_sg_len,
++ mqrq->bounce_buf, mqrq->sg[0].length);
+ local_irq_restore(flags);
+ }
+
+@@ -361,19 +407,18 @@ void mmc_queue_bounce_pre(struct mmc_queue *mq)
+ * If reading, bounce the data from the buffer after the request
+ * has been handled by the host driver
+ */
+-void mmc_queue_bounce_post(struct mmc_queue *mq)
++void mmc_queue_bounce_post(struct mmc_queue_req *mqrq)
+ {
+ unsigned long flags;
+
+- if (!mq->bounce_buf)
++ if (!mqrq->bounce_buf)
+ return;
+
+- if (rq_data_dir(mq->req) != READ)
++ if (rq_data_dir(mqrq->req) != READ)
+ return;
+
+ local_irq_save(flags);
+- sg_copy_from_buffer(mq->bounce_sg, mq->bounce_sg_len,
+- mq->bounce_buf, mq->sg[0].length);
++ sg_copy_from_buffer(mqrq->bounce_sg, mqrq->bounce_sg_len,
++ mqrq->bounce_buf, mqrq->sg[0].length);
+ local_irq_restore(flags);
+ }
+-
+diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h
+index 64e66e0..0e65807 100644
+--- a/drivers/mmc/card/queue.h
++++ b/drivers/mmc/card/queue.h
+@@ -4,19 +4,33 @@
+ struct request;
+ struct task_struct;
+
++struct mmc_blk_request {
++ struct mmc_request mrq;
++ struct mmc_command cmd;
++ struct mmc_command stop;
++ struct mmc_data data;
++};
++
++struct mmc_queue_req {
++ struct request *req;
++ struct mmc_blk_request brq;
++ struct scatterlist *sg;
++ char *bounce_buf;
++ struct scatterlist *bounce_sg;
++ unsigned int bounce_sg_len;
++};
++
+ struct mmc_queue {
+ struct mmc_card *card;
+ struct task_struct *thread;
+ struct semaphore thread_sem;
+ unsigned int flags;
+- struct request *req;
+ int (*issue_fn)(struct mmc_queue *, struct request *);
+ void *data;
+ struct request_queue *queue;
+- struct scatterlist *sg;
+- char *bounce_buf;
+- struct scatterlist *bounce_sg;
+- unsigned int bounce_sg_len;
++ struct mmc_queue_req mqrq[2];
++ struct mmc_queue_req *mqrq_cur;
++ struct mmc_queue_req *mqrq_prev;
+ };
+
+ extern int mmc_init_queue(struct mmc_queue *, struct mmc_card *, spinlock_t *);
+@@ -24,8 +38,9 @@ extern void mmc_cleanup_queue(struct mmc_queue *);
+ extern void mmc_queue_suspend(struct mmc_queue *);
+ extern void mmc_queue_resume(struct mmc_queue *);
+
+-extern unsigned int mmc_queue_map_sg(struct mmc_queue *);
+-extern void mmc_queue_bounce_pre(struct mmc_queue *);
+-extern void mmc_queue_bounce_post(struct mmc_queue *);
++extern unsigned int mmc_queue_map_sg(struct mmc_queue *,
++ struct mmc_queue_req *);
++extern void mmc_queue_bounce_pre(struct mmc_queue_req *);
++extern void mmc_queue_bounce_post(struct mmc_queue_req *);
+
+ #endif
+diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
+index 1f453ac..85296df 100644
+--- a/drivers/mmc/core/core.c
++++ b/drivers/mmc/core/core.c
+@@ -23,6 +23,8 @@
+ #include <linux/log2.h>
+ #include <linux/regulator/consumer.h>
+ #include <linux/pm_runtime.h>
++#include <linux/fault-inject.h>
++#include <linux/random.h>
+
+ #include <linux/mmc/card.h>
+ #include <linux/mmc/host.h>
+@@ -82,6 +84,56 @@ static void mmc_flush_scheduled_work(void)
+ flush_workqueue(workqueue);
+ }
+
++#ifdef CONFIG_FAIL_MMC_REQUEST
++
++static DECLARE_FAULT_ATTR(fail_mmc_request);
++
++static int __init setup_fail_mmc_request(char *str)
++{
++ return setup_fault_attr(&fail_mmc_request, str);
++}
++__setup("fail_mmc_request=", setup_fail_mmc_request);
++
++static void mmc_should_fail_request(struct mmc_host *host,
++ struct mmc_request *mrq)
++{
++ struct mmc_command *cmd = mrq->cmd;
++ struct mmc_data *data = mrq->data;
++ static const int data_errors[] = {
++ -ETIMEDOUT,
++ -EILSEQ,
++ -EIO,
++ };
++
++ if (!data)
++ return;
++
++ if (cmd->error || data->error || !host->make_it_fail ||
++ !should_fail(&fail_mmc_request, data->blksz * data->blocks))
++ return;
++
++ data->error = data_errors[random32() % ARRAY_SIZE(data_errors)];
++ data->bytes_xfered = (random32() % (data->bytes_xfered >> 9)) << 9;
++}
++
++static int __init fail_mmc_request_debugfs(void)
++{
++ return init_fault_attr_dentries(&fail_mmc_request,
++ "fail_mmc_request");
++}
++
++late_initcall(fail_mmc_request_debugfs);
++
++#else /* CONFIG_FAIL_MMC_REQUEST */
++
++static inline void mmc_should_fail_request(struct mmc_host *host,
++ struct mmc_data *data)
++{
++}
++
++#endif /* CONFIG_FAIL_MMC_REQUEST */
++
++
+ /**
+ * mmc_request_done - finish processing an MMC request
+ * @host: MMC host which completed request
+@@ -108,6 +160,8 @@ void mmc_request_done(struct mmc_host *host, struct mmc_request *mrq)
+ cmd->error = 0;
+ host->ops->request(host, mrq);
+ } else {
++ mmc_should_fail_request(host, mrq);
++
+ led_trigger_event(host->led, LED_OFF);
+
+ pr_debug("%s: req done (CMD%u): %d: %08x %08x %08x %08x\n",
+@@ -198,30 +252,88 @@ mmc_start_request(struct mmc_host *host, struct mmc_request *mrq)
+
+ static void mmc_wait_done(struct mmc_request *mrq)
+ {
+- complete(mrq->done_data);
++ complete(&mrq->completion);
+ }
+
+ /**
+- * mmc_wait_for_req - start a request and wait for completion
++ * mmc_pre_req - Prepare for a new request
++ * @host: MMC host to prepare command
++ * @mrq: MMC request to prepare for
++ * @is_first_req: true if there is no previous started request
++ * that may run in parellel to this call, otherwise false
++ *
++ * mmc_pre_req() is called in prior to mmc_start_req() to let
++ * host prepare for the new request. Preparation of a request may be
++ * performed while another request is running on the host.
++ */
++void mmc_pre_req(struct mmc_host *host, struct mmc_request *mrq,
++ bool is_first_req)
++{
++ if (host->ops->pre_req)
++ host->ops->pre_req(host, mrq, is_first_req);
++}
++EXPORT_SYMBOL(mmc_pre_req);
++
++/**
++ * mmc_post_req - Post process a completed request
++ * @host: MMC host to post process command
++ * @mrq: MMC request to post process for
++ * @err: Error, if none zero, clean up any resources made in pre_req
++ *
++ * Let the host post process a completed request. Post processing of
++ * a request may be performed while another reuqest is running.
++ */
++void mmc_post_req(struct mmc_host *host, struct mmc_request *mrq, int err)
++{
++ if (host->ops->post_req)
++ host->ops->post_req(host, mrq, err);
++}
++EXPORT_SYMBOL(mmc_post_req);
++
++/**
++ * mmc_start_req - start a request
+ * @host: MMC host to start command
+ * @mrq: MMC request to start
+ *
+- * Start a new MMC custom command request for a host, and wait
+- * for the command to complete. Does not attempt to parse the
+- * response.
++ * Start a new MMC custom command request for a host.
++ * Does not wait for the command to complete.
+ */
+-void mmc_wait_for_req(struct mmc_host *host, struct mmc_request *mrq)
++void mmc_start_req(struct mmc_host *host, struct mmc_request *mrq)
+ {
+- DECLARE_COMPLETION_ONSTACK(complete);
+-
+- mrq->done_data = &complete;
++ init_completion(&mrq->completion);
+ mrq->done = mmc_wait_done;
+
+ mmc_start_request(host, mrq);
++}
++EXPORT_SYMBOL(mmc_start_req);
+
+- wait_for_completion(&complete);
++/**
++ * mmc_wait_for_req_done - wait for completion of request
++ * @mrq: MMC request to wait for
++ *
++ * Wait for the command to complete. Does not attempt to parse the
++ * response.
++ */
++void mmc_wait_for_req_done(struct mmc_request *mrq)
++{
++ wait_for_completion(&mrq->completion);
+ }
++EXPORT_SYMBOL(mmc_wait_for_req_done);
+
++/**
++ * mmc_wait_for_req - start a request and wait for completion
++ * @host: MMC host to start command
++ * @mrq: MMC request to start
++ *
++ * Start a new MMC custom command request for a host, and wait
++ * for the command to complete. Does not attempt to parse the
++ * response.
++ */
++void mmc_wait_for_req(struct mmc_host *host, struct mmc_request *mrq)
++{
++ mmc_start_req(host, mrq);
++ mmc_wait_for_req_done(mrq);
++}
+ EXPORT_SYMBOL(mmc_wait_for_req);
+
+ /**
+diff --git a/drivers/mmc/core/debugfs.c b/drivers/mmc/core/debugfs.c
+index 998797e..588e76f 100644
+--- a/drivers/mmc/core/debugfs.c
++++ b/drivers/mmc/core/debugfs.c
+@@ -188,6 +188,11 @@ void mmc_add_host_debugfs(struct mmc_host *host)
+ root, &host->clk_delay))
+ goto err_node;
+ #endif
++#ifdef CONFIG_FAIL_MMC_REQUEST
++ if (!debugfs_create_u8("make-it-fail", S_IRUSR | S_IWUSR,
++ root, &host->make_it_fail))
++ goto err_node;
++#endif
+ return;
+
+ err_node:
+diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
+index 94df405..872ef4a 100644
+--- a/drivers/mmc/host/Kconfig
++++ b/drivers/mmc/host/Kconfig
+@@ -429,6 +429,17 @@ config MMC_S3C_PIODMA
+
+ endchoice
+
++config MMC_GLAMO
++ tristate "Glamo S3C SD/MMC Card Interface support"
++ depends on MFD_GLAMO && MMC && REGULATOR
++ select CRC7
++ help
++ This selects a driver for the MCI interface found in
++ the S-Media GLAMO chip, as used in Openmoko
++ neo1973 GTA-02.
++
++ If unsure, say N.
++
+ config MMC_SDRICOH_CS
+ tristate "MMC/SD driver for Ricoh Bay1Controllers (EXPERIMENTAL)"
+ depends on EXPERIMENTAL && PCI && PCMCIA
+diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile
+index 4f1df0a..7133627 100644
+--- a/drivers/mmc/host/Makefile
++++ b/drivers/mmc/host/Makefile
+@@ -27,6 +27,7 @@ ifeq ($(CONFIG_OF),y)
+ obj-$(CONFIG_MMC_SPI) += of_mmc_spi.o
+ endif
+ obj-$(CONFIG_MMC_S3C) += s3cmci.o
++obj-$(CONFIG_MMC_GLAMO) += glamo-mci.o
+ obj-$(CONFIG_MMC_SDRICOH_CS) += sdricoh_cs.o
+ obj-$(CONFIG_MMC_TMIO) += tmio_mmc.o
+ obj-$(CONFIG_MMC_TMIO_CORE) += tmio_mmc_core.o
+diff --git a/drivers/mmc/host/glamo-mci.c b/drivers/mmc/host/glamo-mci.c
+new file mode 100644
+index 0000000..02c4b69
+--- /dev/null
++++ b/drivers/mmc/host/glamo-mci.c
+@@ -0,0 +1,939 @@
++/*
++ * linux/drivers/mmc/host/glamo-mmc.c - Glamo MMC driver
++ *
++ * Copyright (C) 2007 Openmoko, Inc, Andy Green <andy@openmoko.com>
++ * Copyright (C) 2009, Lars-Peter Clausen <lars@metafoo.de>
++ * Based on S3C MMC driver that was:
++ * Copyright (C) 2004-2006 maintech GmbH, Thomas Kleffel <tk@maintech.de>
++ *
++ * 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/mmc/mmc.h>
++#include <linux/mmc/sd.h>
++#include <linux/mmc/host.h>
++#include <linux/platform_device.h>
++#include <linux/irq.h>
++#include <linux/delay.h>
++#include <linux/interrupt.h>
++#include <linux/workqueue.h>
++#include <linux/crc7.h>
++#include <linux/scatterlist.h>
++#include <linux/io.h>
++#include <linux/regulator/consumer.h>
++#include <linux/err.h>
++#include <linux/mfd/glamo.h>
++#include <linux/mfd/glamo-core.h>
++#include <linux/mfd/glamo-regs.h>
++
++struct glamo_mci_host {
++ struct glamo_mmc_platform_data *pdata;
++ struct platform_device *pdev;
++ struct glamo_core *core;
++ struct mmc_host *mmc;
++ struct resource *mmio_mem;
++ struct resource *data_mem;
++ void __iomem *mmio_base;
++ uint16_t __iomem *data_base;
++
++ unsigned int irq;
++
++ struct regulator *regulator;
++ struct mmc_request *mrq;
++
++ unsigned int clk_rate;
++
++ unsigned short vdd;
++ char power_mode;
++
++ unsigned long transfer_start;
++ unsigned long request_start;
++
++ unsigned char request_counter;
++};
++
++static void glamo_mci_send_request(struct mmc_host *mmc,
++ struct mmc_request *mrq);
++static void glamo_mci_send_command(struct glamo_mci_host *host,
++ struct mmc_command *cmd);
++
++/*
++ * Max SD clock rate
++ *
++ * held at /(3 + 1) due to concerns of 100R recommended series resistor
++ * allows 16MHz @ 4-bit --> 8MBytes/sec raw
++ *
++ * you can override this on kernel commandline using
++ *
++ * glamo_mci.sd_max_clk=10000000
++ *
++ * for example
++ */
++
++static int sd_max_clk = 17000000;
++module_param(sd_max_clk, int, 0644);
++
++/*
++ * Slow SD clock rate
++ *
++ * you can override this on kernel commandline using
++ *
++ * glamo_mci.sd_slow_ratio=8
++ *
++ * for example
++ *
++ * platform callback is used to decide effective clock rate, if not
++ * defined then max is used, if defined and returns nonzero, rate is
++ * divided by this factor
++ */
++
++static int sd_slow_ratio = 8;
++module_param(sd_slow_ratio, int, 0644);
++
++/*
++ * Post-power SD clock rate
++ *
++ * you can override this on kernel commandline using
++ *
++ * glamo_mci.sd_post_power_clock=1000000
++ *
++ * for example
++ *
++ * After changing power to card, clock is held at this rate until first bulk
++ * transfer completes
++ */
++
++static int sd_post_power_clock = 1000000;
++module_param(sd_post_power_clock, int, 0644);
++
++
++static inline void glamomci_reg_write(struct glamo_mci_host *glamo,
++ uint16_t reg, uint16_t val)
++{
++ writew(val, glamo->mmio_base + reg);
++}
++
++static inline uint16_t glamomci_reg_read(struct glamo_mci_host *glamo,
++ uint16_t reg)
++{
++ return readw(glamo->mmio_base + reg);
++}
++
++static void glamomci_reg_set_bit_mask(struct glamo_mci_host *glamo,
++ uint16_t reg, uint16_t mask, uint16_t val)
++{
++ uint16_t tmp;
++
++ val &= mask;
++
++ tmp = glamomci_reg_read(glamo, reg);
++ tmp &= ~mask;
++ tmp |= val;
++ glamomci_reg_write(glamo, reg, tmp);
++}
++
++static void glamo_mci_reset(struct glamo_mci_host *host)
++{
++ glamo_engine_reset(host->core, GLAMO_ENGINE_MMC);
++
++ glamomci_reg_write(host, GLAMO_REG_MMC_WDATADS1,
++ (uint16_t)(host->data_mem->start));
++ glamomci_reg_write(host, GLAMO_REG_MMC_WDATADS2,
++ (uint16_t)(host->data_mem->start >> 16));
++
++ glamomci_reg_write(host, GLAMO_REG_MMC_RDATADS1,
++ (uint16_t)(host->data_mem->start));
++ glamomci_reg_write(host, GLAMO_REG_MMC_RDATADS2,
++ (uint16_t)(host->data_mem->start >> 16));
++
++}
++
++static int glamo_mci_clock_disable(struct mmc_host *mmc, int lazy)
++{
++ struct glamo_mci_host *host = mmc_priv(mmc);
++ glamo_engine_suspend(host->core, GLAMO_ENGINE_MMC);
++ return 0;
++}
++
++static int glamo_mci_clock_enable(struct mmc_host *mmc)
++{
++ struct glamo_mci_host *host = mmc_priv(mmc);
++ glamo_engine_enable(host->core, GLAMO_ENGINE_MMC);
++ return 0;
++}
++
++static void __iomem *glamo_mci_get_data_addr(struct glamo_mci_host *host,
++ struct mmc_data *data)
++{
++ void __iomem *addr = host->data_base;
++
++ if (data->host_cookie & 1)
++ addr += resource_size(host->data_mem) / 2;
++
++ return addr;
++}
++
++static void do_pio_read(struct glamo_mci_host *host, struct mmc_data *data)
++{
++ void __iomem *from_ptr = glamo_mci_get_data_addr(host, data);
++ struct sg_mapping_iter miter;
++
++ dev_dbg(&host->pdev->dev, "pio_read():\n");
++
++ sg_miter_start(&miter, data->sg, data->sg_len, SG_MITER_TO_SG);
++
++ while (sg_miter_next(&miter)) {
++ memcpy(miter.addr, from_ptr, miter.length);
++ from_ptr += miter.length;
++ }
++
++ sg_miter_stop(&miter);
++
++ dev_dbg(&host->pdev->dev, "pio_read(): "
++ "complete (no more data)\n");
++}
++
++static void do_pio_write(struct glamo_mci_host *host, struct mmc_data *data)
++{
++ void __iomem *to_ptr = glamo_mci_get_data_addr(host, data);
++ struct sg_mapping_iter miter;
++
++ dev_dbg(&host->pdev->dev, "pio_write():\n");
++ sg_miter_start(&miter, data->sg, data->sg_len, SG_MITER_FROM_SG);
++
++ while (sg_miter_next(&miter)) {
++ memcpy(to_ptr, miter.addr, miter.length);
++ to_ptr += miter.length;
++
++ data->bytes_xfered += miter.length;
++ }
++ sg_miter_stop(&miter);
++
++ dev_dbg(&host->pdev->dev, "pio_write(): complete\n");
++}
++
++static int glamo_mci_set_card_clock(struct glamo_mci_host *host, int freq)
++{
++ int real_rate = 0;
++
++ if (freq)
++ real_rate = glamo_engine_reclock(host->core, GLAMO_ENGINE_MMC,
++ freq);
++
++ return real_rate;
++}
++
++static int glamo_mci_wait_idle(struct glamo_mci_host *host,
++ unsigned long timeout)
++{
++ uint16_t status;
++
++ do {
++ status = glamomci_reg_read(host, GLAMO_REG_MMC_RB_STAT1);
++ } while (!(status & GLAMO_STAT1_MMC_IDLE) &&
++ time_is_after_jiffies(timeout));
++
++ if (time_is_before_eq_jiffies(timeout)) {
++ glamo_mci_reset(host);
++ return -ETIMEDOUT;
++ }
++
++ return 0;
++}
++
++static void glamo_mci_request_done(struct glamo_mci_host *host,
++ struct mmc_request *mrq)
++{
++ mmc_request_done(host->mmc, mrq);
++}
++
++static irqreturn_t glamo_mci_irq(int irq, void *data)
++{
++ struct glamo_mci_host *host = data;
++ struct mmc_request *mrq;
++ struct mmc_command *cmd;
++ uint16_t status;
++
++ if (!host->mrq || !host->mrq->cmd)
++ return IRQ_HANDLED;
++
++ mrq = host->mrq;
++ cmd = mrq->cmd;
++
++ status = glamomci_reg_read(host, GLAMO_REG_MMC_RB_STAT1);
++ dev_dbg(&host->pdev->dev, "status = 0x%04x\n", status);
++
++ /* we ignore a data timeout report if we are also told the data came */
++ if (status & GLAMO_STAT1_MMC_RB_DRDY)
++ status &= ~GLAMO_STAT1_MMC_DTOUT;
++
++ if (status & (GLAMO_STAT1_MMC_RTOUT | GLAMO_STAT1_MMC_DTOUT))
++ cmd->error = -ETIMEDOUT;
++ else if (status & (GLAMO_STAT1_MMC_BWERR | GLAMO_STAT1_MMC_BRERR))
++ cmd->error = -EILSEQ;
++
++ if (cmd->error) {
++ dev_info(&host->pdev->dev, "Error after cmd: 0x%x\n", status);
++ goto done;
++ }
++
++ /* issue STOP if we have been given one to use */
++ if (mrq->stop)
++ glamo_mci_send_command(host, mrq->stop);
++
++ if (mrq->data && (mrq->data->flags & MMC_DATA_READ)) {
++ mrq->data->bytes_xfered = mrq->data->blocks * mrq->data->blksz;
++ if (!mrq->data->host_cookie)
++ do_pio_read(host, mrq->data);
++ }
++
++ if (mrq->stop)
++ mrq->stop->error = glamo_mci_wait_idle(host, jiffies + HZ);
++
++done:
++ host->mrq = NULL;
++ glamo_mci_request_done(host, cmd->mrq);
++
++ return IRQ_HANDLED;
++}
++
++static void glamo_mci_send_command(struct glamo_mci_host *host,
++ struct mmc_command *cmd)
++{
++ uint8_t u8a[6];
++ uint16_t fire = 0;
++ unsigned int timeout = 1000000;
++ uint16_t *reg_resp = (uint16_t *)(host->mmio_base + GLAMO_REG_MMC_CMD_RSP1);
++ uint16_t status;
++ int triggers_int = 1;
++
++ /* if we can't do it, reject as busy */
++ if (!(glamomci_reg_read(host, GLAMO_REG_MMC_RB_STAT1) &
++ GLAMO_STAT1_MMC_IDLE)) {
++ cmd->error = -EBUSY;
++ return;
++ }
++
++ /* create an array in wire order for CRC computation */
++ u8a[0] = 0x40 | (cmd->opcode & 0x3f);
++ u8a[1] = (uint8_t)(cmd->arg >> 24);
++ u8a[2] = (uint8_t)(cmd->arg >> 16);
++ u8a[3] = (uint8_t)(cmd->arg >> 8);
++ u8a[4] = (uint8_t)cmd->arg;
++ u8a[5] = (crc7(0, u8a, 5) << 1) | 0x01;
++
++ /* issue the wire-order array including CRC in register order */
++ glamomci_reg_write(host, GLAMO_REG_MMC_CMD_REG1, ((u8a[4] << 8) | u8a[5]));
++ glamomci_reg_write(host, GLAMO_REG_MMC_CMD_REG2, ((u8a[2] << 8) | u8a[3]));
++ glamomci_reg_write(host, GLAMO_REG_MMC_CMD_REG3, ((u8a[0] << 8) | u8a[1]));
++
++ /* command index toggle */
++ fire |= (host->request_counter & 1) << 12;
++
++ /* set type of command */
++ switch (mmc_cmd_type(cmd)) {
++ case MMC_CMD_BC:
++ fire |= GLAMO_FIRE_MMC_CMDT_BNR;
++ break;
++ case MMC_CMD_BCR:
++ fire |= GLAMO_FIRE_MMC_CMDT_BR;
++ break;
++ case MMC_CMD_AC:
++ fire |= GLAMO_FIRE_MMC_CMDT_AND;
++ break;
++ case MMC_CMD_ADTC:
++ fire |= GLAMO_FIRE_MMC_CMDT_AD;
++ break;
++ }
++ /*
++ * if it expects a response, set the type expected
++ *
++ * R1, Length : 48bit, Normal response
++ * R1b, Length : 48bit, same R1, but added card busy status
++ * R2, Length : 136bit (really 128 bits with CRC snipped)
++ * R3, Length : 48bit (OCR register value)
++ * R4, Length : 48bit, SDIO_OP_CONDITION, Reverse SDIO Card
++ * R5, Length : 48bit, IO_RW_DIRECTION, Reverse SDIO Card
++ * R6, Length : 48bit (RCA register)
++ * R7, Length : 48bit (interface condition, VHS(voltage supplied),
++ * check pattern, CRC7)
++ */
++ switch (mmc_resp_type(cmd)) {
++ case MMC_RSP_R1: /* same index as R6 and R7 */
++ fire |= GLAMO_FIRE_MMC_RSPT_R1;
++ break;
++ case MMC_RSP_R1B:
++ fire |= GLAMO_FIRE_MMC_RSPT_R1b;
++ break;
++ case MMC_RSP_R2:
++ fire |= GLAMO_FIRE_MMC_RSPT_R2;
++ break;
++ case MMC_RSP_R3:
++ fire |= GLAMO_FIRE_MMC_RSPT_R3;
++ break;
++ /* R4 and R5 supported by chip not defined in linux/mmc/core.h (sdio) */
++ }
++ /*
++ * From the command index, set up the command class in the host ctrllr
++ *
++ * missing guys present on chip but couldn't figure out how to use yet:
++ * 0x0 "stream read"
++ * 0x9 "cancel running command"
++ */
++ switch (cmd->opcode) {
++ case MMC_READ_SINGLE_BLOCK:
++ fire |= GLAMO_FIRE_MMC_CC_SBR; /* single block read */
++ break;
++ case MMC_SWITCH: /* 64 byte payload */
++ case SD_APP_SD_STATUS:
++ case SD_APP_SEND_SCR:
++ case MMC_READ_MULTIPLE_BLOCK:
++ /* we will get an interrupt off this */
++ if (!cmd->mrq->stop) {
++ /* multiblock no stop */
++ fire |= GLAMO_FIRE_MMC_CC_MBRNS;
++ } else {
++ /* multiblock with stop */
++ fire |= GLAMO_FIRE_MMC_CC_MBRS;
++ }
++ break;
++ case MMC_WRITE_BLOCK:
++ fire |= GLAMO_FIRE_MMC_CC_SBW; /* single block write */
++ break;
++ case MMC_WRITE_MULTIPLE_BLOCK:
++ if (cmd->mrq->stop) {
++ /* multiblock with stop */
++ fire |= GLAMO_FIRE_MMC_CC_MBWS;
++ } else {
++ /* multiblock NO stop-- 'RESERVED'? */
++ fire |= GLAMO_FIRE_MMC_CC_MBWNS;
++ }
++ break;
++ case MMC_STOP_TRANSMISSION:
++ fire |= GLAMO_FIRE_MMC_CC_STOP; /* STOP */
++ triggers_int = 0;
++ break;
++ default:
++ fire |= GLAMO_FIRE_MMC_CC_BASIC; /* "basic command" */
++ triggers_int = 0;
++ break;
++ }
++
++ if (cmd->data)
++ host->mrq = cmd->mrq;
++
++ /* always largest timeout */
++ glamomci_reg_write(host, GLAMO_REG_MMC_TIMEOUT, 0xfff);
++
++ /* Generate interrupt on txfer */
++ glamomci_reg_set_bit_mask(host, GLAMO_REG_MMC_BASIC, 0xff36,
++ 0x0800 |
++ GLAMO_BASIC_MMC_NO_CLK_RD_WAIT |
++ GLAMO_BASIC_MMC_EN_COMPL_INT |
++ GLAMO_BASIC_MMC_EN_DATA_PUPS |
++ GLAMO_BASIC_MMC_EN_CMD_PUP);
++
++ /* send the command out on the wire */
++ /* dev_info(&host->pdev->dev, "Using FIRE %04X\n", fire); */
++ glamomci_reg_write(host, GLAMO_REG_MMC_CMD_FIRE, fire);
++
++ /* we are deselecting card? because it isn't going to ack then... */
++ if ((cmd->opcode == 7) && (cmd->arg == 0))
++ return;
++
++ /*
++ * we must spin until response is ready or timed out
++ * -- we don't get interrupts unless there is a bulk rx
++ */
++ do
++ status = glamomci_reg_read(host, GLAMO_REG_MMC_RB_STAT1);
++ while (((((status >> 15) & 1) != (host->request_counter & 1)) ||
++ (!(status & (GLAMO_STAT1_MMC_RB_RRDY |
++ GLAMO_STAT1_MMC_RTOUT |
++ GLAMO_STAT1_MMC_DTOUT |
++ GLAMO_STAT1_MMC_BWERR |
++ GLAMO_STAT1_MMC_BRERR)))) && (timeout--));
++
++ if ((status & (GLAMO_STAT1_MMC_RTOUT | GLAMO_STAT1_MMC_DTOUT)) ||
++ (timeout == 0)) {
++ cmd->error = -ETIMEDOUT;
++ } else if (status & (GLAMO_STAT1_MMC_BWERR | GLAMO_STAT1_MMC_BRERR)) {
++ cmd->error = -EILSEQ;
++ }
++
++ if (cmd->flags & MMC_RSP_PRESENT) {
++ if (cmd->flags & MMC_RSP_136) {
++ cmd->resp[3] = readw(&reg_resp[0]) |
++ (readw(&reg_resp[1]) << 16);
++ cmd->resp[2] = readw(&reg_resp[2]) |
++ (readw(&reg_resp[3]) << 16);
++ cmd->resp[1] = readw(&reg_resp[4]) |
++ (readw(&reg_resp[5]) << 16);
++ cmd->resp[0] = readw(&reg_resp[6]) |
++ (readw(&reg_resp[7]) << 16);
++ } else {
++ cmd->resp[0] = (readw(&reg_resp[0]) >> 8) |
++ (readw(&reg_resp[1]) << 8) |
++ (readw(&reg_resp[2]) << 24);
++ }
++ }
++}
++
++static int glamo_mci_prepare_pio(struct glamo_mci_host *host,
++ struct mmc_data *data)
++{
++ unsigned long addr = host->data_mem->start;
++
++ if (data->host_cookie & 1)
++ addr += resource_size(host->data_mem) / 2;
++
++ /* set up the block info */
++ glamomci_reg_write(host, GLAMO_REG_MMC_DATBLKLEN, data->blksz);
++ glamomci_reg_write(host, GLAMO_REG_MMC_DATBLKCNT, data->blocks);
++
++ if (data->flags & MMC_DATA_WRITE) {
++ glamomci_reg_write(host, GLAMO_REG_MMC_WDATADS1, addr);
++ glamomci_reg_write(host, GLAMO_REG_MMC_WDATADS2, addr >> 16);
++ } else {
++ glamomci_reg_write(host, GLAMO_REG_MMC_RDATADS1, addr);
++ glamomci_reg_write(host, GLAMO_REG_MMC_RDATADS2, addr >> 16);
++ }
++
++ if ((data->flags & MMC_DATA_WRITE) && !data->host_cookie)
++ do_pio_write(host, data);
++
++ dev_dbg(&host->pdev->dev, "(blksz=%d, count=%d)\n",
++ data->blksz, data->blocks);
++ return 0;
++}
++
++static void glamo_mci_send_request(struct mmc_host *mmc,
++ struct mmc_request *mrq)
++{
++ struct glamo_mci_host *host = mmc_priv(mmc);
++ struct mmc_command *cmd = mrq->cmd;
++
++ host->request_counter++;
++ host->request_start = jiffies;
++
++ if (cmd->data) {
++ if (glamo_mci_prepare_pio(host, cmd->data)) {
++ cmd->error = -EIO;
++ cmd->data->error = -EIO;
++ goto done;
++ }
++ }
++
++ dev_dbg(&host->pdev->dev, "cmd 0x%x, "
++ "arg 0x%x data=%p mrq->stop=%p flags 0x%x\n",
++ cmd->opcode, cmd->arg, cmd->data, cmd->mrq->stop,
++ cmd->flags);
++
++ glamo_mci_send_command(host, cmd);
++
++ /*
++ * if we don't have bulk data to take care of, we're done
++ */
++ if (!cmd->data || cmd->error)
++ goto done;
++
++ /*
++ * Otherwise can can use the interrupt as async completion --
++ * if there is read data coming, or we wait for write data to complete,
++ * exit without mmc_request_done() as the payload interrupt
++ * will service it
++ */
++ dev_dbg(&host->pdev->dev, "Waiting for payload data\n");
++ return;
++done:
++ if (!cmd->error)
++ cmd->error = glamo_mci_wait_idle(host, jiffies + 2 * HZ);
++ glamo_mci_request_done(host, mrq);
++}
++
++static void glamo_mci_set_power_mode(struct glamo_mci_host *host,
++ unsigned char power_mode)
++{
++ int ret;
++
++ if (power_mode == host->power_mode)
++ return;
++
++ switch (power_mode) {
++ case MMC_POWER_UP:
++ if (host->power_mode == MMC_POWER_OFF) {
++ ret = regulator_enable(host->regulator);
++ if (ret)
++ dev_err(&host->pdev->dev,
++ "Failed to enable regulator: %d\n",
++ ret);
++ }
++ break;
++ case MMC_POWER_ON:
++ break;
++ case MMC_POWER_OFF:
++ default:
++ ret = regulator_disable(host->regulator);
++ if (ret)
++ dev_warn(&host->pdev->dev,
++ "Failed to disable regulator: %d\n",
++ ret);
++ break;
++ }
++ host->power_mode = power_mode;
++}
++
++static void glamo_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
++{
++ struct glamo_mci_host *host = mmc_priv(mmc);
++ int bus_width = 0;
++ int rate;
++ int sd_drive;
++ int ret;
++
++ mmc_host_enable(mmc);
++
++ /* Set power */
++ glamo_mci_set_power_mode(host, ios->power_mode);
++
++ if (host->vdd != ios->vdd) {
++ ret = mmc_regulator_set_ocr(mmc, host->regulator, ios->vdd);
++ if (ret)
++ dev_err(&host->pdev->dev,
++ "Failed to set regulator voltage: %d\n", ret);
++ else
++ host->vdd = ios->vdd;
++ }
++
++ rate = glamo_mci_set_card_clock(host, ios->clock);
++
++ if ((ios->power_mode == MMC_POWER_ON) ||
++ (ios->power_mode == MMC_POWER_UP)) {
++ dev_info(&host->pdev->dev,
++ "powered (vdd = %hu) clk: %dkHz div=%hu (req: %ukHz). "
++ "Bus width=%d\n", ios->vdd,
++ rate / 1000, 0,
++ ios->clock / 1000, (int)ios->bus_width);
++ } else {
++ dev_info(&host->pdev->dev, "glamo_mci_set_ios: power down.\n");
++ }
++
++ /* set bus width */
++ if (ios->bus_width == MMC_BUS_WIDTH_4)
++ bus_width = GLAMO_BASIC_MMC_EN_4BIT_DATA;
++
++ sd_drive = (rate * 4) / host->clk_rate;
++ if (sd_drive > 3)
++ sd_drive = 3;
++
++ glamomci_reg_set_bit_mask(host, GLAMO_REG_MMC_BASIC,
++ GLAMO_BASIC_MMC_EN_4BIT_DATA | 0xc0,
++ bus_width | sd_drive << 6);
++
++ if (host->power_mode == MMC_POWER_OFF)
++ mmc_host_disable(host->mmc);
++ else
++ mmc_host_lazy_disable(host->mmc);
++}
++
++static void glamo_mci_pre_request(struct mmc_host *mmc,
++ struct mmc_request *mrq, bool is_first_req)
++{
++ struct glamo_mci_host *host = mmc_priv(mmc);
++
++ mrq->data->host_cookie = (host->request_counter & 1) | 2;
++
++ /* if write, prep the write into the shared RAM before the command */
++ if (mrq->data->flags & MMC_DATA_WRITE)
++ do_pio_write(host, mrq->data);
++}
++
++static void glamo_mci_post_request(struct mmc_host *mmc,
++ struct mmc_request *mrq, int err)
++{
++ struct glamo_mci_host *host = mmc_priv(mmc);
++
++ if (!mrq->data->host_cookie)
++ return;
++
++ if (err)
++ return;
++
++ if (mrq->data->flags & MMC_DATA_READ)
++ do_pio_read(host, mrq->data);
++
++ mrq->data->host_cookie = 0;
++}
++
++static struct mmc_host_ops glamo_mci_ops = {
++ .enable = glamo_mci_clock_enable,
++ .disable = glamo_mci_clock_disable,
++ .request = glamo_mci_send_request,
++ .post_req = glamo_mci_post_request,
++ .pre_req = glamo_mci_pre_request,
++ .set_ios = glamo_mci_set_ios,
++};
++
++static int __devinit glamo_mci_probe(struct platform_device *pdev)
++{
++ struct mmc_host *mmc;
++ struct glamo_mci_host *host;
++ struct glamo_core *core = dev_get_drvdata(pdev->dev.parent);
++ int ret;
++
++ dev_info(&pdev->dev, "glamo_mci driver (C)2007 Openmoko, Inc\n");
++
++ mmc = mmc_alloc_host(sizeof(struct glamo_mci_host), &pdev->dev);
++ if (!mmc) {
++ ret = -ENOMEM;
++ goto probe_out;
++ }
++
++ host = mmc_priv(mmc);
++ host->mmc = mmc;
++ host->pdev = pdev;
++ if (core->pdata)
++ host->pdata = core->pdata->mmc_data;
++ host->power_mode = MMC_POWER_OFF;
++ host->core = core;
++
++ host->irq = platform_get_irq(pdev, 0);
++
++ host->regulator = regulator_get(pdev->dev.parent, "SD_3V3");
++ if (IS_ERR(host->regulator)) {
++ dev_err(&pdev->dev, "Cannot proceed without regulator.\n");
++ ret = PTR_ERR(host->regulator);
++ goto probe_free_host;
++ }
++
++ host->mmio_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ if (!host->mmio_mem) {
++ dev_err(&pdev->dev,
++ "failed to get io memory region resouce.\n");
++ ret = -ENOENT;
++ goto probe_regulator_put;
++ }
++
++ host->mmio_mem = request_mem_region(host->mmio_mem->start,
++ resource_size(host->mmio_mem),
++ pdev->name);
++
++ if (!host->mmio_mem) {
++ dev_err(&pdev->dev, "failed to request io memory region.\n");
++ ret = -ENOENT;
++ goto probe_regulator_put;
++ }
++
++ host->mmio_base = ioremap(host->mmio_mem->start,
++ resource_size(host->mmio_mem));
++ if (!host->mmio_base) {
++ dev_err(&pdev->dev, "failed to ioremap() io memory region.\n");
++ ret = -EINVAL;
++ goto probe_free_mem_region_mmio;
++ }
++
++
++ /* Get ahold of our data buffer we use for data in and out on MMC */
++ host->data_mem = platform_get_resource(pdev, IORESOURCE_MEM, 1);
++ if (!host->data_mem) {
++ dev_err(&pdev->dev,
++ "failed to get io memory region resource.\n");
++ ret = -ENOENT;
++ goto probe_iounmap_mmio;
++ }
++
++ host->data_mem = request_mem_region(host->data_mem->start,
++ resource_size(host->data_mem),
++ pdev->name);
++
++ if (!host->data_mem) {
++ dev_err(&pdev->dev, "failed to request io memory region.\n");
++ ret = -ENOENT;
++ goto probe_iounmap_mmio;
++ }
++ host->data_base = ioremap(host->data_mem->start,
++ resource_size(host->data_mem));
++
++ if (host->data_base == 0) {
++ dev_err(&pdev->dev, "failed to ioremap() io memory region.\n");
++ ret = -EINVAL;
++ goto probe_free_mem_region_data;
++ }
++
++ ret = request_threaded_irq(host->irq, NULL, glamo_mci_irq, IRQF_SHARED,
++ pdev->name, host);
++ if (ret) {
++ dev_err(&pdev->dev, "failed to register irq.\n");
++ goto probe_iounmap_data;
++ }
++
++
++ host->vdd = 0;
++ host->clk_rate = glamo_pll_rate(host->core, GLAMO_PLL1);
++
++ /* explain our host controller capabilities */
++ mmc->ops = &glamo_mci_ops;
++ mmc->ocr_avail = mmc_regulator_get_ocrmask(host->regulator);
++ mmc->caps = MMC_CAP_4_BIT_DATA |
++ MMC_CAP_MMC_HIGHSPEED |
++ MMC_CAP_SD_HIGHSPEED;
++
++ if (host->pdata->nonremovable)
++ mmc->caps |= MMC_CAP_NONREMOVABLE;
++
++ mmc->f_min = host->clk_rate / 256;
++ mmc->f_max = sd_max_clk;
++
++ mmc->max_blk_count = (1 << 16) - 1; /* GLAMO_REG_MMC_RB_BLKCNT */
++ mmc->max_blk_size = (1 << 12) - 1; /* GLAMO_REG_MMC_RB_BLKLEN */
++ mmc->max_req_size = resource_size(host->data_mem) / 2;
++ mmc->max_seg_size = mmc->max_req_size;
++ mmc->max_segs = 128;
++
++ if (mmc->ocr_avail < 0) {
++ dev_warn(&pdev->dev,
++ "Failed to get ocr list for regulator: %d.\n",
++ mmc->ocr_avail);
++ mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
++ }
++
++ platform_set_drvdata(pdev, mmc);
++
++ mmc->caps |= MMC_CAP_DISABLE;
++ mmc_set_disable_delay(mmc, 1000 / 16);
++
++ mmc_host_enable(mmc);
++ glamo_mci_reset(host);
++
++ ret = mmc_add_host(mmc);
++ if (ret) {
++ dev_err(&pdev->dev, "failed to add mmc host.\n");
++ goto probe_mmc_host_disable;
++ }
++
++ mmc_host_lazy_disable(mmc);
++
++ return 0;
++
++probe_mmc_host_disable:
++ mmc_host_disable(mmc);
++ free_irq(host->irq, host);
++probe_iounmap_data:
++ iounmap(host->data_base);
++probe_free_mem_region_data:
++ release_mem_region(host->data_mem->start,
++ resource_size(host->data_mem));
++probe_iounmap_mmio:
++ iounmap(host->mmio_base);
++probe_free_mem_region_mmio:
++ release_mem_region(host->mmio_mem->start,
++ resource_size(host->mmio_mem));
++probe_regulator_put:
++ regulator_put(host->regulator);
++probe_free_host:
++ mmc_free_host(mmc);
++probe_out:
++ return ret;
++}
++
++static int __devexit glamo_mci_remove(struct platform_device *pdev)
++{
++ struct mmc_host *mmc = platform_get_drvdata(pdev);
++ struct glamo_mci_host *host = mmc_priv(mmc);
++
++ mmc_host_enable(mmc);
++ mmc_remove_host(mmc);
++ mmc_host_disable(mmc);
++
++ synchronize_irq(host->irq);
++ free_irq(host->irq, host);
++
++ iounmap(host->mmio_base);
++ iounmap(host->data_base);
++ release_mem_region(host->mmio_mem->start,
++ resource_size(host->mmio_mem));
++ release_mem_region(host->data_mem->start,
++ resource_size(host->data_mem));
++
++ regulator_put(host->regulator);
++
++ mmc_free_host(mmc);
++
++ return 0;
++}
++
++
++#ifdef CONFIG_PM
++
++static int glamo_mci_suspend(struct device *dev)
++{
++ struct mmc_host *mmc = dev_get_drvdata(dev);
++ struct glamo_mci_host *host = mmc_priv(mmc);
++ int ret;
++
++ disable_irq(host->irq);
++
++ mmc_host_enable(mmc);
++ ret = mmc_suspend_host(mmc);
++ mmc_host_disable(mmc);
++
++ return ret;
++}
++
++static int glamo_mci_resume(struct device *dev)
++{
++ struct mmc_host *mmc = dev_get_drvdata(dev);
++ struct glamo_mci_host *host = mmc_priv(mmc);
++ int ret;
++
++ mmc_host_enable(mmc);
++ glamo_mci_reset(host);
++ mdelay(10);
++
++ enable_irq(host->irq);
++
++ ret = mmc_resume_host(host->mmc);
++
++ mmc_host_lazy_disable(host->mmc);
++
++ return ret;
++}
++
++static SIMPLE_DEV_PM_OPS(glamo_mci_pm_ops, glamo_mci_suspend, glamo_mci_resume);
++#define GLAMO_MCI_PM_OPS (&glamo_mci_pm_ops)
++
++#else /* CONFIG_PM */
++#define GLAMO_MCI_PM_OPS NULL
++#endif /* CONFIG_PM */
++
++
++static struct platform_driver glamo_mci_driver = {
++ .probe = glamo_mci_probe,
++ .remove = __devexit_p(glamo_mci_remove),
++ .driver = {
++ .name = "glamo-mci",
++ .owner = THIS_MODULE,
++ .pm = GLAMO_MCI_PM_OPS,
++ },
++};
++
++static int __init glamo_mci_init(void)
++{
++ platform_driver_register(&glamo_mci_driver);
++ return 0;
++}
++module_init(glamo_mci_init);
++
++static void __exit glamo_mci_exit(void)
++{
++ platform_driver_unregister(&glamo_mci_driver);
++}
++module_exit(glamo_mci_exit);
++
++MODULE_DESCRIPTION("Glamo MMC/SD Card Interface driver");
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
++MODULE_ALIAS("platform:glamo-mci");
+diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c
+index 33d832d..cb5d2c0 100644
+--- a/drivers/mtd/nand/s3c2410.c
++++ b/drivers/mtd/nand/s3c2410.c
+@@ -813,7 +813,7 @@ static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info,
+ nmtd->mtd.owner = THIS_MODULE;
+ nmtd->set = set;
+
+- if (hardware_ecc) {
++ if (!(info->platform && info->platform->software_ecc) && hardware_ecc) {
+ chip->ecc.calculate = s3c2410_nand_calculate_ecc;
+ chip->ecc.correct = s3c2410_nand_correct_data;
+ chip->ecc.mode = NAND_ECC_HW;
+diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig
+index 52a462f..985f350 100644
+--- a/drivers/power/Kconfig
++++ b/drivers/power/Kconfig
+@@ -14,6 +14,12 @@ config POWER_SUPPLY_DEBUG
+ Say Y here to enable debugging messages for power supply class
+ and drivers.
+
++config BATTERY_PLATFORM
++ tristate "Platform battery driver"
++ help
++ Say Y here to include support for battery driver that gets all
++ information from platform functions.
++
+ config PDA_POWER
+ tristate "Generic PDA/phone power driver"
+ depends on !S390
+diff --git a/drivers/power/Makefile b/drivers/power/Makefile
+index 8385bfa..59530ee 100644
+--- a/drivers/power/Makefile
++++ b/drivers/power/Makefile
+@@ -14,6 +14,7 @@ obj-$(CONFIG_WM831X_POWER) += wm831x_power.o
+ obj-$(CONFIG_WM8350_POWER) += wm8350_power.o
+ obj-$(CONFIG_TEST_POWER) += test_power.o
+
++obj-$(CONFIG_BATTERY_PLATFORM) += platform_battery.o
+ obj-$(CONFIG_BATTERY_DS2760) += ds2760_battery.o
+ obj-$(CONFIG_BATTERY_DS2782) += ds2782_battery.o
+ obj-$(CONFIG_BATTERY_PMU) += pmu_battery.o
+diff --git a/drivers/power/pcf50633-charger.c b/drivers/power/pcf50633-charger.c
+index 4fa52e1..97dbcb2 100644
+--- a/drivers/power/pcf50633-charger.c
++++ b/drivers/power/pcf50633-charger.c
+@@ -24,9 +24,27 @@
+ #include <linux/platform_device.h>
+ #include <linux/power_supply.h>
+
++#include <linux/interrupt.h>
++
+ #include <linux/mfd/pcf50633/core.h>
+ #include <linux/mfd/pcf50633/mbc.h>
+
++enum pcf50633_mbc_irqs {
++ PCF50633_MBC_IRQ_ADPINS,
++ PCF50633_MBC_IRQ_ADPREM,
++ PCF50633_MBC_IRQ_USBINS,
++ PCF50633_MBC_IRQ_USBREM,
++ PCF50633_MBC_IRQ_BATFULL,
++ PCF50633_MBC_IRQ_CHGHALT,
++ PCF50633_MBC_IRQ_THLIMON,
++ PCF50633_MBC_IRQ_THLIMOFF,
++ PCF50633_MBC_IRQ_USBLIMON,
++ PCF50633_MBC_IRQ_USBLIMOFF,
++ PCF50633_MBC_IRQ_LOWSYS,
++ PCF50633_MBC_IRQ_LOWBAT,
++ PCF50633_MBC_NUM_IRQS,
++};
++
+ struct pcf50633_mbc {
+ struct pcf50633 *pcf;
+
+@@ -36,11 +54,13 @@ struct pcf50633_mbc {
+ struct power_supply usb;
+ struct power_supply adapter;
+ struct power_supply ac;
++
++ int irqs[PCF50633_MBC_NUM_IRQS];
+ };
+
+-int pcf50633_mbc_usb_curlim_set(struct pcf50633 *pcf, int ma)
++static int __pcf50633_mbc_usb_curlim_set(struct pcf50633_mbc *mbc, int ma)
+ {
+- struct pcf50633_mbc *mbc = platform_get_drvdata(pcf->mbc_pdev);
++ struct pcf50633 *pcf = mbc->pcf;
+ int ret = 0;
+ u8 bits;
+ int charging_start = 1;
+@@ -80,14 +100,14 @@ int pcf50633_mbc_usb_curlim_set(struct pcf50633 *pcf, int ma)
+ * gets reset to the wrong thing
+ */
+
+- if (mbc->pcf->pdata->charger_reference_current_ma) {
+- mbcc5 = (ma << 8) / mbc->pcf->pdata->charger_reference_current_ma;
++ if (pcf->pdata->charger_reference_current_ma) {
++ mbcc5 = (ma << 8) / pcf->pdata->charger_reference_current_ma;
+ if (mbcc5 > 255)
+ mbcc5 = 255;
+- pcf50633_reg_write(mbc->pcf, PCF50633_REG_MBCC5, mbcc5);
++ pcf50633_reg_write(pcf, PCF50633_REG_MBCC5, mbcc5);
+ }
+
+- mbcs2 = pcf50633_reg_read(mbc->pcf, PCF50633_REG_MBCS2);
++ mbcs2 = pcf50633_reg_read(pcf, PCF50633_REG_MBCS2);
+ chgmod = (mbcs2 & PCF50633_MBCS2_MBC_MASK);
+
+ /* If chgmod == BATFULL, setting chgena has no effect.
+@@ -108,18 +128,29 @@ int pcf50633_mbc_usb_curlim_set(struct pcf50633 *pcf, int ma)
+
+ return ret;
+ }
++
++int pcf50633_mbc_usb_curlim_set(struct pcf50633 *pcf, int ma)
++{
++ struct pcf50633_mbc *mbc = pcf->mbc;
++
++ if (!mbc)
++ return -ENODEV;
++
++ return __pcf50633_mbc_usb_curlim_set(mbc, ma);
++}
+ EXPORT_SYMBOL_GPL(pcf50633_mbc_usb_curlim_set);
+
++
+ int pcf50633_mbc_get_status(struct pcf50633 *pcf)
+ {
+- struct pcf50633_mbc *mbc = platform_get_drvdata(pcf->mbc_pdev);
++ struct pcf50633_mbc *mbc = pcf->mbc;
+ int status = 0;
+ u8 chgmod;
+
+ if (!mbc)
+ return 0;
+
+- chgmod = pcf50633_reg_read(mbc->pcf, PCF50633_REG_MBCS2)
++ chgmod = pcf50633_reg_read(pcf, PCF50633_REG_MBCS2)
+ & PCF50633_MBCS2_MBC_MASK;
+
+ if (mbc->usb_online)
+@@ -143,7 +174,7 @@ EXPORT_SYMBOL_GPL(pcf50633_mbc_get_status);
+
+ int pcf50633_mbc_get_usb_online_status(struct pcf50633 *pcf)
+ {
+- struct pcf50633_mbc *mbc = platform_get_drvdata(pcf->mbc_pdev);
++ struct pcf50633_mbc *mbc = pcf->mbc;
+
+ if (!mbc)
+ return 0;
+@@ -195,7 +226,7 @@ static ssize_t set_usblim(struct device *dev,
+ if (ret)
+ return -EINVAL;
+
+- pcf50633_mbc_usb_curlim_set(mbc->pcf, ma);
++ __pcf50633_mbc_usb_curlim_set(mbc, ma);
+
+ return count;
+ }
+@@ -259,31 +290,34 @@ static struct attribute_group mbc_attr_group = {
+ .attrs = pcf50633_mbc_sysfs_entries,
+ };
+
+-static void
+-pcf50633_mbc_irq_handler(int irq, void *data)
++static irqreturn_t pcf50633_mbc_irq_handler(int irq, void *data)
+ {
+ struct pcf50633_mbc *mbc = data;
+
+ /* USB */
+- if (irq == PCF50633_IRQ_USBINS) {
++ if (irq == mbc->irqs[PCF50633_MBC_IRQ_USBINS]) {
+ mbc->usb_online = 1;
+- } else if (irq == PCF50633_IRQ_USBREM) {
++ } else if (irq == mbc->irqs[PCF50633_MBC_IRQ_USBREM]) {
+ mbc->usb_online = 0;
+- pcf50633_mbc_usb_curlim_set(mbc->pcf, 0);
++ __pcf50633_mbc_usb_curlim_set(mbc, 0);
+ }
+
+ /* Adapter */
+- if (irq == PCF50633_IRQ_ADPINS)
++ if (irq == mbc->irqs[PCF50633_MBC_IRQ_ADPINS])
+ mbc->adapter_online = 1;
+- else if (irq == PCF50633_IRQ_ADPREM)
++ else if (irq == mbc->irqs[PCF50633_MBC_IRQ_ADPREM])
+ mbc->adapter_online = 0;
+
+ power_supply_changed(&mbc->ac);
+ power_supply_changed(&mbc->usb);
+ power_supply_changed(&mbc->adapter);
+
+- if (mbc->pcf->pdata->mbc_event_callback)
++ if (mbc->pcf->pdata->mbc_event_callback) {
++ irq -= mbc->pcf->irq_base;
+ mbc->pcf->pdata->mbc_event_callback(mbc->pcf, irq);
++ }
++
++ return IRQ_HANDLED;
+ }
+
+ static int adapter_get_property(struct power_supply *psy,
+@@ -351,25 +385,27 @@ static enum power_supply_property power_props[] = {
+ POWER_SUPPLY_PROP_ONLINE,
+ };
+
+-static const u8 mbc_irq_handlers[] = {
+- PCF50633_IRQ_ADPINS,
+- PCF50633_IRQ_ADPREM,
+- PCF50633_IRQ_USBINS,
+- PCF50633_IRQ_USBREM,
+- PCF50633_IRQ_BATFULL,
+- PCF50633_IRQ_CHGHALT,
+- PCF50633_IRQ_THLIMON,
+- PCF50633_IRQ_THLIMOFF,
+- PCF50633_IRQ_USBLIMON,
+- PCF50633_IRQ_USBLIMOFF,
+- PCF50633_IRQ_LOWSYS,
+- PCF50633_IRQ_LOWBAT,
++static const char *pcf50633_mbc_irq_names[PCF50633_MBC_NUM_IRQS] = {
++ "ADPINS",
++ "ADPREM",
++ "USBINS",
++ "USBREM",
++ "BATFULL",
++ "CHGHALT",
++ "THLIMON",
++ "THLIMOFF",
++ "USBLIMON",
++ "USBLIMOFF",
++ "LOWSYS",
++ "LOWBAT",
+ };
+
+ static int __devinit pcf50633_mbc_probe(struct platform_device *pdev)
+ {
++ struct pcf50633 *pcf = dev_to_pcf50633(pdev->dev.parent);
+ struct pcf50633_mbc *mbc;
+ int ret;
++ int irq;
+ int i;
+ u8 mbcs1;
+
+@@ -377,13 +413,19 @@ static int __devinit pcf50633_mbc_probe(struct platform_device *pdev)
+ if (!mbc)
+ return -ENOMEM;
+
+- platform_set_drvdata(pdev, mbc);
+- mbc->pcf = dev_to_pcf50633(pdev->dev.parent);
++ for (i = 0; i < PCF50633_MBC_NUM_IRQS; ++i) {
++ irq = platform_get_irq_byname(pdev, pcf50633_mbc_irq_names[i]);
++ if (irq <= 0) {
++ dev_err(&pdev->dev, "Failed to get %s irq: %d\n",
++ pcf50633_mbc_irq_names[i], irq);
++ ret = irq ?: -EINVAL;
++ goto err_free;
++ }
++ mbc->irqs[i] = irq;
++ }
+
+- /* Set up IRQ handlers */
+- for (i = 0; i < ARRAY_SIZE(mbc_irq_handlers); i++)
+- pcf50633_register_irq(mbc->pcf, mbc_irq_handlers[i],
+- pcf50633_mbc_irq_handler, mbc);
++ platform_set_drvdata(pdev, mbc);
++ mbc->pcf = pcf;
+
+ /* Create power supplies */
+ mbc->adapter.name = "adapter";
+@@ -413,38 +455,63 @@ static int __devinit pcf50633_mbc_probe(struct platform_device *pdev)
+ ret = power_supply_register(&pdev->dev, &mbc->adapter);
+ if (ret) {
+ dev_err(mbc->pcf->dev, "failed to register adapter\n");
+- kfree(mbc);
+- return ret;
++ goto err_free;
+ }
+
+ ret = power_supply_register(&pdev->dev, &mbc->usb);
+ if (ret) {
+ dev_err(mbc->pcf->dev, "failed to register usb\n");
+- power_supply_unregister(&mbc->adapter);
+- kfree(mbc);
+- return ret;
++ goto err_unregister_adapter;
+ }
+
+ ret = power_supply_register(&pdev->dev, &mbc->ac);
+ if (ret) {
+ dev_err(mbc->pcf->dev, "failed to register ac\n");
+- power_supply_unregister(&mbc->adapter);
+- power_supply_unregister(&mbc->usb);
+- kfree(mbc);
+- return ret;
++ goto err_unregister_usb;
+ }
+
+ ret = sysfs_create_group(&pdev->dev.kobj, &mbc_attr_group);
+- if (ret)
++ if (ret) {
+ dev_err(mbc->pcf->dev, "failed to create sysfs entries\n");
++ goto err_unregister_ac;
++ }
++
++ /* Set up IRQ handlers */
++ for (i = 0; i < PCF50633_MBC_NUM_IRQS; ++i) {
++ ret = request_threaded_irq(mbc->irqs[i], NULL,
++ pcf50633_mbc_irq_handler, 0,
++ pcf50633_mbc_irq_names[i], mbc);
++ if (ret) {
++ dev_err(&pdev->dev, "Failed to request %s irq: %d\n",
++ pcf50633_mbc_irq_names[i], ret);
++ goto err_free_irq;
++ }
++ }
+
+ mbcs1 = pcf50633_reg_read(mbc->pcf, PCF50633_REG_MBCS1);
+ if (mbcs1 & PCF50633_MBCS1_USBPRES)
+- pcf50633_mbc_irq_handler(PCF50633_IRQ_USBINS, mbc);
++ pcf50633_mbc_irq_handler(mbc->irqs[PCF50633_MBC_IRQ_USBINS], mbc);
+ if (mbcs1 & PCF50633_MBCS1_ADAPTPRES)
+- pcf50633_mbc_irq_handler(PCF50633_IRQ_ADPINS, mbc);
++ pcf50633_mbc_irq_handler(mbc->irqs[PCF50633_MBC_IRQ_ADPINS], mbc);
++
++ pcf->mbc = mbc;
+
+ return 0;
++
++err_free_irq:
++ for (--i; i >= 0; --i)
++ free_irq(mbc->irqs[i], mbc);
++ sysfs_remove_group(&pdev->dev.kobj, &mbc_attr_group);
++err_unregister_ac:
++ power_supply_unregister(&mbc->ac);
++err_unregister_usb:
++ power_supply_unregister(&mbc->usb);
++err_unregister_adapter:
++ power_supply_unregister(&mbc->adapter);
++err_free:
++ kfree(mbc);
++
++ return ret;
+ }
+
+ static int __devexit pcf50633_mbc_remove(struct platform_device *pdev)
+@@ -452,9 +519,11 @@ static int __devexit pcf50633_mbc_remove(struct platform_device *pdev)
+ struct pcf50633_mbc *mbc = platform_get_drvdata(pdev);
+ int i;
+
++ mbc->pcf->mbc = NULL;
++
+ /* Remove IRQ handlers */
+- for (i = 0; i < ARRAY_SIZE(mbc_irq_handlers); i++)
+- pcf50633_free_irq(mbc->pcf, mbc_irq_handlers[i]);
++ for (i = PCF50633_MBC_NUM_IRQS - 1; i >= 0; --i)
++ free_irq(mbc->irqs[i], mbc);
+
+ sysfs_remove_group(&pdev->dev.kobj, &mbc_attr_group);
+ power_supply_unregister(&mbc->usb);
+diff --git a/drivers/power/platform_battery.c b/drivers/power/platform_battery.c
+new file mode 100644
+index 0000000..a5c9f35
+--- /dev/null
++++ b/drivers/power/platform_battery.c
+@@ -0,0 +1,120 @@
++/*
++ * Driver for platform battery
++ *
++ * Copyright (c) Paul Fertser <fercerpav@gmail.com>
++ * Inspired by Balaji Rao <balajirrao@openmoko.org>
++ *
++ * This driver can be used for dumb batteries when all knowledge about
++ * their state belongs to the platform that does necessary ADC readings,
++ * conversions, guessimations etc.
++ *
++ * Use consistent with the GNU GPL is permitted, provided that this
++ * copyright notice is preserved in its entirety in all copies and derived
++ * works.
++ */
++
++#include <linux/module.h>
++#include <linux/platform_device.h>
++#include <linux/power_supply.h>
++#include <linux/slab.h>
++#include <linux/workqueue.h>
++
++#include <linux/delay.h>
++#include <linux/platform_battery.h>
++
++struct platform_battery {
++ struct power_supply psy;
++ struct platform_bat_platform_data *pdata;
++};
++
++static int platform_bat_get_property(struct power_supply *psy,
++ enum power_supply_property psp,
++ union power_supply_propval *val)
++{
++ struct platform_battery *bat =
++ container_of(psy, struct platform_battery, psy);
++ size_t i;
++ int present=1;
++
++ if (bat->pdata->is_present)
++ present = bat->pdata->is_present();
++
++ if (psp != POWER_SUPPLY_PROP_PRESENT && !present)
++ return -ENODEV;
++
++ for (i = 0; i < psy->num_properties; i++)
++ if (psy->properties[i] == psp) {
++ val->intval = bat->pdata->get_property[i]();
++ return 0;
++ }
++
++ return -EINVAL;
++}
++
++static void platform_bat_ext_changed(struct power_supply *psy)
++{
++ struct platform_battery *bat =
++ container_of(psy, struct platform_battery, psy);
++ power_supply_changed(&bat->psy);
++}
++
++static int platform_battery_probe(struct platform_device *pdev)
++{
++ struct platform_battery *platform_bat;
++ struct platform_bat_platform_data *pdata =
++ (struct platform_bat_platform_data *)pdev->dev.platform_data;
++
++ platform_bat = kzalloc(sizeof(*platform_bat), GFP_KERNEL);
++ if (!platform_bat)
++ return -ENOMEM;
++
++ if (pdata->name)
++ platform_bat->psy.name = pdata->name;
++ else
++ platform_bat->psy.name = dev_name(&pdev->dev);
++ platform_bat->psy.type = POWER_SUPPLY_TYPE_BATTERY;
++ platform_bat->psy.properties = pdata->properties;
++ platform_bat->psy.num_properties = pdata->num_properties;
++ platform_bat->psy.get_property = platform_bat_get_property;
++ platform_bat->psy.external_power_changed = platform_bat_ext_changed;
++
++ platform_bat->pdata = pdata;
++ platform_set_drvdata(pdev, platform_bat);
++ power_supply_register(&pdev->dev, &platform_bat->psy);
++
++ return 0;
++}
++
++static int platform_battery_remove(struct platform_device *pdev)
++{
++ struct platform_battery *bat = platform_get_drvdata(pdev);
++
++ power_supply_unregister(&bat->psy);
++ kfree(bat);
++
++ return 0;
++}
++
++static struct platform_driver platform_battery_driver = {
++ .driver = {
++ .name = "platform_battery",
++ },
++ .probe = platform_battery_probe,
++ .remove = platform_battery_remove,
++};
++
++static int __init platform_battery_init(void)
++{
++ return platform_driver_register(&platform_battery_driver);
++}
++module_init(platform_battery_init);
++
++static void __exit platform_battery_exit(void)
++{
++ platform_driver_unregister(&platform_battery_driver);
++}
++module_exit(platform_battery_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Paul Fertser <fercerpav@gmail.com>");
++MODULE_DESCRIPTION("platform battery driver");
+diff --git a/drivers/regulator/pcf50633-regulator.c b/drivers/regulator/pcf50633-regulator.c
+index 69a11d9..5e7deb5 100644
+--- a/drivers/regulator/pcf50633-regulator.c
++++ b/drivers/regulator/pcf50633-regulator.c
+@@ -316,11 +316,10 @@ static int __devinit pcf50633_regulator_probe(struct platform_device *pdev)
+ struct regulator_dev *rdev;
+ struct pcf50633 *pcf;
+
+- /* Already set by core driver */
+ pcf = dev_to_pcf50633(pdev->dev.parent);
+
+ rdev = regulator_register(&regulators[pdev->id], &pdev->dev,
+- pdev->dev.platform_data, pcf);
++ &pcf->pdata->reg_init_data[pdev->id], pcf);
+ if (IS_ERR(rdev))
+ return PTR_ERR(rdev);
+
+diff --git a/drivers/rtc/rtc-pcf50633.c b/drivers/rtc/rtc-pcf50633.c
+index f90c574..b0dc8c2 100644
+--- a/drivers/rtc/rtc-pcf50633.c
++++ b/drivers/rtc/rtc-pcf50633.c
+@@ -58,11 +58,12 @@ struct pcf50633_time {
+
+ struct pcf50633_rtc {
+ int alarm_enabled;
+- int second_enabled;
+ int alarm_pending;
+
+ struct pcf50633 *pcf;
+ struct rtc_device *rtc_dev;
++
++ int irq_alarm;
+ };
+
+ static void pcf2rtc_time(struct rtc_time *rtc, struct pcf50633_time *pcf)
+@@ -91,15 +92,11 @@ static int
+ pcf50633_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
+ {
+ struct pcf50633_rtc *rtc = dev_get_drvdata(dev);
+- int err;
+-
+- if (enabled)
+- err = pcf50633_irq_unmask(rtc->pcf, PCF50633_IRQ_ALARM);
+- else
+- err = pcf50633_irq_mask(rtc->pcf, PCF50633_IRQ_ALARM);
+
+- if (err < 0)
+- return err;
++ if (enabled && !rtc->alarm_enabled)
++ enable_irq(rtc->irq_alarm);
++ else if (!enabled && rtc->alarm_enabled)
++ disable_irq(rtc->irq_alarm);
+
+ rtc->alarm_enabled = enabled;
+
+@@ -143,7 +140,7 @@ static int pcf50633_rtc_set_time(struct device *dev, struct rtc_time *tm)
+ {
+ struct pcf50633_rtc *rtc;
+ struct pcf50633_time pcf_tm;
+- int second_masked, alarm_masked, ret = 0;
++ int ret = 0;
+
+ rtc = dev_get_drvdata(dev);
+
+@@ -162,23 +159,16 @@ static int pcf50633_rtc_set_time(struct device *dev, struct rtc_time *tm)
+ pcf_tm.time[PCF50633_TI_SEC]);
+
+
+- second_masked = pcf50633_irq_mask_get(rtc->pcf, PCF50633_IRQ_SECOND);
+- alarm_masked = pcf50633_irq_mask_get(rtc->pcf, PCF50633_IRQ_ALARM);
+-
+- if (!second_masked)
+- pcf50633_irq_mask(rtc->pcf, PCF50633_IRQ_SECOND);
+- if (!alarm_masked)
+- pcf50633_irq_mask(rtc->pcf, PCF50633_IRQ_ALARM);
++ if (rtc->alarm_enabled)
++ disable_irq(rtc->irq_alarm);
+
+ /* Returns 0 on success */
+ ret = pcf50633_write_block(rtc->pcf, PCF50633_REG_RTCSC,
+ PCF50633_TI_EXTENT,
+ &pcf_tm.time[0]);
+
+- if (!second_masked)
+- pcf50633_irq_unmask(rtc->pcf, PCF50633_IRQ_SECOND);
+- if (!alarm_masked)
+- pcf50633_irq_unmask(rtc->pcf, PCF50633_IRQ_ALARM);
++ if (rtc->alarm_enabled)
++ enable_irq(rtc->irq_alarm);
+
+ return ret;
+ }
+@@ -210,7 +200,7 @@ static int pcf50633_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
+ {
+ struct pcf50633_rtc *rtc;
+ struct pcf50633_time pcf_tm;
+- int alarm_masked, ret = 0;
++ int ret = 0;
+
+ rtc = dev_get_drvdata(dev);
+
+@@ -219,11 +209,9 @@ static int pcf50633_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
+ /* do like mktime does and ignore tm_wday */
+ pcf_tm.time[PCF50633_TI_WKDAY] = 7;
+
+- alarm_masked = pcf50633_irq_mask_get(rtc->pcf, PCF50633_IRQ_ALARM);
+-
+ /* disable alarm interrupt */
+- if (!alarm_masked)
+- pcf50633_irq_mask(rtc->pcf, PCF50633_IRQ_ALARM);
++ if (rtc->alarm_enabled)
++ disable_irq(rtc->irq_alarm);
+
+ /* Returns 0 on success */
+ ret = pcf50633_write_block(rtc->pcf, PCF50633_REG_RTCSCA,
+@@ -231,8 +219,8 @@ static int pcf50633_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
+ if (!alrm->enabled)
+ rtc->alarm_pending = 0;
+
+- if (!alarm_masked || alrm->enabled)
+- pcf50633_irq_unmask(rtc->pcf, PCF50633_IRQ_ALARM);
++ if (!rtc->alarm_enabled && alrm->enabled)
++ enable_irq(rtc->irq_alarm);
+ rtc->alarm_enabled = alrm->enabled;
+
+ return ret;
+@@ -246,24 +234,26 @@ static struct rtc_class_ops pcf50633_rtc_ops = {
+ .alarm_irq_enable = pcf50633_rtc_alarm_irq_enable,
+ };
+
+-static void pcf50633_rtc_irq(int irq, void *data)
++static irqreturn_t pcf50633_rtc_alarm_irq(int irq, void *data)
+ {
+ struct pcf50633_rtc *rtc = data;
++ rtc_update_irq(rtc->rtc_dev, 1, RTC_AF | RTC_IRQF);
++ rtc->alarm_pending = 1;
+
+- switch (irq) {
+- case PCF50633_IRQ_ALARM:
+- rtc_update_irq(rtc->rtc_dev, 1, RTC_AF | RTC_IRQF);
+- rtc->alarm_pending = 1;
+- break;
+- case PCF50633_IRQ_SECOND:
+- rtc_update_irq(rtc->rtc_dev, 1, RTC_UF | RTC_IRQF);
+- break;
+- }
++ return IRQ_HANDLED;
+ }
+
+ static int __devinit pcf50633_rtc_probe(struct platform_device *pdev)
+ {
+ struct pcf50633_rtc *rtc;
++ int irq_alarm;
++ int ret;
++
++ irq_alarm = platform_get_irq_byname(pdev, "ALARM");
++ if (irq_alarm <= 0) {
++ dev_err(&pdev->dev, "Failed to get alarm irq: %d\n", irq_alarm);
++ return irq_alarm ?: -EINVAL;
++ }
+
+ rtc = kzalloc(sizeof(*rtc), GFP_KERNEL);
+ if (!rtc)
+@@ -280,12 +270,23 @@ static int __devinit pcf50633_rtc_probe(struct platform_device *pdev)
+ return ret;
+ }
+
+- pcf50633_register_irq(rtc->pcf, PCF50633_IRQ_ALARM,
+- pcf50633_rtc_irq, rtc);
+- pcf50633_register_irq(rtc->pcf, PCF50633_IRQ_SECOND,
+- pcf50633_rtc_irq, rtc);
++ ret = request_threaded_irq(irq_alarm, NULL, pcf50633_rtc_alarm_irq, 0,
++ "pcf50633-rtc alarm", rtc);
++ if (ret) {
++ dev_err(&pdev->dev, "Failed to request alarm irq: %d\n", ret);
++ goto err_free;
++ }
++ disable_irq(irq_alarm);
++
++ rtc->irq_alarm = irq_alarm;
+
+ return 0;
++
++err_free_irq:
++ free_irq(irq_alarm, rtc);
++err_free:
++ kfree(rtc);
++ return ret;
+ }
+
+ static int __devexit pcf50633_rtc_remove(struct platform_device *pdev)
+@@ -294,8 +295,7 @@ static int __devexit pcf50633_rtc_remove(struct platform_device *pdev)
+
+ rtc = platform_get_drvdata(pdev);
+
+- pcf50633_free_irq(rtc->pcf, PCF50633_IRQ_ALARM);
+- pcf50633_free_irq(rtc->pcf, PCF50633_IRQ_SECOND);
++ free_irq(rtc->irq_alarm, rtc);
+
+ rtc_device_unregister(rtc->rtc_dev);
+ kfree(rtc);
+diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c
+index 9e2fa8d..318093c 100644
+--- a/drivers/tty/serial/samsung.c
++++ b/drivers/tty/serial/samsung.c
+@@ -1268,6 +1268,13 @@ module_exit(s3c24xx_serial_modexit);
+ #ifdef CONFIG_SERIAL_SAMSUNG_CONSOLE
+
+ static struct uart_port *cons_uart;
++static int cons_silenced;
++
++void s3c24xx_serial_console_set_silence(int silenced)
++{
++ cons_silenced = silenced;
++}
++EXPORT_SYMBOL(s3c24xx_serial_console_set_silence);
+
+ static int
+ s3c24xx_serial_console_txrdy(struct uart_port *port, unsigned int ufcon)
+@@ -1292,9 +1299,21 @@ static void
+ s3c24xx_serial_console_putchar(struct uart_port *port, int ch)
+ {
+ unsigned int ufcon = rd_regl(cons_uart, S3C2410_UFCON);
++ unsigned int umcon = rd_regl(cons_uart, S3C2410_UMCON);
++
++ if (cons_silenced)
++ return;
++
++ /* If auto HW flow control enabled, temporarily turn it off */
++ if (umcon & S3C2410_UMCOM_AFC)
++ wr_regl(port, S3C2410_UMCON, (umcon & !S3C2410_UMCOM_AFC));
++
+ while (!s3c24xx_serial_console_txrdy(port, ufcon))
+ barrier();
+ wr_regb(cons_uart, S3C2410_UTXH, ch);
++
++ if (umcon & S3C2410_UMCOM_AFC)
++ wr_regl(port, S3C2410_UMCON, umcon);
+ }
+
+ static void
+diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
+index e6a8d8c..03ff799 100644
+--- a/drivers/video/Kconfig
++++ b/drivers/video/Kconfig
+@@ -2341,6 +2341,23 @@ config FB_PUV3_UNIGFX
+ Choose this option if you want to use the Unigfx device as a
+ framebuffer device. Without the support of PCI & AGP.
+
++config FB_GLAMO
++ tristate "Smedia Glamo 336x/337x framebuffer support"
++ depends on FB && MFD_GLAMO
++ select FB_CFB_FILLRECT
++ select FB_CFB_COPYAREA
++ select FB_CFB_IMAGEBLIT
++ help
++ Frame buffer driver for the LCD controller in the Smedia Glamo
++ 336x/337x.
++
++ This driver is also available as a module ( = code which can be
++ inserted and removed from the running kernel whenever you want). The
++ module will be called glamofb. If you want to compile it as a module,
++ say M here and read <file:Documentation/modules.txt>.
++
++ If unsure, say N.
++
+ source "drivers/video/omap/Kconfig"
+ source "drivers/video/omap2/Kconfig"
+
+diff --git a/drivers/video/Makefile b/drivers/video/Makefile
+index 2ea44b6..c92cacf 100644
+--- a/drivers/video/Makefile
++++ b/drivers/video/Makefile
+@@ -140,6 +140,7 @@ obj-$(CONFIG_FB_MSM) += msm/
+ obj-$(CONFIG_FB_NUC900) += nuc900fb.o
+ obj-$(CONFIG_FB_JZ4740) += jz4740_fb.o
+ obj-$(CONFIG_FB_PUV3_UNIGFX) += fb-puv3.o
++obj-$(CONFIG_FB_GLAMO) += glamo-fb.o
+
+ # Platform or fallback drivers go here
+ obj-$(CONFIG_FB_UVESA) += uvesafb.o
+diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
+index 0c9373b..664509e 100644
+--- a/drivers/video/backlight/Kconfig
++++ b/drivers/video/backlight/Kconfig
+@@ -117,6 +117,20 @@ config LCD_LD9040
+ If you have an LD9040 Panel, say Y to enable its
+ control driver.
+
++config LCD_JBT6K74
++ tristate "TPO JBT6K74-AS TFT display ASIC control interface"
++ depends on SPI_MASTER && SYSFS && LCD_CLASS_DEVICE
++ help
++ SPI driver for the control interface of TFT panels containing
++ the TPO JBT6K74-AS controller ASIC, such as the TPO TD028TTEC1
++ TFT diplay module used in the Openmoko Freerunner GSM phone.
++
++ The control interface is required for display operation, as it
++ controls power management, display timing and gamma calibration.
++
++ This driver can also be build as a module, if so it will be called
++ jbt6k74.
++
+ endif # LCD_CLASS_DEVICE
+
+ #
+diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
+index b9ca849..fe67e97 100644
+--- a/drivers/video/backlight/Makefile
++++ b/drivers/video/backlight/Makefile
+@@ -13,6 +13,7 @@ obj-$(CONFIG_LCD_TDO24M) += tdo24m.o
+ obj-$(CONFIG_LCD_TOSA) += tosa_lcd.o
+ obj-$(CONFIG_LCD_S6E63M0) += s6e63m0.o
+ obj-$(CONFIG_LCD_LD9040) += ld9040.o
++obj-$(CONFIG_LCD_JBT6K74) += jbt6k74.o
+
+ obj-$(CONFIG_BACKLIGHT_CLASS_DEVICE) += backlight.o
+ obj-$(CONFIG_BACKLIGHT_ATMEL_PWM) += atmel-pwm-bl.o
+diff --git a/drivers/video/backlight/jbt6k74.c b/drivers/video/backlight/jbt6k74.c
+new file mode 100644
+index 0000000..d53a366
+--- /dev/null
++++ b/drivers/video/backlight/jbt6k74.c
+@@ -0,0 +1,895 @@
++/* Linux kernel driver for the tpo JBT6K74-AS LCM ASIC
++ *
++ * Copyright (C) 2006-2007 by Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>,
++ * Stefan Schmidt <stefan@openmoko.org>
++ * Copyright (C) 2008 by Harald Welte <laforge@openmoko.org>
++ * Copyright (C) 2009 by Lars-Peter Clausen <lars@metafoo.de>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/module.h>
++#include <linux/device.h>
++#include <linux/platform_device.h>
++#include <linux/delay.h>
++#include <linux/workqueue.h>
++#include <linux/jbt6k74.h>
++#include <linux/fb.h>
++#include <linux/lcd.h>
++#include <linux/time.h>
++#include <linux/regulator/consumer.h>
++#include <linux/gpio.h>
++
++enum jbt6k74_register {
++ JBT_REG_SLEEP_IN = 0x10,
++ JBT_REG_SLEEP_OUT = 0x11,
++
++ JBT_REG_DISPLAY_OFF = 0x28,
++ JBT_REG_DISPLAY_ON = 0x29,
++
++ JBT_REG_RGB_FORMAT = 0x3a,
++ JBT_REG_QUAD_RATE = 0x3b,
++
++ JBT_REG_POWER_ON_OFF = 0xb0,
++ JBT_REG_BOOSTER_OP = 0xb1,
++ JBT_REG_BOOSTER_MODE = 0xb2,
++ JBT_REG_BOOSTER_FREQ = 0xb3,
++ JBT_REG_OPAMP_SYSCLK = 0xb4,
++ JBT_REG_VSC_VOLTAGE = 0xb5,
++ JBT_REG_VCOM_VOLTAGE = 0xb6,
++ JBT_REG_EXT_DISPL = 0xb7,
++ JBT_REG_OUTPUT_CONTROL = 0xb8,
++ JBT_REG_DCCLK_DCEV = 0xb9,
++ JBT_REG_DISPLAY_MODE1 = 0xba,
++ JBT_REG_DISPLAY_MODE2 = 0xbb,
++ JBT_REG_DISPLAY_MODE = 0xbc,
++ JBT_REG_ASW_SLEW = 0xbd,
++ JBT_REG_DUMMY_DISPLAY = 0xbe,
++ JBT_REG_DRIVE_SYSTEM = 0xbf,
++
++ JBT_REG_SLEEP_OUT_FR_A = 0xc0,
++ JBT_REG_SLEEP_OUT_FR_B = 0xc1,
++ JBT_REG_SLEEP_OUT_FR_C = 0xc2,
++ JBT_REG_SLEEP_IN_LCCNT_D = 0xc3,
++ JBT_REG_SLEEP_IN_LCCNT_E = 0xc4,
++ JBT_REG_SLEEP_IN_LCCNT_F = 0xc5,
++ JBT_REG_SLEEP_IN_LCCNT_G = 0xc6,
++
++ JBT_REG_GAMMA1_FINE_1 = 0xc7,
++ JBT_REG_GAMMA1_FINE_2 = 0xc8,
++ JBT_REG_GAMMA1_INCLINATION = 0xc9,
++ JBT_REG_GAMMA1_BLUE_OFFSET = 0xca,
++
++ /* VGA */
++ JBT_REG_BLANK_CONTROL = 0xcf,
++ JBT_REG_BLANK_TH_TV = 0xd0,
++ JBT_REG_CKV_ON_OFF = 0xd1,
++ JBT_REG_CKV_1_2 = 0xd2,
++ JBT_REG_OEV_TIMING = 0xd3,
++ JBT_REG_ASW_TIMING_1 = 0xd4,
++ JBT_REG_ASW_TIMING_2 = 0xd5,
++
++ /* QVGA */
++ JBT_REG_BLANK_CONTROL_QVGA = 0xd6,
++ JBT_REG_BLANK_TH_TV_QVGA = 0xd7,
++ JBT_REG_CKV_ON_OFF_QVGA = 0xd8,
++ JBT_REG_CKV_1_2_QVGA = 0xd9,
++ JBT_REG_OEV_TIMING_QVGA = 0xde,
++ JBT_REG_ASW_TIMING_1_QVGA = 0xdf,
++ JBT_REG_ASW_TIMING_2_QVGA = 0xe0,
++
++
++ JBT_REG_HCLOCK_VGA = 0xec,
++ JBT_REG_HCLOCK_QVGA = 0xed,
++};
++
++enum jbt6k74_resolution {
++ JBT_RESOLUTION_VGA,
++ JBT_RESOLUTION_QVGA,
++};
++
++enum jbt6k74_power_mode {
++ JBT_POWER_MODE_DEEP_STANDBY,
++ JBT_POWER_MODE_SLEEP,
++ JBT_POWER_MODE_NORMAL,
++};
++
++static const char * const jbt6k74_power_mode_names[] = {
++ [JBT_POWER_MODE_DEEP_STANDBY] = "deep-standby",
++ [JBT_POWER_MODE_SLEEP] = "sleep",
++ [JBT_POWER_MODE_NORMAL] = "normal",
++};
++
++static const char * const jbt6k74_resolution_names[] = {
++ [JBT_RESOLUTION_VGA] = "vga",
++ [JBT_RESOLUTION_QVGA] = "qvga",
++};
++
++struct jbt6k74_info {
++ struct mutex lock; /* protects this structure */
++ enum jbt6k74_resolution resolution;
++ enum jbt6k74_power_mode power_mode;
++ enum jbt6k74_power_mode suspend_mode;
++ int suspended;
++
++ struct spi_device *spi;
++ struct lcd_device *lcd_dev;
++
++ unsigned long next_sleep;
++ struct delayed_work blank_work;
++ int blank_mode;
++ struct regulator_bulk_data supplies[2];
++ uint16_t tx_buf[3];
++ uint16_t reg_cache[0xEE];
++};
++
++#define JBT_COMMAND 0x000
++#define JBT_DATA 0x100
++
++static int jbt6k74_reg_write_nodata(struct jbt6k74_info *jbt, uint8_t reg)
++{
++ int ret;
++
++ jbt->tx_buf[0] = JBT_COMMAND | reg;
++ ret = spi_write(jbt->spi, (uint8_t *)jbt->tx_buf,
++ sizeof(uint16_t));
++ if (ret == 0)
++ jbt->reg_cache[reg] = 0;
++ else
++ dev_err(&jbt->spi->dev, "Write failed: %d\n", ret);
++
++ return ret;
++}
++
++
++static int jbt6k74_reg_write(struct jbt6k74_info *jbt, uint8_t reg, uint8_t data)
++{
++ int ret;
++
++ jbt->tx_buf[0] = JBT_COMMAND | reg;
++ jbt->tx_buf[1] = JBT_DATA | data;
++ ret = spi_write(jbt->spi, (uint8_t *)jbt->tx_buf,
++ 2*sizeof(uint16_t));
++ if (ret == 0)
++ jbt->reg_cache[reg] = data;
++ else
++ dev_err(&jbt->spi->dev, "Write failed: %d\n", ret);
++
++ return ret;
++}
++
++static int jbt6k74_reg_write16(struct jbt6k74_info *jbt, uint8_t reg, uint16_t data)
++{
++ int ret;
++
++ jbt->tx_buf[0] = JBT_COMMAND | reg;
++ jbt->tx_buf[1] = JBT_DATA | (data >> 8);
++ jbt->tx_buf[2] = JBT_DATA | (data & 0xff);
++
++ ret = spi_write(jbt->spi, (uint8_t *)jbt->tx_buf,
++ 3*sizeof(uint16_t));
++ if (ret == 0)
++ jbt->reg_cache[reg] = data;
++ else
++ dev_err(&jbt->spi->dev, "Write failed: %d\n", ret);
++
++ return ret;
++}
++
++static int jbt6k74_init_regs(struct jbt6k74_info *jbt)
++{
++ int ret;
++
++ dev_dbg(&jbt->spi->dev, "entering %cVGA mode\n",
++ jbt->resolution == JBT_RESOLUTION_QVGA ? 'Q' : ' ');
++
++ ret = jbt6k74_reg_write(jbt, JBT_REG_DISPLAY_MODE1, 0x01);
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_DISPLAY_MODE2, 0x00);
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_RGB_FORMAT, 0x60);
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_DRIVE_SYSTEM, 0x10);
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_BOOSTER_OP, 0x56);
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_BOOSTER_MODE, 0x33);
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_BOOSTER_FREQ, 0x11);
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_OPAMP_SYSCLK, 0x02);
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_VSC_VOLTAGE, 0x2b);
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_VCOM_VOLTAGE, 0x40);
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_EXT_DISPL, 0x03);
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_DCCLK_DCEV, 0x04);
++ /*
++ * default of 0x02 in JBT_REG_ASW_SLEW responsible for 72Hz requirement
++ * to avoid red / blue flicker
++ */
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_ASW_SLEW, 0x00 | (1 << 5));
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_DUMMY_DISPLAY, 0x00);
++
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_SLEEP_OUT_FR_A, 0x11);
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_SLEEP_OUT_FR_B, 0x11);
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_SLEEP_OUT_FR_C, 0x11);
++ ret |= jbt6k74_reg_write16(jbt, JBT_REG_SLEEP_IN_LCCNT_D, 0x2040);
++ ret |= jbt6k74_reg_write16(jbt, JBT_REG_SLEEP_IN_LCCNT_E, 0x60c0);
++ ret |= jbt6k74_reg_write16(jbt, JBT_REG_SLEEP_IN_LCCNT_F, 0x1020);
++ ret |= jbt6k74_reg_write16(jbt, JBT_REG_SLEEP_IN_LCCNT_G, 0x60c0);
++
++ ret |= jbt6k74_reg_write16(jbt, JBT_REG_GAMMA1_FINE_1, 0x5533);
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_GAMMA1_FINE_2, 0x00);
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_GAMMA1_INCLINATION, 0x00);
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_GAMMA1_BLUE_OFFSET, 0x00);
++
++ if (jbt->resolution != JBT_RESOLUTION_QVGA) {
++ ret |= jbt6k74_reg_write16(jbt, JBT_REG_HCLOCK_VGA, 0x1f0);
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_BLANK_CONTROL, 0x02);
++ ret |= jbt6k74_reg_write16(jbt, JBT_REG_BLANK_TH_TV, 0x0804);
++
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_CKV_ON_OFF, 0x01);
++ ret |= jbt6k74_reg_write16(jbt, JBT_REG_CKV_1_2, 0x0000);
++
++ ret |= jbt6k74_reg_write16(jbt, JBT_REG_OEV_TIMING, 0x0d0e);
++ ret |= jbt6k74_reg_write16(jbt, JBT_REG_ASW_TIMING_1, 0x11a4);
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_ASW_TIMING_2, 0x0e);
++ } else {
++ ret |= jbt6k74_reg_write16(jbt, JBT_REG_HCLOCK_QVGA, 0x00ff);
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_BLANK_CONTROL_QVGA, 0x02);
++ ret |= jbt6k74_reg_write16(jbt, JBT_REG_BLANK_TH_TV_QVGA, 0x0804);
++
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_CKV_ON_OFF_QVGA, 0x01);
++ ret |= jbt6k74_reg_write16(jbt, JBT_REG_CKV_1_2_QVGA, 0x0008);
++
++ ret |= jbt6k74_reg_write16(jbt, JBT_REG_OEV_TIMING_QVGA, 0x050a);
++ ret |= jbt6k74_reg_write16(jbt, JBT_REG_ASW_TIMING_1_QVGA, 0x0a19);
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_ASW_TIMING_2_QVGA, 0x0a);
++ }
++
++ return ret ? -EIO : 0;
++}
++
++static int jbt6k74_standby_to_sleep(struct jbt6k74_info *jbt)
++{
++ int ret;
++ struct jbt6k74_platform_data *pdata = jbt->spi->dev.platform_data;
++
++ ret = regulator_bulk_enable(ARRAY_SIZE(jbt->supplies), jbt->supplies);
++ if (ret)
++ return ret;
++
++ gpio_set_value_cansleep(pdata->gpio_reset, 1);
++ mdelay(100);
++
++ /* three times command zero */
++ ret |= jbt6k74_reg_write_nodata(jbt, 0x00);
++ mdelay(1);
++ ret |= jbt6k74_reg_write_nodata(jbt, 0x00);
++ mdelay(1);
++ ret |= jbt6k74_reg_write_nodata(jbt, 0x00);
++ mdelay(1);
++
++ /* deep standby out */
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x11);
++ mdelay(1);
++ ret = jbt6k74_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x28);
++
++ /* (re)initialize register set */
++ ret |= jbt6k74_init_regs(jbt);
++
++ return ret ? -EIO : 0;
++}
++
++static int jbt6k74_sleep_to_normal(struct jbt6k74_info *jbt)
++{
++ int ret;
++
++ /* Make sure we are 120 ms after SLEEP_OUT */
++ if (time_before(jiffies, jbt->next_sleep))
++ mdelay(jiffies_to_msecs(jbt->next_sleep - jiffies));
++
++ if (jbt->resolution == JBT_RESOLUTION_VGA) {
++ /* RGB I/F on, RAM wirte off, QVGA through, SIGCON enable */
++ ret = jbt6k74_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x80);
++
++ /* Quad mode off */
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_QUAD_RATE, 0x00);
++ } else {
++ /* RGB I/F on, RAM wirte off, QVGA through, SIGCON enable */
++ ret = jbt6k74_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x81);
++
++ /* Quad mode on */
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_QUAD_RATE, 0x22);
++ }
++
++ /* AVDD on, XVDD on */
++ ret |= jbt6k74_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x16);
++
++ /* Output control */
++ ret |= jbt6k74_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0xdff9);
++
++ /* Turn on display */
++ ret |= jbt6k74_reg_write_nodata(jbt, JBT_REG_DISPLAY_ON);
++
++ /* Sleep mode off */
++ ret |= jbt6k74_reg_write_nodata(jbt, JBT_REG_SLEEP_OUT);
++ jbt->next_sleep = jiffies + msecs_to_jiffies(120);
++
++ /* Allow the booster and display controller to restart stably */
++ mdelay(5);
++
++ return ret ? -EIO : 0;
++}
++
++static int jbt6k74_normal_to_sleep(struct jbt6k74_info *jbt)
++{
++ int ret;
++
++ /* Make sure we are 120 ms after SLEEP_OUT */
++ if (time_before(jiffies, jbt->next_sleep))
++ mdelay(jiffies_to_msecs(jbt->next_sleep - jiffies));
++
++ ret = jbt6k74_reg_write_nodata(jbt, JBT_REG_DISPLAY_OFF);
++ ret |= jbt6k74_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0x8000 | 1 << 3);
++ ret |= jbt6k74_reg_write_nodata(jbt, JBT_REG_SLEEP_IN);
++ jbt->next_sleep = jiffies + msecs_to_jiffies(120);
++
++ /* Allow the internal circuits to stop automatically */
++ mdelay(5);
++
++ return ret ? -EIO : 0;
++}
++
++static int jbt6k74_sleep_to_standby(struct jbt6k74_info *jbt)
++{
++ int ret;
++ struct jbt6k74_platform_data *pdata = jbt->spi->dev.platform_data;
++
++ ret = jbt6k74_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x00);
++
++ if (!ret) {
++ gpio_set_value_cansleep(pdata->gpio_reset, 0);
++ ret = regulator_bulk_disable(ARRAY_SIZE(jbt->supplies),
++ jbt->supplies);
++ }
++
++ return ret;
++}
++
++static int jbt6k74_enter_power_mode(struct jbt6k74_info *jbt,
++ enum jbt6k74_power_mode new_mode)
++{
++ struct jbt6k74_platform_data *pdata = jbt->spi->dev.platform_data;
++ int ret = -EINVAL;
++
++ dev_dbg(&jbt->spi->dev, "entering (old_state=%s, new_state=%s)\n",
++ jbt6k74_power_mode_names[jbt->power_mode],
++ jbt6k74_power_mode_names[new_mode]);
++
++ mutex_lock(&jbt->lock);
++
++ if (jbt->suspended) {
++ switch (new_mode) {
++ case JBT_POWER_MODE_DEEP_STANDBY:
++ case JBT_POWER_MODE_SLEEP:
++ case JBT_POWER_MODE_NORMAL:
++ ret = 0;
++ jbt->suspend_mode = new_mode;
++ break;
++ default:
++ break;
++ }
++ } else if (new_mode == JBT_POWER_MODE_NORMAL &&
++ pdata->enable_pixel_clock) {
++ pdata->enable_pixel_clock(&jbt->spi->dev, 1);
++ }
++
++ switch (jbt->power_mode) {
++ case JBT_POWER_MODE_DEEP_STANDBY:
++ switch (new_mode) {
++ case JBT_POWER_MODE_DEEP_STANDBY:
++ ret = 0;
++ break;
++ case JBT_POWER_MODE_SLEEP:
++ ret = jbt6k74_standby_to_sleep(jbt);
++ break;
++ case JBT_POWER_MODE_NORMAL:
++ /* first transition into sleep */
++ ret = jbt6k74_standby_to_sleep(jbt);
++ /* then transition into normal */
++ ret |= jbt6k74_sleep_to_normal(jbt);
++ break;
++ }
++ break;
++ case JBT_POWER_MODE_SLEEP:
++ switch (new_mode) {
++ case JBT_POWER_MODE_SLEEP:
++ ret = 0;
++ break;
++ case JBT_POWER_MODE_DEEP_STANDBY:
++ ret = jbt6k74_sleep_to_standby(jbt);
++ break;
++ case JBT_POWER_MODE_NORMAL:
++ ret = jbt6k74_sleep_to_normal(jbt);
++ break;
++ }
++ break;
++ case JBT_POWER_MODE_NORMAL:
++ switch (new_mode) {
++ case JBT_POWER_MODE_NORMAL:
++ ret = 0;
++ break;
++ case JBT_POWER_MODE_DEEP_STANDBY:
++ /* first transition into sleep */
++ ret = jbt6k74_normal_to_sleep(jbt);
++ /* then transition into deep standby */
++ ret |= jbt6k74_sleep_to_standby(jbt);
++ break;
++ case JBT_POWER_MODE_SLEEP:
++ ret = jbt6k74_normal_to_sleep(jbt);
++ break;
++ }
++ }
++
++ if (ret == 0) {
++ jbt->power_mode = new_mode;
++ if (new_mode != JBT_POWER_MODE_NORMAL &&
++ pdata->enable_pixel_clock)
++ pdata->enable_pixel_clock(&jbt->spi->dev, 0);
++ } else {
++ dev_err(&jbt->spi->dev, "Failed enter state '%s': %d\n",
++ jbt6k74_power_mode_names[new_mode], ret);
++ }
++
++ mutex_unlock(&jbt->lock);
++
++ return ret;
++}
++
++static int jbt6k74_set_resolution(struct jbt6k74_info *jbt,
++ enum jbt6k74_resolution new_resolution)
++{
++ int ret = 0;
++ enum jbt6k74_resolution old_resolution;
++
++ mutex_lock(&jbt->lock);
++
++ if (jbt->resolution == new_resolution)
++ goto out_unlock;
++
++ old_resolution = jbt->resolution;
++ jbt->resolution = new_resolution;
++
++ if (jbt->power_mode == JBT_POWER_MODE_NORMAL) {
++
++ /* first transition into sleep */
++ ret = jbt6k74_normal_to_sleep(jbt);
++ ret |= jbt6k74_sleep_to_normal(jbt);
++
++ if (ret) {
++ jbt->resolution = old_resolution;
++ dev_err(&jbt->spi->dev, "Failed to set resolution '%s')\n",
++ jbt6k74_resolution_names[new_resolution]);
++ }
++ }
++
++out_unlock:
++ mutex_unlock(&jbt->lock);
++
++ return ret;
++}
++
++static ssize_t resolution_read(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ struct jbt6k74_info *jbt = dev_get_drvdata(dev);
++
++ if (jbt->resolution >= ARRAY_SIZE(jbt6k74_resolution_names))
++ return -EIO;
++
++ return sprintf(buf, "%s\n", jbt6k74_resolution_names[jbt->resolution]);
++}
++
++static ssize_t resolution_write(struct device *dev,
++ struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ struct jbt6k74_info *jbt = dev_get_drvdata(dev);
++ int i, ret;
++
++ for (i = 0; i < ARRAY_SIZE(jbt6k74_resolution_names); i++) {
++ if (!strncmp(buf, jbt6k74_resolution_names[i],
++ strlen(jbt6k74_resolution_names[i]))) {
++ ret = jbt6k74_set_resolution(jbt, i);
++ if (ret)
++ return ret;
++ return count;
++ }
++ }
++
++ return -EINVAL;
++}
++
++static DEVICE_ATTR(resolution, 0644, resolution_read, resolution_write);
++
++static int reg_by_string(const char *name)
++{
++ if (!strcmp(name, "gamma_fine1"))
++ return JBT_REG_GAMMA1_FINE_1;
++ else if (!strcmp(name, "gamma_fine2"))
++ return JBT_REG_GAMMA1_FINE_2;
++ else if (!strcmp(name, "gamma_inclination"))
++ return JBT_REG_GAMMA1_INCLINATION;
++ else
++ return JBT_REG_GAMMA1_BLUE_OFFSET;
++}
++
++static ssize_t gamma_read(struct device *dev, struct device_attribute *attr,
++ char *buf)
++{
++ struct jbt6k74_info *jbt = dev_get_drvdata(dev);
++ int reg = reg_by_string(attr->attr.name);
++ uint16_t val;
++
++ mutex_lock(&jbt->lock);
++ val = jbt->reg_cache[reg];
++ mutex_unlock(&jbt->lock);
++
++ return sprintf(buf, "0x%04x\n", val);
++}
++
++static ssize_t gamma_write(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ int ret;
++ struct jbt6k74_info *jbt = dev_get_drvdata(dev);
++ int reg = reg_by_string(attr->attr.name);
++ unsigned long val;
++
++ ret = strict_strtoul(buf, 10, &val);
++ if (ret)
++ return ret;
++
++ mutex_lock(&jbt->lock);
++ jbt6k74_reg_write(jbt, reg, val & 0xff);
++ mutex_unlock(&jbt->lock);
++
++ return count;
++}
++
++static ssize_t reset_write(struct device *dev, struct device_attribute *attr,
++ const char *buf, size_t count)
++{
++ int ret;
++ struct jbt6k74_info *jbt = dev_get_drvdata(dev);
++ struct jbt6k74_platform_data *pdata = jbt->spi->dev.platform_data;
++ enum jbt6k74_power_mode old_power_mode = jbt->power_mode;
++
++ mutex_lock(&jbt->lock);
++
++ if (gpio_is_valid(pdata->gpio_reset)) {
++ /* hard reset the jbt6k74 */
++ gpio_set_value_cansleep(pdata->gpio_reset, 0);
++ mdelay(120);
++ gpio_set_value_cansleep(pdata->gpio_reset, 1);
++ mdelay(120);
++ }
++
++ ret = jbt6k74_reg_write_nodata(jbt, 0x01);
++ if (ret < 0)
++ dev_err(&jbt->spi->dev, "cannot soft reset\n");
++ mdelay(120);
++
++ mutex_unlock(&jbt->lock);
++
++ jbt->power_mode = JBT_POWER_MODE_DEEP_STANDBY;
++ jbt6k74_enter_power_mode(jbt, old_power_mode);
++
++ return count;
++}
++
++static DEVICE_ATTR(gamma_fine1, 0644, gamma_read, gamma_write);
++static DEVICE_ATTR(gamma_fine2, 0644, gamma_read, gamma_write);
++static DEVICE_ATTR(gamma_inclination, 0644, gamma_read, gamma_write);
++static DEVICE_ATTR(gamma_blue_offset, 0644, gamma_read, gamma_write);
++static DEVICE_ATTR(reset, 0600, NULL, reset_write);
++
++static struct attribute *jbt6k74_sysfs_entries[] = {
++ &dev_attr_resolution.attr,
++ &dev_attr_gamma_fine1.attr,
++ &dev_attr_gamma_fine2.attr,
++ &dev_attr_gamma_inclination.attr,
++ &dev_attr_gamma_blue_offset.attr,
++ &dev_attr_reset.attr,
++ NULL,
++};
++
++static struct attribute_group jbt6k74_attr_group = {
++ .name = NULL,
++ .attrs = jbt6k74_sysfs_entries,
++};
++
++/* FIXME: This in an ugly hack to delay display blanking.
++ When the jbt is in sleep mode it displays an all white screen and thus one
++ will a see a short flash.
++ By delaying the blanking we will give the backlight a chance to turn off and
++ thus avoid getting the flash */
++static void jbt6k74_blank_worker(struct work_struct *work)
++{
++ struct jbt6k74_info *jbt = container_of(work, struct jbt6k74_info,
++ blank_work.work);
++
++ switch (jbt->blank_mode) {
++ case FB_BLANK_NORMAL:
++ jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_SLEEP);
++ break;
++ case FB_BLANK_POWERDOWN:
++ jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_DEEP_STANDBY);
++ break;
++ default:
++ break;
++ }
++}
++
++static int jbt6k74_set_mode(struct lcd_device *ld, struct fb_videomode *m)
++{
++ int ret = -EINVAL;
++ struct jbt6k74_info *jbt = dev_get_drvdata(&ld->dev);
++
++ if (m->xres == 240 && m->yres == 320) {
++ ret = jbt6k74_set_resolution(jbt, JBT_RESOLUTION_QVGA);
++ } else if (m->xres == 480 && m->yres == 640) {
++ ret = jbt6k74_set_resolution(jbt, JBT_RESOLUTION_VGA);
++ } else {
++ dev_err(&jbt->spi->dev, "Unknown resolution.\n");
++ jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_SLEEP);
++ }
++
++ return ret;
++}
++
++static int jbt6k74_set_power(struct lcd_device *ld, int power)
++{
++ int ret = -EINVAL;
++ struct jbt6k74_info *jbt = dev_get_drvdata(&ld->dev);
++
++ jbt->blank_mode = power;
++ cancel_rearming_delayed_work(&jbt->blank_work);
++
++ switch (power) {
++ case FB_BLANK_UNBLANK:
++ dev_dbg(&jbt->spi->dev, "unblank\n");
++ mdelay(20);
++ ret = jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_NORMAL);
++ break;
++ case FB_BLANK_NORMAL:
++ dev_dbg(&jbt->spi->dev, "blank\n");
++ ret = schedule_delayed_work(&jbt->blank_work, HZ);
++ break;
++ case FB_BLANK_POWERDOWN:
++ dev_dbg(&jbt->spi->dev, "powerdown\n");
++ ret = schedule_delayed_work(&jbt->blank_work, HZ);
++ break;
++ default:
++ break;
++ }
++
++ return ret;
++}
++
++static int jbt6k74_get_power(struct lcd_device *ld)
++{
++ struct jbt6k74_info *jbt = dev_get_drvdata(&ld->dev);
++
++ switch (jbt->power_mode) {
++ case JBT_POWER_MODE_NORMAL:
++ return FB_BLANK_UNBLANK;
++ case JBT_POWER_MODE_SLEEP:
++ return FB_BLANK_NORMAL;
++ default:
++ return JBT_POWER_MODE_DEEP_STANDBY;
++ }
++}
++
++static struct lcd_ops jbt6k74_lcd_ops = {
++ .set_power = jbt6k74_set_power,
++ .get_power = jbt6k74_get_power,
++ .set_mode = jbt6k74_set_mode,
++};
++
++/* linux device model infrastructure */
++
++static int __devinit jbt6k74_probe(struct spi_device *spi)
++{
++ int ret;
++ struct jbt6k74_info *jbt;
++ struct jbt6k74_platform_data *pdata = spi->dev.platform_data;
++
++ /* the controller doesn't have a MISO pin; we can't do detection */
++
++ spi->mode = SPI_CPOL | SPI_CPHA;
++ spi->bits_per_word = 9;
++
++ ret = spi_setup(spi);
++ if (ret < 0) {
++ dev_err(&spi->dev,
++ "Failed to setup spi\n");
++ return ret;
++ }
++
++ jbt = kzalloc(sizeof(*jbt), GFP_KERNEL);
++ if (!jbt)
++ return -ENOMEM;
++
++ jbt->spi = spi;
++
++ jbt->lcd_dev = lcd_device_register("jbt6k74-lcd", &spi->dev, jbt,
++ &jbt6k74_lcd_ops);
++
++ if (IS_ERR(jbt->lcd_dev)) {
++ ret = PTR_ERR(jbt->lcd_dev);
++ goto err_free_drvdata;
++ }
++
++ INIT_DELAYED_WORK(&jbt->blank_work, jbt6k74_blank_worker);
++
++ jbt->resolution = JBT_RESOLUTION_VGA;
++ jbt->power_mode = JBT_POWER_MODE_DEEP_STANDBY;
++ jbt->next_sleep = jiffies + msecs_to_jiffies(120);
++ mutex_init(&jbt->lock);
++
++ dev_set_drvdata(&spi->dev, jbt);
++
++ jbt->supplies[0].supply = "VDC";
++ jbt->supplies[1].supply = "VDDIO";
++
++ ret = regulator_bulk_get(&spi->dev, ARRAY_SIZE(jbt->supplies),
++ jbt->supplies);
++ if (ret) {
++ dev_err(&spi->dev, "Failed to power get supplies: %d\n", ret);
++ goto err_unregister_lcd;
++ }
++
++ if (gpio_is_valid(pdata->gpio_reset)) {
++ ret = gpio_request(pdata->gpio_reset, "jbt6k74 reset");
++ if (ret) {
++ dev_err(&spi->dev, "Failed to request reset gpio: %d\n",
++ ret);
++ goto err_free_supplies;
++ }
++
++ ret = gpio_direction_output(pdata->gpio_reset, 1);
++ if (ret) {
++ dev_err(&spi->dev, "Failed to set reset gpio direction: %d\n",
++ ret);
++ goto err_gpio_free;
++ }
++ }
++
++ ret = sysfs_create_group(&spi->dev.kobj, &jbt6k74_attr_group);
++ if (ret < 0) {
++ dev_err(&spi->dev, "cannot create sysfs group\n");
++ goto err_gpio_free;
++ }
++
++ mdelay(50);
++ ret = jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_NORMAL);
++ if (ret < 0) {
++ dev_err(&spi->dev, "cannot enter NORMAL state\n");
++ goto err_sysfs_remove;
++ }
++
++ return 0;
++
++err_sysfs_remove:
++ sysfs_remove_group(&spi->dev.kobj, &jbt6k74_attr_group);
++err_gpio_free:
++ gpio_free(pdata->gpio_reset);
++err_free_supplies:
++ regulator_bulk_free(ARRAY_SIZE(jbt->supplies), jbt->supplies);
++err_unregister_lcd:
++ lcd_device_unregister(jbt->lcd_dev);
++err_free_drvdata:
++ dev_set_drvdata(&spi->dev, NULL);
++ kfree(jbt);
++
++ return ret;
++}
++
++static int __devexit jbt6k74_remove(struct spi_device *spi)
++{
++ struct jbt6k74_info *jbt = dev_get_drvdata(&spi->dev);
++ struct jbt6k74_platform_data *pdata = jbt->spi->dev.platform_data;
++
++ /* We don't want to switch off the display in case the user
++ * accidentially unloads the module (whose use count normally is 0) */
++ jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_NORMAL);
++
++ sysfs_remove_group(&spi->dev.kobj, &jbt6k74_attr_group);
++
++ if (gpio_is_valid(pdata->gpio_reset))
++ gpio_free(pdata->gpio_reset);
++
++ lcd_device_unregister(jbt->lcd_dev);
++
++ dev_set_drvdata(&spi->dev, NULL);
++
++ regulator_bulk_free(ARRAY_SIZE(jbt->supplies), jbt->supplies);
++ kfree(jbt);
++
++ return 0;
++}
++
++#ifdef CONFIG_PM
++static int jbt6k74_suspend(struct spi_device *spi, pm_message_t state)
++{
++ struct jbt6k74_info *jbt = dev_get_drvdata(&spi->dev);
++
++ jbt->suspend_mode = jbt->power_mode;
++
++ jbt6k74_enter_power_mode(jbt, JBT_POWER_MODE_DEEP_STANDBY);
++ jbt->suspended = 1;
++
++ dev_info(&spi->dev, "suspended\n");
++
++ return 0;
++}
++
++static int jbt6k74_resume(struct spi_device *spi)
++{
++ struct jbt6k74_info *jbt = dev_get_drvdata(&spi->dev);
++ dev_info(&spi->dev, "starting resume: %d\n", jbt->suspend_mode);
++
++ mdelay(20);
++
++ jbt->suspended = 0;
++ jbt6k74_enter_power_mode(jbt, jbt->suspend_mode);
++
++ dev_info(&spi->dev, "resumed: %d\n", jbt->suspend_mode);
++
++ return 0;
++}
++
++#else
++#define jbt6k74_suspend NULL
++#define jbt6k74_resume NULL
++#endif
++
++static struct spi_driver jbt6k74_driver = {
++ .driver = {
++ .name = "jbt6k74",
++ .owner = THIS_MODULE,
++ },
++
++ .probe = jbt6k74_probe,
++ .remove = __devexit_p(jbt6k74_remove),
++ .suspend = jbt6k74_suspend,
++ .resume = jbt6k74_resume,
++};
++
++static int __init jbt6k74_init(void)
++{
++ return spi_register_driver(&jbt6k74_driver);
++}
++module_init(jbt6k74_init);
++
++static void __exit jbt6k74_exit(void)
++{
++ spi_unregister_driver(&jbt6k74_driver);
++}
++module_exit(jbt6k74_exit);
++
++MODULE_DESCRIPTION("SPI driver for tpo JBT6K74-AS LCM control interface");
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
++MODULE_LICENSE("GPL");
+diff --git a/drivers/video/backlight/pcf50633-backlight.c b/drivers/video/backlight/pcf50633-backlight.c
+index ef5628d..7d80574 100644
+--- a/drivers/video/backlight/pcf50633-backlight.c
++++ b/drivers/video/backlight/pcf50633-backlight.c
+@@ -44,7 +44,7 @@ struct pcf50633_bl {
+ */
+ int pcf50633_bl_set_brightness_limit(struct pcf50633 *pcf, unsigned int limit)
+ {
+- struct pcf50633_bl *pcf_bl = platform_get_drvdata(pcf->bl_pdev);
++ struct pcf50633_bl *pcf_bl = pcf->bl;
+
+ if (!pcf_bl)
+ return -ENODEV;
+@@ -102,6 +102,7 @@ static const struct backlight_ops pcf50633_bl_ops = {
+ static int __devinit pcf50633_bl_probe(struct platform_device *pdev)
+ {
+ int ret;
++ struct pcf50633 *pcf = dev_to_pcf50633(pdev->dev.parent);
+ struct pcf50633_bl *pcf_bl;
+ struct device *parent = pdev->dev.parent;
+ struct pcf50633_platform_data *pcf50633_data = parent->platform_data;
+@@ -124,7 +125,7 @@ static int __devinit pcf50633_bl_probe(struct platform_device *pdev)
+ pcf_bl->brightness_limit = 0x3f;
+ }
+
+- pcf_bl->pcf = dev_to_pcf50633(pdev->dev.parent);
++ pcf_bl->pcf = pcf;
+
+ pcf_bl->bl = backlight_device_register(pdev->name, &pdev->dev, pcf_bl,
+ &pcf50633_bl_ops, &bl_props);
+@@ -134,6 +135,7 @@ static int __devinit pcf50633_bl_probe(struct platform_device *pdev)
+ goto err_free;
+ }
+
++ pcf->bl = pcf_bl;
+ platform_set_drvdata(pdev, pcf_bl);
+
+ pcf50633_reg_write(pcf_bl->pcf, PCF50633_REG_LEDDIM, pdata->ramp_time);
+@@ -156,6 +158,8 @@ static int __devexit pcf50633_bl_remove(struct platform_device *pdev)
+ {
+ struct pcf50633_bl *pcf_bl = platform_get_drvdata(pdev);
+
++ pcf_bl->pcf->bl = NULL;
++
+ backlight_device_unregister(pcf_bl->bl);
+
+ platform_set_drvdata(pdev, NULL);
+diff --git a/drivers/video/glamo-fb.c b/drivers/video/glamo-fb.c
+new file mode 100644
+index 0000000..45f5a2b
+--- /dev/null
++++ b/drivers/video/glamo-fb.c
+@@ -0,0 +1,943 @@
++/* Smedia Glamo 336x/337x driver
++ *
++ * (C) 2007-2008 by Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/string.h>
++#include <linux/mm.h>
++#include <linux/delay.h>
++#include <linux/fb.h>
++#include <linux/console.h>
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/spinlock.h>
++#include <linux/io.h>
++#include <linux/mfd/glamo.h>
++#include <linux/mfd/glamo-core.h>
++#include <linux/mfd/glamo-regs.h>
++
++#include <asm/div64.h>
++
++#ifdef CONFIG_PM
++#include <linux/pm.h>
++#endif
++
++#include <linux/glamofb.h>
++
++struct glamofb_handle {
++ struct glamo_core *core;
++ struct fb_info *fb;
++ struct device *dev;
++
++ struct resource *reg;
++ struct resource *fb_res;
++ void __iomem *base;
++ void __iomem *cursor_addr;
++
++ struct glamo_fb_platform_data *mach_info;
++
++ int cursor_on;
++ int blank_mode;
++ int mode_set; /* 0 if the current display mode hasn't been set on the glamo */
++ int output_enabled; /* 0 if the video output is disabled */
++
++ spinlock_t lock_cmd;
++ uint32_t pseudo_pal[16];
++};
++
++static void glamofb_program_mode(struct glamofb_handle *glamo);
++
++static void glamo_output_enable(struct glamofb_handle *gfb)
++{
++ struct glamo_core *gcore = gfb->core;
++
++ if (gfb->output_enabled)
++ return;
++
++ /* enable the pixel clock if off */
++ glamo_engine_enable(gcore, GLAMO_ENGINE_LCD);
++
++ gfb->output_enabled = 1;
++ if (!gfb->mode_set)
++ glamofb_program_mode(gfb);
++}
++
++static void glamo_output_disable(struct glamofb_handle *gfb)
++{
++ struct glamo_core *gcore = gfb->core;
++
++ if (!gfb->output_enabled)
++ return;
++
++ /* enable the pixel clock if off */
++ glamo_engine_suspend(gcore, GLAMO_ENGINE_LCD);
++
++ gfb->output_enabled = 0;
++}
++
++
++static inline int glamofb_reg_read(struct glamofb_handle *glamo, uint16_t reg)
++{
++ return readw(glamo->base + reg);
++}
++
++static inline void glamofb_reg_write(struct glamofb_handle *glamo, uint16_t reg,
++ uint16_t val)
++{
++ writew(val, glamo->base + reg);
++}
++
++static const struct glamo_script glamo_regs[] = {
++ { GLAMO_REG_LCD_MODE1, 0x0020 },
++ /* no display rotation, no hardware cursor, no dither, no gamma,
++ * no retrace flip, vsync low-active, hsync low active,
++ * no TVCLK, no partial display, hw dest color from fb,
++ * no partial display mode, LCD1, software flip, */
++ { GLAMO_REG_LCD_MODE2, 0x9020 },
++ /* video flip, no ptr, no ptr, dhclk off,
++ * normal mode, no cpuif,
++ * res, serial msb first, single fb, no fr ctrl,
++ * cpu if bits all zero, no crc
++ * 0000 0000 0010 0000 */
++ { GLAMO_REG_LCD_MODE3, 0x0b40 },
++ /* src data rgb565, res, 18bit rgb666
++ * 000 01 011 0100 0000 */
++ { GLAMO_REG_LCD_POLARITY, 0x440c },
++ /* DE high active, no cpu/lcd if, cs0 force low, a0 low active,
++ * np cpu if, 9bit serial data, sclk rising edge latch data
++ * 01 00 0 100 0 000 01 0 0 */
++ /* The following values assume 640*480@16bpp */
++ { GLAMO_REG_LCD_A_BASE1, 0x0000 }, /* display A base address 15:0 */
++ { GLAMO_REG_LCD_A_BASE2, 0x4000 }, /* display A base address 22:16 */
++ { GLAMO_REG_LCD_CURSOR_BASE1, 0xC000 }, /* cursor base address 15:0 */
++ { GLAMO_REG_LCD_CURSOR_BASE2, 0x0012 }, /* cursor base address 22:16 */
++ { GLAMO_REG_LCD_COMMAND2, 0x0000 }, /* display page A */
++};
++
++static int glamofb_run_script(struct glamofb_handle *glamo,
++ const struct glamo_script *script, size_t len)
++{
++ size_t i;
++
++ for (i = 0; i < len; i++) {
++ const struct glamo_script *line = &script[i];
++
++ if (line->reg == 0xffff)
++ return 0;
++ else if (line->reg == 0xfffe)
++ msleep(line->val);
++ else
++ glamofb_reg_write(glamo, script[i].reg, script[i].val);
++ }
++
++ return 0;
++}
++
++static int glamofb_check_var(struct fb_var_screeninfo *var,
++ struct fb_info *info)
++{
++ struct glamofb_handle *glamo = info->par;
++
++ if (var->bits_per_pixel != 16)
++ var->bits_per_pixel = 16;
++
++ var->height = glamo->mach_info->height;
++ var->width = glamo->mach_info->width;
++
++ /* FIXME: set rgb positions */
++ switch (var->bits_per_pixel) {
++ case 16:
++ switch (glamofb_reg_read(glamo, GLAMO_REG_LCD_MODE3) & 0xc000) {
++ case GLAMO_LCD_SRC_RGB565:
++ var->red.offset = 11;
++ var->green.offset = 5;
++ var->blue.offset = 0;
++ var->red.length = 5;
++ var->green.length = 6;
++ var->blue.length = 5;
++ var->transp.length = 0;
++ break;
++ case GLAMO_LCD_SRC_ARGB1555:
++ var->transp.offset = 15;
++ var->red.offset = 10;
++ var->green.offset = 5;
++ var->blue.offset = 0;
++ var->transp.length = 1;
++ var->red.length = 5;
++ var->green.length = 5;
++ var->blue.length = 5;
++ break;
++ case GLAMO_LCD_SRC_ARGB4444:
++ var->transp.offset = 12;
++ var->red.offset = 8;
++ var->green.offset = 4;
++ var->blue.offset = 0;
++ var->transp.length = 4;
++ var->red.length = 4;
++ var->green.length = 4;
++ var->blue.length = 4;
++ break;
++ }
++ break;
++ case 24:
++ case 32:
++ default:
++ /* The Smedia Glamo doesn't support anything but 16bit color */
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
++static void glamofb_reg_set_bit_mask(struct glamofb_handle *glamo, uint16_t reg,
++ uint16_t mask, uint16_t val)
++{
++ uint16_t tmp;
++
++ val &= mask;
++
++ tmp = glamofb_reg_read(glamo, reg);
++ tmp &= ~mask;
++ tmp |= val;
++ glamofb_reg_write(glamo, reg, tmp);
++}
++
++#define GLAMO_LCD_WIDTH_MASK 0x03FF
++#define GLAMO_LCD_HEIGHT_MASK 0x03FF
++#define GLAMO_LCD_PITCH_MASK 0x07FE
++#define GLAMO_LCD_HV_TOTAL_MASK 0x03FF
++#define GLAMO_LCD_HV_RETR_START_MASK 0x03FF
++#define GLAMO_LCD_HV_RETR_END_MASK 0x03FF
++#define GLAMO_LCD_HV_RETR_DISP_START_MASK 0x03FF
++#define GLAMO_LCD_HV_RETR_DISP_END_MASK 0x03FF
++
++/* the caller has to ensure lock_cmd is held and we are in cmd mode */
++static void __rotate_lcd(struct glamofb_handle *glamo, uint32_t rotation)
++{
++ uint32_t glamo_rot;
++
++ switch (rotation) {
++ case FB_ROTATE_CW:
++ glamo_rot = GLAMO_LCD_ROT_MODE_90;
++ break;
++ case FB_ROTATE_UD:
++ glamo_rot = GLAMO_LCD_ROT_MODE_180;
++ break;
++ case FB_ROTATE_CCW:
++ glamo_rot = GLAMO_LCD_ROT_MODE_270;
++ break;
++ default:
++ glamo_rot = GLAMO_LCD_ROT_MODE_0;
++ break;
++ }
++
++ glamofb_reg_set_bit_mask(glamo,
++ GLAMO_REG_LCD_WIDTH,
++ GLAMO_LCD_ROT_MODE_MASK,
++ glamo_rot);
++ glamofb_reg_set_bit_mask(glamo,
++ GLAMO_REG_LCD_MODE1,
++ GLAMO_LCD_MODE1_ROTATE_EN,
++ (glamo_rot != GLAMO_LCD_ROT_MODE_0) ?
++ GLAMO_LCD_MODE1_ROTATE_EN : 0);
++}
++
++static inline int glamofb_cmdq_empty(struct glamofb_handle *gfb)
++{
++ /* DGCMdQempty -- 1 == command queue is empty */
++ return glamofb_reg_read(gfb, GLAMO_REG_LCD_STATUS1) & (1 << 15);
++}
++
++/* call holding gfb->lock_cmd when locking, until you unlock */
++static int glamofb_cmd_mode(struct glamofb_handle *gfb, int on)
++{
++ int timeout = 2000000;
++
++ dev_dbg(gfb->dev, "glamofb_cmd_mode(gfb=%p, on=%d)\n", gfb, on);
++ if (on) {
++ dev_dbg(gfb->dev, "%s: waiting for cmdq empty: ",
++ __func__);
++ while (!glamofb_cmdq_empty(gfb) && (timeout--))
++ cpu_relax();
++ if (timeout < 0) {
++ printk(KERN_ERR "glamofb cmd_queue never got empty\n");
++ return -EIO;
++ }
++ dev_dbg(gfb->dev, "empty!\n");
++
++ /* display the entire frame then switch to command */
++ glamofb_reg_write(gfb, GLAMO_REG_LCD_COMMAND1,
++ GLAMO_LCD_CMD_TYPE_DISP |
++ GLAMO_LCD_CMD_DATA_FIRE_VSYNC);
++
++ /* wait until lcd idle */
++ dev_dbg(gfb->dev, "waiting for lcd idle: ");
++ timeout = 2000000;
++ while (!(glamofb_reg_read(gfb, GLAMO_REG_LCD_STATUS2) & (1 << 12)) &&
++ (timeout--))
++ cpu_relax();
++ if (timeout < 0) {
++ printk(KERN_ERR"*************"
++ "glamofb lcd never idle"
++ "*************\n");
++ return -EIO;
++ }
++
++ mdelay(100);
++
++ dev_dbg(gfb->dev, "cmd mode entered\n");
++
++ } else {
++ /* RGB interface needs vsync/hsync */
++ if (glamofb_reg_read(gfb, GLAMO_REG_LCD_MODE3) & GLAMO_LCD_MODE3_RGB)
++ glamofb_reg_write(gfb, GLAMO_REG_LCD_COMMAND1,
++ GLAMO_LCD_CMD_TYPE_DISP |
++ GLAMO_LCD_CMD_DATA_DISP_SYNC);
++
++ glamofb_reg_write(gfb, GLAMO_REG_LCD_COMMAND1,
++ GLAMO_LCD_CMD_TYPE_DISP |
++ GLAMO_LCD_CMD_DATA_DISP_FIRE);
++ }
++
++ return 0;
++}
++
++static void glamofb_program_mode(struct glamofb_handle *gfb)
++{
++ unsigned int sync, bp, disp, fp, total;
++ unsigned long flags;
++ struct glamo_core *gcore = gfb->core;
++ struct fb_var_screeninfo *var = &gfb->fb->var;
++
++ dev_dbg(&gcore->pdev->dev,
++ "glamofb_program_mode spin_lock_irqsave\n");
++ spin_lock_irqsave(&gfb->lock_cmd, flags);
++
++ if (glamofb_cmd_mode(gfb, 1))
++ goto out_unlock;
++
++ if (var->pixclock)
++ glamo_engine_reclock(gcore, GLAMO_ENGINE_LCD,
++ (1000000000UL / gfb->fb->var.pixclock) * 1000);
++
++ glamofb_reg_set_bit_mask(gfb,
++ GLAMO_REG_LCD_WIDTH,
++ GLAMO_LCD_WIDTH_MASK,
++ var->xres);
++ glamofb_reg_set_bit_mask(gfb,
++ GLAMO_REG_LCD_HEIGHT,
++ GLAMO_LCD_HEIGHT_MASK,
++ var->yres);
++ glamofb_reg_set_bit_mask(gfb,
++ GLAMO_REG_LCD_PITCH,
++ GLAMO_LCD_PITCH_MASK,
++ gfb->fb->fix.line_length);
++
++ /* honour the rotation request */
++ __rotate_lcd(gfb, var->rotate);
++
++ /* update scannout timings */
++ sync = 0;
++ bp = sync + var->hsync_len;
++ disp = bp + var->left_margin;
++ fp = disp + var->xres;
++ total = fp + var->right_margin;
++
++ glamofb_reg_set_bit_mask(gfb, GLAMO_REG_LCD_HORIZ_TOTAL,
++ GLAMO_LCD_HV_TOTAL_MASK, total);
++ glamofb_reg_set_bit_mask(gfb, GLAMO_REG_LCD_HORIZ_RETR_START,
++ GLAMO_LCD_HV_RETR_START_MASK, sync);
++ glamofb_reg_set_bit_mask(gfb, GLAMO_REG_LCD_HORIZ_RETR_END,
++ GLAMO_LCD_HV_RETR_END_MASK, bp);
++ glamofb_reg_set_bit_mask(gfb, GLAMO_REG_LCD_HORIZ_DISP_START,
++ GLAMO_LCD_HV_RETR_DISP_START_MASK, disp);
++ glamofb_reg_set_bit_mask(gfb, GLAMO_REG_LCD_HORIZ_DISP_END,
++ GLAMO_LCD_HV_RETR_DISP_END_MASK, fp);
++
++ sync = 0;
++ bp = sync + var->vsync_len;
++ disp = bp + var->upper_margin;
++ fp = disp + var->yres;
++ total = fp + var->lower_margin;
++
++ glamofb_reg_set_bit_mask(gfb, GLAMO_REG_LCD_VERT_TOTAL,
++ GLAMO_LCD_HV_TOTAL_MASK, total);
++ glamofb_reg_set_bit_mask(gfb, GLAMO_REG_LCD_VERT_RETR_START,
++ GLAMO_LCD_HV_RETR_START_MASK, sync);
++ glamofb_reg_set_bit_mask(gfb, GLAMO_REG_LCD_VERT_RETR_END,
++ GLAMO_LCD_HV_RETR_END_MASK, bp);
++ glamofb_reg_set_bit_mask(gfb, GLAMO_REG_LCD_VERT_DISP_START,
++ GLAMO_LCD_HV_RETR_DISP_START_MASK, disp);
++ glamofb_reg_set_bit_mask(gfb, GLAMO_REG_LCD_VERT_DISP_END,
++ GLAMO_LCD_HV_RETR_DISP_END_MASK, fp);
++
++ glamofb_cmd_mode(gfb, 0);
++
++ gfb->mode_set = 1;
++
++out_unlock:
++ dev_dbg(&gcore->pdev->dev,
++ "glamofb_program_mode spin_unlock_irqrestore\n");
++ spin_unlock_irqrestore(&gfb->lock_cmd, flags);
++}
++
++static struct fb_videomode *glamofb_find_mode(struct fb_info *info,
++ struct fb_var_screeninfo *var)
++{
++ struct glamofb_handle *glamo = info->par;
++ struct glamo_fb_platform_data *pdata = glamo->mach_info;
++ struct fb_videomode *mode;
++ int i;
++
++ for (i = pdata->num_modes, mode = pdata->modes; i; --i, ++mode) {
++ if (mode->xres == var->xres &&
++ mode->yres == var->yres)
++ return mode;
++ }
++
++ return NULL;
++}
++
++static int glamofb_set_par(struct fb_info *info)
++{
++ struct glamofb_handle *glamo = info->par;
++ struct fb_var_screeninfo *var = &info->var;
++ struct fb_videomode *mode;
++
++ mode = glamofb_find_mode(info, var);
++ if (!mode)
++ return -EINVAL;
++
++ fb_videomode_to_var(var, mode);
++
++ info->mode = mode;
++
++ glamo->mode_set = 0;
++
++ switch (var->rotate) {
++ case FB_ROTATE_CW:
++ case FB_ROTATE_CCW:
++ info->fix.line_length = (var->yres * var->bits_per_pixel) / 8;
++ /* FIXME: Limit pixelclock */
++ var->pixclock *= 2;
++ break;
++ default:
++ info->fix.line_length = (var->xres * var->bits_per_pixel) / 8;
++ break;
++ }
++
++ if (glamo->output_enabled)
++ glamofb_program_mode(glamo);
++
++ return 0;
++}
++
++static int glamofb_blank(int blank_mode, struct fb_info *info)
++{
++ struct glamofb_handle *gfb = info->par;
++
++ dev_dbg(gfb->dev, "glamofb_blank(%u)\n", blank_mode);
++
++ switch (blank_mode) {
++ case FB_BLANK_VSYNC_SUSPEND:
++ case FB_BLANK_HSYNC_SUSPEND:
++ /* FIXME: add pdata hook/flag to indicate whether
++ * we should already switch off pixel clock here */
++ break;
++ case FB_BLANK_POWERDOWN:
++ /* disable the pixel clock */
++ glamo_output_disable(gfb);
++ gfb->blank_mode = blank_mode;
++ break;
++ case FB_BLANK_UNBLANK:
++ case FB_BLANK_NORMAL:
++ glamo_output_enable(gfb);
++ gfb->blank_mode = blank_mode;
++ break;
++ }
++
++ /* FIXME: once we have proper clock management in glamo-core,
++ * we can determine if other units need MCLK1 or the PLL, and
++ * disable it if not used. */
++ return 0;
++}
++
++static inline unsigned int chan_to_field(unsigned int chan,
++ struct fb_bitfield *bf)
++{
++ chan &= 0xffff;
++ chan >>= 16 - bf->length;
++ return chan << bf->offset;
++}
++
++static int glamofb_setcolreg(unsigned regno, unsigned red, unsigned green,
++ unsigned blue, unsigned transp, struct fb_info *info)
++{
++ struct glamofb_handle *glamo = info->par;
++ unsigned int val;
++
++ switch (glamo->fb->fix.visual) {
++ case FB_VISUAL_TRUECOLOR:
++ case FB_VISUAL_DIRECTCOLOR:
++ /* true-colour, use pseuo-palette */
++
++ if (regno < 16) {
++ u32 *pal = glamo->fb->pseudo_palette;
++
++ val = chan_to_field(red, &glamo->fb->var.red);
++ val |= chan_to_field(green, &glamo->fb->var.green);
++ val |= chan_to_field(blue, &glamo->fb->var.blue);
++
++ pal[regno] = val;
++ };
++ break;
++ default:
++ return 1; /* unknown type */
++ }
++
++ return 0;
++}
++
++static int glamofb_ioctl(struct fb_info *info, unsigned int cmd,
++ unsigned long arg)
++{
++ struct glamofb_handle *gfb = (struct glamofb_handle *)info->par;
++ struct glamo_core *gcore = gfb->core;
++ int retval = -ENOTTY;
++
++ switch (cmd) {
++ case GLAMOFB_ENGINE_ENABLE:
++ retval = glamo_engine_enable(gcore, arg);
++ break;
++ case GLAMOFB_ENGINE_DISABLE:
++ retval = glamo_engine_disable(gcore, arg);
++ break;
++ case GLAMOFB_ENGINE_RESET:
++ glamo_engine_reset(gcore, arg);
++ retval = 0;
++ break;
++ default:
++ break;
++ }
++
++ return retval;
++}
++
++
++#ifdef CONFIG_MFD_GLAMO_HWACCEL
++static inline void glamofb_vsync_wait(struct glamofb_handle *glamo, int line,
++ int size, int range)
++{
++ int count[2];
++
++ do {
++ count[0] = glamofb_reg_read(glamo, GLAMO_REG_LCD_STATUS2) & 0x3ff;
++ count[1] = glamofb_reg_read(glamo, GLAMO_REG_LCD_STATUS2) & 0x3ff;
++ } while (count[0] != count[1] ||
++ (line < count[0] + range &&
++ size > count[0] - range) ||
++ count[0] < range * 2);
++}
++
++/*
++ * Enable/disable the hardware cursor mode altogether
++ * (for blinking and such, use glamofb_cursor()).
++ */
++static void glamofb_cursor_onoff(struct glamofb_handle *glamo, int on)
++{
++ int y, size;
++
++ if (glamo->cursor_on) {
++ y = glamofb_reg_read(glamo, GLAMO_REG_LCD_CURSOR_Y_POS);
++ size = glamofb_reg_read(glamo, GLAMO_REG_LCD_CURSOR_Y_SIZE);
++
++ glamofb_vsync_wait(glamo, y, size, 30);
++ }
++
++ glamofb_reg_set_bit_mask(glamo, GLAMO_REG_LCD_MODE1,
++ GLAMO_LCD_MODE1_CURSOR_EN,
++ on ? GLAMO_LCD_MODE1_CURSOR_EN : 0);
++ glamo->cursor_on = on;
++
++ /* Hide the cursor by default */
++ glamofb_reg_write(glamo, GLAMO_REG_LCD_CURSOR_X_SIZE, 0);
++}
++
++static int glamofb_cursor(struct fb_info *info, struct fb_cursor *cursor)
++{
++ struct glamofb_handle *glamo = info->par;
++ unsigned long flags;
++
++ spin_lock_irqsave(&glamo->lock_cmd, flags);
++
++ glamofb_reg_write(glamo, GLAMO_REG_LCD_CURSOR_X_SIZE,
++ cursor->enable ? cursor->image.width : 0);
++
++ if (cursor->set & FB_CUR_SETPOS) {
++ glamofb_reg_write(glamo, GLAMO_REG_LCD_CURSOR_X_POS,
++ cursor->image.dx);
++ glamofb_reg_write(glamo, GLAMO_REG_LCD_CURSOR_Y_POS,
++ cursor->image.dy);
++ }
++
++ if (cursor->set & FB_CUR_SETCMAP) {
++ uint16_t fg = glamo->pseudo_pal[cursor->image.fg_color];
++ uint16_t bg = glamo->pseudo_pal[cursor->image.bg_color];
++
++ glamofb_reg_write(glamo, GLAMO_REG_LCD_CURSOR_FG_COLOR, fg);
++ glamofb_reg_write(glamo, GLAMO_REG_LCD_CURSOR_BG_COLOR, bg);
++ glamofb_reg_write(glamo, GLAMO_REG_LCD_CURSOR_DST_COLOR, fg);
++ }
++
++ if (cursor->set & FB_CUR_SETHOT)
++ glamofb_reg_write(glamo, GLAMO_REG_LCD_CURSOR_PRESET,
++ (cursor->hot.x << 8) | cursor->hot.y);
++
++ if ((cursor->set & FB_CUR_SETSIZE) ||
++ (cursor->set & (FB_CUR_SETIMAGE | FB_CUR_SETSHAPE))) {
++ int x, y, pitch, op;
++ const uint8_t *pcol = cursor->image.data;
++ const uint8_t *pmsk = cursor->mask;
++ uint8_t __iomem *dst = glamo->cursor_addr;
++ uint8_t dcol = 0;
++ uint8_t dmsk = 0;
++ uint8_t byte = 0;
++
++ if (cursor->image.depth > 1) {
++ spin_unlock_irqrestore(&glamo->lock_cmd, flags);
++ return -EINVAL;
++ }
++
++ pitch = ((cursor->image.width + 7) >> 2) & ~1;
++ glamofb_reg_write(glamo, GLAMO_REG_LCD_CURSOR_PITCH,
++ pitch);
++ glamofb_reg_write(glamo, GLAMO_REG_LCD_CURSOR_Y_SIZE,
++ cursor->image.height);
++
++ for (y = 0; y < cursor->image.height; y++) {
++ byte = 0;
++ for (x = 0; x < cursor->image.width; x++) {
++ if ((x % 8) == 0) {
++ dcol = *pcol++;
++ dmsk = *pmsk++;
++ } else {
++ dcol >>= 1;
++ dmsk >>= 1;
++ }
++
++ if (cursor->rop == ROP_COPY)
++ op = (dmsk & 1) ?
++ (dcol & 1) ? 1 : 3 : 0;
++ else
++ op = ((dmsk & 1) << 1) |
++ ((dcol & 1) << 0);
++ byte |= op << ((x & 3) << 1);
++
++ if (x % 4 == 3) {
++ writeb(byte, dst + x / 4);
++ byte = 0;
++ }
++ }
++ if (x % 4) {
++ writeb(byte, dst + x / 4);
++ byte = 0;
++ }
++
++ dst += pitch;
++ }
++ }
++
++ spin_unlock_irqrestore(&glamo->lock_cmd, flags);
++
++ return 0;
++}
++#endif
++
++static struct fb_ops glamofb_ops = {
++ .owner = THIS_MODULE,
++ .fb_check_var = glamofb_check_var,
++ .fb_set_par = glamofb_set_par,
++ .fb_blank = glamofb_blank,
++ .fb_setcolreg = glamofb_setcolreg,
++ .fb_ioctl = glamofb_ioctl,
++#ifdef CONFIG_MFD_GLAMO_HWACCEL
++ .fb_cursor = glamofb_cursor,
++#endif
++ .fb_fillrect = cfb_fillrect,
++ .fb_copyarea = cfb_copyarea,
++ .fb_imageblit = cfb_imageblit,
++};
++
++static int glamofb_init_regs(struct glamofb_handle *glamo)
++{
++ struct fb_info *info = glamo->fb;
++
++ glamofb_check_var(&info->var, info);
++ glamofb_run_script(glamo, glamo_regs, ARRAY_SIZE(glamo_regs));
++ glamofb_set_par(info);
++
++ return 0;
++}
++
++static int __devinit glamofb_probe(struct platform_device *pdev)
++{
++ int rc = -EIO;
++ struct fb_info *fbinfo;
++ struct glamofb_handle *glamofb;
++ struct glamo_core *core = dev_get_drvdata(pdev->dev.parent);
++ struct glamo_fb_platform_data *mach_info;
++
++ printk(KERN_INFO "SMEDIA Glamo frame buffer driver (C) 2007 "
++ "Openmoko, Inc.\n");
++
++ if (!core->pdata || !core->pdata->fb_data)
++ return -ENOENT;
++
++
++ fbinfo = framebuffer_alloc(sizeof(struct glamofb_handle), &pdev->dev);
++ if (!fbinfo)
++ return -ENOMEM;
++
++
++ glamofb = fbinfo->par;
++ glamofb->fb = fbinfo;
++ glamofb->dev = &pdev->dev;
++
++ glamofb->blank_mode = FB_BLANK_POWERDOWN;
++
++ strcpy(fbinfo->fix.id, "SMedia Glamo");
++
++ glamofb->reg = platform_get_resource_byname(pdev, IORESOURCE_MEM,
++ "glamo-fb-regs");
++ if (!glamofb->reg) {
++ dev_err(&pdev->dev, "platform device with no registers?\n");
++ rc = -ENOENT;
++ goto out_free;
++ }
++
++ glamofb->fb_res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
++ "glamo-fb-mem");
++ if (!glamofb->fb_res) {
++ dev_err(&pdev->dev, "platform device with no memory ?\n");
++ rc = -ENOENT;
++ goto out_free;
++ }
++
++ glamofb->reg = request_mem_region(glamofb->reg->start,
++ resource_size(glamofb->reg),
++ pdev->name);
++ if (!glamofb->reg) {
++ dev_err(&pdev->dev, "failed to request mmio region\n");
++ goto out_free;
++ }
++
++ glamofb->fb_res = request_mem_region(glamofb->fb_res->start,
++ resource_size(glamofb->fb_res),
++ pdev->name);
++ if (!glamofb->fb_res) {
++ dev_err(&pdev->dev, "failed to request vram region\n");
++ goto out_release_reg;
++ }
++
++ /* we want to remap only the registers required for this core
++ * driver. */
++ glamofb->base = ioremap_nocache(glamofb->reg->start,
++ resource_size(glamofb->reg));
++ if (!glamofb->base) {
++ dev_err(&pdev->dev, "failed to ioremap() mmio memory\n");
++ goto out_release_fb;
++ }
++
++ fbinfo->fix.smem_start = (unsigned long)glamofb->fb_res->start;
++ fbinfo->fix.smem_len = (__u32)resource_size(glamofb->fb_res);
++
++ fbinfo->screen_base = ioremap(glamofb->fb_res->start,
++ resource_size(glamofb->fb_res));
++ if (!fbinfo->screen_base) {
++ dev_err(&pdev->dev, "failed to ioremap() vram memory\n");
++ goto out_release_fb;
++ }
++ glamofb->cursor_addr = fbinfo->screen_base + 0x12C000;
++
++ platform_set_drvdata(pdev, glamofb);
++
++ mach_info = core->pdata->fb_data;
++ glamofb->core = core;
++ glamofb->mach_info = mach_info;
++
++ fbinfo->fix.visual = FB_VISUAL_TRUECOLOR;
++ fbinfo->fix.type = FB_TYPE_PACKED_PIXELS;
++ fbinfo->fix.type_aux = 0;
++ fbinfo->fix.xpanstep = 0;
++ fbinfo->fix.ypanstep = 0;
++ fbinfo->fix.ywrapstep = 0;
++ fbinfo->fix.accel = FB_ACCEL_GLAMO;
++
++
++ fbinfo->fbops = &glamofb_ops;
++ fbinfo->flags = FBINFO_FLAG_DEFAULT;
++ fbinfo->pseudo_palette = &glamofb->pseudo_pal;
++
++ fbinfo->mode = mach_info->modes;
++ fb_videomode_to_var(&fbinfo->var, fbinfo->mode);
++ fbinfo->var.bits_per_pixel = 16;
++ fbinfo->var.nonstd = 0;
++ fbinfo->var.activate = FB_ACTIVATE_NOW;
++ fbinfo->var.height = mach_info->height;
++ fbinfo->var.width = mach_info->width;
++ fbinfo->var.accel_flags = 0;
++ fbinfo->var.vmode = FB_VMODE_NONINTERLACED;
++
++ glamo_engine_enable(core, GLAMO_ENGINE_LCD);
++ glamo_engine_reset(core, GLAMO_ENGINE_LCD);
++ glamofb->output_enabled = 1;
++ glamofb->mode_set = 1;
++
++ dev_info(&pdev->dev, "spin_lock_init\n");
++ spin_lock_init(&glamofb->lock_cmd);
++ glamofb_init_regs(glamofb);
++#ifdef CONFIG_MFD_GLAMO_HWACCEL
++ glamofb_cursor_onoff(glamofb, 1);
++#endif
++
++ fb_videomode_to_modelist(mach_info->modes, mach_info->num_modes,
++ &fbinfo->modelist);
++
++ rc = register_framebuffer(fbinfo);
++ if (rc < 0) {
++ dev_err(&pdev->dev, "failed to register framebuffer\n");
++ goto out_unmap_fb;
++ }
++
++ printk(KERN_INFO "fb%d: %s frame buffer device\n",
++ fbinfo->node, fbinfo->fix.id);
++
++ return 0;
++
++out_unmap_fb:
++ iounmap(fbinfo->screen_base);
++ iounmap(glamofb->base);
++out_release_fb:
++ release_mem_region(glamofb->fb_res->start,
++ resource_size(glamofb->fb_res));
++out_release_reg:
++ release_mem_region(glamofb->reg->start,
++ resource_size(glamofb->reg));
++out_free:
++ framebuffer_release(fbinfo);
++ return rc;
++}
++
++static int __devexit glamofb_remove(struct platform_device *pdev)
++{
++ struct glamofb_handle *glamofb = platform_get_drvdata(pdev);
++
++ iounmap(glamofb->fb->screen_base);
++ iounmap(glamofb->base);
++
++ release_mem_region(glamofb->fb_res->start,
++ resource_size(glamofb->fb_res));
++ release_mem_region(glamofb->reg->start, resource_size(glamofb->reg));
++
++ platform_set_drvdata(pdev, NULL);
++ framebuffer_release(glamofb->fb);
++
++ return 0;
++}
++
++#ifdef CONFIG_PM
++
++static int glamofb_suspend(struct device *dev)
++{
++ struct glamofb_handle *gfb = dev_get_drvdata(dev);
++
++ console_lock();
++ fb_set_suspend(gfb->fb, 1);
++ console_unlock();
++
++ /* seriously -- nobody is allowed to touch glamo memory when we
++ * are suspended or we lock on nWAIT
++ */
++ /* iounmap(gfb->fb->screen_base); */
++
++ return 0;
++}
++
++static int glamofb_resume(struct device *dev)
++{
++ struct glamofb_handle *gfb = dev_get_drvdata(dev);
++
++ /* OK let's allow framebuffer ops again */
++ /* gfb->fb->screen_base = ioremap(gfb->fb_res->start,
++ resource_size(gfb->fb_res)); */
++ glamo_engine_enable(gfb->core, GLAMO_ENGINE_LCD);
++ glamo_engine_reset(gfb->core, GLAMO_ENGINE_LCD);
++
++ glamofb_init_regs(gfb);
++#ifdef CONFIG_MFD_GLAMO_HWACCEL
++ glamofb_cursor_onoff(gfb, 1);
++#endif
++
++ console_lock();
++ fb_set_suspend(gfb->fb, 0);
++ console_unlock();
++
++ return 0;
++}
++
++static const struct dev_pm_ops glamofb_pm_ops = {
++ .suspend = glamofb_suspend,
++ .resume = glamofb_resume,
++};
++
++#define GLAMOFB_PM_OPS (&glamofb_pm_ops)
++
++#else
++#define GLAMOFB_PM_OPS NULL
++#endif
++
++static struct platform_driver glamofb_driver = {
++ .probe = glamofb_probe,
++ .remove = __devexit_p(glamofb_remove),
++ .driver = {
++ .name = "glamo-fb",
++ .owner = THIS_MODULE,
++ .pm = GLAMOFB_PM_OPS
++ },
++};
++
++static int __init glamofb_init(void)
++{
++ return platform_driver_register(&glamofb_driver);
++}
++module_init(glamofb_init);
++
++static void __exit glamofb_cleanup(void)
++{
++ platform_driver_unregister(&glamofb_driver);
++}
++module_exit(glamofb_cleanup);
++
++MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
++MODULE_DESCRIPTION("Smedia Glamo 336x/337x framebuffer driver");
++MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:glamo-fb");
+diff --git a/include/linux/fb.h b/include/linux/fb.h
+index 6a82748..6965285 100644
+--- a/include/linux/fb.h
++++ b/include/linux/fb.h
+@@ -135,6 +135,7 @@
+ #define FB_ACCEL_NEOMAGIC_NM2360 97 /* NeoMagic NM2360 */
+ #define FB_ACCEL_NEOMAGIC_NM2380 98 /* NeoMagic NM2380 */
+ #define FB_ACCEL_PXA3XX 99 /* PXA3xx */
++#define FB_ACCEL_GLAMO 100 /* Smedia Glamo 3362 */
+
+ #define FB_ACCEL_SAVAGE4 0x80 /* S3 Savage4 */
+ #define FB_ACCEL_SAVAGE3D 0x81 /* S3 Savage3D */
+diff --git a/include/linux/glamofb.h b/include/linux/glamofb.h
+new file mode 100644
+index 0000000..896579b
+--- /dev/null
++++ b/include/linux/glamofb.h
+@@ -0,0 +1,21 @@
++#ifndef _LINUX_GLAMOFB_H
++#define _LINUX_GLAMOFB_H
++
++#ifdef __KERNEL__
++
++#include <linux/fb.h>
++
++struct glamo_fb_platform_data {
++ int width, height;
++
++ int num_modes;
++ struct fb_videomode *modes;
++};
++
++#endif
++
++#define GLAMOFB_ENGINE_ENABLE _IOW('F', 0x1, __u32)
++#define GLAMOFB_ENGINE_DISABLE _IOW('F', 0x2, __u32)
++#define GLAMOFB_ENGINE_RESET _IOW('F', 0x3, __u32)
++
++#endif
+diff --git a/include/linux/jbt6k74.h b/include/linux/jbt6k74.h
+new file mode 100644
+index 0000000..3f0735d
+--- /dev/null
++++ b/include/linux/jbt6k74.h
+@@ -0,0 +1,18 @@
++#ifndef __JBT6K74_H__
++#define __JBT6K74_H__
++
++#include <linux/spi/spi.h>
++
++/*
++ * struct jbt6k74_platform_data - Platform data for jbt6k74 driver
++ * @enable_pixel_clock: Callback to enable or disable the pixelclock of the
++ * gpu.
++ * @gpio_reset: Reset gpio pin number.
++ */
++struct jbt6k74_platform_data {
++ void (*enable_pixel_clock)(struct device *dev, int enable);
++
++ int gpio_reset;
++};
++
++#endif
+diff --git a/include/linux/leds_pwm.h b/include/linux/leds_pwm.h
+index 33a0711..42d4969 100644
+--- a/include/linux/leds_pwm.h
++++ b/include/linux/leds_pwm.h
+@@ -16,6 +16,26 @@ struct led_pwm {
+ struct led_pwm_platform_data {
+ int num_leds;
+ struct led_pwm *leds;
++
++ /* @init: The init callback is called after the pwm device for a led has
++ * been successfully configured. If the return value is negative it will be
++ * seen as an error and initzalisation of the leds-pwm device will fail.
++ */
++ int (*init)(struct device *dev, struct led_pwm *led);
++
++ /* @notify: The notify callback is called whenever the brightness of a led
++ * is changed.
++ * The return value of the callback will be the brightness which is used to
++ * configure the pwm device.
++ */
++ enum led_brightness (*notify)(struct device *dev, struct led_pwm *led,
++ enum led_brightness brightness);
++
++ /* @exit: The exit callback is called, whenever a led device registered by
++ * the leds-pwm device is unregistered. It will be called prior to freeing
++ * the pwm device.
++ */
++ void (*exit)(struct device *dev, struct led_pwm *led);
+ };
+
+ #endif
+diff --git a/include/linux/mfd/glamo-core.h b/include/linux/mfd/glamo-core.h
+new file mode 100644
+index 0000000..8275a2f
+--- /dev/null
++++ b/include/linux/mfd/glamo-core.h
+@@ -0,0 +1,58 @@
++#ifndef __GLAMO_CORE_H
++#define __GLAMO_CORE_H
++
++#include <linux/mfd/glamo.h>
++
++/* for the time being, we put the on-screen framebuffer into the lowest
++ * VRAM space. This should make the code easily compatible with the various
++ * 2MB/4MB/8MB variants of the Smedia chips */
++#define GLAMO_OFFSET_VRAM 0x800000
++#define GLAMO_OFFSET_FB (GLAMO_OFFSET_VRAM)
++
++/* we only allocate the minimum possible size for the framebuffer to make
++ * sure we have sufficient memory for other functions of the chip */
++/*#define GLAMO_FB_SIZE (640*480*4) *//* == 0x12c000 */
++#define GLAMO_INTERNAL_RAM_SIZE 0x800000
++#define GLAMO_MMC_BUFFER_SIZE (64 * 1024)
++#define GLAMO_FB_SIZE (GLAMO_INTERNAL_RAM_SIZE - GLAMO_MMC_BUFFER_SIZE)
++
++enum glamo_pll {
++ GLAMO_PLL1,
++ GLAMO_PLL2,
++};
++
++enum glamo_engine_state {
++ GLAMO_ENGINE_DISABLED,
++ GLAMO_ENGINE_SUSPENDED,
++ GLAMO_ENGINE_ENABLED,
++};
++
++struct glamo_core {
++ int irq;
++ int irq_base;
++ struct resource *mem;
++ void __iomem *base;
++ struct platform_device *pdev;
++ struct glamo_platform_data *pdata;
++ enum glamo_engine_state engine_state[__NUM_GLAMO_ENGINES];
++ spinlock_t lock;
++ uint16_t saved_irq_mask;
++#ifdef CONFIG_DEBUG_FS
++ struct dentry *debugfs_dir;
++#endif
++};
++
++struct glamo_script {
++ uint16_t reg;
++ uint16_t val;
++};
++
++int glamo_pll_rate(struct glamo_core *glamo, enum glamo_pll pll);
++
++int glamo_engine_enable(struct glamo_core *glamo, enum glamo_engine engine);
++int glamo_engine_suspend(struct glamo_core *glamo, enum glamo_engine engine);
++int glamo_engine_disable(struct glamo_core *glamo, enum glamo_engine engine);
++void glamo_engine_reset(struct glamo_core *glamo, enum glamo_engine engine);
++int glamo_engine_reclock(struct glamo_core *glamo,
++ enum glamo_engine engine, int ps);
++#endif /* __GLAMO_CORE_H */
+diff --git a/include/linux/mfd/glamo-regs.h b/include/linux/mfd/glamo-regs.h
+new file mode 100644
+index 0000000..59848e1
+--- /dev/null
++++ b/include/linux/mfd/glamo-regs.h
+@@ -0,0 +1,630 @@
++#ifndef _GLAMO_REGS_H
++#define _GLAMO_REGS_H
++
++/* Smedia Glamo 336x/337x driver
++ *
++ * (C) 2007 by Openmoko, Inc.
++ * Author: Harald Welte <laforge@openmoko.org>
++ * All rights reserved.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License as
++ * published by the Free Software Foundation; either version 2 of
++ * the License, or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ */
++
++enum glamo_regster_offsets {
++ GLAMO_REGOFS_GENERIC = 0x0000,
++ GLAMO_REGOFS_HOSTBUS = 0x0200,
++ GLAMO_REGOFS_MEMORY = 0x0300,
++ GLAMO_REGOFS_VIDCAP = 0x0400,
++ GLAMO_REGOFS_ISP = 0x0500,
++ GLAMO_REGOFS_JPEG = 0x0800,
++ GLAMO_REGOFS_MPEG = 0x0c00,
++ GLAMO_REGOFS_LCD = 0x1100,
++ GLAMO_REGOFS_MMC = 0x1400,
++ GLAMO_REGOFS_MPROC0 = 0x1500,
++ GLAMO_REGOFS_MPROC1 = 0x1580,
++ GLAMO_REGOFS_CMDQUEUE = 0x1600,
++ GLAMO_REGOFS_RISC = 0x1680,
++ GLAMO_REGOFS_2D = 0x1700,
++ GLAMO_REGOFS_3D = 0x1b00,
++ GLAMO_REGOFS_END = 0x2400,
++};
++
++
++enum glamo_register_generic {
++ GLAMO_REG_GCONF1 = 0x0000,
++ GLAMO_REG_GCONF2 = 0x0002,
++#define GLAMO_REG_DEVICE_ID GLAMO_REG_GCONF2
++ GLAMO_REG_GCONF3 = 0x0004,
++#define GLAMO_REG_REVISION_ID GLAMO_REG_GCONF3
++ GLAMO_REG_IRQ_GEN1 = 0x0006,
++#define GLAMO_REG_IRQ_ENABLE GLAMO_REG_IRQ_GEN1
++ GLAMO_REG_IRQ_GEN2 = 0x0008,
++#define GLAMO_REG_IRQ_SET GLAMO_REG_IRQ_GEN2
++ GLAMO_REG_IRQ_GEN3 = 0x000a,
++#define GLAMO_REG_IRQ_CLEAR GLAMO_REG_IRQ_GEN3
++ GLAMO_REG_IRQ_GEN4 = 0x000c,
++#define GLAMO_REG_IRQ_STATUS GLAMO_REG_IRQ_GEN4
++ GLAMO_REG_CLOCK_HOST = 0x0010,
++ GLAMO_REG_CLOCK_MEMORY = 0x0012,
++ GLAMO_REG_CLOCK_LCD = 0x0014,
++ GLAMO_REG_CLOCK_MMC = 0x0016,
++ GLAMO_REG_CLOCK_ISP = 0x0018,
++ GLAMO_REG_CLOCK_JPEG = 0x001a,
++ GLAMO_REG_CLOCK_3D = 0x001c,
++ GLAMO_REG_CLOCK_2D = 0x001e,
++ GLAMO_REG_CLOCK_RISC1 = 0x0020, /* 3365 only? */
++ GLAMO_REG_CLOCK_RISC2 = 0x0022, /* 3365 only? */
++ GLAMO_REG_CLOCK_MPEG = 0x0024,
++ GLAMO_REG_CLOCK_MPROC = 0x0026,
++
++ GLAMO_REG_CLOCK_GEN5_1 = 0x0030,
++ GLAMO_REG_CLOCK_GEN5_2 = 0x0032,
++ GLAMO_REG_CLOCK_GEN6 = 0x0034,
++ GLAMO_REG_CLOCK_GEN7 = 0x0036,
++ GLAMO_REG_CLOCK_GEN8 = 0x0038,
++ GLAMO_REG_CLOCK_GEN9 = 0x003a,
++ GLAMO_REG_CLOCK_GEN10 = 0x003c,
++ GLAMO_REG_CLOCK_GEN11 = 0x003e,
++ GLAMO_REG_PLL_GEN1 = 0x0040,
++ GLAMO_REG_PLL_GEN2 = 0x0042,
++ GLAMO_REG_PLL_GEN3 = 0x0044,
++ GLAMO_REG_PLL_GEN4 = 0x0046,
++ GLAMO_REG_PLL_GEN5 = 0x0048,
++ GLAMO_REG_GPIO_GEN1 = 0x0050,
++ GLAMO_REG_GPIO_GEN2 = 0x0052,
++ GLAMO_REG_GPIO_GEN3 = 0x0054,
++ GLAMO_REG_GPIO_GEN4 = 0x0056,
++ GLAMO_REG_GPIO_GEN5 = 0x0058,
++ GLAMO_REG_GPIO_GEN6 = 0x005a,
++ GLAMO_REG_GPIO_GEN7 = 0x005c,
++ GLAMO_REG_GPIO_GEN8 = 0x005e,
++ GLAMO_REG_GPIO_GEN9 = 0x0060,
++ GLAMO_REG_GPIO_GEN10 = 0x0062,
++ GLAMO_REG_DFT_GEN1 = 0x0070,
++ GLAMO_REG_DFT_GEN2 = 0x0072,
++ GLAMO_REG_DFT_GEN3 = 0x0074,
++ GLAMO_REG_DFT_GEN4 = 0x0076,
++
++ GLAMO_REG_DFT_GEN5 = 0x01e0,
++ GLAMO_REG_DFT_GEN6 = 0x01f0,
++};
++
++#define GLAMO_REG_HOSTBUS(x) (GLAMO_REGOFS_HOSTBUS-2+(x*2))
++
++#define REG_MEM(x) (GLAMO_REGOFS_MEMORY+(x))
++#define GLAMO_REG_MEM_TIMING(x) (GLAMO_REG_MEM_TIMING1-2+(x*2))
++
++enum glamo_register_mem {
++ GLAMO_REG_MEM_TYPE = REG_MEM(0x00),
++ GLAMO_REG_MEM_GEN = REG_MEM(0x02),
++ GLAMO_REG_MEM_TIMING1 = REG_MEM(0x04),
++ GLAMO_REG_MEM_TIMING2 = REG_MEM(0x06),
++ GLAMO_REG_MEM_TIMING3 = REG_MEM(0x08),
++ GLAMO_REG_MEM_TIMING4 = REG_MEM(0x0a),
++ GLAMO_REG_MEM_TIMING5 = REG_MEM(0x0c),
++ GLAMO_REG_MEM_TIMING6 = REG_MEM(0x0e),
++ GLAMO_REG_MEM_TIMING7 = REG_MEM(0x10),
++ GLAMO_REG_MEM_TIMING8 = REG_MEM(0x12),
++ GLAMO_REG_MEM_TIMING9 = REG_MEM(0x14),
++ GLAMO_REG_MEM_TIMING10 = REG_MEM(0x16),
++ GLAMO_REG_MEM_TIMING11 = REG_MEM(0x18),
++ GLAMO_REG_MEM_POWER1 = REG_MEM(0x1a),
++ GLAMO_REG_MEM_POWER2 = REG_MEM(0x1c),
++ GLAMO_REG_MEM_LCD_BUF1 = REG_MEM(0x1e),
++ GLAMO_REG_MEM_LCD_BUF2 = REG_MEM(0x20),
++ GLAMO_REG_MEM_LCD_BUF3 = REG_MEM(0x22),
++ GLAMO_REG_MEM_LCD_BUF4 = REG_MEM(0x24),
++ GLAMO_REG_MEM_BIST1 = REG_MEM(0x26),
++ GLAMO_REG_MEM_BIST2 = REG_MEM(0x28),
++ GLAMO_REG_MEM_BIST3 = REG_MEM(0x2a),
++ GLAMO_REG_MEM_BIST4 = REG_MEM(0x2c),
++ GLAMO_REG_MEM_BIST5 = REG_MEM(0x2e),
++ GLAMO_REG_MEM_MAH1 = REG_MEM(0x30),
++ GLAMO_REG_MEM_MAH2 = REG_MEM(0x32),
++ GLAMO_REG_MEM_DRAM1 = REG_MEM(0x34),
++ GLAMO_REG_MEM_DRAM2 = REG_MEM(0x36),
++ GLAMO_REG_MEM_CRC = REG_MEM(0x38),
++};
++
++#define GLAMO_MEM_TYPE_MASK 0x03
++
++enum glamo_reg_mem_dram1 {
++ /* b0 - b10 == refresh period, 1 -> 2048 clocks */
++ GLAMO_MEM_DRAM1_EN_GATE_CLK = (1 << 11),
++ GLAMO_MEM_DRAM1_SELF_REFRESH = (1 << 12),
++ GLAMO_MEM_DRAM1_EN_GATE_CKE = (1 << 13),
++ GLAMO_MEM_DRAM1_EN_DRAM_REFRESH = (1 << 14),
++ GLAMO_MEM_DRAM1_EN_MODEREG_SET = (1 << 15),
++};
++
++enum glamo_reg_mem_dram2 {
++ GLAMO_MEM_DRAM2_DEEP_PWRDOWN = (1 << 12),
++};
++
++enum glamo_irq_index {
++ GLAMO_IRQIDX_HOSTBUS = 0,
++ GLAMO_IRQIDX_JPEG = 1,
++ GLAMO_IRQIDX_MPEG = 2,
++ GLAMO_IRQIDX_MPROC1 = 3,
++ GLAMO_IRQIDX_MPROC0 = 4,
++ GLAMO_IRQIDX_CMDQUEUE = 5,
++ GLAMO_IRQIDX_2D = 6,
++ GLAMO_IRQIDX_MMC = 7,
++ GLAMO_IRQIDX_RISC = 8,
++};
++
++enum glamo_irq {
++ GLAMO_IRQ_HOSTBUS = (1 << GLAMO_IRQIDX_HOSTBUS),
++ GLAMO_IRQ_JPEG = (1 << GLAMO_IRQIDX_JPEG),
++ GLAMO_IRQ_MPEG = (1 << GLAMO_IRQIDX_MPEG),
++ GLAMO_IRQ_MPROC1 = (1 << GLAMO_IRQIDX_MPROC1),
++ GLAMO_IRQ_MPROC0 = (1 << GLAMO_IRQIDX_MPROC0),
++ GLAMO_IRQ_CMDQUEUE = (1 << GLAMO_IRQIDX_CMDQUEUE),
++ GLAMO_IRQ_2D = (1 << GLAMO_IRQIDX_2D),
++ GLAMO_IRQ_MMC = (1 << GLAMO_IRQIDX_MMC),
++ GLAMO_IRQ_RISC = (1 << GLAMO_IRQIDX_RISC),
++};
++
++enum glamo_reg_clock_host {
++ GLAMO_CLOCK_HOST_DG_BCLK = 0x0001,
++ GLAMO_CLOCK_HOST_DG_M0CLK = 0x0004,
++ GLAMO_CLOCK_HOST_RESET = 0x1000,
++};
++
++enum glamo_reg_clock_mem {
++ GLAMO_CLOCK_MEM_DG_M1CLK = 0x0001,
++ GLAMO_CLOCK_MEM_EN_M1CLK = 0x0002,
++ GLAMO_CLOCK_MEM_DG_MOCACLK = 0x0004,
++ GLAMO_CLOCK_MEM_EN_MOCACLK = 0x0008,
++ GLAMO_CLOCK_MEM_RESET = 0x1000,
++ GLAMO_CLOCK_MOCA_RESET = 0x2000,
++};
++
++enum glamo_reg_clock_lcd {
++ GLAMO_CLOCK_LCD_DG_DCLK = 0x0001,
++ GLAMO_CLOCK_LCD_EN_DCLK = 0x0002,
++ GLAMO_CLOCK_LCD_DG_DMCLK = 0x0004,
++ GLAMO_CLOCK_LCD_EN_DMCLK = 0x0008,
++ GLAMO_CLOCK_LCD_EN_DHCLK = 0x0020,
++ GLAMO_CLOCK_LCD_DG_M5CLK = 0x0040,
++ GLAMO_CLOCK_LCD_EN_M5CLK = 0x0080,
++ GLAMO_CLOCK_LCD_RESET = 0x1000,
++};
++
++enum glamo_reg_clock_mmc {
++ GLAMO_CLOCK_MMC_DG_TCLK = 0x0001,
++ GLAMO_CLOCK_MMC_EN_TCLK = 0x0002,
++ GLAMO_CLOCK_MMC_DG_M9CLK = 0x0004,
++ GLAMO_CLOCK_MMC_EN_M9CLK = 0x0008,
++ GLAMO_CLOCK_MMC_RESET = 0x1000,
++};
++
++enum glamo_reg_basic_mmc {
++ /* set to disable CRC error rejection */
++ GLAMO_BASIC_MMC_DISABLE_CRC = 0x0001,
++ /* enable completion interrupt */
++ GLAMO_BASIC_MMC_EN_COMPL_INT = 0x0002,
++ /* stop MMC clock while enforced idle waiting for data from card */
++ GLAMO_BASIC_MMC_NO_CLK_RD_WAIT = 0x0004,
++ /* 0 = 1-bit bus to card, 1 = use 4-bit bus (has to be negotiated) */
++ GLAMO_BASIC_MMC_EN_4BIT_DATA = 0x0008,
++ /* enable 75K pullups on D3..D0 */
++ GLAMO_BASIC_MMC_EN_DATA_PUPS = 0x0010,
++ /* enable 75K pullup on CMD */
++ GLAMO_BASIC_MMC_EN_CMD_PUP = 0x0020,
++ /* IO drive strength 00=weak -> 11=strongest */
++ GLAMO_BASIC_MMC_EN_DR_STR0 = 0x0040,
++ GLAMO_BASIC_MMC_EN_DR_STR1 = 0x0080,
++ /* TCLK delay stage A, 0000 = 500ps --> 1111 = 8ns */
++ GLAMO_BASIC_MMC_EN_TCLK_DLYA0 = 0x0100,
++ GLAMO_BASIC_MMC_EN_TCLK_DLYA1 = 0x0200,
++ GLAMO_BASIC_MMC_EN_TCLK_DLYA2 = 0x0400,
++ GLAMO_BASIC_MMC_EN_TCLK_DLYA3 = 0x0800,
++ /* TCLK delay stage B (cumulative), 0000 = 500ps --> 1111 = 8ns */
++ GLAMO_BASIC_MMC_EN_TCLK_DLYB0 = 0x1000,
++ GLAMO_BASIC_MMC_EN_TCLK_DLYB1 = 0x2000,
++ GLAMO_BASIC_MMC_EN_TCLK_DLYB2 = 0x4000,
++ GLAMO_BASIC_MMC_EN_TCLK_DLYB3 = 0x8000,
++};
++
++enum glamo_reg_stat1_mmc {
++ /* command "counter" (really: toggle) */
++ GLAMO_STAT1_MMC_CMD_CTR = 0x8000,
++ /* engine is idle */
++ GLAMO_STAT1_MMC_IDLE = 0x4000,
++ /* readback response is ready */
++ GLAMO_STAT1_MMC_RB_RRDY = 0x0200,
++ /* readback data is ready */
++ GLAMO_STAT1_MMC_RB_DRDY = 0x0100,
++ /* no response timeout */
++ GLAMO_STAT1_MMC_RTOUT = 0x0020,
++ /* no data timeout */
++ GLAMO_STAT1_MMC_DTOUT = 0x0010,
++ /* CRC error on block write */
++ GLAMO_STAT1_MMC_BWERR = 0x0004,
++ /* CRC error on block read */
++ GLAMO_STAT1_MMC_BRERR = 0x0002
++};
++
++enum glamo_reg_fire_mmc {
++ /* command "counter" (really: toggle)
++ * the STAT1 register reflects this so you can ensure you don't look
++ * at status for previous command
++ */
++ GLAMO_FIRE_MMC_CMD_CTR = 0x8000,
++ /* sets kind of response expected */
++ GLAMO_FIRE_MMC_RES_MASK = 0x0700,
++ /* sets command type */
++ GLAMO_FIRE_MMC_TYP_MASK = 0x00C0,
++ /* sets command class */
++ GLAMO_FIRE_MMC_CLS_MASK = 0x000F,
++};
++
++enum glamo_fire_mmc_response_types {
++ GLAMO_FIRE_MMC_RSPT_R1 = 0x0000,
++ GLAMO_FIRE_MMC_RSPT_R1b = 0x0100,
++ GLAMO_FIRE_MMC_RSPT_R2 = 0x0200,
++ GLAMO_FIRE_MMC_RSPT_R3 = 0x0300,
++ GLAMO_FIRE_MMC_RSPT_R4 = 0x0400,
++ GLAMO_FIRE_MMC_RSPT_R5 = 0x0500,
++};
++
++enum glamo_fire_mmc_command_types {
++ /* broadcast, no response */
++ GLAMO_FIRE_MMC_CMDT_BNR = 0x0000,
++ /* broadcast, with response */
++ GLAMO_FIRE_MMC_CMDT_BR = 0x0040,
++ /* addressed, no data */
++ GLAMO_FIRE_MMC_CMDT_AND = 0x0080,
++ /* addressed, with data */
++ GLAMO_FIRE_MMC_CMDT_AD = 0x00C0,
++};
++
++enum glamo_fire_mmc_command_class {
++ /* "Stream Read" */
++ GLAMO_FIRE_MMC_CC_STRR = 0x0000,
++ /* Single Block Read */
++ GLAMO_FIRE_MMC_CC_SBR = 0x0001,
++ /* Multiple Block Read With Stop */
++ GLAMO_FIRE_MMC_CC_MBRS = 0x0002,
++ /* Multiple Block Read No Stop */
++ GLAMO_FIRE_MMC_CC_MBRNS = 0x0003,
++ /* RESERVED for "Stream Write" */
++ GLAMO_FIRE_MMC_CC_STRW = 0x0004,
++ /* "Stream Write" */
++ GLAMO_FIRE_MMC_CC_SBW = 0x0005,
++ /* RESERVED for Multiple Block Write With Stop */
++ GLAMO_FIRE_MMC_CC_MBWS = 0x0006,
++ /* Multiple Block Write No Stop */
++ GLAMO_FIRE_MMC_CC_MBWNS = 0x0007,
++ /* STOP command */
++ GLAMO_FIRE_MMC_CC_STOP = 0x0008,
++ /* Cancel on Running Command */
++ GLAMO_FIRE_MMC_CC_CANCL = 0x0009,
++ /* "Basic Command" */
++ GLAMO_FIRE_MMC_CC_BASIC = 0x000a,
++};
++
++/* these are offsets from the start of the MMC register region */
++enum glamo_register_mmc {
++ /* MMC command, b15..8 = cmd arg b7..0; b7..1 = CRC; b0 = end bit */
++ GLAMO_REG_MMC_CMD_REG1 = 0x00,
++ /* MMC command, b15..0 = cmd arg b23 .. 8 */
++ GLAMO_REG_MMC_CMD_REG2 = 0x02,
++ /* MMC command, b15=start, b14=transmission,
++ * b13..8=cmd idx, b7..0=cmd arg b31..24
++ */
++ GLAMO_REG_MMC_CMD_REG3 = 0x04,
++ GLAMO_REG_MMC_CMD_FIRE = 0x06,
++ GLAMO_REG_MMC_CMD_RSP1 = 0x10,
++ GLAMO_REG_MMC_CMD_RSP2 = 0x12,
++ GLAMO_REG_MMC_CMD_RSP3 = 0x14,
++ GLAMO_REG_MMC_CMD_RSP4 = 0x16,
++ GLAMO_REG_MMC_CMD_RSP5 = 0x18,
++ GLAMO_REG_MMC_CMD_RSP6 = 0x1a,
++ GLAMO_REG_MMC_CMD_RSP7 = 0x1c,
++ GLAMO_REG_MMC_CMD_RSP8 = 0x1e,
++ GLAMO_REG_MMC_RB_STAT1 = 0x20,
++ GLAMO_REG_MMC_RB_BLKCNT = 0x22,
++ GLAMO_REG_MMC_RB_BLKLEN = 0x24,
++ GLAMO_REG_MMC_BASIC = 0x30,
++ GLAMO_REG_MMC_RDATADS1 = 0x34,
++ GLAMO_REG_MMC_RDATADS2 = 0x36,
++ GLAMO_REG_MMC_WDATADS1 = 0x38,
++ GLAMO_REG_MMC_WDATADS2 = 0x3a,
++ GLAMO_REG_MMC_DATBLKCNT = 0x3c,
++ GLAMO_REG_MMC_DATBLKLEN = 0x3e,
++ GLAMO_REG_MMC_TIMEOUT = 0x40,
++
++};
++
++enum glamo_reg_clock_isp {
++ GLAMO_CLOCK_ISP_DG_I1CLK = 0x0001,
++ GLAMO_CLOCK_ISP_EN_I1CLK = 0x0002,
++ GLAMO_CLOCK_ISP_DG_CCLK = 0x0004,
++ GLAMO_CLOCK_ISP_EN_CCLK = 0x0008,
++ GLAMO_CLOCK_ISP_EN_SCLK = 0x0020,
++ GLAMO_CLOCK_ISP_DG_M2CLK = 0x0040,
++ GLAMO_CLOCK_ISP_EN_M2CLK = 0x0080,
++ GLAMO_CLOCK_ISP_DG_M15CLK = 0x0100,
++ GLAMO_CLOCK_ISP_EN_M15CLK = 0x0200,
++ GLAMO_CLOCK_ISP1_RESET = 0x1000,
++ GLAMO_CLOCK_ISP2_RESET = 0x2000,
++};
++
++enum glamo_reg_clock_jpeg {
++ GLAMO_CLOCK_JPEG_DG_JCLK = 0x0001,
++ GLAMO_CLOCK_JPEG_EN_JCLK = 0x0002,
++ GLAMO_CLOCK_JPEG_DG_M3CLK = 0x0004,
++ GLAMO_CLOCK_JPEG_EN_M3CLK = 0x0008,
++ GLAMO_CLOCK_JPEG_RESET = 0x1000,
++};
++
++enum glamo_reg_clock_2d {
++ GLAMO_CLOCK_2D_DG_GCLK = 0x0001,
++ GLAMO_CLOCK_2D_EN_GCLK = 0x0002,
++ GLAMO_CLOCK_2D_DG_M7CLK = 0x0004,
++ GLAMO_CLOCK_2D_EN_M7CLK = 0x0008,
++ GLAMO_CLOCK_2D_DG_M6CLK = 0x0010,
++ GLAMO_CLOCK_2D_EN_M6CLK = 0x0020,
++ GLAMO_CLOCK_2D_RESET = 0x1000,
++ GLAMO_CLOCK_2D_CQ_RESET = 0x2000,
++};
++
++enum glamo_reg_clock_3d {
++ GLAMO_CLOCK_3D_DG_ECLK = 0x0001,
++ GLAMO_CLOCK_3D_EN_ECLK = 0x0002,
++ GLAMO_CLOCK_3D_DG_RCLK = 0x0004,
++ GLAMO_CLOCK_3D_EN_RCLK = 0x0008,
++ GLAMO_CLOCK_3D_DG_M8CLK = 0x0010,
++ GLAMO_CLOCK_3D_EN_M8CLK = 0x0020,
++ GLAMO_CLOCK_3D_BACK_RESET = 0x1000,
++ GLAMO_CLOCK_3D_FRONT_RESET = 0x2000,
++};
++
++enum glamo_reg_clock_mpeg {
++ GLAMO_CLOCK_MPEG_DG_X0CLK = 0x0001,
++ GLAMO_CLOCK_MPEG_EN_X0CLK = 0x0002,
++ GLAMO_CLOCK_MPEG_DG_X1CLK = 0x0004,
++ GLAMO_CLOCK_MPEG_EN_X1CLK = 0x0008,
++ GLAMO_CLOCK_MPEG_DG_X2CLK = 0x0010,
++ GLAMO_CLOCK_MPEG_EN_X2CLK = 0x0020,
++ GLAMO_CLOCK_MPEG_DG_X3CLK = 0x0040,
++ GLAMO_CLOCK_MPEG_EN_X3CLK = 0x0080,
++ GLAMO_CLOCK_MPEG_DG_X4CLK = 0x0100,
++ GLAMO_CLOCK_MPEG_EN_X4CLK = 0x0200,
++ GLAMO_CLOCK_MPEG_DG_X6CLK = 0x0400,
++ GLAMO_CLOCK_MPEG_EN_X6CLK = 0x0800,
++ GLAMO_CLOCK_MPEG_ENC_RESET = 0x1000,
++ GLAMO_CLOCK_MPEG_DEC_RESET = 0x2000,
++};
++
++enum glamo_reg_clock51 {
++ GLAMO_CLOCK_GEN51_EN_DIV_MCLK = 0x0001,
++ GLAMO_CLOCK_GEN51_EN_DIV_SCLK = 0x0002,
++ GLAMO_CLOCK_GEN51_EN_DIV_JCLK = 0x0004,
++ GLAMO_CLOCK_GEN51_EN_DIV_DCLK = 0x0008,
++ GLAMO_CLOCK_GEN51_EN_DIV_DMCLK = 0x0010,
++ GLAMO_CLOCK_GEN51_EN_DIV_DHCLK = 0x0020,
++ GLAMO_CLOCK_GEN51_EN_DIV_GCLK = 0x0040,
++ GLAMO_CLOCK_GEN51_EN_DIV_TCLK = 0x0080,
++ /* FIXME: higher bits */
++};
++
++enum glamo_reg_hostbus2 {
++ GLAMO_HOSTBUS2_MMIO_EN_ISP = 0x0001,
++ GLAMO_HOSTBUS2_MMIO_EN_JPEG = 0x0002,
++ GLAMO_HOSTBUS2_MMIO_EN_MPEG = 0x0004,
++ GLAMO_HOSTBUS2_MMIO_EN_LCD = 0x0008,
++ GLAMO_HOSTBUS2_MMIO_EN_MMC = 0x0010,
++ GLAMO_HOSTBUS2_MMIO_EN_MICROP0 = 0x0020,
++ GLAMO_HOSTBUS2_MMIO_EN_MICROP1 = 0x0040,
++ GLAMO_HOSTBUS2_MMIO_EN_CQ = 0x0080,
++ GLAMO_HOSTBUS2_MMIO_EN_RISC = 0x0100,
++ GLAMO_HOSTBUS2_MMIO_EN_2D = 0x0200,
++ GLAMO_HOSTBUS2_MMIO_EN_3D = 0x0400,
++};
++
++/* LCD Controller */
++
++#define REG_LCD(x) (x)
++enum glamo_reg_lcd {
++ GLAMO_REG_LCD_MODE1 = REG_LCD(0x00),
++ GLAMO_REG_LCD_MODE2 = REG_LCD(0x02),
++ GLAMO_REG_LCD_MODE3 = REG_LCD(0x04),
++ GLAMO_REG_LCD_WIDTH = REG_LCD(0x06),
++ GLAMO_REG_LCD_HEIGHT = REG_LCD(0x08),
++ GLAMO_REG_LCD_POLARITY = REG_LCD(0x0a),
++ GLAMO_REG_LCD_A_BASE1 = REG_LCD(0x0c),
++ GLAMO_REG_LCD_A_BASE2 = REG_LCD(0x0e),
++ GLAMO_REG_LCD_B_BASE1 = REG_LCD(0x10),
++ GLAMO_REG_LCD_B_BASE2 = REG_LCD(0x12),
++ GLAMO_REG_LCD_C_BASE1 = REG_LCD(0x14),
++ GLAMO_REG_LCD_C_BASE2 = REG_LCD(0x16),
++ GLAMO_REG_LCD_PITCH = REG_LCD(0x18),
++ /* RES */
++ GLAMO_REG_LCD_HORIZ_TOTAL = REG_LCD(0x1c),
++ /* RES */
++ GLAMO_REG_LCD_HORIZ_RETR_START = REG_LCD(0x20),
++ /* RES */
++ GLAMO_REG_LCD_HORIZ_RETR_END = REG_LCD(0x24),
++ /* RES */
++ GLAMO_REG_LCD_HORIZ_DISP_START = REG_LCD(0x28),
++ /* RES */
++ GLAMO_REG_LCD_HORIZ_DISP_END = REG_LCD(0x2c),
++ /* RES */
++ GLAMO_REG_LCD_VERT_TOTAL = REG_LCD(0x30),
++ /* RES */
++ GLAMO_REG_LCD_VERT_RETR_START = REG_LCD(0x34),
++ /* RES */
++ GLAMO_REG_LCD_VERT_RETR_END = REG_LCD(0x38),
++ /* RES */
++ GLAMO_REG_LCD_VERT_DISP_START = REG_LCD(0x3c),
++ /* RES */
++ GLAMO_REG_LCD_VERT_DISP_END = REG_LCD(0x40),
++ /* RES */
++ GLAMO_REG_LCD_POL = REG_LCD(0x44),
++ GLAMO_REG_LCD_DATA_START = REG_LCD(0x46),
++ GLAMO_REG_LCD_FRATE_CONTRO = REG_LCD(0x48),
++ GLAMO_REG_LCD_DATA_CMD_HDR = REG_LCD(0x4a),
++ GLAMO_REG_LCD_SP_START = REG_LCD(0x4c),
++ GLAMO_REG_LCD_SP_END = REG_LCD(0x4e),
++ GLAMO_REG_LCD_CURSOR_BASE1 = REG_LCD(0x50),
++ GLAMO_REG_LCD_CURSOR_BASE2 = REG_LCD(0x52),
++ GLAMO_REG_LCD_CURSOR_PITCH = REG_LCD(0x54),
++ GLAMO_REG_LCD_CURSOR_X_SIZE = REG_LCD(0x56),
++ GLAMO_REG_LCD_CURSOR_Y_SIZE = REG_LCD(0x58),
++ GLAMO_REG_LCD_CURSOR_X_POS = REG_LCD(0x5a),
++ GLAMO_REG_LCD_CURSOR_Y_POS = REG_LCD(0x5c),
++ GLAMO_REG_LCD_CURSOR_PRESET = REG_LCD(0x5e),
++ GLAMO_REG_LCD_CURSOR_FG_COLOR = REG_LCD(0x60),
++ /* RES */
++ GLAMO_REG_LCD_CURSOR_BG_COLOR = REG_LCD(0x64),
++ /* RES */
++ GLAMO_REG_LCD_CURSOR_DST_COLOR = REG_LCD(0x68),
++ /* RES */
++ GLAMO_REG_LCD_STATUS1 = REG_LCD(0x80),
++ GLAMO_REG_LCD_STATUS2 = REG_LCD(0x82),
++ GLAMO_REG_LCD_STATUS3 = REG_LCD(0x84),
++ GLAMO_REG_LCD_STATUS4 = REG_LCD(0x86),
++ /* RES */
++ GLAMO_REG_LCD_COMMAND1 = REG_LCD(0xa0),
++ GLAMO_REG_LCD_COMMAND2 = REG_LCD(0xa2),
++ /* RES */
++ GLAMO_REG_LCD_WFORM_DELAY1 = REG_LCD(0xb0),
++ GLAMO_REG_LCD_WFORM_DELAY2 = REG_LCD(0xb2),
++ /* RES */
++ GLAMO_REG_LCD_GAMMA_CORR = REG_LCD(0x100),
++ /* RES */
++ GLAMO_REG_LCD_GAMMA_R_ENTRY01 = REG_LCD(0x110),
++ GLAMO_REG_LCD_GAMMA_R_ENTRY23 = REG_LCD(0x112),
++ GLAMO_REG_LCD_GAMMA_R_ENTRY45 = REG_LCD(0x114),
++ GLAMO_REG_LCD_GAMMA_R_ENTRY67 = REG_LCD(0x116),
++ GLAMO_REG_LCD_GAMMA_R_ENTRY8 = REG_LCD(0x118),
++ /* RES */
++ GLAMO_REG_LCD_GAMMA_G_ENTRY01 = REG_LCD(0x130),
++ GLAMO_REG_LCD_GAMMA_G_ENTRY23 = REG_LCD(0x132),
++ GLAMO_REG_LCD_GAMMA_G_ENTRY45 = REG_LCD(0x134),
++ GLAMO_REG_LCD_GAMMA_G_ENTRY67 = REG_LCD(0x136),
++ GLAMO_REG_LCD_GAMMA_G_ENTRY8 = REG_LCD(0x138),
++ /* RES */
++ GLAMO_REG_LCD_GAMMA_B_ENTRY01 = REG_LCD(0x150),
++ GLAMO_REG_LCD_GAMMA_B_ENTRY23 = REG_LCD(0x152),
++ GLAMO_REG_LCD_GAMMA_B_ENTRY45 = REG_LCD(0x154),
++ GLAMO_REG_LCD_GAMMA_B_ENTRY67 = REG_LCD(0x156),
++ GLAMO_REG_LCD_GAMMA_B_ENTRY8 = REG_LCD(0x158),
++ /* RES */
++ GLAMO_REG_LCD_SRAM_DRIVING1 = REG_LCD(0x160),
++ GLAMO_REG_LCD_SRAM_DRIVING2 = REG_LCD(0x162),
++ GLAMO_REG_LCD_SRAM_DRIVING3 = REG_LCD(0x164),
++};
++
++enum glamo_reg_lcd_mode1 {
++ GLAMO_LCD_MODE1_PWRSAVE = 0x0001,
++ GLAMO_LCD_MODE1_PARTIAL_PRT = 0x0002,
++ GLAMO_LCD_MODE1_HWFLIP = 0x0004,
++ GLAMO_LCD_MODE1_LCD2 = 0x0008,
++ /* RES */
++ GLAMO_LCD_MODE1_PARTIAL_MODE = 0x0020,
++ GLAMO_LCD_MODE1_CURSOR_DSTCOLOR = 0x0040,
++ GLAMO_LCD_MODE1_PARTIAL_ENABLE = 0x0080,
++ GLAMO_LCD_MODE1_TVCLK_IN_ENABLE = 0x0100,
++ GLAMO_LCD_MODE1_HSYNC_HIGH_ACT = 0x0200,
++ GLAMO_LCD_MODE1_VSYNC_HIGH_ACT = 0x0400,
++ GLAMO_LCD_MODE1_HSYNC_FLIP = 0x0800,
++ GLAMO_LCD_MODE1_GAMMA_COR_EN = 0x1000,
++ GLAMO_LCD_MODE1_DITHER_EN = 0x2000,
++ GLAMO_LCD_MODE1_CURSOR_EN = 0x4000,
++ GLAMO_LCD_MODE1_ROTATE_EN = 0x8000,
++};
++
++enum glamo_reg_lcd_mode2 {
++ GLAMO_LCD_MODE2_CRC_CHECK_EN = 0x0001,
++ GLAMO_LCD_MODE2_DCMD_PER_LINE = 0x0002,
++ GLAMO_LCD_MODE2_NOUSE_BDEF = 0x0004,
++ GLAMO_LCD_MODE2_OUT_POS_MODE = 0x0008,
++ GLAMO_LCD_MODE2_FRATE_CTRL_EN = 0x0010,
++ GLAMO_LCD_MODE2_SINGLE_BUFFER = 0x0020,
++ GLAMO_LCD_MODE2_SER_LSB_TO_MSB = 0x0040,
++ /* FIXME */
++};
++
++enum glamo_reg_lcd_mode3 {
++ /* LCD color source data format */
++ GLAMO_LCD_SRC_RGB565 = 0x0000,
++ GLAMO_LCD_SRC_ARGB1555 = 0x4000,
++ GLAMO_LCD_SRC_ARGB4444 = 0x8000,
++ /* interface type */
++ GLAMO_LCD_MODE3_LCD = 0x1000,
++ GLAMO_LCD_MODE3_RGB = 0x0800,
++ GLAMO_LCD_MODE3_CPU = 0x0000,
++ /* mode */
++ GLAMO_LCD_MODE3_RGB332 = 0x0000,
++ GLAMO_LCD_MODE3_RGB444 = 0x0100,
++ GLAMO_LCD_MODE3_RGB565 = 0x0200,
++ GLAMO_LCD_MODE3_RGB666 = 0x0300,
++ /* depth */
++ GLAMO_LCD_MODE3_6BITS = 0x0000,
++ GLAMO_LCD_MODE3_8BITS = 0x0010,
++ GLAMO_LCD_MODE3_9BITS = 0x0020,
++ GLAMO_LCD_MODE3_16BITS = 0x0030,
++ GLAMO_LCD_MODE3_18BITS = 0x0040,
++};
++
++enum glamo_lcd_rot_mode {
++ GLAMO_LCD_ROT_MODE_0 = 0x0000,
++ GLAMO_LCD_ROT_MODE_180 = 0x2000,
++ GLAMO_LCD_ROT_MODE_MIRROR = 0x4000,
++ GLAMO_LCD_ROT_MODE_FLIP = 0x6000,
++ GLAMO_LCD_ROT_MODE_90 = 0x8000,
++ GLAMO_LCD_ROT_MODE_270 = 0xa000,
++};
++#define GLAMO_LCD_ROT_MODE_MASK 0xe000
++
++enum glamo_lcd_cmd_type {
++ GLAMO_LCD_CMD_TYPE_DISP = 0x0000,
++ GLAMO_LCD_CMD_TYPE_PARALLEL = 0x4000,
++ GLAMO_LCD_CMD_TYPE_SERIAL = 0x8000,
++ GLAMO_LCD_CMD_TYPE_SERIAL_DIRECT = 0xc000,
++};
++#define GLAMO_LCD_CMD_TYPE_MASK 0xc000
++
++enum glamo_lcd_cmds {
++ GLAMO_LCD_CMD_DATA_DISP_FIRE = 0x00,
++ GLAMO_LCD_CMD_DATA_DISP_SYNC = 0x01, /* RGB only */
++ /* switch to command mode, no display */
++ GLAMO_LCD_CMD_DATA_FIRE_NO_DISP = 0x02,
++ /* display until VSYNC, switch to command */
++ GLAMO_LCD_CMD_DATA_FIRE_VSYNC = 0x11,
++ /* display until HSYNC, switch to command */
++ GLAMO_LCD_CMD_DATA_FIRE_HSYNC = 0x12,
++ /* display until VSYNC, 1 black frame, VSYNC, switch to command */
++ GLAMO_LCD_CMD_DATA_FIRE_VSYNC_B = 0x13,
++ /* don't care about display and switch to command */
++ GLAMO_LCD_CMD_DATA_FIRE_FREE = 0x14, /* RGB only */
++ /* don't care about display, keep data display but disable data,
++ * and switch to command */
++ GLAMO_LCD_CMD_DATA_FIRE_FREE_D = 0x15, /* RGB only */
++};
++
++enum glamo_core_revisions {
++ GLAMO_CORE_REV_A0 = 0x0000,
++ GLAMO_CORE_REV_A1 = 0x0001,
++ GLAMO_CORE_REV_A2 = 0x0002,
++ GLAMO_CORE_REV_A3 = 0x0003,
++};
++
++#endif /* _GLAMO_REGS_H */
+diff --git a/include/linux/mfd/glamo.h b/include/linux/mfd/glamo.h
+new file mode 100644
+index 0000000..b8dfaef
+--- /dev/null
++++ b/include/linux/mfd/glamo.h
+@@ -0,0 +1,53 @@
++#ifndef __GLAMO_MFD_H
++#define __GLAMO_MFD_H
++
++struct glamo_core;
++struct glamo_spigpio_platform_data;
++struct glamo_fb_platform_data;
++
++struct glamo_mmc_platform_data {
++ int (*glamo_mmc_use_slow)(void);
++
++ unsigned nonremovable:1;
++
++ struct glamo_core *core;
++};
++
++struct glamo_gpio_platform_data {
++ int base;
++};
++
++struct glamo_platform_data {
++ struct glamo_fb_platform_data *fb_data;
++ struct glamo_mmc_platform_data *mmc_data;
++ struct glamo_gpio_platform_data *gpio_data;
++
++ unsigned int osci_clock_rate;
++
++ void (*glamo_external_reset)(int);
++};
++
++enum glamo_engine {
++ GLAMO_ENGINE_CAPTURE = 0,
++ GLAMO_ENGINE_ISP = 1,
++ GLAMO_ENGINE_JPEG = 2,
++ GLAMO_ENGINE_MPEG_ENC = 3,
++ GLAMO_ENGINE_MPEG_DEC = 4,
++ GLAMO_ENGINE_LCD = 5,
++ GLAMO_ENGINE_CMDQ = 6,
++ GLAMO_ENGINE_2D = 7,
++ GLAMO_ENGINE_3D = 8,
++ GLAMO_ENGINE_MMC = 9,
++ GLAMO_ENGINE_MICROP0 = 10,
++ GLAMO_ENGINE_RISC = 11,
++ GLAMO_ENGINE_MICROP1_MPEG_ENC = 12,
++ GLAMO_ENGINE_MICROP1_MPEG_DEC = 13,
++#if 0
++ GLAMO_ENGINE_H264_DEC = 14,
++ GLAMO_ENGINE_RISC1 = 15,
++ GLAMO_ENGINE_SPI = 16,
++#endif
++ __NUM_GLAMO_ENGINES
++};
++
++#endif
+diff --git a/include/linux/mfd/pcf50633/core.h b/include/linux/mfd/pcf50633/core.h
+index 50d4a04..bec3cb7 100644
+--- a/include/linux/mfd/pcf50633/core.h
++++ b/include/linux/mfd/pcf50633/core.h
+@@ -1,4 +1,5 @@
+ /*
++
+ * core.h -- Core driver for NXP PCF50633
+ *
+ * (C) 2006-2008 by Openmoko, Inc.
+@@ -14,7 +15,6 @@
+ #define __LINUX_MFD_PCF50633_CORE_H
+
+ #include <linux/i2c.h>
+-#include <linux/workqueue.h>
+ #include <linux/regulator/driver.h>
+ #include <linux/regulator/machine.h>
+ #include <linux/power_supply.h>
+@@ -46,21 +46,10 @@ struct pcf50633_platform_data {
+ u8 resumers[5];
+
+ struct pcf50633_bl_platform_data *backlight_data;
+-};
+
+-struct pcf50633_irq {
+- void (*handler) (int, void *);
+- void *data;
++ int gpio_base;
+ };
+
+-int pcf50633_register_irq(struct pcf50633 *pcf, int irq,
+- void (*handler) (int, void *), void *data);
+-int pcf50633_free_irq(struct pcf50633 *pcf, int irq);
+-
+-int pcf50633_irq_mask(struct pcf50633 *pcf, int irq);
+-int pcf50633_irq_unmask(struct pcf50633 *pcf, int irq);
+-int pcf50633_irq_mask_get(struct pcf50633 *pcf, int irq);
+-
+ int pcf50633_read_block(struct pcf50633 *, u8 reg,
+ int nr_regs, u8 *data);
+ int pcf50633_write_block(struct pcf50633 *pcf, u8 reg,
+@@ -138,12 +127,11 @@ struct pcf50633 {
+
+ struct pcf50633_platform_data *pdata;
+ int irq;
+- struct pcf50633_irq irq_handler[PCF50633_NUM_IRQ];
+- struct work_struct irq_work;
+- struct workqueue_struct *work_queue;
+ struct mutex lock;
++ struct mutex irq_lock;
+
+ u8 mask_regs[5];
++ u8 mask_regs_cur[5];
+
+ u8 suspend_irq_masks[5];
+ u8 resume_reason[5];
+@@ -151,12 +139,11 @@ struct pcf50633 {
+
+ int onkey1s_held;
+
+- struct platform_device *rtc_pdev;
+- struct platform_device *mbc_pdev;
+- struct platform_device *adc_pdev;
+- struct platform_device *input_pdev;
+- struct platform_device *bl_pdev;
+- struct platform_device *regulator_pdev[PCF50633_NUM_REGULATORS];
++ unsigned int irq_base;
++
++ struct pcf50633_mbc *mbc;
++ struct pcf50633_adc *adc;
++ struct pcf50633_bl *bl;
+ };
+
+ enum pcf50633_reg_int1 {
+diff --git a/include/linux/mfd/pcf50633/gpio.h b/include/linux/mfd/pcf50633/gpio.h
+index a42b845..af2c341 100644
+--- a/include/linux/mfd/pcf50633/gpio.h
++++ b/include/linux/mfd/pcf50633/gpio.h
+@@ -15,37 +15,40 @@
+
+ #include <linux/mfd/pcf50633/core.h>
+
+-#define PCF50633_GPIO1 1
+-#define PCF50633_GPIO2 2
+-#define PCF50633_GPIO3 3
+-#define PCF50633_GPO 4
+-
+-#define PCF50633_REG_GPIO1CFG 0x14
+-#define PCF50633_REG_GPIO2CFG 0x15
+-#define PCF50633_REG_GPIO3CFG 0x16
+-#define PCF50633_REG_GPOCFG 0x17
+-
+-#define PCF50633_GPOCFG_GPOSEL_MASK 0x07
+-
+-enum pcf50633_reg_gpocfg {
+- PCF50633_GPOCFG_GPOSEL_0 = 0x00,
+- PCF50633_GPOCFG_GPOSEL_LED_NFET = 0x01,
+- PCF50633_GPOCFG_GPOSEL_SYSxOK = 0x02,
+- PCF50633_GPOCFG_GPOSEL_CLK32K = 0x03,
+- PCF50633_GPOCFG_GPOSEL_ADAPUSB = 0x04,
+- PCF50633_GPOCFG_GPOSEL_USBxOK = 0x05,
+- PCF50633_GPOCFG_GPOSEL_ACTPH4 = 0x06,
+- PCF50633_GPOCFG_GPOSEL_1 = 0x07,
+- PCF50633_GPOCFG_GPOSEL_INVERSE = 0x08,
++#define PCF50633_GPIO1 0
++#define PCF50633_GPIO2 1
++#define PCF50633_GPIO3 2
++#define PCF50633_GPO 3
++
++#define PCF50633_REG_GPIOCFG(x) (0x14 + (x))
++
++enum pcf50633_gpio_config {
++ PCF50633_GPIO_CONFIG_OUTPUT = 0x0,
++ PCF50633_GPIO_CONFIG_SYSxOK = 0x2,
++ PCF50633_GPIO_CONFIG_CHARGING = 0x3,
++ PCF50633_GPIO_CONFIG_MOBILE_MODE = 0x4,
++ PCF50633_GPIO_CONFIG_USBxOK = 0x5,
++ PCF50633_GPIO_CONFIG_ACTPH = 0x6,
++ PCF50633_GPIO_CONFIG_INPUT = 0x7,
++
++ PCF50633_GPIO_CONFIG_INVERT = 0x8,
++
++ PCF50633_GPO_CONFIG_OUTPUT = 0x0,
++ PCF50633_GPO_CONFIG_LED_NFET = 0x1,
++ PCF50633_GPO_CONFIG_SYSxOK = 0x2,
++ PCF50633_GPO_CONFIG_CLK32K = 0x3,
++ PCF50633_GPO_CONFIG_MOBILE_MODE = 0x4,
++ PCF50633_GPO_CONFIG_USBxOK = 0x5,
++ PCF50633_GPO_CONFIG_ACTPH = 0x6,
++ PCF50633_GPO_CONFIG_INPUT = 0x7,
++
++ PCF50633_GPO_CONFIG_INVERT = 0x8,
+ };
+
+-int pcf50633_gpio_set(struct pcf50633 *pcf, int gpio, u8 val);
+-u8 pcf50633_gpio_get(struct pcf50633 *pcf, int gpio);
++int pcf50633_gpio_set_config(struct pcf50633 *pcf, unsigned gpio,
++ enum pcf50633_gpio_config config);
+
+-int pcf50633_gpio_invert_set(struct pcf50633 *, int gpio, int invert);
+-int pcf50633_gpio_invert_get(struct pcf50633 *pcf, int gpio);
+-
+-int pcf50633_gpio_power_supply_set(struct pcf50633 *,
++int pcf50633_gpio_power_supply_set(struct pcf50633 *pcf,
+ int gpio, int regulator, int on);
+ #endif /* __LINUX_MFD_PCF50633_GPIO_H */
+
+diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h
+index 07f27af..5bbfb71 100644
+--- a/include/linux/mmc/core.h
++++ b/include/linux/mmc/core.h
+@@ -117,6 +117,7 @@ struct mmc_data {
+
+ unsigned int sg_len; /* size of scatter list */
+ struct scatterlist *sg; /* I/O scatter list */
++ s32 host_cookie; /* host private data */
+ };
+
+ struct mmc_request {
+@@ -124,13 +125,19 @@ struct mmc_request {
+ struct mmc_data *data;
+ struct mmc_command *stop;
+
+- void *done_data; /* completion data */
++ struct completion completion;
+ void (*done)(struct mmc_request *);/* completion function */
+ };
+
+ struct mmc_host;
+ struct mmc_card;
+
++extern void mmc_pre_req(struct mmc_host *host, struct mmc_request *mrq,
++ bool is_first_req);
++extern void mmc_post_req(struct mmc_host *host, struct mmc_request *mrq,
++ int err);
++extern void mmc_start_req(struct mmc_host *host, struct mmc_request *mrq);
++extern void mmc_wait_for_req_done(struct mmc_request *mrq);
+ extern void mmc_wait_for_req(struct mmc_host *, struct mmc_request *);
+ extern int mmc_wait_for_cmd(struct mmc_host *, struct mmc_command *, int);
+ extern int mmc_wait_for_app_cmd(struct mmc_host *, struct mmc_card *,
+diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
+index bcb793e..8b2b44b 100644
+--- a/include/linux/mmc/host.h
++++ b/include/linux/mmc/host.h
+@@ -88,6 +88,15 @@ struct mmc_host_ops {
+ */
+ int (*enable)(struct mmc_host *host);
+ int (*disable)(struct mmc_host *host, int lazy);
++ /*
++ * It is optional for the host to implement pre_req and post_req in
++ * order to support double buffering of requests (prepare one
++ * request while another request is active).
++ */
++ void (*post_req)(struct mmc_host *host, struct mmc_request *req,
++ int err);
++ void (*pre_req)(struct mmc_host *host, struct mmc_request *req,
++ bool is_first_req);
+ void (*request)(struct mmc_host *host, struct mmc_request *req);
+ /*
+ * Avoid calling these three functions too often or in a "fast path",
+@@ -242,7 +251,9 @@ struct mmc_host {
+ #endif
+
+ struct dentry *debugfs_root;
+-
++#ifdef CONFIG_FAIL_MMC_REQUEST
++ u8 make_it_fail;
++#endif
+ unsigned long private[0] ____cacheline_aligned;
+ };
+
+diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h
+index a36ab3b..c2bb43b 100644
+--- a/include/linux/mmc/sdio_ids.h
++++ b/include/linux/mmc/sdio_ids.h
+@@ -44,4 +44,9 @@
+ #define SDIO_DEVICE_ID_SIANO_NOVA_A0 0x1100
+ #define SDIO_DEVICE_ID_SIANO_STELLAR 0x5347
+
++#define SDIO_DEVICE_ID_MARVELL_88W8688 0x9104
++#define SDIO_VENDOR_ID_ATHEROS 0x0271
++#define SDIO_DEVICE_ID_ATHEROS_AR6001 0x0100
++#define SDIO_DEVICE_ID_ATHEROS_AR6002 0x0200
++
+ #endif
+diff --git a/include/linux/platform_battery.h b/include/linux/platform_battery.h
+new file mode 100644
+index 0000000..00f7651
+--- /dev/null
++++ b/include/linux/platform_battery.h
+@@ -0,0 +1,12 @@
++#ifndef __PLATFORM_BATTERY_H__
++#define __PLATFORM_BATTERY_H__
++
++struct platform_bat_platform_data {
++ const char *name;
++ int (**get_property)(void);
++ int (*is_present)(void);
++ enum power_supply_property *properties;
++ size_t num_properties;
++};
++
++#endif
+diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
+index c768bcd..330fc70 100644
+--- a/lib/Kconfig.debug
++++ b/lib/Kconfig.debug
+@@ -1057,6 +1057,17 @@ config FAIL_IO_TIMEOUT
+ Only works with drivers that use the generic timeout handling,
+ for others it wont do anything.
+
++config FAIL_MMC_REQUEST
++ bool "Fault-injection capability for MMC IO"
++ select DEBUG_FS
++ depends on FAULT_INJECTION
++ help
++ Provide fault-injection capability for MMC IO.
++ This will make the mmc core return data errors. This is
++ useful for testing the error handling in the mmc block device
++ and how the mmc host driver handle retries from
++ the block device.
++
+ config FAULT_INJECTION_DEBUG_FS
+ bool "Debugfs entries for fault-injection capabilities"
+ depends on FAULT_INJECTION && SYSFS && DEBUG_FS
+diff --git a/sound/soc/samsung/neo1973_wm8753.c b/sound/soc/samsung/neo1973_wm8753.c
+index 4522309..4f845fe 100644
+--- a/sound/soc/samsung/neo1973_wm8753.c
++++ b/sound/soc/samsung/neo1973_wm8753.c
+@@ -27,6 +27,9 @@
+ #include "../codecs/wm8753.h"
+ #include "s3c24xx-i2s.h"
+
++/* HACK */
++#define machine_is_neo1973_gta01() (0)
++
+ static int neo1973_hifi_hw_params(struct snd_pcm_substream *substream,
+ struct snd_pcm_hw_params *params)
+ {
diff --git a/recipes-kernel/linux/linux-2.6.39/poodle/defconfig b/recipes-kernel/linux/linux-2.6.39/poodle/defconfig
new file mode 100644
index 0000000..0f5bdad
--- /dev/null
+++ b/recipes-kernel/linux/linux-2.6.39/poodle/defconfig
@@ -0,0 +1,379 @@
+CONFIG_EXPERIMENTAL=y
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_IKCONFIG=m
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_LZO=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_EMBEDDED=y
+CONFIG_SLOB=y
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_LBDAF is not set
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+CONFIG_ARCH_PXA=y
+CONFIG_PXA_SHARPSL=y
+CONFIG_MACH_POODLE=y
+CONFIG_PCCARD=y
+CONFIG_PCMCIA_PXA2XX=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_AEABI=y
+# CONFIG_OABI_COMPAT is not set
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 fbcon=rotate:1 quiet"
+CONFIG_KEXEC=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_BINFMT_AOUT=m
+CONFIG_BINFMT_MISC=m
+CONFIG_PM_RUNTIME=y
+CONFIG_APM_EMULATION=y
+CONFIG_NET=y
+CONFIG_PACKET=m
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=m
+CONFIG_INET=y
+CONFIG_INET_XFRM_MODE_TRANSPORT=m
+CONFIG_INET_XFRM_MODE_TUNNEL=m
+CONFIG_INET_XFRM_MODE_BEET=m
+# CONFIG_INET_LRO is not set
+CONFIG_INET_DIAG=m
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_IPV6_TUNNEL=m
+CONFIG_NETFILTER=y
+CONFIG_NF_CONNTRACK=m
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_H323=m
+CONFIG_NF_CONNTRACK_IRC=m
+CONFIG_NF_CONNTRACK_SIP=m
+CONFIG_NF_CONNTRACK_IPV4=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_NF_NAT=m
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_TTL=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+CONFIG_IRDA=m
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
+CONFIG_IRCOMM=m
+CONFIG_PXA_FICP=m
+CONFIG_BT=m
+CONFIG_BT_L2CAP=y
+CONFIG_BT_SCO=y
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+CONFIG_BT_HCIBTUSB=m
+CONFIG_BT_HCIBTSDIO=m
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIUART_ATH3K=y
+CONFIG_BT_HCIUART_LL=y
+CONFIG_BT_HCIBCM203X=m
+CONFIG_BT_HCIBPA10X=m
+CONFIG_BT_HCIBFUSB=m
+CONFIG_BT_HCIDTL1=m
+CONFIG_BT_HCIBT3C=m
+CONFIG_BT_HCIBLUECARD=m
+CONFIG_BT_HCIBTUART=m
+CONFIG_BT_HCIVHCI=m
+CONFIG_BT_MRVL=m
+CONFIG_BT_MRVL_SDIO=m
+CONFIG_BT_ATH3K=m
+CONFIG_CFG80211=m
+# CONFIG_CFG80211_DEFAULT_PS is not set
+CONFIG_MAC80211=m
+# CONFIG_MAC80211_RC_MINSTREL is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_MTD=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_ROM=y
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_VERIFY_WRITE=y
+CONFIG_MTD_NAND_SHARPSL=y
+CONFIG_MTD_UBI=y
+CONFIG_MTD_UBI_GLUEBI=m
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_MISC_DEVICES=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_BLK_DEV_SR=m
+CONFIG_CHR_DEV_SG=m
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_ATA=y
+CONFIG_PATA_PXA=y
+CONFIG_PATA_PCMCIA=y
+CONFIG_NETDEVICES=y
+CONFIG_TUN=m
+CONFIG_NET_ETHERNET=y
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+CONFIG_AIRO_CS=m
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_FIRMWARE=y
+CONFIG_HOSTAP_CS=m
+CONFIG_USB_CATC=m
+CONFIG_USB_KAWETH=m
+CONFIG_USB_PEGASUS=m
+CONFIG_USB_RTL8150=m
+CONFIG_USB_USBNET=m
+CONFIG_USB_NET_DM9601=m
+# CONFIG_USB_NET_CDC_SUBSET is not set
+CONFIG_USB_SIERRA_NET=m
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PPP=m
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=240
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320
+CONFIG_INPUT_EVDEV=y
+CONFIG_INPUT_APMPOWER=y
+# CONFIG_KEYBOARD_ATKBD is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_KEYBOARD_LOCOMO=y
+# CONFIG_INPUT_MOUSE is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_ADS7846=y
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+# CONFIG_SERIO is not set
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_RAMOOPS=y
+CONFIG_I2C=y
+CONFIG_I2C_PXA=y
+CONFIG_SPI=y
+CONFIG_SPI_PXA2XX=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_POWER_SUPPLY=y
+CONFIG_POWER_SUPPLY_DEBUG=y
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+CONFIG_SENSORS_MAX1111=y
+CONFIG_FB=y
+CONFIG_FB_PXA=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+# CONFIG_BACKLIGHT_GENERIC is not set
+CONFIG_DISPLAY_SUPPORT=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+CONFIG_SOUND=m
+CONFIG_SND=m
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_PXA2XX_AC97=m
+CONFIG_SND_USB_AUDIO=m
+CONFIG_SND_SOC=m
+CONFIG_SND_PXA2XX_SOC=m
+CONFIG_SND_PXA2XX_SOC_POODLE=m
+CONFIG_HID=m
+CONFIG_USB_KBD=m
+CONFIG_USB_MOUSE=m
+CONFIG_USB=m
+CONFIG_USB_DEBUG=y
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+CONFIG_USB_DEVICEFS=y
+CONFIG_USB_OTG_WHITELIST=y
+CONFIG_USB_MON=m
+CONFIG_USB_SL811_HCD=m
+CONFIG_USB_SL811_CS=m
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
+CONFIG_USB_STORAGE=m
+CONFIG_USB_MDC800=m
+CONFIG_USB_MICROTEK=m
+CONFIG_USB_SERIAL=m
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_BELKIN=m
+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
+CONFIG_USB_SERIAL_CYPRESS_M8=m
+CONFIG_USB_SERIAL_EMPEG=m
+CONFIG_USB_SERIAL_FTDI_SIO=m
+CONFIG_USB_SERIAL_VISOR=m
+CONFIG_USB_SERIAL_IPAQ=m
+CONFIG_USB_SERIAL_IR=m
+CONFIG_USB_SERIAL_EDGEPORT=m
+CONFIG_USB_SERIAL_EDGEPORT_TI=m
+CONFIG_USB_SERIAL_GARMIN=m
+CONFIG_USB_SERIAL_IPW=m
+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
+CONFIG_USB_SERIAL_KEYSPAN=m
+CONFIG_USB_SERIAL_KLSI=m
+CONFIG_USB_SERIAL_KOBIL_SCT=m
+CONFIG_USB_SERIAL_MCT_U232=m
+CONFIG_USB_SERIAL_PL2303=m
+CONFIG_USB_SERIAL_SAFE=m
+CONFIG_USB_SERIAL_TI=m
+CONFIG_USB_SERIAL_CYBERJACK=m
+CONFIG_USB_SERIAL_XIRCOM=m
+CONFIG_USB_SERIAL_OMNINET=m
+CONFIG_USB_EMI62=m
+CONFIG_USB_EMI26=m
+CONFIG_USB_RIO500=m
+CONFIG_USB_LEGOTOWER=m
+CONFIG_USB_LCD=m
+CONFIG_USB_LED=m
+CONFIG_USB_CYTHERM=m
+CONFIG_USB_IDMOUSE=m
+CONFIG_USB_GADGET=m
+CONFIG_USB_GADGET_DEBUG_FILES=y
+CONFIG_USB_GADGET_DEBUG_FS=y
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_EEM=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+CONFIG_USB_MASS_STORAGE=m
+CONFIG_USB_G_SERIAL=m
+CONFIG_USB_CDC_COMPOSITE=m
+CONFIG_USB_G_MULTI=m
+CONFIG_USB_G_MULTI_CDC=y
+CONFIG_USB_GPIO_VBUS=m
+CONFIG_USB_ULPI=y
+CONFIG_NOP_USB_XCEIV=m
+CONFIG_MMC=y
+CONFIG_MMC_UNSAFE_RESUME=y
+CONFIG_MMC_PXA=y
+CONFIG_MMC_SPI=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_LOCOMO=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_RTC_CLASS=m
+CONFIG_RTC_DRV_SA1100=m
+CONFIG_RTC_DRV_PXA=m
+CONFIG_EXT2_FS=y
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+# CONFIG_EXT3_FS_XATTR is not set
+CONFIG_EXT4_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_SUMMARY=y
+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+CONFIG_JFFS2_LZO=y
+CONFIG_JFFS2_RUBIN=y
+CONFIG_UBIFS_FS=y
+CONFIG_UBIFS_FS_ADVANCED_COMPR=y
+CONFIG_CRAMFS=m
+CONFIG_NFS_FS=m
+CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V4=y
+CONFIG_CIFS=m
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_NLS_DEFAULT="cp437"
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=m
+CONFIG_NLS_CODEPAGE_775=m
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_852=m
+CONFIG_NLS_CODEPAGE_855=m
+CONFIG_NLS_CODEPAGE_857=m
+CONFIG_NLS_CODEPAGE_860=m
+CONFIG_NLS_CODEPAGE_861=m
+CONFIG_NLS_CODEPAGE_862=m
+CONFIG_NLS_CODEPAGE_863=m
+CONFIG_NLS_CODEPAGE_864=m
+CONFIG_NLS_CODEPAGE_865=m
+CONFIG_NLS_CODEPAGE_866=m
+CONFIG_NLS_CODEPAGE_869=m
+CONFIG_NLS_CODEPAGE_936=m
+CONFIG_NLS_CODEPAGE_950=m
+CONFIG_NLS_CODEPAGE_932=m
+CONFIG_NLS_CODEPAGE_949=m
+CONFIG_NLS_CODEPAGE_874=m
+CONFIG_NLS_ISO8859_8=m
+CONFIG_NLS_CODEPAGE_1250=m
+CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+CONFIG_NLS_KOI8_R=m
+CONFIG_NLS_KOI8_U=m
+CONFIG_NLS_UTF8=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_FS=y
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_TEST=m
+CONFIG_CRYPTO_PCBC=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_CAMELLIA=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_TWOFISH=m
+# CONFIG_CRYPTO_HW is not set
+CONFIG_CRC_CCITT=y
+CONFIG_LIBCRC32C=m
diff --git a/recipes-kernel/linux/linux-2.6.39/shr.patch b/recipes-kernel/linux/linux-2.6.39/shr.patch
new file mode 100644
index 0000000..330cbf7
--- /dev/null
+++ b/recipes-kernel/linux/linux-2.6.39/shr.patch
@@ -0,0 +1,2021 @@
+All patches from shr kernel repository
+rebased on top of openmoko kernel repository
+
+https://gitorious.org/shr/linux/commits/shr-2.6.39-nodrm
+
+efd94d3 nand/s3c2410: add mising badblocksbits value
+56885e2 glamo-mci: revert changes for Per's patchset
+6ab40bf Revert "mmc: add none blocking mmc request function"
+7937634 Revert "mmc: mmc_test: add debugfs file to list all tests"
+cf10e4d Revert "mmc: mmc_test: add test for none blocking transfers"
+29cd7b4 Revert "mmc: add member in mmc queue struct to hold request data"
+8f94eec Revert "mmc: add a block request prepare function"
+eae71b0 Revert "mmc: move error code in mmc_block_issue_rw_rq to a separate function."
+1062d7c Revert "mmc: add a second mmc queue request member"
+e0b2a74 Revert "mmc: add handling for two parallel block requests in issue_rw_rq"
+b59a013 Revert "mmc: test: add random fault injection in core.c"
+
+diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
+index 4b530ae..61d233a 100644
+--- a/drivers/mmc/card/block.c
++++ b/drivers/mmc/card/block.c
+@@ -79,13 +79,6 @@ struct mmc_blk_data {
+
+ static DEFINE_MUTEX(open_lock);
+
+-enum mmc_blk_status {
+- MMC_BLK_SUCCESS = 0,
+- MMC_BLK_RETRY,
+- MMC_BLK_DATA_ERR,
+- MMC_BLK_CMD_ERR,
+-};
+-
+ module_param(perdev_minors, int, 0444);
+ MODULE_PARM_DESC(perdev_minors, "Minors numbers to allocate per device");
+
+@@ -172,6 +165,13 @@ static const struct block_device_operations mmc_bdops = {
+ .owner = THIS_MODULE,
+ };
+
++struct mmc_blk_request {
++ struct mmc_request mrq;
++ struct mmc_command cmd;
++ struct mmc_command stop;
++ struct mmc_data data;
++};
++
+ static u32 mmc_sd_num_wr_blocks(struct mmc_card *card)
+ {
+ int err;
+@@ -331,341 +331,200 @@ out:
+ return err ? 0 : 1;
+ }
+
+-static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq,
+- struct mmc_card *card,
+- int disable_multi,
+- struct mmc_queue *mq)
++static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *req)
+ {
+- u32 readcmd, writecmd;
+- struct mmc_blk_request *brq = &mqrq->brq;
+- struct request *req = mqrq->req;
+-
+- memset(brq, 0, sizeof(struct mmc_blk_request));
+-
+- brq->mrq.cmd = &brq->cmd;
+- brq->mrq.data = &brq->data;
+-
+- brq->cmd.arg = blk_rq_pos(req);
+- if (!mmc_card_blockaddr(card))
+- brq->cmd.arg <<= 9;
+- brq->cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC;
+- brq->data.blksz = 512;
+- brq->stop.opcode = MMC_STOP_TRANSMISSION;
+- brq->stop.arg = 0;
+- brq->stop.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC;
+- brq->data.blocks = blk_rq_sectors(req);
++ struct mmc_blk_data *md = mq->data;
++ struct mmc_card *card = md->queue.card;
++ struct mmc_blk_request brq;
++ int ret = 1, disable_multi = 0;
+
+- /*
+- * The block layer doesn't support all sector count
+- * restrictions, so we need to be prepared for too big
+- * requests.
+- */
+- if (brq->data.blocks > card->host->max_blk_count)
+- brq->data.blocks = card->host->max_blk_count;
++ mmc_claim_host(card->host);
+
+- /*
+- * After a read error, we redo the request one sector at a time
+- * in order to accurately determine which sectors can be read
+- * successfully.
+- */
+- if (disable_multi && brq->data.blocks > 1)
+- brq->data.blocks = 1;
++ do {
++ struct mmc_command cmd;
++ u32 readcmd, writecmd, status = 0;
++
++ memset(&brq, 0, sizeof(struct mmc_blk_request));
++ brq.mrq.cmd = &brq.cmd;
++ brq.mrq.data = &brq.data;
++
++ brq.cmd.arg = blk_rq_pos(req);
++ if (!mmc_card_blockaddr(card))
++ brq.cmd.arg <<= 9;
++ brq.cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC;
++ brq.data.blksz = 512;
++ brq.stop.opcode = MMC_STOP_TRANSMISSION;
++ brq.stop.arg = 0;
++ brq.stop.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC;
++ brq.data.blocks = blk_rq_sectors(req);
+
+- if (brq->data.blocks > 1) {
+- /* SPI multiblock writes terminate using a special
+- * token, not a STOP_TRANSMISSION request.
++ /*
++ * The block layer doesn't support all sector count
++ * restrictions, so we need to be prepared for too big
++ * requests.
+ */
+- if (!mmc_host_is_spi(card->host)
+- || rq_data_dir(req) == READ)
+- brq->mrq.stop = &brq->stop;
+- readcmd = MMC_READ_MULTIPLE_BLOCK;
+- writecmd = MMC_WRITE_MULTIPLE_BLOCK;
+- } else {
+- brq->mrq.stop = NULL;
+- readcmd = MMC_READ_SINGLE_BLOCK;
+- writecmd = MMC_WRITE_BLOCK;
+- }
+- if (rq_data_dir(req) == READ) {
+- brq->cmd.opcode = readcmd;
+- brq->data.flags |= MMC_DATA_READ;
+- } else {
+- brq->cmd.opcode = writecmd;
+- brq->data.flags |= MMC_DATA_WRITE;
+- }
+-
+- mmc_set_data_timeout(&brq->data, card);
++ if (brq.data.blocks > card->host->max_blk_count)
++ brq.data.blocks = card->host->max_blk_count;
+
+- brq->data.sg = mqrq->sg;
+- brq->data.sg_len = mmc_queue_map_sg(mq, mqrq);
++ /*
++ * After a read error, we redo the request one sector at a time
++ * in order to accurately determine which sectors can be read
++ * successfully.
++ */
++ if (disable_multi && brq.data.blocks > 1)
++ brq.data.blocks = 1;
+
+- /*
+- * Adjust the sg list so it is the same size as the
+- * request.
+- */
+- if (brq->data.blocks != blk_rq_sectors(req)) {
+- int i, data_size = brq->data.blocks << 9;
+- struct scatterlist *sg;
+-
+- for_each_sg(brq->data.sg, sg, brq->data.sg_len, i) {
+- data_size -= sg->length;
+- if (data_size <= 0) {
+- sg->length += data_size;
+- i++;
+- break;
+- }
++ if (brq.data.blocks > 1) {
++ /* SPI multiblock writes terminate using a special
++ * token, not a STOP_TRANSMISSION request.
++ */
++ if (!mmc_host_is_spi(card->host)
++ || rq_data_dir(req) == READ)
++ brq.mrq.stop = &brq.stop;
++ readcmd = MMC_READ_MULTIPLE_BLOCK;
++ writecmd = MMC_WRITE_MULTIPLE_BLOCK;
++ } else {
++ brq.mrq.stop = NULL;
++ readcmd = MMC_READ_SINGLE_BLOCK;
++ writecmd = MMC_WRITE_BLOCK;
+ }
+- brq->data.sg_len = i;
+- }
+-
+- mmc_queue_bounce_pre(mqrq);
+-}
+-
+-static enum mmc_blk_status mmc_blk_get_status(struct mmc_blk_request *brq,
+- struct request *req,
+- struct mmc_card *card,
+- struct mmc_blk_data *md)
+-{
+- struct mmc_command cmd;
+- u32 status;
+- enum mmc_blk_status ret = MMC_BLK_SUCCESS;
+-
+- /*
+- * Check for errors here, but don't jump to cmd_err
+- * until later as we need to wait for the card to leave
+- * programming mode even when things go wrong.
+- */
+- if (brq->cmd.error || brq->data.error || brq->stop.error) {
+- if (brq->data.blocks > 1 && rq_data_dir(req) == READ) {
+- /* Redo read one sector at a time */
+- printk(KERN_WARNING "%s: retrying using single "
+- "block read, brq %p\n",
+- req->rq_disk->disk_name, brq);
+- ret = MMC_BLK_RETRY;
+- goto out;
++ if (rq_data_dir(req) == READ) {
++ brq.cmd.opcode = readcmd;
++ brq.data.flags |= MMC_DATA_READ;
++ } else {
++ brq.cmd.opcode = writecmd;
++ brq.data.flags |= MMC_DATA_WRITE;
+ }
+- status = get_card_status(card, req);
+- }
+
+- if (brq->cmd.error) {
+- printk(KERN_ERR "%s: error %d sending read/write "
+- "command, response %#x, card status %#x\n",
+- req->rq_disk->disk_name, brq->cmd.error,
+- brq->cmd.resp[0], status);
+- }
+-
+- if (brq->data.error) {
+- if (brq->data.error == -ETIMEDOUT && brq->mrq.stop)
+- /* 'Stop' response contains card status */
+- status = brq->mrq.stop->resp[0];
+- printk(KERN_ERR "%s: error %d transferring data,"
+- " sector %u, nr %u, card status %#x\n",
+- req->rq_disk->disk_name, brq->data.error,
+- (unsigned)blk_rq_pos(req),
+- (unsigned)blk_rq_sectors(req), status);
+- }
++ mmc_set_data_timeout(&brq.data, card);
+
+- if (brq->stop.error) {
+- printk(KERN_ERR "%s: error %d sending stop command, "
+- "response %#x, card status %#x\n",
+- req->rq_disk->disk_name, brq->stop.error,
+- brq->stop.resp[0], status);
+- }
++ brq.data.sg = mq->sg;
++ brq.data.sg_len = mmc_queue_map_sg(mq);
+
+- if (!mmc_host_is_spi(card->host) && rq_data_dir(req) != READ) {
+- do {
+- int err;
+-
+- cmd.opcode = MMC_SEND_STATUS;
+- cmd.arg = card->rca << 16;
+- cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
+- err = mmc_wait_for_cmd(card->host, &cmd, 5);
+- if (err) {
+- printk(KERN_ERR "%s: error %d requesting status\n",
+- req->rq_disk->disk_name, err);
+- ret = MMC_BLK_CMD_ERR;
+- goto out;
++ /*
++ * Adjust the sg list so it is the same size as the
++ * request.
++ */
++ if (brq.data.blocks != blk_rq_sectors(req)) {
++ int i, data_size = brq.data.blocks << 9;
++ struct scatterlist *sg;
++
++ for_each_sg(brq.data.sg, sg, brq.data.sg_len, i) {
++ data_size -= sg->length;
++ if (data_size <= 0) {
++ sg->length += data_size;
++ i++;
++ break;
++ }
+ }
+- /*
+- * Some cards mishandle the status bits,
+- * so make sure to check both the busy
+- * indication and the card state.
+- */
+- } while (!(cmd.resp[0] & R1_READY_FOR_DATA) ||
+- (R1_CURRENT_STATE(cmd.resp[0]) == 7));
+-
+-#if 0
+- if (cmd.resp[0] & ~0x00000900)
+- printk(KERN_ERR "%s: status = %08x\n",
+- req->rq_disk->disk_name, cmd.resp[0]);
+- if (mmc_decode_status(cmd.resp)) {
+- ret = MMC_BLK_CMD_ERR;
+- goto out;
++ brq.data.sg_len = i;
+ }
+
+-#endif
+- }
++ mmc_queue_bounce_pre(mq);
+
+- if (brq->cmd.error || brq->stop.error || brq->data.error) {
+- if (rq_data_dir(req) == READ)
+- ret = MMC_BLK_DATA_ERR;
+- else
+- ret = MMC_BLK_CMD_ERR;
+- }
+- out:
+- return ret;
++ mmc_wait_for_req(card->host, &brq.mrq);
+
+-}
++ mmc_queue_bounce_post(mq);
+
+-static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc)
+-{
+- struct mmc_blk_data *md = mq->data;
+- struct mmc_card *card = md->queue.card;
+- struct mmc_blk_request *brqc = &mq->mqrq_cur->brq;
+- struct mmc_blk_request *brqp = &mq->mqrq_prev->brq;
+- struct mmc_queue_req *mqrqp = mq->mqrq_prev;
+- struct request *rqp = mqrqp->req;
+- int ret = 0;
+- int disable_multi = 0;
+- enum mmc_blk_status status;
+-
+- if (!rqc && !rqp)
+- return 0;
+-
+- if (rqc) {
+- /* Claim host for the first request in a serie of requests */
+- if (!rqp)
+- mmc_claim_host(card->host);
+-
+- /* Prepare a new request */
+- mmc_blk_rw_rq_prep(mq->mqrq_cur, card, 0, mq);
+- mmc_pre_req(card->host, &brqc->mrq, !rqp);
+- }
+- do {
+ /*
+- * If there is an ongoing request, indicated by rqp, wait for
+- * it to finish before starting a new one.
++ * Check for errors here, but don't jump to cmd_err
++ * until later as we need to wait for the card to leave
++ * programming mode even when things go wrong.
+ */
+- if (rqp)
+- mmc_wait_for_req_done(&brqp->mrq);
+- else {
+- /* start a new asynchronous request */
+- mmc_start_req(card->host, &brqc->mrq);
+- goto out;
+- }
+- status = mmc_blk_get_status(brqp, rqp, card, md);
+- if (status != MMC_BLK_SUCCESS) {
+- mmc_post_req(card->host, &brqp->mrq, -EINVAL);
+- mmc_queue_bounce_post(mqrqp);
+- if (rqc)
+- mmc_post_req(card->host, &brqc->mrq, -EINVAL);
++ if (brq.cmd.error || brq.data.error || brq.stop.error) {
++ if (brq.data.blocks > 1 && rq_data_dir(req) == READ) {
++ /* Redo read one sector at a time */
++ printk(KERN_WARNING "%s: retrying using single "
++ "block read\n", req->rq_disk->disk_name);
++ disable_multi = 1;
++ continue;
++ }
++ status = get_card_status(card, req);
+ }
+
+- switch (status) {
+- case MMC_BLK_SUCCESS:
+- /*
+- * A block was successfully transferred.
+- */
+-
+- /*
+- * All data is transferred without errors.
+- * Defer mmc post processing and _blk_end_request
+- * until after the new request is started.
+- */
+- if (blk_rq_bytes(rqp) == brqp->data.bytes_xfered)
+- break;
+-
+- mmc_post_req(card->host, &brqp->mrq, 0);
+- mmc_queue_bounce_post(mqrqp);
+-
+- spin_lock_irq(&md->lock);
+- ret = __blk_end_request(rqp, 0,
+- brqp->data.bytes_xfered);
+- spin_unlock_irq(&md->lock);
+-
+- if (rqc)
+- mmc_post_req(card->host, &brqc->mrq, -EINVAL);
+- break;
+- case MMC_BLK_CMD_ERR:
+- goto cmd_err;
+- break;
+- case MMC_BLK_RETRY:
+- disable_multi = 1;
+- ret = 1;
+- break;
+- case MMC_BLK_DATA_ERR:
+- /*
+- * After an error, we redo I/O one sector at a
+- * time, so we only reach here after trying to
+- * read a single sector.
+- */
+- spin_lock_irq(&md->lock);
+- ret = __blk_end_request(rqp, -EIO, brqp->data.blksz);
+- spin_unlock_irq(&md->lock);
+- if (rqc && !ret)
+- mmc_pre_req(card->host, &brqc->mrq, false);
+- break;
++ if (brq.cmd.error) {
++ printk(KERN_ERR "%s: error %d sending read/write "
++ "command, response %#x, card status %#x\n",
++ req->rq_disk->disk_name, brq.cmd.error,
++ brq.cmd.resp[0], status);
+ }
+
+- if (ret) {
+- /*
+- * In case of a none complete request
+- * prepare it again and resend.
+- */
+- mmc_blk_rw_rq_prep(mqrqp, card, disable_multi, mq);
+- mmc_pre_req(card->host, &brqp->mrq, true);
+- mmc_start_req(card->host, &brqp->mrq);
+- if (rqc)
+- mmc_pre_req(card->host, &brqc->mrq, false);
++ if (brq.data.error) {
++ if (brq.data.error == -ETIMEDOUT && brq.mrq.stop)
++ /* 'Stop' response contains card status */
++ status = brq.mrq.stop->resp[0];
++ printk(KERN_ERR "%s: error %d transferring data,"
++ " sector %u, nr %u, card status %#x\n",
++ req->rq_disk->disk_name, brq.data.error,
++ (unsigned)blk_rq_pos(req),
++ (unsigned)blk_rq_sectors(req), status);
+ }
+- } while (ret);
+
+- /* Previous request is completed, start the new request if any */
+- if (rqc)
+- mmc_start_req(card->host, &brqc->mrq);
++ if (brq.stop.error) {
++ printk(KERN_ERR "%s: error %d sending stop command, "
++ "response %#x, card status %#x\n",
++ req->rq_disk->disk_name, brq.stop.error,
++ brq.stop.resp[0], status);
++ }
+
+- /*
+- * Post process the previous request while the new request is active.
+- * In case of error the reuqest is already ended.
+- */
+- if (status == MMC_BLK_SUCCESS) {
+- mmc_post_req(card->host, &brqp->mrq, 0);
+- mmc_queue_bounce_post(mqrqp);
++ if (!mmc_host_is_spi(card->host) && rq_data_dir(req) != READ) {
++ do {
++ int err;
++
++ cmd.opcode = MMC_SEND_STATUS;
++ cmd.arg = card->rca << 16;
++ cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
++ err = mmc_wait_for_cmd(card->host, &cmd, 5);
++ if (err) {
++ printk(KERN_ERR "%s: error %d requesting status\n",
++ req->rq_disk->disk_name, err);
++ goto cmd_err;
++ }
++ /*
++ * Some cards mishandle the status bits,
++ * so make sure to check both the busy
++ * indication and the card state.
++ */
++ } while (!(cmd.resp[0] & R1_READY_FOR_DATA) ||
++ (R1_CURRENT_STATE(cmd.resp[0]) == 7));
+
+- spin_lock_irq(&md->lock);
+- ret = __blk_end_request(rqp, 0, brqp->data.bytes_xfered);
+- spin_unlock_irq(&md->lock);
++#if 0
++ if (cmd.resp[0] & ~0x00000900)
++ printk(KERN_ERR "%s: status = %08x\n",
++ req->rq_disk->disk_name, cmd.resp[0]);
++ if (mmc_decode_status(cmd.resp))
++ goto cmd_err;
++#endif
++ }
+
+- if (ret) {
+- /* If this happen it is a bug */
+- printk(KERN_ERR "[%s] BUG: rq_bytes %d xfered %d\n",
+- __func__, blk_rq_bytes(rqp),
+- brqp->data.bytes_xfered);
++ if (brq.cmd.error || brq.stop.error || brq.data.error) {
++ if (rq_data_dir(req) == READ) {
++ /*
++ * After an error, we redo I/O one sector at a
++ * time, so we only reach here after trying to
++ * read a single sector.
++ */
++ spin_lock_irq(&md->lock);
++ ret = __blk_end_request(req, -EIO, brq.data.blksz);
++ spin_unlock_irq(&md->lock);
++ continue;
++ }
+ goto cmd_err;
+ }
+- }
+
+- /* 1 indicates one request has been completed */
+- ret = 1;
+- out:
+- /*
+- * TODO: Find out if it is OK to only release host after the
+- * last request. For the last request the current request
+- * is NULL, which means no requests are pending.
+- */
+- /* Release host for the last request in a serie of requests */
+- if (!rqc)
+- mmc_release_host(card->host);
++ /*
++ * A block was successfully transferred.
++ */
++ spin_lock_irq(&md->lock);
++ ret = __blk_end_request(req, 0, brq.data.bytes_xfered);
++ spin_unlock_irq(&md->lock);
++ } while (ret);
+
+- /* Current request becomes previous request and vice versa. */
+- mqrqp->brq.mrq.data = NULL;
+- mqrqp->req = NULL;
+- mq->mqrq_prev = mq->mqrq_cur;
+- mq->mqrq_cur = mqrqp;
++ mmc_release_host(card->host);
+
+- return ret;
++ return 1;
+
+ cmd_err:
+-
+ /*
+ * If this is an SD card and we're writing, we can first
+ * mark the known good sectors as ok.
+@@ -680,12 +539,12 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc)
+ blocks = mmc_sd_num_wr_blocks(card);
+ if (blocks != (u32)-1) {
+ spin_lock_irq(&md->lock);
+- ret = __blk_end_request(rqp, 0, blocks << 9);
++ ret = __blk_end_request(req, 0, blocks << 9);
+ spin_unlock_irq(&md->lock);
+ }
+ } else {
+ spin_lock_irq(&md->lock);
+- ret = __blk_end_request(rqp, 0, brqp->data.bytes_xfered);
++ ret = __blk_end_request(req, 0, brq.data.bytes_xfered);
+ spin_unlock_irq(&md->lock);
+ }
+
+@@ -693,27 +552,15 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc)
+
+ spin_lock_irq(&md->lock);
+ while (ret)
+- ret = __blk_end_request(rqp, -EIO, blk_rq_cur_bytes(rqp));
++ ret = __blk_end_request(req, -EIO, blk_rq_cur_bytes(req));
+ spin_unlock_irq(&md->lock);
+
+- if (rqc) {
+- mmc_claim_host(card->host);
+- mmc_pre_req(card->host, &brqc->mrq, false);
+- mmc_start_req(card->host, &brqc->mrq);
+- }
+-
+- /* Current request becomes previous request and vice versa. */
+- mqrqp->brq.mrq.data = NULL;
+- mqrqp->req = NULL;
+- mq->mqrq_prev = mq->mqrq_cur;
+- mq->mqrq_cur = mqrqp;
+-
+ return 0;
+ }
+
+ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
+ {
+- if (req && req->cmd_flags & REQ_DISCARD) {
++ if (req->cmd_flags & REQ_DISCARD) {
+ if (req->cmd_flags & REQ_SECURE)
+ return mmc_blk_issue_secdiscard_rq(mq, req);
+ else
+diff --git a/drivers/mmc/card/mmc_test.c b/drivers/mmc/card/mmc_test.c
+index 8f7ffad..abc1a63 100644
+--- a/drivers/mmc/card/mmc_test.c
++++ b/drivers/mmc/card/mmc_test.c
+@@ -22,7 +22,6 @@
+ #include <linux/debugfs.h>
+ #include <linux/uaccess.h>
+ #include <linux/seq_file.h>
+-#include <linux/random.h>
+
+ #define RESULT_OK 0
+ #define RESULT_FAIL 1
+@@ -52,12 +51,10 @@ struct mmc_test_pages {
+ * struct mmc_test_mem - allocated memory.
+ * @arr: array of allocations
+ * @cnt: number of allocations
+- * @size_min_cmn: lowest common size in array of allocations
+ */
+ struct mmc_test_mem {
+ struct mmc_test_pages *arr;
+ unsigned int cnt;
+- unsigned int size_min_cmn;
+ };
+
+ /**
+@@ -151,21 +148,6 @@ struct mmc_test_card {
+ struct mmc_test_general_result *gr;
+ };
+
+-enum mmc_test_prep_media {
+- MMC_TEST_PREP_NONE = 0,
+- MMC_TEST_PREP_WRITE_FULL = 1 << 0,
+- MMC_TEST_PREP_ERASE = 1 << 1,
+-};
+-
+-struct mmc_test_multiple_rw {
+- unsigned int *bs;
+- unsigned int len;
+- unsigned int size;
+- bool do_write;
+- bool do_nonblock_req;
+- enum mmc_test_prep_media prepare;
+-};
+-
+ /*******************************************************************/
+ /* General helper functions */
+ /*******************************************************************/
+@@ -325,7 +307,6 @@ static struct mmc_test_mem *mmc_test_alloc_mem(unsigned long min_sz,
+ unsigned long max_seg_page_cnt = DIV_ROUND_UP(max_seg_sz, PAGE_SIZE);
+ unsigned long page_cnt = 0;
+ unsigned long limit = nr_free_buffer_pages() >> 4;
+- unsigned int min_cmn = 0;
+ struct mmc_test_mem *mem;
+
+ if (max_page_cnt > limit)
+@@ -369,12 +350,6 @@ static struct mmc_test_mem *mmc_test_alloc_mem(unsigned long min_sz,
+ mem->arr[mem->cnt].page = page;
+ mem->arr[mem->cnt].order = order;
+ mem->cnt += 1;
+- if (!min_cmn)
+- min_cmn = PAGE_SIZE << order;
+- else
+- min_cmn = min(min_cmn,
+- (unsigned int) (PAGE_SIZE << order));
+-
+ if (max_page_cnt <= (1UL << order))
+ break;
+ max_page_cnt -= 1UL << order;
+@@ -385,7 +360,6 @@ static struct mmc_test_mem *mmc_test_alloc_mem(unsigned long min_sz,
+ break;
+ }
+ }
+- mem->size_min_cmn = min_cmn;
+
+ return mem;
+
+@@ -412,6 +386,7 @@ static int mmc_test_map_sg(struct mmc_test_mem *mem, unsigned long sz,
+ do {
+ for (i = 0; i < mem->cnt; i++) {
+ unsigned long len = PAGE_SIZE << mem->arr[i].order;
++
+ if (len > sz)
+ len = sz;
+ if (len > max_seg_sz)
+@@ -750,94 +725,6 @@ static int mmc_test_check_broken_result(struct mmc_test_card *test,
+ }
+
+ /*
+- * Tests nonblock transfer with certain parameters
+- */
+-static void mmc_test_nonblock_reset(struct mmc_request *mrq,
+- struct mmc_command *cmd,
+- struct mmc_command *stop,
+- struct mmc_data *data)
+-{
+- memset(mrq, 0, sizeof(struct mmc_request));
+- memset(cmd, 0, sizeof(struct mmc_command));
+- memset(data, 0, sizeof(struct mmc_data));
+- memset(stop, 0, sizeof(struct mmc_command));
+-
+- mrq->cmd = cmd;
+- mrq->data = data;
+- mrq->stop = stop;
+-}
+-static int mmc_test_nonblock_transfer(struct mmc_test_card *test,
+- struct scatterlist *sg, unsigned sg_len,
+- unsigned dev_addr, unsigned blocks,
+- unsigned blksz, int write, int count)
+-{
+- struct mmc_request mrq1;
+- struct mmc_command cmd1;
+- struct mmc_command stop1;
+- struct mmc_data data1;
+-
+- struct mmc_request mrq2;
+- struct mmc_command cmd2;
+- struct mmc_command stop2;
+- struct mmc_data data2;
+-
+- struct mmc_request *cur_mrq;
+- struct mmc_request *prev_mrq;
+- int i;
+- int ret = 0;
+-
+- if (!test->card->host->ops->pre_req ||
+- !test->card->host->ops->post_req)
+- return -RESULT_UNSUP_HOST;
+-
+- mmc_test_nonblock_reset(&mrq1, &cmd1, &stop1, &data1);
+- mmc_test_nonblock_reset(&mrq2, &cmd2, &stop2, &data2);
+-
+- cur_mrq = &mrq1;
+- prev_mrq = NULL;
+-
+- for (i = 0; i < count; i++) {
+- mmc_test_prepare_mrq(test, cur_mrq, sg, sg_len, dev_addr,
+- blocks, blksz, write);
+- mmc_pre_req(test->card->host, cur_mrq, !prev_mrq);
+-
+- if (prev_mrq) {
+- mmc_wait_for_req_done(prev_mrq);
+- mmc_test_wait_busy(test);
+- ret = mmc_test_check_result(test, prev_mrq);
+- if (ret)
+- goto err;
+- }
+-
+- mmc_start_req(test->card->host, cur_mrq);
+-
+- if (prev_mrq)
+- mmc_post_req(test->card->host, prev_mrq, 0);
+-
+- prev_mrq = cur_mrq;
+- if (cur_mrq == &mrq1) {
+- mmc_test_nonblock_reset(&mrq2, &cmd2, &stop2, &data2);
+- cur_mrq = &mrq2;
+- } else {
+- mmc_test_nonblock_reset(&mrq1, &cmd1, &stop1, &data1);
+- cur_mrq = &mrq1;
+- }
+- dev_addr += blocks;
+- }
+-
+- mmc_wait_for_req_done(prev_mrq);
+- mmc_test_wait_busy(test);
+- ret = mmc_test_check_result(test, prev_mrq);
+- if (ret)
+- goto err;
+- mmc_post_req(test->card->host, prev_mrq, 0);
+-
+- return ret;
+-err:
+- return ret;
+-}
+-
+-/*
+ * Tests a basic transfer with certain parameters
+ */
+ static int mmc_test_simple_transfer(struct mmc_test_card *test,
+@@ -1464,17 +1351,14 @@ static int mmc_test_area_transfer(struct mmc_test_card *test,
+ }
+
+ /*
+- * Map and transfer bytes for multiple transfers.
++ * Map and transfer bytes.
+ */
+-static int mmc_test_area_io_seq(struct mmc_test_card *test, unsigned long sz,
+- unsigned int dev_addr, int write,
+- int max_scatter, int timed, int count,
+- bool nonblock)
++static int mmc_test_area_io(struct mmc_test_card *test, unsigned long sz,
++ unsigned int dev_addr, int write, int max_scatter,
++ int timed)
+ {
+ struct timespec ts1, ts2;
+- int ret = 0;
+- int i;
+- struct mmc_test_area *t = &test->area;
++ int ret;
+
+ /*
+ * In the case of a maximally scattered transfer, the maximum transfer
+@@ -1498,15 +1382,8 @@ static int mmc_test_area_io_seq(struct mmc_test_card *test, unsigned long sz,
+
+ if (timed)
+ getnstimeofday(&ts1);
+- if (nonblock)
+- ret = mmc_test_nonblock_transfer(test, t->sg, t->sg_len,
+- dev_addr, t->blocks, 512, write, count);
+- else
+- for (i = 0; i < count && ret == 0; i++) {
+- ret = mmc_test_area_transfer(test, dev_addr, write);
+- dev_addr += sz >> 9;
+- }
+
++ ret = mmc_test_area_transfer(test, dev_addr, write);
+ if (ret)
+ return ret;
+
+@@ -1514,19 +1391,11 @@ static int mmc_test_area_io_seq(struct mmc_test_card *test, unsigned long sz,
+ getnstimeofday(&ts2);
+
+ if (timed)
+- mmc_test_print_avg_rate(test, sz, count, &ts1, &ts2);
++ mmc_test_print_rate(test, sz, &ts1, &ts2);
+
+ return 0;
+ }
+
+-static int mmc_test_area_io(struct mmc_test_card *test, unsigned long sz,
+- unsigned int dev_addr, int write, int max_scatter,
+- int timed)
+-{
+- return mmc_test_area_io_seq(test, sz, dev_addr, write, max_scatter,
+- timed, 1, false);
+-}
+-
+ /*
+ * Write the test area entirely.
+ */
+@@ -2087,144 +1956,6 @@ static int mmc_test_large_seq_write_perf(struct mmc_test_card *test)
+ return mmc_test_large_seq_perf(test, 1);
+ }
+
+-static int mmc_test_rw_multiple(struct mmc_test_card *test,
+- struct mmc_test_multiple_rw *tdata,
+- unsigned int reqsize, unsigned int size)
+-{
+- unsigned int dev_addr;
+- struct mmc_test_area *t = &test->area;
+- int ret = 0;
+- int max_reqsize = max(t->mem->size_min_cmn *
+- min(t->max_segs, t->mem->cnt), t->max_tfr);
+-
+- /* Set up test area */
+- if (size > mmc_test_capacity(test->card) / 2 * 512)
+- size = mmc_test_capacity(test->card) / 2 * 512;
+- if (reqsize > max_reqsize)
+- reqsize = max_reqsize;
+- dev_addr = mmc_test_capacity(test->card) / 4;
+- if ((dev_addr & 0xffff0000))
+- dev_addr &= 0xffff0000; /* Round to 64MiB boundary */
+- else
+- dev_addr &= 0xfffff800; /* Round to 1MiB boundary */
+- if (!dev_addr)
+- goto err;
+-
+- /* prepare test area */
+- if (mmc_can_erase(test->card) &&
+- tdata->prepare & MMC_TEST_PREP_ERASE) {
+- ret = mmc_erase(test->card, dev_addr,
+- size / 512, MMC_SECURE_ERASE_ARG);
+- if (ret)
+- ret = mmc_erase(test->card, dev_addr,
+- size / 512, MMC_ERASE_ARG);
+- if (ret)
+- goto err;
+- }
+-
+- /* Run test */
+- ret = mmc_test_area_io_seq(test, reqsize, dev_addr,
+- tdata->do_write, 0, 1, size / reqsize,
+- tdata->do_nonblock_req);
+- if (ret)
+- goto err;
+-
+- return ret;
+- err:
+- printk(KERN_INFO "[%s] error\n", __func__);
+- return ret;
+-}
+-
+-static int mmc_test_rw_multiple_size(struct mmc_test_card *test,
+- struct mmc_test_multiple_rw *rw)
+-{
+- int ret = 0;
+- int i;
+-
+- for (i = 0 ; i < rw->len && ret == 0; i++) {
+- ret = mmc_test_rw_multiple(test, rw, rw->bs[i], rw->size);
+- if (ret)
+- break;
+- }
+- return ret;
+-}
+-
+-/*
+- * Multiple blocking write 4k to 4 MB chunks
+- */
+-static int mmc_test_profile_mult_write_blocking_perf(struct mmc_test_card *test)
+-{
+- unsigned int bs[] = {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16,
+- 1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22};
+- struct mmc_test_multiple_rw test_data = {
+- .bs = bs,
+- .size = 128*1024*1024,
+- .len = ARRAY_SIZE(bs),
+- .do_write = true,
+- .do_nonblock_req = false,
+- .prepare = MMC_TEST_PREP_ERASE,
+- };
+-
+- return mmc_test_rw_multiple_size(test, &test_data);
+-};
+-
+-/*
+- * Multiple none blocking write 4k to 4 MB chunks
+- */
+-static int mmc_test_profile_mult_write_nonblock_perf(struct mmc_test_card *test)
+-{
+- unsigned int bs[] = {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16,
+- 1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22};
+- struct mmc_test_multiple_rw test_data = {
+- .bs = bs,
+- .size = 128*1024*1024,
+- .len = ARRAY_SIZE(bs),
+- .do_write = true,
+- .do_nonblock_req = true,
+- .prepare = MMC_TEST_PREP_ERASE,
+- };
+-
+- return mmc_test_rw_multiple_size(test, &test_data);
+-}
+-
+-/*
+- * Multiple blocking read 4k to 4 MB chunks
+- */
+-static int mmc_test_profile_mult_read_blocking_perf(struct mmc_test_card *test)
+-{
+- unsigned int bs[] = {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16,
+- 1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22};
+- struct mmc_test_multiple_rw test_data = {
+- .bs = bs,
+- .size = 128*1024*1024,
+- .len = ARRAY_SIZE(bs),
+- .do_write = false,
+- .do_nonblock_req = false,
+- .prepare = MMC_TEST_PREP_NONE,
+- };
+-
+- return mmc_test_rw_multiple_size(test, &test_data);
+-}
+-
+-/*
+- * Multiple none blocking read 4k to 4 MB chunks
+- */
+-static int mmc_test_profile_mult_read_nonblock_perf(struct mmc_test_card *test)
+-{
+- unsigned int bs[] = {1 << 12, 1 << 13, 1 << 14, 1 << 15, 1 << 16,
+- 1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 22};
+- struct mmc_test_multiple_rw test_data = {
+- .bs = bs,
+- .size = 128*1024*1024,
+- .len = ARRAY_SIZE(bs),
+- .do_write = false,
+- .do_nonblock_req = true,
+- .prepare = MMC_TEST_PREP_NONE,
+- };
+-
+- return mmc_test_rw_multiple_size(test, &test_data);
+-}
+-
+ static const struct mmc_test_case mmc_test_cases[] = {
+ {
+ .name = "Basic write (no data verification)",
+@@ -2492,33 +2223,6 @@ static const struct mmc_test_case mmc_test_cases[] = {
+ .cleanup = mmc_test_area_cleanup,
+ },
+
+- {
+- .name = "Write performance with blocking req 4k to 4MB",
+- .prepare = mmc_test_area_prepare,
+- .run = mmc_test_profile_mult_write_blocking_perf,
+- .cleanup = mmc_test_area_cleanup,
+- },
+-
+- {
+- .name = "Write performance with none blocking req 4k to 4MB",
+- .prepare = mmc_test_area_prepare,
+- .run = mmc_test_profile_mult_write_nonblock_perf,
+- .cleanup = mmc_test_area_cleanup,
+- },
+-
+- {
+- .name = "Read performance with blocking req 4k to 4MB",
+- .prepare = mmc_test_area_prepare,
+- .run = mmc_test_profile_mult_read_blocking_perf,
+- .cleanup = mmc_test_area_cleanup,
+- },
+-
+- {
+- .name = "Read performance with none blocking req 4k to 4MB",
+- .prepare = mmc_test_area_prepare,
+- .run = mmc_test_profile_mult_read_nonblock_perf,
+- .cleanup = mmc_test_area_cleanup,
+- },
+ };
+
+ static DEFINE_MUTEX(mmc_test_lock);
+@@ -2743,32 +2447,6 @@ static const struct file_operations mmc_test_fops_test = {
+ .release = single_release,
+ };
+
+-static int mtf_testlist_show(struct seq_file *sf, void *data)
+-{
+- int i;
+-
+- mutex_lock(&mmc_test_lock);
+-
+- for (i = 0; i < ARRAY_SIZE(mmc_test_cases); i++)
+- seq_printf(sf, "%d:\t%s\n", i+1, mmc_test_cases[i].name);
+-
+- mutex_unlock(&mmc_test_lock);
+-
+- return 0;
+-}
+-
+-static int mtf_testlist_open(struct inode *inode, struct file *file)
+-{
+- return single_open(file, mtf_testlist_show, inode->i_private);
+-}
+-
+-static const struct file_operations mmc_test_fops_testlist = {
+- .open = mtf_testlist_open,
+- .read = seq_read,
+- .llseek = seq_lseek,
+- .release = single_release,
+-};
+-
+ static void mmc_test_free_file_test(struct mmc_card *card)
+ {
+ struct mmc_test_dbgfs_file *df, *dfs;
+@@ -2798,10 +2476,6 @@ static int mmc_test_register_file_test(struct mmc_card *card)
+ file = debugfs_create_file("test", S_IWUSR | S_IRUGO,
+ card->debugfs_root, card, &mmc_test_fops_test);
+
+- if (card->debugfs_root)
+- file = debugfs_create_file("testlist", S_IRUGO,
+- card->debugfs_root, card, &mmc_test_fops_testlist);
+-
+ if (IS_ERR_OR_NULL(file)) {
+ dev_err(&card->dev,
+ "Can't create file. Perhaps debugfs is disabled.\n");
+diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c
+index 2b14d1c..2ae7275 100644
+--- a/drivers/mmc/card/queue.c
++++ b/drivers/mmc/card/queue.c
+@@ -56,10 +56,9 @@ static int mmc_queue_thread(void *d)
+ spin_lock_irq(q->queue_lock);
+ set_current_state(TASK_INTERRUPTIBLE);
+ req = blk_fetch_request(q);
+- mq->mqrq_cur->req = req;
++ mq->req = req;
+ spin_unlock_irq(q->queue_lock);
+
+- mq->issue_fn(mq, req);
+ if (!req) {
+ if (kthread_should_stop()) {
+ set_current_state(TASK_RUNNING);
+@@ -72,6 +71,7 @@ static int mmc_queue_thread(void *d)
+ }
+ set_current_state(TASK_RUNNING);
+
++ mq->issue_fn(mq, req);
+ } while (1);
+ up(&mq->thread_sem);
+
+@@ -97,25 +97,10 @@ static void mmc_request(struct request_queue *q)
+ return;
+ }
+
+- if (!mq->mqrq_cur->req)
++ if (!mq->req)
+ wake_up_process(mq->thread);
+ }
+
+-struct scatterlist *mmc_alloc_sg(int sg_len, int *err)
+-{
+- struct scatterlist *sg;
+-
+- sg = kmalloc(sizeof(struct scatterlist)*sg_len, GFP_KERNEL);
+- if (!sg)
+- *err = -ENOMEM;
+- else {
+- *err = 0;
+- sg_init_table(sg, sg_len);
+- }
+-
+- return sg;
+-}
+-
+ /**
+ * mmc_init_queue - initialise a queue structure.
+ * @mq: mmc queue
+@@ -129,8 +114,6 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock
+ struct mmc_host *host = card->host;
+ u64 limit = BLK_BOUNCE_HIGH;
+ int ret;
+- struct mmc_queue_req *mqrq_cur = &mq->mqrq[0];
+- struct mmc_queue_req *mqrq_prev = &mq->mqrq[1];
+
+ if (mmc_dev(host)->dma_mask && *mmc_dev(host)->dma_mask)
+ limit = *mmc_dev(host)->dma_mask;
+@@ -140,11 +123,8 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock
+ if (!mq->queue)
+ return -ENOMEM;
+
+- memset(&mq->mqrq_cur, 0, sizeof(mq->mqrq_cur));
+- memset(&mq->mqrq_prev, 0, sizeof(mq->mqrq_prev));
+- mq->mqrq_cur = mqrq_cur;
+- mq->mqrq_prev = mqrq_prev;
+ mq->queue->queuedata = mq;
++ mq->req = NULL;
+
+ blk_queue_prep_rq(mq->queue, mmc_prep_request);
+ queue_flag_set_unlocked(QUEUE_FLAG_NONROT, mq->queue);
+@@ -178,64 +158,53 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock
+ bouncesz = host->max_blk_count * 512;
+
+ if (bouncesz > 512) {
+- mqrq_cur->bounce_buf = kmalloc(bouncesz, GFP_KERNEL);
+- if (!mqrq_cur->bounce_buf) {
+- printk(KERN_WARNING "%s: unable to "
+- "allocate bounce cur buffer\n",
+- mmc_card_name(card));
+- }
+- mqrq_prev->bounce_buf = kmalloc(bouncesz, GFP_KERNEL);
+- if (!mqrq_prev->bounce_buf) {
++ mq->bounce_buf = kmalloc(bouncesz, GFP_KERNEL);
++ if (!mq->bounce_buf) {
+ printk(KERN_WARNING "%s: unable to "
+- "allocate bounce prev buffer\n",
++ "allocate bounce buffer\n",
+ mmc_card_name(card));
+- kfree(mqrq_cur->bounce_buf);
+- mqrq_cur->bounce_buf = NULL;
+ }
+ }
+
+- if (mqrq_cur->bounce_buf && mqrq_prev->bounce_buf) {
++ if (mq->bounce_buf) {
+ blk_queue_bounce_limit(mq->queue, BLK_BOUNCE_ANY);
+ blk_queue_max_hw_sectors(mq->queue, bouncesz / 512);
+ blk_queue_max_segments(mq->queue, bouncesz / 512);
+ blk_queue_max_segment_size(mq->queue, bouncesz);
+
+- mqrq_cur->sg = mmc_alloc_sg(1, &ret);
+- if (ret)
+- goto cleanup_queue;
+-
+- mqrq_cur->bounce_sg =
+- mmc_alloc_sg(bouncesz / 512, &ret);
+- if (ret)
+- goto cleanup_queue;
+-
+- mqrq_prev->sg = mmc_alloc_sg(1, &ret);
+- if (ret)
++ mq->sg = kmalloc(sizeof(struct scatterlist),
++ GFP_KERNEL);
++ if (!mq->sg) {
++ ret = -ENOMEM;
+ goto cleanup_queue;
++ }
++ sg_init_table(mq->sg, 1);
+
+- mqrq_prev->bounce_sg =
+- mmc_alloc_sg(bouncesz / 512, &ret);
+- if (ret)
++ mq->bounce_sg = kmalloc(sizeof(struct scatterlist) *
++ bouncesz / 512, GFP_KERNEL);
++ if (!mq->bounce_sg) {
++ ret = -ENOMEM;
+ goto cleanup_queue;
++ }
++ sg_init_table(mq->bounce_sg, bouncesz / 512);
+ }
+ }
+ #endif
+
+- if (!mqrq_cur->bounce_buf && !mqrq_prev->bounce_buf) {
++ if (!mq->bounce_buf) {
+ blk_queue_bounce_limit(mq->queue, limit);
+ blk_queue_max_hw_sectors(mq->queue,
+ min(host->max_blk_count, host->max_req_size / 512));
+ blk_queue_max_segments(mq->queue, host->max_segs);
+ blk_queue_max_segment_size(mq->queue, host->max_seg_size);
+
+- mqrq_cur->sg = mmc_alloc_sg(host->max_segs, &ret);
+- if (ret)
+- goto cleanup_queue;
+-
+-
+- mqrq_prev->sg = mmc_alloc_sg(host->max_segs, &ret);
+- if (ret)
++ mq->sg = kmalloc(sizeof(struct scatterlist) *
++ host->max_segs, GFP_KERNEL);
++ if (!mq->sg) {
++ ret = -ENOMEM;
+ goto cleanup_queue;
++ }
++ sg_init_table(mq->sg, host->max_segs);
+ }
+
+ sema_init(&mq->thread_sem, 1);
+@@ -250,22 +219,16 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock
+
+ return 0;
+ free_bounce_sg:
+- kfree(mqrq_cur->bounce_sg);
+- mqrq_cur->bounce_sg = NULL;
+- kfree(mqrq_prev->bounce_sg);
+- mqrq_prev->bounce_sg = NULL;
+-
++ if (mq->bounce_sg)
++ kfree(mq->bounce_sg);
++ mq->bounce_sg = NULL;
+ cleanup_queue:
+- kfree(mqrq_cur->sg);
+- mqrq_cur->sg = NULL;
+- kfree(mqrq_cur->bounce_buf);
+- mqrq_cur->bounce_buf = NULL;
+-
+- kfree(mqrq_prev->sg);
+- mqrq_prev->sg = NULL;
+- kfree(mqrq_prev->bounce_buf);
+- mqrq_prev->bounce_buf = NULL;
+-
++ if (mq->sg)
++ kfree(mq->sg);
++ mq->sg = NULL;
++ if (mq->bounce_buf)
++ kfree(mq->bounce_buf);
++ mq->bounce_buf = NULL;
+ blk_cleanup_queue(mq->queue);
+ return ret;
+ }
+@@ -274,8 +237,6 @@ void mmc_cleanup_queue(struct mmc_queue *mq)
+ {
+ struct request_queue *q = mq->queue;
+ unsigned long flags;
+- struct mmc_queue_req *mqrq_cur = mq->mqrq_cur;
+- struct mmc_queue_req *mqrq_prev = mq->mqrq_prev;
+
+ /* Make sure the queue isn't suspended, as that will deadlock */
+ mmc_queue_resume(mq);
+@@ -289,23 +250,16 @@ void mmc_cleanup_queue(struct mmc_queue *mq)
+ blk_start_queue(q);
+ spin_unlock_irqrestore(q->queue_lock, flags);
+
+- kfree(mqrq_cur->bounce_sg);
+- mqrq_cur->bounce_sg = NULL;
+-
+- kfree(mqrq_cur->sg);
+- mqrq_cur->sg = NULL;
++ if (mq->bounce_sg)
++ kfree(mq->bounce_sg);
++ mq->bounce_sg = NULL;
+
+- kfree(mqrq_cur->bounce_buf);
+- mqrq_cur->bounce_buf = NULL;
++ kfree(mq->sg);
++ mq->sg = NULL;
+
+- kfree(mqrq_prev->bounce_sg);
+- mqrq_prev->bounce_sg = NULL;
+-
+- kfree(mqrq_prev->sg);
+- mqrq_prev->sg = NULL;
+-
+- kfree(mqrq_prev->bounce_buf);
+- mqrq_prev->bounce_buf = NULL;
++ if (mq->bounce_buf)
++ kfree(mq->bounce_buf);
++ mq->bounce_buf = NULL;
+
+ mq->card = NULL;
+ }
+@@ -358,27 +312,27 @@ void mmc_queue_resume(struct mmc_queue *mq)
+ /*
+ * Prepare the sg list(s) to be handed of to the host driver
+ */
+-unsigned int mmc_queue_map_sg(struct mmc_queue *mq, struct mmc_queue_req *mqrq)
++unsigned int mmc_queue_map_sg(struct mmc_queue *mq)
+ {
+ unsigned int sg_len;
+ size_t buflen;
+ struct scatterlist *sg;
+ int i;
+
+- if (!mqrq->bounce_buf)
+- return blk_rq_map_sg(mq->queue, mqrq->req, mqrq->sg);
++ if (!mq->bounce_buf)
++ return blk_rq_map_sg(mq->queue, mq->req, mq->sg);
+
+- BUG_ON(!mqrq->bounce_sg);
++ BUG_ON(!mq->bounce_sg);
+
+- sg_len = blk_rq_map_sg(mq->queue, mqrq->req, mqrq->bounce_sg);
++ sg_len = blk_rq_map_sg(mq->queue, mq->req, mq->bounce_sg);
+
+- mqrq->bounce_sg_len = sg_len;
++ mq->bounce_sg_len = sg_len;
+
+ buflen = 0;
+- for_each_sg(mqrq->bounce_sg, sg, sg_len, i)
++ for_each_sg(mq->bounce_sg, sg, sg_len, i)
+ buflen += sg->length;
+
+- sg_init_one(mqrq->sg, mqrq->bounce_buf, buflen);
++ sg_init_one(mq->sg, mq->bounce_buf, buflen);
+
+ return 1;
+ }
+@@ -387,19 +341,19 @@ unsigned int mmc_queue_map_sg(struct mmc_queue *mq, struct mmc_queue_req *mqrq)
+ * If writing, bounce the data to the buffer before the request
+ * is sent to the host driver
+ */
+-void mmc_queue_bounce_pre(struct mmc_queue_req *mqrq)
++void mmc_queue_bounce_pre(struct mmc_queue *mq)
+ {
+ unsigned long flags;
+
+- if (!mqrq->bounce_buf)
++ if (!mq->bounce_buf)
+ return;
+
+- if (rq_data_dir(mqrq->req) != WRITE)
++ if (rq_data_dir(mq->req) != WRITE)
+ return;
+
+ local_irq_save(flags);
+- sg_copy_to_buffer(mqrq->bounce_sg, mqrq->bounce_sg_len,
+- mqrq->bounce_buf, mqrq->sg[0].length);
++ sg_copy_to_buffer(mq->bounce_sg, mq->bounce_sg_len,
++ mq->bounce_buf, mq->sg[0].length);
+ local_irq_restore(flags);
+ }
+
+@@ -407,18 +361,19 @@ void mmc_queue_bounce_pre(struct mmc_queue_req *mqrq)
+ * If reading, bounce the data from the buffer after the request
+ * has been handled by the host driver
+ */
+-void mmc_queue_bounce_post(struct mmc_queue_req *mqrq)
++void mmc_queue_bounce_post(struct mmc_queue *mq)
+ {
+ unsigned long flags;
+
+- if (!mqrq->bounce_buf)
++ if (!mq->bounce_buf)
+ return;
+
+- if (rq_data_dir(mqrq->req) != READ)
++ if (rq_data_dir(mq->req) != READ)
+ return;
+
+ local_irq_save(flags);
+- sg_copy_from_buffer(mqrq->bounce_sg, mqrq->bounce_sg_len,
+- mqrq->bounce_buf, mqrq->sg[0].length);
++ sg_copy_from_buffer(mq->bounce_sg, mq->bounce_sg_len,
++ mq->bounce_buf, mq->sg[0].length);
+ local_irq_restore(flags);
+ }
++
+diff --git a/drivers/mmc/card/queue.h b/drivers/mmc/card/queue.h
+index 0e65807..64e66e0 100644
+--- a/drivers/mmc/card/queue.h
++++ b/drivers/mmc/card/queue.h
+@@ -4,33 +4,19 @@
+ struct request;
+ struct task_struct;
+
+-struct mmc_blk_request {
+- struct mmc_request mrq;
+- struct mmc_command cmd;
+- struct mmc_command stop;
+- struct mmc_data data;
+-};
+-
+-struct mmc_queue_req {
+- struct request *req;
+- struct mmc_blk_request brq;
+- struct scatterlist *sg;
+- char *bounce_buf;
+- struct scatterlist *bounce_sg;
+- unsigned int bounce_sg_len;
+-};
+-
+ struct mmc_queue {
+ struct mmc_card *card;
+ struct task_struct *thread;
+ struct semaphore thread_sem;
+ unsigned int flags;
++ struct request *req;
+ int (*issue_fn)(struct mmc_queue *, struct request *);
+ void *data;
+ struct request_queue *queue;
+- struct mmc_queue_req mqrq[2];
+- struct mmc_queue_req *mqrq_cur;
+- struct mmc_queue_req *mqrq_prev;
++ struct scatterlist *sg;
++ char *bounce_buf;
++ struct scatterlist *bounce_sg;
++ unsigned int bounce_sg_len;
+ };
+
+ extern int mmc_init_queue(struct mmc_queue *, struct mmc_card *, spinlock_t *);
+@@ -38,9 +24,8 @@ extern void mmc_cleanup_queue(struct mmc_queue *);
+ extern void mmc_queue_suspend(struct mmc_queue *);
+ extern void mmc_queue_resume(struct mmc_queue *);
+
+-extern unsigned int mmc_queue_map_sg(struct mmc_queue *,
+- struct mmc_queue_req *);
+-extern void mmc_queue_bounce_pre(struct mmc_queue_req *);
+-extern void mmc_queue_bounce_post(struct mmc_queue_req *);
++extern unsigned int mmc_queue_map_sg(struct mmc_queue *);
++extern void mmc_queue_bounce_pre(struct mmc_queue *);
++extern void mmc_queue_bounce_post(struct mmc_queue *);
+
+ #endif
+diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
+index 85296df..1f453ac 100644
+--- a/drivers/mmc/core/core.c
++++ b/drivers/mmc/core/core.c
+@@ -23,8 +23,6 @@
+ #include <linux/log2.h>
+ #include <linux/regulator/consumer.h>
+ #include <linux/pm_runtime.h>
+-#include <linux/fault-inject.h>
+-#include <linux/random.h>
+
+ #include <linux/mmc/card.h>
+ #include <linux/mmc/host.h>
+@@ -84,56 +82,6 @@ static void mmc_flush_scheduled_work(void)
+ flush_workqueue(workqueue);
+ }
+
+-#ifdef CONFIG_FAIL_MMC_REQUEST
+-
+-static DECLARE_FAULT_ATTR(fail_mmc_request);
+-
+-static int __init setup_fail_mmc_request(char *str)
+-{
+- return setup_fault_attr(&fail_mmc_request, str);
+-}
+-__setup("fail_mmc_request=", setup_fail_mmc_request);
+-
+-static void mmc_should_fail_request(struct mmc_host *host,
+- struct mmc_request *mrq)
+-{
+- struct mmc_command *cmd = mrq->cmd;
+- struct mmc_data *data = mrq->data;
+- static const int data_errors[] = {
+- -ETIMEDOUT,
+- -EILSEQ,
+- -EIO,
+- };
+-
+- if (!data)
+- return;
+-
+- if (cmd->error || data->error || !host->make_it_fail ||
+- !should_fail(&fail_mmc_request, data->blksz * data->blocks))
+- return;
+-
+- data->error = data_errors[random32() % ARRAY_SIZE(data_errors)];
+- data->bytes_xfered = (random32() % (data->bytes_xfered >> 9)) << 9;
+-}
+-
+-static int __init fail_mmc_request_debugfs(void)
+-{
+- return init_fault_attr_dentries(&fail_mmc_request,
+- "fail_mmc_request");
+-}
+-
+-late_initcall(fail_mmc_request_debugfs);
+-
+-#else /* CONFIG_FAIL_MMC_REQUEST */
+-
+-static inline void mmc_should_fail_request(struct mmc_host *host,
+- struct mmc_data *data)
+-{
+-}
+-
+-#endif /* CONFIG_FAIL_MMC_REQUEST */
+-
+-
+ /**
+ * mmc_request_done - finish processing an MMC request
+ * @host: MMC host which completed request
+@@ -160,8 +108,6 @@ void mmc_request_done(struct mmc_host *host, struct mmc_request *mrq)
+ cmd->error = 0;
+ host->ops->request(host, mrq);
+ } else {
+- mmc_should_fail_request(host, mrq);
+-
+ led_trigger_event(host->led, LED_OFF);
+
+ pr_debug("%s: req done (CMD%u): %d: %08x %08x %08x %08x\n",
+@@ -252,73 +198,8 @@ mmc_start_request(struct mmc_host *host, struct mmc_request *mrq)
+
+ static void mmc_wait_done(struct mmc_request *mrq)
+ {
+- complete(&mrq->completion);
+-}
+-
+-/**
+- * mmc_pre_req - Prepare for a new request
+- * @host: MMC host to prepare command
+- * @mrq: MMC request to prepare for
+- * @is_first_req: true if there is no previous started request
+- * that may run in parellel to this call, otherwise false
+- *
+- * mmc_pre_req() is called in prior to mmc_start_req() to let
+- * host prepare for the new request. Preparation of a request may be
+- * performed while another request is running on the host.
+- */
+-void mmc_pre_req(struct mmc_host *host, struct mmc_request *mrq,
+- bool is_first_req)
+-{
+- if (host->ops->pre_req)
+- host->ops->pre_req(host, mrq, is_first_req);
++ complete(mrq->done_data);
+ }
+-EXPORT_SYMBOL(mmc_pre_req);
+-
+-/**
+- * mmc_post_req - Post process a completed request
+- * @host: MMC host to post process command
+- * @mrq: MMC request to post process for
+- * @err: Error, if none zero, clean up any resources made in pre_req
+- *
+- * Let the host post process a completed request. Post processing of
+- * a request may be performed while another reuqest is running.
+- */
+-void mmc_post_req(struct mmc_host *host, struct mmc_request *mrq, int err)
+-{
+- if (host->ops->post_req)
+- host->ops->post_req(host, mrq, err);
+-}
+-EXPORT_SYMBOL(mmc_post_req);
+-
+-/**
+- * mmc_start_req - start a request
+- * @host: MMC host to start command
+- * @mrq: MMC request to start
+- *
+- * Start a new MMC custom command request for a host.
+- * Does not wait for the command to complete.
+- */
+-void mmc_start_req(struct mmc_host *host, struct mmc_request *mrq)
+-{
+- init_completion(&mrq->completion);
+- mrq->done = mmc_wait_done;
+-
+- mmc_start_request(host, mrq);
+-}
+-EXPORT_SYMBOL(mmc_start_req);
+-
+-/**
+- * mmc_wait_for_req_done - wait for completion of request
+- * @mrq: MMC request to wait for
+- *
+- * Wait for the command to complete. Does not attempt to parse the
+- * response.
+- */
+-void mmc_wait_for_req_done(struct mmc_request *mrq)
+-{
+- wait_for_completion(&mrq->completion);
+-}
+-EXPORT_SYMBOL(mmc_wait_for_req_done);
+
+ /**
+ * mmc_wait_for_req - start a request and wait for completion
+@@ -331,9 +212,16 @@ EXPORT_SYMBOL(mmc_wait_for_req_done);
+ */
+ void mmc_wait_for_req(struct mmc_host *host, struct mmc_request *mrq)
+ {
+- mmc_start_req(host, mrq);
+- mmc_wait_for_req_done(mrq);
++ DECLARE_COMPLETION_ONSTACK(complete);
++
++ mrq->done_data = &complete;
++ mrq->done = mmc_wait_done;
++
++ mmc_start_request(host, mrq);
++
++ wait_for_completion(&complete);
+ }
++
+ EXPORT_SYMBOL(mmc_wait_for_req);
+
+ /**
+diff --git a/drivers/mmc/core/debugfs.c b/drivers/mmc/core/debugfs.c
+index 588e76f..998797e 100644
+--- a/drivers/mmc/core/debugfs.c
++++ b/drivers/mmc/core/debugfs.c
+@@ -188,11 +188,6 @@ void mmc_add_host_debugfs(struct mmc_host *host)
+ root, &host->clk_delay))
+ goto err_node;
+ #endif
+-#ifdef CONFIG_FAIL_MMC_REQUEST
+- if (!debugfs_create_u8("make-it-fail", S_IRUSR | S_IWUSR,
+- root, &host->make_it_fail))
+- goto err_node;
+-#endif
+ return;
+
+ err_node:
+diff --git a/drivers/mmc/host/glamo-mci.c b/drivers/mmc/host/glamo-mci.c
+index 02c4b69..f298658 100644
+--- a/drivers/mmc/host/glamo-mci.c
++++ b/drivers/mmc/host/glamo-mci.c
+@@ -49,10 +49,10 @@ struct glamo_mci_host {
+ unsigned short vdd;
+ char power_mode;
+
+- unsigned long transfer_start;
+- unsigned long request_start;
+-
+ unsigned char request_counter;
++
++ struct workqueue_struct *workqueue;
++ struct work_struct read_work;
+ };
+
+ static void glamo_mci_send_request(struct mmc_host *mmc,
+@@ -165,21 +165,12 @@ static int glamo_mci_clock_enable(struct mmc_host *mmc)
+ return 0;
+ }
+
+-static void __iomem *glamo_mci_get_data_addr(struct glamo_mci_host *host,
+- struct mmc_data *data)
+-{
+- void __iomem *addr = host->data_base;
+-
+- if (data->host_cookie & 1)
+- addr += resource_size(host->data_mem) / 2;
+-
+- return addr;
+-}
+
++#ifndef GLAMO_MCI_WORKER
+ static void do_pio_read(struct glamo_mci_host *host, struct mmc_data *data)
+ {
+- void __iomem *from_ptr = glamo_mci_get_data_addr(host, data);
+ struct sg_mapping_iter miter;
++ uint16_t __iomem *from_ptr = host->data_base;
+
+ dev_dbg(&host->pdev->dev, "pio_read():\n");
+
+@@ -187,7 +178,9 @@ static void do_pio_read(struct glamo_mci_host *host, struct mmc_data *data)
+
+ while (sg_miter_next(&miter)) {
+ memcpy(miter.addr, from_ptr, miter.length);
+- from_ptr += miter.length;
++ from_ptr += miter.length >> 1;
++
++ data->bytes_xfered += miter.length;
+ }
+
+ sg_miter_stop(&miter);
+@@ -195,18 +188,19 @@ static void do_pio_read(struct glamo_mci_host *host, struct mmc_data *data)
+ dev_dbg(&host->pdev->dev, "pio_read(): "
+ "complete (no more data)\n");
+ }
++#endif
+
+ static void do_pio_write(struct glamo_mci_host *host, struct mmc_data *data)
+ {
+- void __iomem *to_ptr = glamo_mci_get_data_addr(host, data);
+ struct sg_mapping_iter miter;
++ uint16_t __iomem *to_ptr = host->data_base;
+
+ dev_dbg(&host->pdev->dev, "pio_write():\n");
+ sg_miter_start(&miter, data->sg, data->sg_len, SG_MITER_FROM_SG);
+
+ while (sg_miter_next(&miter)) {
+ memcpy(to_ptr, miter.addr, miter.length);
+- to_ptr += miter.length;
++ to_ptr += miter.length >> 1;
+
+ data->bytes_xfered += miter.length;
+ }
+@@ -284,11 +278,12 @@ static irqreturn_t glamo_mci_irq(int irq, void *data)
+ if (mrq->stop)
+ glamo_mci_send_command(host, mrq->stop);
+
+- if (mrq->data && (mrq->data->flags & MMC_DATA_READ)) {
+- mrq->data->bytes_xfered = mrq->data->blocks * mrq->data->blksz;
+- if (!mrq->data->host_cookie)
+- do_pio_read(host, mrq->data);
+- }
++ if (cmd->data->flags & MMC_DATA_READ)
++#ifndef GLAMO_MCI_WORKER
++ do_pio_read(host, cmd->data);
++#else
++ flush_workqueue(host->workqueue);
++#endif
+
+ if (mrq->stop)
+ mrq->stop->error = glamo_mci_wait_idle(host, jiffies + HZ);
+@@ -300,6 +295,64 @@ done:
+ return IRQ_HANDLED;
+ }
+
++#ifdef GLAMO_MCI_WORKER
++static void glamo_mci_read_worker(struct work_struct *work)
++{
++ struct glamo_mci_host *host = container_of(work, struct glamo_mci_host,
++ read_work);
++ struct mmc_command *cmd;
++ uint16_t status;
++ uint16_t blocks_ready;
++ size_t data_read = 0;
++ size_t data_ready;
++ struct scatterlist *sg;
++ uint16_t __iomem *from_ptr = host->data_base;
++ void *sg_pointer;
++
++
++ cmd = host->mrq->cmd;
++ sg = cmd->data->sg;
++ do {
++ /*
++ * TODO: How to get rid of that?
++ * Maybe just drop it... In fact, it is already handled in
++ * the IRQ handler, maybe we should only check cmd->error.
++ * But the question is: what happens between the moment
++ * the error occurs, and the moment the IRQ handler handles it?
++ */
++ status = glamomci_reg_read(host, GLAMO_REG_MMC_RB_STAT1);
++
++ if (status & (GLAMO_STAT1_MMC_RTOUT | GLAMO_STAT1_MMC_DTOUT))
++ cmd->error = -ETIMEDOUT;
++ if (status & (GLAMO_STAT1_MMC_BWERR | GLAMO_STAT1_MMC_BRERR))
++ cmd->error = -EILSEQ;
++ if (cmd->error) {
++ dev_info(&host->pdev->dev, "Error after cmd: 0x%x\n",
++ status);
++ return;
++ }
++
++ blocks_ready = glamomci_reg_read(host, GLAMO_REG_MMC_RB_BLKCNT);
++ data_ready = blocks_ready * cmd->data->blksz;
++
++ if (data_ready == data_read)
++ yield();
++
++ while (sg && data_read + sg->length <= data_ready) {
++ sg_pointer = page_address(sg_page(sg)) + sg->offset;
++ memcpy(sg_pointer, from_ptr, sg->length);
++ from_ptr += sg->length >> 1;
++
++ data_read += sg->length;
++
++ sg = sg_next(sg);
++ }
++
++ } while (sg);
++ cmd->data->bytes_xfered = data_read;
++}
++#endif
++
+ static void glamo_mci_send_command(struct glamo_mci_host *host,
+ struct mmc_command *cmd)
+ {
+@@ -480,29 +533,28 @@ static void glamo_mci_send_command(struct glamo_mci_host *host,
+ (readw(&reg_resp[2]) << 24);
+ }
+ }
++
++#ifdef GLAMO_MCI_WORKER
++ /* We'll only get an interrupt when all data has been transfered.
++ By starting to copy data when it's avaiable we can increase
++ throughput by up to 30%. */
++ if (cmd->data && (cmd->data->flags & MMC_DATA_READ))
++ queue_work(host->workqueue, &host->read_work);
++#endif
++
+ }
+
+ static int glamo_mci_prepare_pio(struct glamo_mci_host *host,
+ struct mmc_data *data)
+ {
+- unsigned long addr = host->data_mem->start;
+-
+- if (data->host_cookie & 1)
+- addr += resource_size(host->data_mem) / 2;
+-
+ /* set up the block info */
+ glamomci_reg_write(host, GLAMO_REG_MMC_DATBLKLEN, data->blksz);
+ glamomci_reg_write(host, GLAMO_REG_MMC_DATBLKCNT, data->blocks);
+
+- if (data->flags & MMC_DATA_WRITE) {
+- glamomci_reg_write(host, GLAMO_REG_MMC_WDATADS1, addr);
+- glamomci_reg_write(host, GLAMO_REG_MMC_WDATADS2, addr >> 16);
+- } else {
+- glamomci_reg_write(host, GLAMO_REG_MMC_RDATADS1, addr);
+- glamomci_reg_write(host, GLAMO_REG_MMC_RDATADS2, addr >> 16);
+- }
++ data->bytes_xfered = 0;
+
+- if ((data->flags & MMC_DATA_WRITE) && !data->host_cookie)
++ /* if write, prep the write into the shared RAM before the command */
++ if (data->flags & MMC_DATA_WRITE)
+ do_pio_write(host, data);
+
+ dev_dbg(&host->pdev->dev, "(blksz=%d, count=%d)\n",
+@@ -517,8 +569,6 @@ static void glamo_mci_send_request(struct mmc_host *mmc,
+ struct mmc_command *cmd = mrq->cmd;
+
+ host->request_counter++;
+- host->request_start = jiffies;
+-
+ if (cmd->data) {
+ if (glamo_mci_prepare_pio(host, cmd->data)) {
+ cmd->error = -EIO;
+@@ -639,42 +689,21 @@ static void glamo_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
+ mmc_host_lazy_disable(host->mmc);
+ }
+
+-static void glamo_mci_pre_request(struct mmc_host *mmc,
+- struct mmc_request *mrq, bool is_first_req)
+-{
+- struct glamo_mci_host *host = mmc_priv(mmc);
+-
+- mrq->data->host_cookie = (host->request_counter & 1) | 2;
+-
+- /* if write, prep the write into the shared RAM before the command */
+- if (mrq->data->flags & MMC_DATA_WRITE)
+- do_pio_write(host, mrq->data);
+-}
+
+-static void glamo_mci_post_request(struct mmc_host *mmc,
+- struct mmc_request *mrq, int err)
++/*
++ * no physical write protect supported by us
++ */
++static int glamo_mci_get_ro(struct mmc_host *mmc)
+ {
+- struct glamo_mci_host *host = mmc_priv(mmc);
+-
+- if (!mrq->data->host_cookie)
+- return;
+-
+- if (err)
+- return;
+-
+- if (mrq->data->flags & MMC_DATA_READ)
+- do_pio_read(host, mrq->data);
+-
+- mrq->data->host_cookie = 0;
++ return 0;
+ }
+
+ static struct mmc_host_ops glamo_mci_ops = {
+ .enable = glamo_mci_clock_enable,
+ .disable = glamo_mci_clock_disable,
+ .request = glamo_mci_send_request,
+- .post_req = glamo_mci_post_request,
+- .pre_req = glamo_mci_pre_request,
+ .set_ios = glamo_mci_set_ios,
++ .get_ro = glamo_mci_get_ro,
+ };
+
+ static int __devinit glamo_mci_probe(struct platform_device *pdev)
+@@ -702,6 +731,11 @@ static int __devinit glamo_mci_probe(struct platform_device *pdev)
+
+ host->irq = platform_get_irq(pdev, 0);
+
++#ifdef GLAMO_MCI_WORKER
++ INIT_WORK(&host->read_work, glamo_mci_read_worker);
++ host->workqueue = create_singlethread_workqueue("glamo-mci-read");
++#endif
++
+ host->regulator = regulator_get(pdev->dev.parent, "SD_3V3");
+ if (IS_ERR(host->regulator)) {
+ dev_err(&pdev->dev, "Cannot proceed without regulator.\n");
+@@ -789,7 +823,7 @@ static int __devinit glamo_mci_probe(struct platform_device *pdev)
+
+ mmc->max_blk_count = (1 << 16) - 1; /* GLAMO_REG_MMC_RB_BLKCNT */
+ mmc->max_blk_size = (1 << 12) - 1; /* GLAMO_REG_MMC_RB_BLKLEN */
+- mmc->max_req_size = resource_size(host->data_mem) / 2;
++ mmc->max_req_size = resource_size(host->data_mem);
+ mmc->max_seg_size = mmc->max_req_size;
+ mmc->max_segs = 128;
+
+@@ -834,6 +868,9 @@ probe_free_mem_region_mmio:
+ probe_regulator_put:
+ regulator_put(host->regulator);
+ probe_free_host:
++#ifdef GLAMO_MCI_WORKER
++ destroy_workqueue(host->workqueue);
++#endif
+ mmc_free_host(mmc);
+ probe_out:
+ return ret;
+@@ -844,6 +881,11 @@ static int __devexit glamo_mci_remove(struct platform_device *pdev)
+ struct mmc_host *mmc = platform_get_drvdata(pdev);
+ struct glamo_mci_host *host = mmc_priv(mmc);
+
++#ifdef GLAMO_MCI_WORKER
++ flush_workqueue(host->workqueue);
++ destroy_workqueue(host->workqueue);
++#endif
++
+ mmc_host_enable(mmc);
+ mmc_remove_host(mmc);
+ mmc_host_disable(mmc);
+diff --git a/drivers/mtd/nand/s3c2410.c b/drivers/mtd/nand/s3c2410.c
+index cb5d2c0..66b75c6 100644
+--- a/drivers/mtd/nand/s3c2410.c
++++ b/drivers/mtd/nand/s3c2410.c
+@@ -773,6 +773,7 @@ static void s3c2410_nand_init_chip(struct s3c2410_nand_info *info,
+ chip->priv = nmtd;
+ chip->options = set->options;
+ chip->controller = &info->controller;
++ chip->badblockbits = 8;
+
+ switch (info->cpu_type) {
+ case TYPE_S3C2410:
+diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h
+index 5bbfb71..07f27af 100644
+--- a/include/linux/mmc/core.h
++++ b/include/linux/mmc/core.h
+@@ -117,7 +117,6 @@ struct mmc_data {
+
+ unsigned int sg_len; /* size of scatter list */
+ struct scatterlist *sg; /* I/O scatter list */
+- s32 host_cookie; /* host private data */
+ };
+
+ struct mmc_request {
+@@ -125,19 +124,13 @@ struct mmc_request {
+ struct mmc_data *data;
+ struct mmc_command *stop;
+
+- struct completion completion;
++ void *done_data; /* completion data */
+ void (*done)(struct mmc_request *);/* completion function */
+ };
+
+ struct mmc_host;
+ struct mmc_card;
+
+-extern void mmc_pre_req(struct mmc_host *host, struct mmc_request *mrq,
+- bool is_first_req);
+-extern void mmc_post_req(struct mmc_host *host, struct mmc_request *mrq,
+- int err);
+-extern void mmc_start_req(struct mmc_host *host, struct mmc_request *mrq);
+-extern void mmc_wait_for_req_done(struct mmc_request *mrq);
+ extern void mmc_wait_for_req(struct mmc_host *, struct mmc_request *);
+ extern int mmc_wait_for_cmd(struct mmc_host *, struct mmc_command *, int);
+ extern int mmc_wait_for_app_cmd(struct mmc_host *, struct mmc_card *,
+diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
+index 8b2b44b..bcb793e 100644
+--- a/include/linux/mmc/host.h
++++ b/include/linux/mmc/host.h
+@@ -88,15 +88,6 @@ struct mmc_host_ops {
+ */
+ int (*enable)(struct mmc_host *host);
+ int (*disable)(struct mmc_host *host, int lazy);
+- /*
+- * It is optional for the host to implement pre_req and post_req in
+- * order to support double buffering of requests (prepare one
+- * request while another request is active).
+- */
+- void (*post_req)(struct mmc_host *host, struct mmc_request *req,
+- int err);
+- void (*pre_req)(struct mmc_host *host, struct mmc_request *req,
+- bool is_first_req);
+ void (*request)(struct mmc_host *host, struct mmc_request *req);
+ /*
+ * Avoid calling these three functions too often or in a "fast path",
+@@ -251,9 +242,7 @@ struct mmc_host {
+ #endif
+
+ struct dentry *debugfs_root;
+-#ifdef CONFIG_FAIL_MMC_REQUEST
+- u8 make_it_fail;
+-#endif
++
+ unsigned long private[0] ____cacheline_aligned;
+ };
+
+diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
+index 330fc70..c768bcd 100644
+--- a/lib/Kconfig.debug
++++ b/lib/Kconfig.debug
+@@ -1057,17 +1057,6 @@ config FAIL_IO_TIMEOUT
+ Only works with drivers that use the generic timeout handling,
+ for others it wont do anything.
+
+-config FAIL_MMC_REQUEST
+- bool "Fault-injection capability for MMC IO"
+- select DEBUG_FS
+- depends on FAULT_INJECTION
+- help
+- Provide fault-injection capability for MMC IO.
+- This will make the mmc core return data errors. This is
+- useful for testing the error handling in the mmc block device
+- and how the mmc host driver handle retries from
+- the block device.
+-
+ config FAULT_INJECTION_DEBUG_FS
+ bool "Debugfs entries for fault-injection capabilities"
+ depends on FAULT_INJECTION && SYSFS && DEBUG_FS
diff --git a/recipes-kernel/linux/linux-2.6.39/spitz/defconfig b/recipes-kernel/linux/linux-2.6.39/spitz/defconfig
new file mode 100644
index 0000000..43b22dc
--- /dev/null
+++ b/recipes-kernel/linux/linux-2.6.39/spitz/defconfig
@@ -0,0 +1,381 @@
+CONFIG_EXPERIMENTAL=y
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_IKCONFIG=m
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_LZO=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_EMBEDDED=y
+CONFIG_SLOB=y
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_LBDAF is not set
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+CONFIG_ARCH_PXA=y
+CONFIG_PXA_SHARPSL=y
+CONFIG_MACH_AKITA=y
+CONFIG_MACH_BORZOI=y
+CONFIG_PCCARD=y
+CONFIG_PCMCIA_PXA2XX=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_AEABI=y
+# CONFIG_OABI_COMPAT is not set
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 fbcon=rotate:1 quiet"
+CONFIG_KEXEC=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_BINFMT_AOUT=m
+CONFIG_BINFMT_MISC=m
+CONFIG_PM_RUNTIME=y
+CONFIG_NET=y
+CONFIG_PACKET=m
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=m
+CONFIG_INET=y
+CONFIG_INET_XFRM_MODE_TRANSPORT=m
+CONFIG_INET_XFRM_MODE_TUNNEL=m
+CONFIG_INET_XFRM_MODE_BEET=m
+# CONFIG_INET_LRO is not set
+CONFIG_INET_DIAG=m
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_IPV6_TUNNEL=m
+CONFIG_NETFILTER=y
+CONFIG_NF_CONNTRACK=m
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_H323=m
+CONFIG_NF_CONNTRACK_IRC=m
+CONFIG_NF_CONNTRACK_SIP=m
+CONFIG_NF_CONNTRACK_IPV4=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_NF_NAT=m
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_TTL=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+CONFIG_IRDA=m
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
+CONFIG_IRCOMM=m
+CONFIG_PXA_FICP=m
+CONFIG_BT=m
+CONFIG_BT_L2CAP=y
+CONFIG_BT_SCO=y
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+CONFIG_BT_HCIBTUSB=m
+CONFIG_BT_HCIBTSDIO=m
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIUART_ATH3K=y
+CONFIG_BT_HCIUART_LL=y
+CONFIG_BT_HCIBCM203X=m
+CONFIG_BT_HCIBPA10X=m
+CONFIG_BT_HCIBFUSB=m
+CONFIG_BT_HCIDTL1=m
+CONFIG_BT_HCIBT3C=m
+CONFIG_BT_HCIBLUECARD=m
+CONFIG_BT_HCIBTUART=m
+CONFIG_BT_HCIVHCI=m
+CONFIG_BT_MRVL=m
+CONFIG_BT_MRVL_SDIO=m
+CONFIG_BT_ATH3K=m
+CONFIG_CFG80211=m
+# CONFIG_CFG80211_DEFAULT_PS is not set
+CONFIG_MAC80211=m
+# CONFIG_MAC80211_RC_MINSTREL is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_MTD=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_ROM=y
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_VERIFY_WRITE=y
+CONFIG_MTD_NAND_SHARPSL=y
+CONFIG_MTD_UBI=y
+CONFIG_MTD_UBI_GLUEBI=m
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_MISC_DEVICES=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_BLK_DEV_SR=m
+CONFIG_CHR_DEV_SG=m
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_ATA=y
+CONFIG_PATA_PXA=y
+CONFIG_PATA_PCMCIA=y
+CONFIG_NETDEVICES=y
+CONFIG_TUN=m
+CONFIG_NET_ETHERNET=y
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+CONFIG_AIRO_CS=m
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_FIRMWARE=y
+CONFIG_HOSTAP_CS=m
+CONFIG_USB_CATC=m
+CONFIG_USB_KAWETH=m
+CONFIG_USB_PEGASUS=m
+CONFIG_USB_RTL8150=m
+CONFIG_USB_USBNET=m
+CONFIG_USB_NET_DM9601=m
+# CONFIG_USB_NET_CDC_SUBSET is not set
+CONFIG_USB_SIERRA_NET=m
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PPP=m
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
+CONFIG_INPUT_EVDEV=y
+CONFIG_INPUT_APMPOWER=y
+# CONFIG_KEYBOARD_ATKBD is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_KEYBOARD_MATRIX=y
+# CONFIG_INPUT_MOUSE is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_ADS7846=y
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+# CONFIG_SERIO is not set
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_RAMOOPS=y
+CONFIG_SPI=y
+CONFIG_SPI_PXA2XX=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_POWER_SUPPLY=y
+CONFIG_POWER_SUPPLY_DEBUG=y
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+CONFIG_FB=y
+CONFIG_FB_PXA=y
+CONFIG_FB_PXA_OVERLAY=y
+CONFIG_FB_PXA_SMARTPANEL=y
+CONFIG_FB_PXA_PARAMETERS=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_LCD_CORGI=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_DISPLAY_SUPPORT=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x16=y
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+CONFIG_SOUND=m
+CONFIG_SND=m
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_PXA2XX_AC97=m
+CONFIG_SND_USB_AUDIO=m
+CONFIG_SND_SOC=m
+CONFIG_SND_PXA2XX_SOC=m
+CONFIG_SND_PXA2XX_SOC_SPITZ=m
+CONFIG_HID=m
+CONFIG_USB_KBD=m
+CONFIG_USB_MOUSE=m
+CONFIG_USB=m
+CONFIG_USB_DEBUG=y
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+CONFIG_USB_DEVICEFS=y
+CONFIG_USB_OTG_WHITELIST=y
+CONFIG_USB_MON=m
+CONFIG_USB_OHCI_HCD=m
+CONFIG_USB_SL811_HCD=m
+CONFIG_USB_SL811_CS=m
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
+CONFIG_USB_STORAGE=m
+CONFIG_USB_MDC800=m
+CONFIG_USB_MICROTEK=m
+CONFIG_USB_SERIAL=m
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_BELKIN=m
+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
+CONFIG_USB_SERIAL_CYPRESS_M8=m
+CONFIG_USB_SERIAL_EMPEG=m
+CONFIG_USB_SERIAL_FTDI_SIO=m
+CONFIG_USB_SERIAL_VISOR=m
+CONFIG_USB_SERIAL_IPAQ=m
+CONFIG_USB_SERIAL_IR=m
+CONFIG_USB_SERIAL_EDGEPORT=m
+CONFIG_USB_SERIAL_EDGEPORT_TI=m
+CONFIG_USB_SERIAL_GARMIN=m
+CONFIG_USB_SERIAL_IPW=m
+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
+CONFIG_USB_SERIAL_KEYSPAN=m
+CONFIG_USB_SERIAL_KLSI=m
+CONFIG_USB_SERIAL_KOBIL_SCT=m
+CONFIG_USB_SERIAL_MCT_U232=m
+CONFIG_USB_SERIAL_PL2303=m
+CONFIG_USB_SERIAL_SAFE=m
+CONFIG_USB_SERIAL_TI=m
+CONFIG_USB_SERIAL_CYBERJACK=m
+CONFIG_USB_SERIAL_XIRCOM=m
+CONFIG_USB_SERIAL_OMNINET=m
+CONFIG_USB_EMI62=m
+CONFIG_USB_EMI26=m
+CONFIG_USB_RIO500=m
+CONFIG_USB_LEGOTOWER=m
+CONFIG_USB_LCD=m
+CONFIG_USB_LED=m
+CONFIG_USB_CYTHERM=m
+CONFIG_USB_IDMOUSE=m
+CONFIG_USB_GADGET=m
+CONFIG_USB_GADGET_DEBUG_FILES=y
+CONFIG_USB_GADGET_DEBUG_FS=y
+CONFIG_USB_GADGET_PXA27X=y
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_EEM=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+CONFIG_USB_MASS_STORAGE=m
+CONFIG_USB_G_SERIAL=m
+CONFIG_USB_CDC_COMPOSITE=m
+CONFIG_USB_G_MULTI=m
+CONFIG_USB_G_MULTI_CDC=y
+CONFIG_USB_GPIO_VBUS=m
+CONFIG_USB_ULPI=y
+CONFIG_NOP_USB_XCEIV=m
+CONFIG_MMC=y
+CONFIG_MMC_UNSAFE_RESUME=y
+CONFIG_MMC_PXA=y
+CONFIG_MMC_SPI=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_RTC_CLASS=m
+CONFIG_RTC_DRV_SA1100=m
+CONFIG_RTC_DRV_PXA=m
+CONFIG_EXT2_FS=y
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+# CONFIG_EXT3_FS_XATTR is not set
+CONFIG_EXT4_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_SUMMARY=y
+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+CONFIG_JFFS2_LZO=y
+CONFIG_JFFS2_RUBIN=y
+CONFIG_UBIFS_FS=y
+CONFIG_UBIFS_FS_ADVANCED_COMPR=y
+CONFIG_CRAMFS=m
+CONFIG_NFS_FS=m
+CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V4=y
+CONFIG_CIFS=m
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_NLS_DEFAULT="cp437"
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=m
+CONFIG_NLS_CODEPAGE_775=m
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_852=m
+CONFIG_NLS_CODEPAGE_855=m
+CONFIG_NLS_CODEPAGE_857=m
+CONFIG_NLS_CODEPAGE_860=m
+CONFIG_NLS_CODEPAGE_861=m
+CONFIG_NLS_CODEPAGE_862=m
+CONFIG_NLS_CODEPAGE_863=m
+CONFIG_NLS_CODEPAGE_864=m
+CONFIG_NLS_CODEPAGE_865=m
+CONFIG_NLS_CODEPAGE_866=m
+CONFIG_NLS_CODEPAGE_869=m
+CONFIG_NLS_CODEPAGE_936=m
+CONFIG_NLS_CODEPAGE_950=m
+CONFIG_NLS_CODEPAGE_932=m
+CONFIG_NLS_CODEPAGE_949=m
+CONFIG_NLS_CODEPAGE_874=m
+CONFIG_NLS_ISO8859_8=m
+CONFIG_NLS_CODEPAGE_1250=m
+CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+CONFIG_NLS_KOI8_R=m
+CONFIG_NLS_KOI8_U=m
+CONFIG_NLS_UTF8=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_FS=y
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_TEST=m
+CONFIG_CRYPTO_PCBC=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_CAMELLIA=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_TWOFISH=m
+# CONFIG_CRYPTO_HW is not set
+CONFIG_CRC_CCITT=y
+CONFIG_LIBCRC32C=m
diff --git a/recipes-kernel/linux/linux-2.6.39/tosa/defconfig b/recipes-kernel/linux/linux-2.6.39/tosa/defconfig
new file mode 100644
index 0000000..4b72d03
--- /dev/null
+++ b/recipes-kernel/linux/linux-2.6.39/tosa/defconfig
@@ -0,0 +1,381 @@
+CONFIG_EXPERIMENTAL=y
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_IKCONFIG=m
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_LZO=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_EMBEDDED=y
+CONFIG_SLOB=y
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_LBDAF is not set
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+CONFIG_ARCH_PXA=y
+CONFIG_PXA_SHARPSL=y
+CONFIG_MACH_TOSA=y
+CONFIG_TOSA_BT=m
+CONFIG_PCCARD=y
+CONFIG_PCMCIA_PXA2XX=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_AEABI=y
+# CONFIG_OABI_COMPAT is not set
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 quiet"
+CONFIG_KEXEC=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_BINFMT_AOUT=m
+CONFIG_BINFMT_MISC=m
+CONFIG_PM_RUNTIME=y
+CONFIG_APM_EMULATION=y
+CONFIG_NET=y
+CONFIG_PACKET=m
+CONFIG_UNIX=y
+CONFIG_XFRM_USER=m
+CONFIG_INET=y
+CONFIG_INET_XFRM_MODE_TRANSPORT=m
+CONFIG_INET_XFRM_MODE_TUNNEL=m
+CONFIG_INET_XFRM_MODE_BEET=m
+# CONFIG_INET_LRO is not set
+CONFIG_INET_DIAG=m
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+CONFIG_INET6_IPCOMP=m
+CONFIG_IPV6_TUNNEL=m
+CONFIG_NETFILTER=y
+CONFIG_NF_CONNTRACK=m
+CONFIG_NF_CONNTRACK_FTP=m
+CONFIG_NF_CONNTRACK_H323=m
+CONFIG_NF_CONNTRACK_IRC=m
+CONFIG_NF_CONNTRACK_SIP=m
+CONFIG_NF_CONNTRACK_IPV4=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_NF_NAT=m
+CONFIG_IP_NF_TARGET_MASQUERADE=m
+CONFIG_IP_NF_TARGET_NETMAP=m
+CONFIG_IP_NF_TARGET_REDIRECT=m
+CONFIG_IP_NF_MANGLE=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_TTL=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
+CONFIG_IRDA=m
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
+CONFIG_IRCOMM=m
+CONFIG_PXA_FICP=m
+CONFIG_BT=m
+CONFIG_BT_L2CAP=y
+CONFIG_BT_SCO=y
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+CONFIG_BT_HCIBTUSB=m
+CONFIG_BT_HCIBTSDIO=m
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIUART_ATH3K=y
+CONFIG_BT_HCIUART_LL=y
+CONFIG_BT_HCIBCM203X=m
+CONFIG_BT_HCIBPA10X=m
+CONFIG_BT_HCIBFUSB=m
+CONFIG_BT_HCIDTL1=m
+CONFIG_BT_HCIBT3C=m
+CONFIG_BT_HCIBLUECARD=m
+CONFIG_BT_HCIBTUART=m
+CONFIG_BT_HCIVHCI=m
+CONFIG_BT_MRVL=m
+CONFIG_BT_MRVL_SDIO=m
+CONFIG_BT_ATH3K=m
+CONFIG_CFG80211=m
+# CONFIG_CFG80211_DEFAULT_PS is not set
+CONFIG_MAC80211=m
+# CONFIG_MAC80211_RC_MINSTREL is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_MTD=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_ROM=y
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_VERIFY_WRITE=y
+CONFIG_MTD_NAND_TMIO=y
+CONFIG_MTD_UBI=y
+CONFIG_MTD_UBI_GLUEBI=m
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_MISC_DEVICES=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_BLK_DEV_SR=m
+CONFIG_CHR_DEV_SG=m
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_ATA=y
+# CONFIG_SATA_PMP is not set
+CONFIG_PATA_PXA=y
+CONFIG_PATA_PCMCIA=y
+CONFIG_NETDEVICES=y
+CONFIG_TUN=m
+CONFIG_NET_ETHERNET=y
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+CONFIG_AIRO_CS=m
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_FIRMWARE=y
+CONFIG_HOSTAP_CS=m
+CONFIG_USB_CATC=m
+CONFIG_USB_KAWETH=m
+CONFIG_USB_PEGASUS=m
+CONFIG_USB_RTL8150=m
+CONFIG_USB_USBNET=m
+CONFIG_USB_NET_DM9601=m
+# CONFIG_USB_NET_CDC_SUBSET is not set
+CONFIG_USB_SIERRA_NET=m
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PPP=m
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=480
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640
+CONFIG_INPUT_EVDEV=y
+CONFIG_INPUT_APMPOWER=y
+# CONFIG_KEYBOARD_ATKBD is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_KEYBOARD_MATRIX=y
+# CONFIG_INPUT_MOUSE is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+# CONFIG_SERIO is not set
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_RAMOOPS=y
+CONFIG_I2C=y
+CONFIG_I2C_PXA=y
+CONFIG_SPI=y
+CONFIG_SPI_PXA2XX=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_POWER_SUPPLY=y
+CONFIG_POWER_SUPPLY_DEBUG=y
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+CONFIG_SENSORS_MAX1111=y
+CONFIG_MFD_TC6393XB=y
+CONFIG_FB=y
+CONFIG_FB_TMIO=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_LCD_TOSA=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_TOSA=y
+CONFIG_DISPLAY_SUPPORT=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x16=y
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+CONFIG_SOUND=m
+CONFIG_SND=m
+CONFIG_SND_SEQUENCER=m
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_PXA2XX_AC97=m
+CONFIG_SND_USB_AUDIO=m
+CONFIG_SND_SOC=m
+CONFIG_SND_PXA2XX_SOC=m
+CONFIG_SND_PXA2XX_SOC_TOSA=m
+CONFIG_HID=m
+CONFIG_USB_KBD=m
+CONFIG_USB_MOUSE=m
+CONFIG_USB=m
+CONFIG_USB_DEBUG=y
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+CONFIG_USB_DEVICEFS=y
+CONFIG_USB_OTG_WHITELIST=y
+CONFIG_USB_MON=m
+CONFIG_USB_SL811_HCD=m
+CONFIG_USB_SL811_CS=m
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
+CONFIG_USB_STORAGE=m
+CONFIG_USB_MDC800=m
+CONFIG_USB_MICROTEK=m
+CONFIG_USB_SERIAL=m
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_BELKIN=m
+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
+CONFIG_USB_SERIAL_CYPRESS_M8=m
+CONFIG_USB_SERIAL_EMPEG=m
+CONFIG_USB_SERIAL_FTDI_SIO=m
+CONFIG_USB_SERIAL_VISOR=m
+CONFIG_USB_SERIAL_IPAQ=m
+CONFIG_USB_SERIAL_IR=m
+CONFIG_USB_SERIAL_EDGEPORT=m
+CONFIG_USB_SERIAL_EDGEPORT_TI=m
+CONFIG_USB_SERIAL_GARMIN=m
+CONFIG_USB_SERIAL_IPW=m
+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
+CONFIG_USB_SERIAL_KEYSPAN=m
+CONFIG_USB_SERIAL_KLSI=m
+CONFIG_USB_SERIAL_KOBIL_SCT=m
+CONFIG_USB_SERIAL_MCT_U232=m
+CONFIG_USB_SERIAL_PL2303=m
+CONFIG_USB_SERIAL_SAFE=m
+CONFIG_USB_SERIAL_TI=m
+CONFIG_USB_SERIAL_CYBERJACK=m
+CONFIG_USB_SERIAL_XIRCOM=m
+CONFIG_USB_SERIAL_OMNINET=m
+CONFIG_USB_EMI62=m
+CONFIG_USB_EMI26=m
+CONFIG_USB_RIO500=m
+CONFIG_USB_LEGOTOWER=m
+CONFIG_USB_LCD=m
+CONFIG_USB_LED=m
+CONFIG_USB_CYTHERM=m
+CONFIG_USB_IDMOUSE=m
+CONFIG_USB_GADGET=m
+CONFIG_USB_GADGET_DEBUG_FILES=y
+CONFIG_USB_GADGET_DEBUG_FS=y
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_EEM=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+CONFIG_USB_MASS_STORAGE=m
+CONFIG_USB_G_SERIAL=m
+CONFIG_USB_CDC_COMPOSITE=m
+CONFIG_USB_G_MULTI=m
+CONFIG_USB_G_MULTI_CDC=y
+CONFIG_USB_GPIO_VBUS=m
+CONFIG_USB_ULPI=y
+CONFIG_NOP_USB_XCEIV=m
+CONFIG_MMC=y
+CONFIG_MMC_UNSAFE_RESUME=y
+CONFIG_MMC_PXA=y
+CONFIG_MMC_SPI=y
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_RTC_CLASS=m
+CONFIG_RTC_DRV_SA1100=m
+CONFIG_RTC_DRV_PXA=m
+CONFIG_EXT2_FS=y
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+# CONFIG_EXT3_FS_XATTR is not set
+CONFIG_EXT4_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_SUMMARY=y
+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+CONFIG_JFFS2_LZO=y
+CONFIG_JFFS2_RUBIN=y
+CONFIG_UBIFS_FS=y
+CONFIG_UBIFS_FS_ADVANCED_COMPR=y
+CONFIG_CRAMFS=m
+CONFIG_NFS_FS=m
+CONFIG_NFS_V3=y
+CONFIG_NFS_V4=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V4=y
+CONFIG_CIFS=m
+CONFIG_PARTITION_ADVANCED=y
+CONFIG_NLS_DEFAULT="cp437"
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=m
+CONFIG_NLS_CODEPAGE_775=m
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_852=m
+CONFIG_NLS_CODEPAGE_855=m
+CONFIG_NLS_CODEPAGE_857=m
+CONFIG_NLS_CODEPAGE_860=m
+CONFIG_NLS_CODEPAGE_861=m
+CONFIG_NLS_CODEPAGE_862=m
+CONFIG_NLS_CODEPAGE_863=m
+CONFIG_NLS_CODEPAGE_864=m
+CONFIG_NLS_CODEPAGE_865=m
+CONFIG_NLS_CODEPAGE_866=m
+CONFIG_NLS_CODEPAGE_869=m
+CONFIG_NLS_CODEPAGE_936=m
+CONFIG_NLS_CODEPAGE_950=m
+CONFIG_NLS_CODEPAGE_932=m
+CONFIG_NLS_CODEPAGE_949=m
+CONFIG_NLS_CODEPAGE_874=m
+CONFIG_NLS_ISO8859_8=m
+CONFIG_NLS_CODEPAGE_1250=m
+CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+CONFIG_NLS_KOI8_R=m
+CONFIG_NLS_KOI8_U=m
+CONFIG_NLS_UTF8=y
+CONFIG_MAGIC_SYSRQ=y
+CONFIG_DEBUG_FS=y
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_TEST=m
+CONFIG_CRYPTO_PCBC=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_WP512=m
+CONFIG_CRYPTO_ANUBIS=m
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_CAMELLIA=m
+CONFIG_CRYPTO_CAST5=m
+CONFIG_CRYPTO_CAST6=m
+CONFIG_CRYPTO_KHAZAD=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_TEA=m
+CONFIG_CRYPTO_TWOFISH=m
+# CONFIG_CRYPTO_HW is not set
+CONFIG_CRC_CCITT=y
+CONFIG_LIBCRC32C=m
diff --git a/recipes-kernel/linux/linux-hackndev-2.6/palmld/defconfig b/recipes-kernel/linux/linux-hackndev-2.6/palmld/defconfig
new file mode 100644
index 0000000..26d10ae
--- /dev/null
+++ b/recipes-kernel/linux/linux-hackndev-2.6/palmld/defconfig
@@ -0,0 +1,1346 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hnd2
+# Tue Jul 3 14:32:58 2007
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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 is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+# CONFIG_BLK_DEV_INITRD is not set
+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_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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+# CONFIG_KMOD is not set
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+# CONFIG_BOARD_IRQ_MAP_BIG is not set
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+CONFIG_MACH_XSCALE_PALMLD=y
+CONFIG_PALMLD_PCMCIA=m
+# CONFIG_PALMLD_USB is not set
+CONFIG_PALMLD_IDE=m
+CONFIG_PALMLD_BATTERY=m
+CONFIG_PALMLD_PM=y
+# CONFIG_MACH_XSCALE_PALMTREO650 is not set
+# CONFIG_MACH_XSCALE_TREO680 is not set
+# CONFIG_MACH_T700WX is not set
+# CONFIG_MACH_TUNGE2 is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_XSCALE_PALMTT5 is not set
+# CONFIG_MACH_XSCALE_PALMTX is not set
+# CONFIG_MACH_PALMZ72 is not set
+# CONFIG_MACH_OMAP_PALMTC is not set
+# CONFIG_MACH_ZIRE31 is not set
+CONFIG_GPIOED=m
+CONFIG_GPIOEDNG=m
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA27x=y
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+CONFIG_IWMMXT=y
+# CONFIG_ARMBOOT_PROC is not set
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+CONFIG_PCCARD=m
+CONFIG_PCMCIA_DEBUG=y
+CONFIG_PCMCIA=m
+# CONFIG_PCMCIA_LOAD_CIS is not set
+CONFIG_PCMCIA_IOCTL=y
+
+#
+# PC-card bridges
+#
+CONFIG_PCMCIA_PXA2XX=m
+
+#
+# Kernel Features
+#
+# CONFIG_PREEMPT is not set
+# CONFIG_NO_IDLE_HZ is not set
+CONFIG_HZ=100
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE=""
+# CONFIG_XIP_KERNEL is not set
+# CONFIG_KEXEC is not set
+# CONFIG_TXTOFFSET_DELTA is not set
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+# CONFIG_DPM_DEBUG is not set
+# CONFIG_PM_SYSFS_DEPRECATED is not set
+CONFIG_APM_EMULATION=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_XFRM_MIGRATE is not set
+CONFIG_NET_KEY=y
+# CONFIG_NET_KEY_MIGRATE 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 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 is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+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_TCP_MD5SIG is not set
+# 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=y
+
+#
+# IrDA protocols
+#
+CONFIG_IRLAN=y
+CONFIG_IRNET=y
+CONFIG_IRCOMM=y
+CONFIG_IRDA_ULTRA=y
+
+#
+# IrDA options
+#
+# CONFIG_IRDA_CACHE_LAST_LSAP is not set
+# CONFIG_IRDA_FAST_RR is not set
+# CONFIG_IRDA_DEBUG is not set
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+# CONFIG_IRTTY_SIR is not set
+
+#
+# Dongle support
+#
+
+#
+# Old SIR device drivers
+#
+# CONFIG_IRPORT_SIR is not set
+
+#
+# Old Serial dongle support
+#
+
+#
+# FIR device drivers
+#
+CONFIG_PXA_FICP=y
+CONFIG_BT=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+# CONFIG_BT_HCIUART_BCSP is not set
+# CONFIG_BT_HCIDTL1 is not set
+# CONFIG_BT_HCIBT3C is not set
+CONFIG_BT_BCM2035UART=m
+# CONFIG_BT_HCIBLUECARD is not set
+# CONFIG_BT_HCIBTUART is not set
+# CONFIG_BT_HCIVHCI is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=m
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+# CONFIG_MTD_BLKDEVS is not set
+# CONFIG_MTD_BLOCK is not set
+# CONFIG_MTD_BLOCK_RO is not set
+# 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=m
+CONFIG_MTD_JEDECPROBE=m
+CONFIG_MTD_GEN_PROBE=m
+# 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 is not set
+# 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=m
+CONFIG_MTD_CFI_AMDSTD=m
+CONFIG_MTD_CFI_STAA=m
+CONFIG_MTD_CFI_UTIL=m
+CONFIG_MTD_RAM=m
+CONFIG_MTD_ROM=m
+CONFIG_MTD_ABSENT=m
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+# CONFIG_MTD_XIP 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_IPAQ is not set
+# CONFIG_MTD_IMPA7 is not set
+# CONFIG_MTD_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI 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 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_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# 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_IDECS is not set
+# CONFIG_BLK_DEV_IDECD is not set
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY 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_IDEDMA 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
+
+#
+# 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
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+# CONFIG_LIBERTAS is not set
+# CONFIG_LIBERTAS_CF8305 is not set
+# CONFIG_LIBERTAS_CF8381 is not set
+# CONFIG_LIBERTAS_CF8385 is not set
+
+#
+# PCMCIA network device support
+#
+# CONFIG_NET_PCMCIA is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+CONFIG_PPP=y
+# CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=y
+CONFIG_PPP_SYNC_TTY=y
+CONFIG_PPP_DEFLATE=y
+# CONFIG_PPP_BSDCOMP is not set
+# CONFIG_PPP_MPPE is not set
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=y
+# 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=y
+CONFIG_INPUT_TSDEV_SCREEN_X=320
+CONFIG_INPUT_TSDEV_SCREEN_Y=480
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+CONFIG_KEYBOARD_PXA27x=y
+CONFIG_KEYBOARD_GPIO=y
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+# CONFIG_TOUCHSCREEN_PALMTC is not set
+CONFIG_TOUCHSCREEN_WM97XX=m
+# CONFIG_TOUCHSCREEN_WM9705 is not set
+CONFIG_TOUCHSCREEN_WM9712=y
+# CONFIG_TOUCHSCREEN_WM9713 is not set
+# CONFIG_TOUCHSCREEN_WM97XX_PXA is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+# CONFIG_SERIAL_8250_CS is not set
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+# CONFIG_SERIAL_PXA_IR is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=m
+# CONFIG_NVRAM is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+# CONFIG_BATTERY_DS2760 is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+# CONFIG_BATTCHARGE_MONITOR is not set
+
+#
+# Multimedia Capabilities Port drivers
+#
+# CONFIG_ADC is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=m
+
+#
+# LED drivers
+#
+CONFIG_LEDS_PALMLD=m
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=m
+CONFIG_LEDS_TRIGGER_HWTIMER=m
+CONFIG_LEDS_TRIGGER_IDE_DISK=y
+CONFIG_LEDS_TRIGGER_MMC_CARD=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=m
+# CONFIG_LEDS_TRIGGER_SHARED is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=m
+CONFIG_LCD_CLASS_DEVICE=m
+CONFIG_BACKLIGHT_CORGI=y
+# CONFIG_BACKLIGHT_PXAPWM is not set
+CONFIG_FB=y
+CONFIG_FIRMWARE_EDID=y
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_BACKLIGHT is not set
+# CONFIG_FB_MODE_HELPERS is not set
+CONFIG_FB_TILEBLITTING=y
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+# CONFIG_FB_PXA_PARAMETERS is not set
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=m
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+CONFIG_SND_SEQUENCER=m
+# CONFIG_SND_SEQ_DUMMY is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_PCM_OSS_PLUGINS=y
+CONFIG_SND_SEQUENCER_OSS=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_AC97_CODEC=m
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_VIRMIDI is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+# CONFIG_SND_PXA2xx_I2SOUND is not set
+CONFIG_SND_PXA2XX_PCM=m
+CONFIG_SND_PXA2XX_AC97=m
+
+#
+# PCMCIA devices
+#
+# CONFIG_SND_VXPOCKET is not set
+# CONFIG_SND_PDAUDIOCF is not set
+
+#
+# SoC audio support
+#
+# CONFIG_SND_SOC is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+CONFIG_AC97_BUS=m
+
+#
+# HID Devices
+#
+CONFIG_HID=y
+# CONFIG_HID_DEBUG 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 is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=m
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+# CONFIG_USB_GADGET_PXA27X is not set
+CONFIG_USB_GADGET_SX2=y
+CONFIG_USB_SX2=m
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+# CONFIG_USB_ETH is not set
+# CONFIG_USB_GADGETFS is not set
+# CONFIG_USB_FILE_STORAGE is not set
+# CONFIG_USB_G_SERIAL is not set
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_PXA=y
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP 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_EPOCH=1904
+# 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_CMOS is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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 is not set
+# CONFIG_EXT4DEV_FS is not set
+# 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=y
+# CONFIG_ROMFS_FS is not set
+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_AUFS 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_JFFS2_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_SQUASHFS is not set
+# CONFIG_SQUASHFS_LZMA 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
+# CONFIG_UNION_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_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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf-8"
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=y
+CONFIG_NLS_CODEPAGE_775=y
+CONFIG_NLS_CODEPAGE_850=y
+CONFIG_NLS_CODEPAGE_852=y
+CONFIG_NLS_CODEPAGE_855=y
+CONFIG_NLS_CODEPAGE_857=y
+CONFIG_NLS_CODEPAGE_860=y
+CONFIG_NLS_CODEPAGE_861=y
+CONFIG_NLS_CODEPAGE_862=y
+CONFIG_NLS_CODEPAGE_863=y
+CONFIG_NLS_CODEPAGE_864=y
+CONFIG_NLS_CODEPAGE_865=y
+CONFIG_NLS_CODEPAGE_866=y
+CONFIG_NLS_CODEPAGE_869=y
+# 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=y
+CONFIG_NLS_CODEPAGE_1250=y
+CONFIG_NLS_CODEPAGE_1251=y
+CONFIG_NLS_ASCII=y
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=y
+CONFIG_NLS_ISO8859_3=y
+CONFIG_NLS_ISO8859_4=y
+CONFIG_NLS_ISO8859_5=y
+CONFIG_NLS_ISO8859_6=y
+CONFIG_NLS_ISO8859_7=y
+CONFIG_NLS_ISO8859_9=y
+CONFIG_NLS_ISO8859_13=y
+CONFIG_NLS_ISO8859_14=y
+CONFIG_NLS_ISO8859_15=y
+CONFIG_NLS_KOI8_R=y
+CONFIG_NLS_KOI8_U=y
+CONFIG_NLS_UTF8=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM 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 is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_SMALLOOPS is not set
+# CONFIG_DEBUG_KERNEL is not set
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_FRAME_POINTER=y
+# CONFIG_DEBUG_USER is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+# CONFIG_CRYPTO_SHA1 is not set
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+CONFIG_CRYPTO_CBC=m
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+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
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-hackndev-2.6/palmt650/defconfig b/recipes-kernel/linux/linux-hackndev-2.6/palmt650/defconfig
new file mode 100644
index 0000000..a013bee
--- /dev/null
+++ b/recipes-kernel/linux/linux-hackndev-2.6/palmt650/defconfig
@@ -0,0 +1,1295 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hnd2
+# Thu Jul 19 11:45:05 2007
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=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_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+# CONFIG_IOSCHED_CFQ is not set
+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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+# CONFIG_BOARD_IRQ_MAP_BIG is not set
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+CONFIG_MACH_XSCALE_PALMTREO650=y
+CONFIG_MACH_XSCALE_PALMTREO650_PM=y
+# CONFIG_MACH_XSCALE_TREO680 is not set
+# CONFIG_MACH_T700WX is not set
+# CONFIG_MACH_TUNGE2 is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_XSCALE_PALMTT5 is not set
+# CONFIG_MACH_XSCALE_PALMTX is not set
+# CONFIG_MACH_PALMZ72 is not set
+# CONFIG_MACH_OMAP_PALMTC is not set
+# CONFIG_MACH_ZIRE31 is not set
+# CONFIG_GPIOED is not set
+# CONFIG_GPIOEDNG is not set
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA27x=y
+# CONFIG_PXA27x_VOLTAGE is not set
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+CONFIG_IWMMXT=y
+# CONFIG_ARMBOOT_PROC is not set
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
+CONFIG_CPU_FREQ_PXA=y
+CONFIG_PXA25x_ALTERNATE_FREQS=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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 is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+# 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=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+# CONFIG_NETFILTER_XTABLES is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+# CONFIG_IP_NF_IPTABLES is not set
+# CONFIG_IP_NF_ARPTABLES 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=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+# CONFIG_BT_BCM2035UART is not set
+# CONFIG_BT_HCIVHCI is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=m
+CONFIG_MTD_DEBUG=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+# CONFIG_MTD_BLKDEVS is not set
+# CONFIG_MTD_BLOCK is not set
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+# CONFIG_MTD_JEDECPROBE 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 is not set
+# 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_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+CONFIG_KEYBOARD_PXA27x=y
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+# CONFIG_TOUCHSCREEN_ADC is not set
+# CONFIG_TOUCHSCREEN_ADC_DEBOUNCE is not set
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+# CONFIG_TOUCHSCREEN_PALMTC is not set
+CONFIG_TOUCHSCREEN_WM97XX=m
+# CONFIG_TOUCHSCREEN_WM9705 is not set
+CONFIG_TOUCHSCREEN_WM9712=y
+# CONFIG_TOUCHSCREEN_WM9713 is not set
+# CONFIG_TOUCHSCREEN_WM97XX_PXA is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+CONFIG_SERIAL_PXA_IR=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+# CONFIG_BATTERY_DS2760 is not set
+# CONFIG_ADC_BATTERY is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+# CONFIG_BATTCHARGE_MONITOR is not set
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+# CONFIG_ADC_ADS7846_SSP is not set
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+CONFIG_LEDS_PALMT650=y
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+# CONFIG_LEDS_TRIGGER_HWTIMER is not set
+# CONFIG_LEDS_TRIGGER_MMC_CARD is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+# CONFIG_BACKLIGHT_PXAPWM is not set
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+# CONFIG_FB_PXA_PARAMETERS is not set
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+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_AC97_CODEC=m
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+# CONFIG_SND_PXA2xx_I2SOUND is not set
+CONFIG_SND_PXA2XX_PCM=m
+CONFIG_SND_PXA2XX_AC97=m
+
+#
+# SoC audio support
+#
+# CONFIG_SND_SOC is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+CONFIG_AC97_BUS=m
+
+#
+# HID Devices
+#
+CONFIG_HID=m
+# CONFIG_HID_DEBUG 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 is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+CONFIG_USB_GADGET_PXA27X=y
+CONFIG_USB_PXA27X=y
+# CONFIG_USB_PXA27X_DMA is not set
+# CONFIG_USB_GADGET_SX2 is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+# CONFIG_USB_ZERO is not set
+CONFIG_USB_ETH=y
+CONFIG_USB_ETH_RNDIS=y
+# CONFIG_USB_GADGETFS is not set
+# CONFIG_USB_FILE_STORAGE is not set
+# CONFIG_USB_G_SERIAL is not set
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+# CONFIG_USB_PXA2XX_GPIO is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_PXA=y
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP 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_EPOCH=1970
+CONFIG_RTC_DEBUG=y
+
+#
+# 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_CMOS is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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 is not set
+# CONFIG_EXT4DEV_FS is not set
+# 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 is not set
+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=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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_AUFS 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_JFFS2_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_SQUASHFS is not set
+# CONFIG_SQUASHFS_LZMA 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
+# CONFIG_UNION_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL 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_LOCKD_V4=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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+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_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=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_SMALLOOPS is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-hackndev-2.6/palmtc/defconfig b/recipes-kernel/linux/linux-hackndev-2.6/palmtc/defconfig
new file mode 100644
index 0000000..fac96df
--- /dev/null
+++ b/recipes-kernel/linux/linux-hackndev-2.6/palmtc/defconfig
@@ -0,0 +1,1208 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.20-hnd0
+# Mon Apr 23 22:34:55 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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ARCH_MTD_XIP=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 is not set
+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_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+# CONFIG_INITRAMFS_SOURCE is not set
+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_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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+# CONFIG_KMOD is not set
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+# CONFIG_IOSCHED_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+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_IOP13XX 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=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_XSCALE_PALMTREO650 is not set
+# CONFIG_MACH_XSCALE_TREO680 is not set
+# CONFIG_MACH_T700WX is not set
+# CONFIG_MACH_TUNGE2 is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_XSCALE_PALMTT5 is not set
+# CONFIG_MACH_XSCALE_PALMTX is not set
+# CONFIG_MACH_PALMZ72 is not set
+CONFIG_MACH_OMAP_PALMTC=y
+CONFIG_PALMTC_KEYBOARD=m
+# CONFIG_PALMTC_UCB1400 is not set
+CONFIG_PALMTC_PCMCIA=m
+# CONFIG_MACH_ZIRE31 is not set
+CONFIG_GPIOED=m
+CONFIG_GPIOEDNG=m
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA25x=y
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+CONFIG_IWMMXT=y
+# CONFIG_ARMBOOT_PROC is not set
+CONFIG_XSCALE_PMU=y
+# CONFIG_KEXEC is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+CONFIG_PCCARD=m
+# CONFIG_PCMCIA_DEBUG is not set
+CONFIG_PCMCIA=m
+CONFIG_PCMCIA_LOAD_CIS=y
+CONFIG_PCMCIA_IOCTL=y
+
+#
+# PC-card bridges
+#
+CONFIG_PCMCIA_PXA2XX=m
+
+#
+# Kernel Features
+#
+# CONFIG_PREEMPT is not set
+# CONFIG_NO_IDLE_HZ is not set
+CONFIG_HZ=100
+# 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=""
+# CONFIG_XIP_KERNEL is not set
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+# CONFIG_DPM_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=m
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=m
+# 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 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 is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# 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=m
+
+#
+# IrDA protocols
+#
+CONFIG_IRLAN=m
+CONFIG_IRCOMM=m
+CONFIG_IRDA_ULTRA=y
+
+#
+# IrDA options
+#
+# CONFIG_IRDA_CACHE_LAST_LSAP is not set
+# CONFIG_IRDA_FAST_RR is not set
+# CONFIG_IRDA_DEBUG is not set
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+# CONFIG_IRTTY_SIR is not set
+
+#
+# Dongle support
+#
+
+#
+# Old SIR device drivers
+#
+# CONFIG_IRPORT_SIR is not set
+
+#
+# Old Serial dongle support
+#
+
+#
+# FIR device drivers
+#
+CONFIG_PXA_FICP=m
+# CONFIG_BT is not set
+CONFIG_IEEE80211=m
+# CONFIG_IEEE80211_DEBUG is not set
+CONFIG_IEEE80211_CRYPT_WEP=m
+CONFIG_IEEE80211_CRYPT_CCMP=m
+CONFIG_IEEE80211_CRYPT_TKIP=m
+CONFIG_IEEE80211_SOFTMAC=m
+# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set
+CONFIG_WIRELESS_EXT=y
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# 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 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 is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# 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_PCMCIA_WAVELAN is not set
+# CONFIG_PCMCIA_NETWAVE is not set
+
+#
+# Wireless 802.11 Frequency Hopping cards support
+#
+# CONFIG_PCMCIA_RAYCS is not set
+
+#
+# Wireless 802.11b ISA/PCI cards support
+#
+# CONFIG_LIBERTAS is not set
+# CONFIG_HERMES is not set
+# CONFIG_ATMEL is not set
+
+#
+# Wireless 802.11b Pcmcia/Cardbus cards support
+#
+# CONFIG_AIRO_CS is not set
+# CONFIG_PCMCIA_WL3501 is not set
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_FIRMWARE=y
+# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set
+CONFIG_HOSTAP_CS=m
+# CONFIG_ACX is not set
+CONFIG_NET_WIRELESS=y
+
+#
+# PCMCIA network device support
+#
+# CONFIG_NET_PCMCIA is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=320
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320
+# CONFIG_INPUT_JOYDEV is not set
+CONFIG_INPUT_TSDEV=y
+CONFIG_INPUT_TSDEV_SCREEN_X=320
+CONFIG_INPUT_TSDEV_SCREEN_Y=320
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIO_KEYS is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+# CONFIG_TOUCHSCREEN_ADC is not set
+# CONFIG_TOUCHSCREEN_ADC_DEBOUNCE is not set
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_TOUCHSCREEN_PALMTC=m
+CONFIG_TOUCHSCREEN_WM97XX=m
+# CONFIG_TOUCHSCREEN_WM9705 is not set
+CONFIG_TOUCHSCREEN_WM9712=y
+# CONFIG_TOUCHSCREEN_WM9713 is not set
+# CONFIG_TOUCHSCREEN_WM97XX_PXA is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+# CONFIG_SERIAL_8250_CS is not set
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+# CONFIG_SERIAL_PXA_IR is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=m
+# CONFIG_NVRAM is not set
+
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+
+#
+# Hardware Monitoring - Battery
+#
+CONFIG_BATTERY_MONITOR=m
+# CONFIG_ADC_BATTERY is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# SoC drivers
+#
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# Misc devices
+#
+# CONFIG_BATTCHARGE_MONITOR is not set
+
+#
+# Multimedia Capabilities Port drivers
+#
+# CONFIG_MCP is not set
+# CONFIG_ADC_ADS7846_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+# CONFIG_TIFM_CORE is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=m
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=m
+CONFIG_LEDS_TRIGGER_HWTIMER=m
+CONFIG_LEDS_TRIGGER_MMC_CARD=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=m
+# CONFIG_LEDS_TRIGGER_SHARED is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_FIRMWARE_EDID=y
+CONFIG_FB=y
+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=y
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+# CONFIG_FB_PXA_PARAMETERS is not set
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=m
+CONFIG_BACKLIGHT_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=m
+CONFIG_LCD_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+# CONFIG_BACKLIGHT_PXAPWM is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=m
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+CONFIG_SND_SEQUENCER=m
+# CONFIG_SND_SEQ_DUMMY is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_PCM_OSS_PLUGINS=y
+CONFIG_SND_SEQUENCER_OSS=y
+# CONFIG_SND_DYNAMIC_MINORS is not set
+# CONFIG_SND_SUPPORT_OLD_API is not set
+CONFIG_SND_VERBOSE_PROCFS=y
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+CONFIG_SND_AC97_CODEC=m
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_VIRMIDI is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+# CONFIG_SND_PXA2xx_I2SOUND is not set
+CONFIG_SND_PXA2XX_PCM=m
+CONFIG_SND_PXA2XX_AC97=m
+
+#
+# PCMCIA devices
+#
+# CONFIG_SND_VXPOCKET is not set
+# CONFIG_SND_PDAUDIOCF is not set
+
+#
+# SoC audio support
+#
+# CONFIG_SND_SOC is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+CONFIG_AC97_BUS=m
+
+#
+# HID Devices
+#
+CONFIG_HID=m
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=m
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+CONFIG_USB_GADGET_PXA2XX=y
+CONFIG_USB_PXA2XX=m
+# CONFIG_USB_PXA2XX_SMALL is not set
+# CONFIG_USB_GADGET_PXA27X is not set
+# CONFIG_USB_GADGET_SX2 is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+# CONFIG_USB_ZERO is not set
+CONFIG_USB_ETH=m
+# CONFIG_USB_ETH_RNDIS is not set
+# CONFIG_USB_GADGETFS is not set
+# CONFIG_USB_FILE_STORAGE is not set
+# CONFIG_USB_G_SERIAL is not set
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_PXA=y
+# CONFIG_MMC_TIFM_SD is not set
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP is not set
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=m
+CONFIG_RTC_EPOCH=1970
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=m
+CONFIG_RTC_INTF_PROC=m
+CONFIG_RTC_INTF_DEV=m
+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+
+#
+# RTC drivers
+#
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=m
+# CONFIG_RTC_DRV_TEST 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 is not set
+# CONFIG_EXT4DEV_FS is not set
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=y
+# 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_CRAMFS is not set
+# CONFIG_SQUASHFS is not set
+# CONFIG_SQUASHFS_LZMA 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
+# CONFIG_UNION_FS is not set
+
+#
+# Network File Systems
+#
+# CONFIG_NFS_FS is not set
+# CONFIG_NFSD 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf-8"
+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=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=y
+# CONFIG_NLS_CODEPAGE_1251 is not set
+CONFIG_NLS_ASCII=y
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=y
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM 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 is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_SMALLOOPS is not set
+# CONFIG_DEBUG_KERNEL is not set
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_FRAME_POINTER=y
+# CONFIG_DEBUG_USER is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+# CONFIG_CRYPTO_SHA1 is not set
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+CONFIG_CRYPTO_CBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+CONFIG_CRYPTO_AES=m
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+CONFIG_CRYPTO_MICHAEL_MIC=m
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_PLIST=y
+CONFIG_IOMAP_COPY=y
diff --git a/recipes-kernel/linux/linux-hackndev-2.6/palmtt3/defconfig b/recipes-kernel/linux/linux-hackndev-2.6/palmtt3/defconfig
new file mode 100644
index 0000000..49b571a
--- /dev/null
+++ b/recipes-kernel/linux/linux-hackndev-2.6/palmtt3/defconfig
@@ -0,0 +1,1383 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.20-hnd0
+# Mon Mar 5 03:36:29 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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ARCH_MTD_XIP=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 is not set
+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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# 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_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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_XSCALE_PALMTREO650 is not set
+# CONFIG_MACH_XSCALE_TREO680 is not set
+# CONFIG_MACH_T700WX is not set
+# CONFIG_MACH_TUNGE2 is not set
+CONFIG_MACH_T3XSCALE=y
+CONFIG_PALM_T3_BUTTONS=y
+CONFIG_PALM_T3_BATTERY=m
+# CONFIG_PALM_T3_GPIOED is not set
+# CONFIG_PALM_T3_GPIOEDNG is not set
+# CONFIG_MACH_XSCALE_PALMTT5 is not set
+# CONFIG_MACH_XSCALE_PALMTX is not set
+# CONFIG_MACH_PALMZ72 is not set
+CONFIG_GPIOED=m
+CONFIG_GPIOEDNG=m
+# CONFIG_MACH_OMAP_PALMTC is not set
+# CONFIG_MACH_ZIRE31 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA25x=y
+CONFIG_PXA_RTC_EPOCH=1904
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_IWMMXT is not set
+# CONFIG_ARMBOOT_PROC is not set
+CONFIG_XSCALE_PMU=y
+# CONFIG_KEXEC is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+# CONFIG_PREEMPT is not set
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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="mem=64M root=/dev/ram0 init=/linuxrc initrd=0xA0400000,900332 max_loop=255"
+# CONFIG_XIP_KERNEL is not set
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+# CONFIG_CPU_FREQ_DEBUG is not set
+CONFIG_CPU_FREQ_STAT=y
+# CONFIG_CPU_FREQ_STAT_DETAILS is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=m
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_PXA=y
+CONFIG_PXA25x_ALTERNATE_FREQS=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options
+#
+CONFIG_PM=y
+CONFIG_PM_LEGACY=y
+# CONFIG_PM_DEBUG is not set
+# CONFIG_DPM_DEBUG is not set
+# CONFIG_PM_SYSFS_DEPRECATED is not set
+CONFIG_APM=m
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=m
+CONFIG_PACKET_MMAP=y
+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 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=m
+CONFIG_INET_TCP_DIAG=m
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# 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=m
+
+#
+# IrDA protocols
+#
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
+CONFIG_IRCOMM=m
+CONFIG_IRDA_ULTRA=y
+
+#
+# IrDA options
+#
+CONFIG_IRDA_CACHE_LAST_LSAP=y
+CONFIG_IRDA_FAST_RR=y
+CONFIG_IRDA_DEBUG=y
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+# CONFIG_IRTTY_SIR is not set
+
+#
+# Dongle support
+#
+
+#
+# Old SIR device drivers
+#
+# CONFIG_IRPORT_SIR is not set
+
+#
+# Old Serial dongle support
+#
+
+#
+# FIR device drivers
+#
+CONFIG_PXA_FICP=m
+CONFIG_BT=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIVHCI=m
+# 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_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=m
+# CONFIG_MTD_DEBUG is not set
+CONFIG_MTD_CONCAT=m
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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=m
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=m
+# 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 is not set
+# 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=m
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=m
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+# CONFIG_MTD_XIP 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_PALMT3 is not set
+# CONFIG_MTD_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_CRYPTOLOOP=m
+CONFIG_BLK_DEV_NBD=m
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=1
+CONFIG_BLK_DEV_RAM_SIZE=3072
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+# CONFIG_PPP_BSDCOMP is not set
+# CONFIG_PPP_MPPE is not set
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# CONFIG_SHAPER is not set
+CONFIG_NETCONSOLE=m
+CONFIG_NETPOLL=y
+CONFIG_NETPOLL_RX=y
+CONFIG_NETPOLL_TRAP=y
+CONFIG_NET_POLL_CONTROLLER=y
+
+#
+# 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 is not set
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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=y
+CONFIG_GPIO_KEYS=y
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_TSC2101=m
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+# CONFIG_TOUCHSCREEN_ADC is not set
+# CONFIG_TOUCHSCREEN_ADC_DEBOUNCE is not set
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+# CONFIG_TOUCHSCREEN_WM97XX is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=y
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=y
+CONFIG_SERIO_RAW=y
+# 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 is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+# CONFIG_SERIAL_PXA_CONSOLE is not set
+CONFIG_SERIAL_PXA_COUNT=4
+# CONFIG_SERIAL_PXA_IR is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=m
+# CONFIG_NVRAM is not set
+CONFIG_SA1100_RTC=y
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# 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 is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+CONFIG_I2C_ALGOPXA=y
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_PXA=y
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# 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 is not set
+# CONFIG_I2C_ADCM2650 is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCA9535 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_RTC8564 is not set
+CONFIG_TPS65010=m
+# 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 is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+CONFIG_HWMON=m
+# CONFIG_HWMON_VID is not set
+# 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_LM75 is not set
+# CONFIG_SENSORS_LM77 is not set
+# CONFIG_SENSORS_LM78 is not set
+# CONFIG_SENSORS_LM80 is not set
+# CONFIG_SENSORS_LM83 is not set
+# CONFIG_SENSORS_LM85 is not set
+# 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_PC87427 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_W83793 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
+
+#
+# Hardware Monitoring - Battery
+#
+CONFIG_BATTERY_MONITOR=m
+CONFIG_ADC_BATTERY=m
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# SoC drivers
+#
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+CONFIG_SOC_TSC2101=m
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# Misc devices
+#
+CONFIG_BATTCHARGE_MONITOR=m
+
+#
+# Multimedia Capabilities Port drivers
+#
+# CONFIG_MCP is not set
+# CONFIG_ADC_ADS7846_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+# CONFIG_TIFM_CORE is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=m
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_FIRMWARE_EDID=y
+CONFIG_FB=y
+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_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+CONFIG_FB_PXA_PARAMETERS=y
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+CONFIG_FONT_6x11=y
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+CONFIG_LOGO_LINUX_CLUT224=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_DEVICE=y
+# CONFIG_LCD_CLASS_DEVICE is not set
+CONFIG_BACKLIGHT_CORGI=y
+# CONFIG_BACKLIGHT_PXAPWM is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=m
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_PCM_OSS_PLUGINS=y
+# CONFIG_SND_DYNAMIC_MINORS is not set
+CONFIG_SND_SUPPORT_OLD_API=y
+# CONFIG_SND_VERBOSE_PROCFS is not set
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+CONFIG_SND_AC97_CODEC=m
+CONFIG_SND_DUMMY=m
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+CONFIG_SND_PXA2xx_I2SOUND=m
+CONFIG_SND_PXA2XX_PCM=m
+CONFIG_SND_PXA2XX_AC97=m
+
+#
+# SoC audio support
+#
+# CONFIG_SND_SOC is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+CONFIG_AC97_BUS=m
+
+#
+# HID Devices
+#
+CONFIG_HID=y
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+CONFIG_USB_GADGET_PXA2XX=y
+CONFIG_USB_PXA2XX=y
+# CONFIG_USB_PXA2XX_SMALL is not set
+# CONFIG_USB_GADGET_PXA27X is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+# CONFIG_USB_ZERO is not set
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+# CONFIG_USB_GADGETFS is not set
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_PXA is not set
+# CONFIG_MMC_TIFM_SD is not set
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP is not set
+CONFIG_MMC_WBSD_PALMT3=m
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc"
+# 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_RS5C372 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=m
+# CONFIG_RTC_DRV_TEST is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=m
+# CONFIG_EXT2_FS_XATTR is not set
+CONFIG_EXT2_FS_XIP=y
+CONFIG_FS_XIP=y
+# CONFIG_EXT3_FS is not set
+# CONFIG_EXT4DEV_FS is not set
+# 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 is not set
+# CONFIG_INOTIFY is not set
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=y
+# 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=m
+CONFIG_FAT_DEFAULT_CODEPAGE=852
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-2"
+# 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=m
+
+#
+# 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_JFFS2_FS is not set
+# CONFIG_CRAMFS is not set
+CONFIG_SQUASHFS=m
+CONFIG_SQUASHFS_EMBEDDED=y
+CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=4
+CONFIG_SQUASHFS_VMALLOC=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
+CONFIG_UNION_FS=m
+# CONFIG_UNION_FS_XATTR is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+CONFIG_NFSD=m
+CONFIG_NFSD_V3=y
+# CONFIG_NFSD_V3_ACL is not set
+# CONFIG_NFSD_V4 is not set
+CONFIG_NFSD_TCP=y
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=m
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# 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 is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# 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-2"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=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=m
+# 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=y
+# CONFIG_NLS_CODEPAGE_1251 is not set
+CONFIG_NLS_ASCII=y
+CONFIG_NLS_ISO8859_1=m
+CONFIG_NLS_ISO8859_2=y
+# 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=m
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM 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 is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_SMALLOOPS is not set
+# CONFIG_DEBUG_KERNEL is not set
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_FRAME_POINTER=y
+# CONFIG_DEBUG_USER is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=y
+# CONFIG_CRYPTO_SHA1 is not set
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+CONFIG_CRYPTO_CBC=m
+# CONFIG_CRYPTO_LRW is not set
+CONFIG_CRYPTO_DES=m
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_ARC4 is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# 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_BITREVERSE=y
+CONFIG_CRC_CCITT=m
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=m
+CONFIG_PLIST=y
+CONFIG_IOMAP_COPY=y
diff --git a/recipes-kernel/linux/linux-hackndev-2.6/palmtt5/defconfig b/recipes-kernel/linux/linux-hackndev-2.6/palmtt5/defconfig
new file mode 100644
index 0000000..4e9db0a
--- /dev/null
+++ b/recipes-kernel/linux/linux-hackndev-2.6/palmtt5/defconfig
@@ -0,0 +1,1314 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hnd2
+# Thu Jul 12 20:16:06 2007
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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 is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_INITRAMFS_SOURCE is not set
+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_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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+# CONFIG_KMOD is not set
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+# CONFIG_BOARD_IRQ_MAP_BIG is not set
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_XSCALE_PALMTREO650 is not set
+# CONFIG_MACH_XSCALE_TREO680 is not set
+# CONFIG_MACH_T700WX is not set
+# CONFIG_MACH_TUNGE2 is not set
+# CONFIG_MACH_T3XSCALE is not set
+CONFIG_MACH_XSCALE_PALMTT5=y
+# CONFIG_PALMT5_DEBUG is not set
+CONFIG_PALMT5_BATTERY=m
+CONFIG_PALMT5_PM=y
+# CONFIG_MACH_XSCALE_PALMTX is not set
+# CONFIG_MACH_PALMZ72 is not set
+# CONFIG_MACH_OMAP_PALMTC is not set
+# CONFIG_MACH_ZIRE31 is not set
+CONFIG_GPIOED=m
+CONFIG_GPIOEDNG=m
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA27x=y
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+CONFIG_IWMMXT=y
+# CONFIG_ARMBOOT_PROC is not set
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+CONFIG_PCCARD=m
+# CONFIG_PCMCIA_DEBUG is not set
+CONFIG_PCMCIA=m
+CONFIG_PCMCIA_LOAD_CIS=y
+CONFIG_PCMCIA_IOCTL=y
+
+#
+# PC-card bridges
+#
+CONFIG_PCMCIA_PXA2XX=m
+
+#
+# Kernel Features
+#
+# CONFIG_PREEMPT is not set
+# CONFIG_NO_IDLE_HZ is not set
+CONFIG_HZ=100
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE=""
+# CONFIG_XIP_KERNEL is not set
+# CONFIG_KEXEC is not set
+# CONFIG_TXTOFFSET_DELTA is not set
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+# CONFIG_DPM_DEBUG is not set
+# CONFIG_PM_SYSFS_DEPRECATED is not set
+CONFIG_APM_EMULATION=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_XFRM_MIGRATE is not set
+CONFIG_NET_KEY=y
+# CONFIG_NET_KEY_MIGRATE 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 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 is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+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_TCP_MD5SIG is not set
+# 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=y
+
+#
+# IrDA protocols
+#
+CONFIG_IRLAN=y
+CONFIG_IRNET=y
+CONFIG_IRCOMM=y
+CONFIG_IRDA_ULTRA=y
+
+#
+# IrDA options
+#
+# CONFIG_IRDA_CACHE_LAST_LSAP is not set
+# CONFIG_IRDA_FAST_RR is not set
+# CONFIG_IRDA_DEBUG is not set
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+# CONFIG_IRTTY_SIR is not set
+
+#
+# Dongle support
+#
+
+#
+# Old SIR device drivers
+#
+# CONFIG_IRPORT_SIR is not set
+
+#
+# Old Serial dongle support
+#
+
+#
+# FIR device drivers
+#
+CONFIG_PXA_FICP=y
+CONFIG_BT=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+# CONFIG_BT_HCIUART_BCSP is not set
+# CONFIG_BT_HCIDTL1 is not set
+# CONFIG_BT_HCIBT3C is not set
+CONFIG_BT_BCM2035UART=m
+# CONFIG_BT_HCIBLUECARD is not set
+# CONFIG_BT_HCIBTUART is not set
+# CONFIG_BT_HCIVHCI is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=m
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+# CONFIG_MTD_BLKDEVS is not set
+# CONFIG_MTD_BLOCK is not set
+# CONFIG_MTD_BLOCK_RO is not set
+# 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=m
+CONFIG_MTD_JEDECPROBE=m
+CONFIG_MTD_GEN_PROBE=m
+# 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 is not set
+# 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=m
+CONFIG_MTD_CFI_AMDSTD=m
+CONFIG_MTD_CFI_STAA=m
+CONFIG_MTD_CFI_UTIL=m
+CONFIG_MTD_RAM=m
+CONFIG_MTD_ROM=m
+CONFIG_MTD_ABSENT=m
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+# CONFIG_MTD_XIP 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_IPAQ is not set
+# CONFIG_MTD_IMPA7 is not set
+# CONFIG_MTD_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI 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 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_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+# CONFIG_LIBERTAS is not set
+
+#
+# PCMCIA network device support
+#
+# CONFIG_NET_PCMCIA is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+CONFIG_PPP=y
+# CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=y
+CONFIG_PPP_SYNC_TTY=y
+CONFIG_PPP_DEFLATE=y
+# CONFIG_PPP_BSDCOMP is not set
+# CONFIG_PPP_MPPE is not set
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=y
+# 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=y
+CONFIG_INPUT_TSDEV_SCREEN_X=320
+CONFIG_INPUT_TSDEV_SCREEN_Y=480
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+CONFIG_KEYBOARD_PXA27x=y
+CONFIG_KEYBOARD_GPIO=y
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+# CONFIG_TOUCHSCREEN_PALMTC is not set
+CONFIG_TOUCHSCREEN_WM97XX=m
+# CONFIG_TOUCHSCREEN_WM9705 is not set
+CONFIG_TOUCHSCREEN_WM9712=y
+# CONFIG_TOUCHSCREEN_WM9713 is not set
+# CONFIG_TOUCHSCREEN_WM97XX_PXA is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+# CONFIG_SERIAL_8250_CS is not set
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+# CONFIG_SERIAL_PXA_IR is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=m
+# CONFIG_NVRAM is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_POWER_SUPPLY=m
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=m
+CONFIG_APM_POWER=m
+# CONFIG_BATTERY_DS2760 is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+# CONFIG_BATTCHARGE_MONITOR is not set
+
+#
+# Multimedia Capabilities Port drivers
+#
+# CONFIG_ADC is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=m
+CONFIG_LCD_CLASS_DEVICE=m
+CONFIG_BACKLIGHT_CORGI=y
+# CONFIG_BACKLIGHT_PXAPWM is not set
+CONFIG_FB=y
+CONFIG_FIRMWARE_EDID=y
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_BACKLIGHT is not set
+# CONFIG_FB_MODE_HELPERS is not set
+CONFIG_FB_TILEBLITTING=y
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+# CONFIG_FB_PXA_PARAMETERS is not set
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=m
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+CONFIG_SND_SEQUENCER=m
+# CONFIG_SND_SEQ_DUMMY is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_PCM_OSS_PLUGINS=y
+CONFIG_SND_SEQUENCER_OSS=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_AC97_CODEC=m
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_VIRMIDI is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+# CONFIG_SND_PXA2xx_I2SOUND is not set
+CONFIG_SND_PXA2XX_PCM=m
+CONFIG_SND_PXA2XX_AC97=m
+
+#
+# PCMCIA devices
+#
+# CONFIG_SND_VXPOCKET is not set
+# CONFIG_SND_PDAUDIOCF is not set
+
+#
+# SoC audio support
+#
+# CONFIG_SND_SOC is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+CONFIG_AC97_BUS=m
+
+#
+# HID Devices
+#
+CONFIG_HID=y
+# CONFIG_HID_DEBUG 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 is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=m
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+CONFIG_USB_GADGET_PXA27X=y
+CONFIG_USB_PXA27X=m
+# CONFIG_USB_PXA27X_DMA is not set
+# CONFIG_USB_GADGET_SX2 is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+# CONFIG_USB_ZERO is not set
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+# CONFIG_USB_GADGETFS is not set
+# CONFIG_USB_FILE_STORAGE is not set
+# CONFIG_USB_G_SERIAL is not set
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+# CONFIG_USB_PXA2XX_GPIO is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_PXA=y
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP 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_EPOCH=1904
+# 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_CMOS is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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 is not set
+# CONFIG_EXT4DEV_FS is not set
+# 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=y
+# CONFIG_ROMFS_FS is not set
+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_AUFS 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_JFFS2_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_SQUASHFS is not set
+# CONFIG_SQUASHFS_LZMA 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
+# CONFIG_UNION_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_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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf-8"
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=y
+CONFIG_NLS_CODEPAGE_775=y
+CONFIG_NLS_CODEPAGE_850=y
+CONFIG_NLS_CODEPAGE_852=y
+CONFIG_NLS_CODEPAGE_855=y
+CONFIG_NLS_CODEPAGE_857=y
+CONFIG_NLS_CODEPAGE_860=y
+CONFIG_NLS_CODEPAGE_861=y
+CONFIG_NLS_CODEPAGE_862=y
+CONFIG_NLS_CODEPAGE_863=y
+CONFIG_NLS_CODEPAGE_864=y
+CONFIG_NLS_CODEPAGE_865=y
+CONFIG_NLS_CODEPAGE_866=y
+CONFIG_NLS_CODEPAGE_869=y
+# 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=y
+CONFIG_NLS_CODEPAGE_1250=y
+CONFIG_NLS_CODEPAGE_1251=y
+CONFIG_NLS_ASCII=y
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=y
+CONFIG_NLS_ISO8859_3=y
+CONFIG_NLS_ISO8859_4=y
+CONFIG_NLS_ISO8859_5=y
+CONFIG_NLS_ISO8859_6=y
+CONFIG_NLS_ISO8859_7=y
+CONFIG_NLS_ISO8859_9=y
+CONFIG_NLS_ISO8859_13=y
+CONFIG_NLS_ISO8859_14=y
+CONFIG_NLS_ISO8859_15=y
+CONFIG_NLS_KOI8_R=y
+CONFIG_NLS_KOI8_U=y
+CONFIG_NLS_UTF8=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM 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 is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_SMALLOOPS is not set
+# CONFIG_DEBUG_KERNEL is not set
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_FRAME_POINTER=y
+# CONFIG_DEBUG_USER is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+# CONFIG_CRYPTO_SHA1 is not set
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+CONFIG_CRYPTO_CBC=m
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+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
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-hackndev-2.6/palmtx/busybox-config b/recipes-kernel/linux/linux-hackndev-2.6/palmtx/busybox-config
new file mode 100644
index 0000000..1f4708b
--- /dev/null
+++ b/recipes-kernel/linux/linux-hackndev-2.6/palmtx/busybox-config
@@ -0,0 +1,571 @@
+#
+# Automatically generated make config: don't edit
+#
+HAVE_DOT_CONFIG=y
+
+#
+# General Configuration
+#
+# CONFIG_FEATURE_BUFFERS_USE_MALLOC is not set
+CONFIG_FEATURE_BUFFERS_GO_ON_STACK=y
+# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set
+# CONFIG_FEATURE_VERBOSE_USAGE is not set
+# CONFIG_FEATURE_INSTALLER is not set
+# CONFIG_LOCALE_SUPPORT is not set
+# CONFIG_FEATURE_DEVFS is not set
+CONFIG_FEATURE_DEVPTS=y
+# CONFIG_FEATURE_CLEAN_UP is not set
+CONFIG_FEATURE_SUID=y
+# CONFIG_FEATURE_SUID_CONFIG is not set
+# CONFIG_FEATURE_SUID_CONFIG_QUIET is not set
+# CONFIG_SELINUX is not set
+
+#
+# Build Options
+#
+CONFIG_STATIC=y
+# CONFIG_LFS is not set
+EXTRA_CFLAGS_OPTIONS=""
+CONFIG_FEATURE_SUSv2=y
+# CONFIG_FEATURE_SUSv2_OBSOLETE is not set
+
+#
+# Installation Options
+#
+# CONFIG_INSTALL_NO_USR is not set
+CONFIG_INSTALL_APPLET_SYMLINKS=y
+# CONFIG_INSTALL_APPLET_HARDLINKS is not set
+# CONFIG_INSTALL_APPLET_DONT is not set
+PREFIX="./_install"
+
+#
+# Archival Utilities
+#
+# CONFIG_AR is not set
+# CONFIG_FEATURE_AR_LONG_FILENAMES is not set
+# CONFIG_BUNZIP2 is not set
+# CONFIG_CPIO is not set
+# CONFIG_DPKG is not set
+# CONFIG_DPKG_DEB is not set
+# CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY is not set
+# CONFIG_GUNZIP is not set
+# CONFIG_FEATURE_GUNZIP_UNCOMPRESS is not set
+# CONFIG_GZIP is not set
+# CONFIG_RPM2CPIO is not set
+# CONFIG_RPM is not set
+# CONFIG_TAR is not set
+# CONFIG_FEATURE_TAR_CREATE is not set
+# CONFIG_FEATURE_TAR_BZIP2 is not set
+# CONFIG_FEATURE_TAR_FROM is not set
+# CONFIG_FEATURE_TAR_GZIP is not set
+# CONFIG_FEATURE_TAR_COMPRESS is not set
+# CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY is not set
+# CONFIG_FEATURE_TAR_GNU_EXTENSIONS is not set
+# CONFIG_FEATURE_TAR_LONG_OPTIONS is not set
+# CONFIG_UNCOMPRESS is not set
+# CONFIG_UNZIP is not set
+# CONFIG_FEATURE_UNARCHIVE_TAPE is not set
+# CONFIG_FEATURE_DEB_TAR_GZ is not set
+# CONFIG_FEATURE_DEB_TAR_BZ2 is not set
+
+#
+# Coreutils
+#
+# CONFIG_BASENAME is not set
+# CONFIG_CAL is not set
+CONFIG_CAT=y
+# CONFIG_CHGRP is not set
+CONFIG_CHMOD=y
+CONFIG_CHOWN=y
+# CONFIG_CHROOT is not set
+# CONFIG_CMP is not set
+# CONFIG_COMM is not set
+CONFIG_CP=y
+# CONFIG_CUT is not set
+# CONFIG_DATE is not set
+# CONFIG_FEATURE_DATE_ISOFMT is not set
+# CONFIG_DD is not set
+# CONFIG_DF is not set
+# CONFIG_DIRNAME is not set
+# CONFIG_DOS2UNIX is not set
+# CONFIG_UNIX2DOS is not set
+# CONFIG_DU is not set
+# CONFIG_FEATURE_DU_DEFALT_BLOCKSIZE_1K is not set
+CONFIG_ECHO=y
+CONFIG_FEATURE_FANCY_ECHO=y
+CONFIG_ENV=y
+CONFIG_EXPR=y
+CONFIG_FALSE=y
+# CONFIG_FOLD is not set
+# CONFIG_HEAD is not set
+# CONFIG_FEATURE_FANCY_HEAD is not set
+# CONFIG_HOSTID is not set
+# CONFIG_ID is not set
+# CONFIG_INSTALL is not set
+# CONFIG_LENGTH is not set
+CONFIG_LN=y
+# CONFIG_LOGNAME is not set
+# CONFIG_LS is not set
+# CONFIG_FEATURE_LS_FILETYPES is not set
+# CONFIG_FEATURE_LS_FOLLOWLINKS is not set
+# CONFIG_FEATURE_LS_RECURSIVE is not set
+# CONFIG_FEATURE_LS_SORTFILES is not set
+# CONFIG_FEATURE_LS_TIMESTAMPS is not set
+# CONFIG_FEATURE_LS_USERNAME is not set
+# CONFIG_FEATURE_LS_COLOR is not set
+# CONFIG_FEATURE_LS_COLOR_IS_DEFAULT is not set
+# CONFIG_MD5SUM is not set
+CONFIG_MKDIR=y
+# CONFIG_MKFIFO is not set
+CONFIG_MKNOD=y
+CONFIG_MV=y
+# CONFIG_NICE is not set
+# CONFIG_NOHUP is not set
+# CONFIG_OD is not set
+# CONFIG_PRINTENV is not set
+# CONFIG_PRINTF is not set
+CONFIG_PWD=y
+# CONFIG_REALPATH is not set
+CONFIG_RM=y
+CONFIG_RMDIR=y
+# CONFIG_SEQ is not set
+# CONFIG_SHA1SUM is not set
+CONFIG_SLEEP=y
+# CONFIG_FEATURE_FANCY_SLEEP is not set
+# CONFIG_SORT is not set
+# CONFIG_FEATURE_SORT_BIG is not set
+CONFIG_STAT=y
+# CONFIG_FEATURE_STAT_FORMAT is not set
+# CONFIG_STTY is not set
+# CONFIG_SUM is not set
+CONFIG_SYNC=y
+# CONFIG_TAIL is not set
+# CONFIG_FEATURE_FANCY_TAIL is not set
+# CONFIG_TEE is not set
+# CONFIG_FEATURE_TEE_USE_BLOCK_IO is not set
+CONFIG_TEST=y
+
+#
+# test (forced enabled for use with shell)
+#
+# CONFIG_FEATURE_TEST_64 is not set
+# CONFIG_TOUCH is not set
+# CONFIG_TR is not set
+# CONFIG_FEATURE_TR_CLASSES is not set
+# CONFIG_FEATURE_TR_EQUIV is not set
+CONFIG_TRUE=y
+# CONFIG_TTY is not set
+# CONFIG_UNAME is not set
+# CONFIG_UNIQ is not set
+# CONFIG_USLEEP is not set
+# CONFIG_UUDECODE is not set
+# CONFIG_UUENCODE is not set
+# CONFIG_WATCH is not set
+# CONFIG_WC is not set
+# CONFIG_WHO is not set
+# CONFIG_WHOAMI is not set
+CONFIG_YES=y
+
+#
+# Common options for cp and mv
+#
+CONFIG_FEATURE_PRESERVE_HARDLINKS=y
+# CONFIG_FEATURE_AUTOWIDTH is not set
+# CONFIG_FEATURE_HUMAN_READABLE is not set
+# CONFIG_FEATURE_MD5_SHA1_SUM_CHECK is not set
+
+#
+# Console Utilities
+#
+# CONFIG_CHVT is not set
+# CONFIG_CLEAR is not set
+# CONFIG_DEALLOCVT is not set
+# CONFIG_DUMPKMAP is not set
+# CONFIG_LOADFONT is not set
+# CONFIG_LOADKMAP is not set
+# CONFIG_OPENVT is not set
+# CONFIG_RESET is not set
+# CONFIG_SETCONSOLE is not set
+# CONFIG_SETKEYCODES is not set
+
+#
+# Debian Utilities
+#
+# CONFIG_MKTEMP is not set
+# CONFIG_PIPE_PROGRESS is not set
+# CONFIG_READLINK is not set
+# CONFIG_FEATURE_READLINK_FOLLOW is not set
+# CONFIG_RUN_PARTS is not set
+# CONFIG_START_STOP_DAEMON is not set
+# CONFIG_WHICH is not set
+
+#
+# Linux Ext2 FS Progs
+#
+# CONFIG_CHATTR is not set
+CONFIG_E2FSCK=y
+# CONFIG_FSCK is not set
+# CONFIG_LSATTR is not set
+# CONFIG_MKE2FS is not set
+# CONFIG_TUNE2FS is not set
+# CONFIG_E2LABEL is not set
+# CONFIG_FINDFS is not set
+
+#
+# Editors
+#
+CONFIG_AWK=y
+# CONFIG_FEATURE_AWK_MATH is not set
+# CONFIG_PATCH is not set
+CONFIG_SED=y
+# CONFIG_VI is not set
+# CONFIG_FEATURE_VI_COLON is not set
+# CONFIG_FEATURE_VI_YANKMARK is not set
+# CONFIG_FEATURE_VI_SEARCH is not set
+# CONFIG_FEATURE_VI_USE_SIGNALS is not set
+# CONFIG_FEATURE_VI_DOT_CMD is not set
+# CONFIG_FEATURE_VI_READONLY is not set
+# CONFIG_FEATURE_VI_SETOPTS is not set
+# CONFIG_FEATURE_VI_SET is not set
+# CONFIG_FEATURE_VI_WIN_RESIZE is not set
+# CONFIG_FEATURE_VI_OPTIMIZE_CURSOR is not set
+
+#
+# Finding Utilities
+#
+# CONFIG_FIND is not set
+# CONFIG_FEATURE_FIND_MTIME is not set
+# CONFIG_FEATURE_FIND_PERM is not set
+# CONFIG_FEATURE_FIND_TYPE is not set
+# CONFIG_FEATURE_FIND_XDEV is not set
+# CONFIG_FEATURE_FIND_NEWER is not set
+# CONFIG_FEATURE_FIND_INUM is not set
+# CONFIG_FEATURE_FIND_EXEC is not set
+# CONFIG_GREP is not set
+# CONFIG_FEATURE_GREP_EGREP_ALIAS is not set
+# CONFIG_FEATURE_GREP_FGREP_ALIAS is not set
+# CONFIG_FEATURE_GREP_CONTEXT is not set
+# CONFIG_XARGS is not set
+# CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION is not set
+# CONFIG_FEATURE_XARGS_SUPPORT_QUOTES is not set
+# CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT is not set
+# CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM is not set
+
+#
+# Init Utilities
+#
+# CONFIG_INIT is not set
+# CONFIG_FEATURE_USE_INITTAB is not set
+# CONFIG_FEATURE_INITRD is not set
+# CONFIG_FEATURE_INIT_COREDUMPS is not set
+# CONFIG_FEATURE_INIT_SCTTY is not set
+# CONFIG_FEATURE_EXTRA_QUIET is not set
+# CONFIG_HALT is not set
+# CONFIG_MESG is not set
+# CONFIG_POWEROFF is not set
+# CONFIG_REBOOT is not set
+
+#
+# Login/Password Management Utilities
+#
+# CONFIG_FEATURE_SHADOWPASSWDS is not set
+# CONFIG_USE_BB_SHADOW is not set
+# CONFIG_USE_BB_PWD_GRP is not set
+# CONFIG_ADDGROUP is not set
+# CONFIG_DELGROUP is not set
+# CONFIG_ADDUSER is not set
+# CONFIG_DELUSER is not set
+# CONFIG_GETTY is not set
+# CONFIG_FEATURE_UTMP is not set
+# CONFIG_FEATURE_WTMP is not set
+# CONFIG_LOGIN is not set
+# CONFIG_FEATURE_SECURETTY is not set
+# CONFIG_PASSWD is not set
+# CONFIG_SU is not set
+# CONFIG_SULOGIN is not set
+# CONFIG_VLOCK is not set
+
+#
+# Miscellaneous Utilities
+#
+# CONFIG_ADJTIMEX is not set
+# CONFIG_BBCONFIG is not set
+# CONFIG_CROND is not set
+# CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set
+# CONFIG_CRONTAB is not set
+# CONFIG_DC is not set
+# CONFIG_DEVFSD is not set
+# CONFIG_DEVFSD_MODLOAD is not set
+# CONFIG_DEVFSD_FG_NP is not set
+# CONFIG_DEVFSD_VERBOSE is not set
+# CONFIG_EJECT is not set
+# CONFIG_LAST is not set
+# CONFIG_LESS is not set
+# CONFIG_FEATURE_LESS_BRACKETS is not set
+# CONFIG_FEATURE_LESS_FLAGS is not set
+# CONFIG_FEATURE_LESS_FLAGCS is not set
+# CONFIG_FEATURE_LESS_MARKS is not set
+# CONFIG_FEATURE_LESS_REGEXP is not set
+# CONFIG_HDPARM is not set
+# CONFIG_FEATURE_HDPARM_GET_IDENTITY is not set
+# CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set
+# CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF is not set
+# CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET is not set
+# CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF is not set
+# CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA is not set
+# CONFIG_MAKEDEVS is not set
+# CONFIG_FEATURE_MAKEDEVS_LEAF is not set
+# CONFIG_FEATURE_MAKEDEVS_TABLE is not set
+# CONFIG_MOUNTPOINT is not set
+# CONFIG_MT is not set
+# BB_APPLET_RUNLEVEL is not set
+# CONFIG_RX is not set
+# CONFIG_STRINGS is not set
+# CONFIG_SETSID is not set
+# CONFIG_TIME is not set
+# CONFIG_WATCHDOG is not set
+
+#
+# Linux Module Utilities
+#
+CONFIG_INSMOD=y
+# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set
+# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set
+# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set
+# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set
+# CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set
+# CONFIG_RMMOD is not set
+# CONFIG_LSMOD is not set
+# CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set
+# CONFIG_MODPROBE is not set
+# CONFIG_FEATURE_MODPROBE_MULTIPLE_OPTIONS is not set
+
+#
+# Options common to multiple modutils
+#
+CONFIG_FEATURE_CHECK_TAINTED_MODULE=y
+# CONFIG_FEATURE_2_4_MODULES is not set
+CONFIG_FEATURE_2_6_MODULES=y
+# CONFIG_FEATURE_QUERY_MODULE_INTERFACE is not set
+
+#
+# Networking Utilities
+#
+# CONFIG_FEATURE_IPV6 is not set
+# CONFIG_ARPING is not set
+# CONFIG_ETHER_WAKE is not set
+# CONFIG_FAKEIDENTD is not set
+# CONFIG_FTPGET is not set
+# CONFIG_FTPPUT is not set
+# CONFIG_HOSTNAME is not set
+# CONFIG_HTTPD is not set
+# CONFIG_FEATURE_HTTPD_USAGE_FROM_INETD_ONLY is not set
+# CONFIG_FEATURE_HTTPD_BASIC_AUTH is not set
+# CONFIG_FEATURE_HTTPD_AUTH_MD5 is not set
+# CONFIG_FEATURE_HTTPD_RELOAD_CONFIG_SIGHUP is not set
+# CONFIG_FEATURE_HTTPD_SETUID is not set
+# CONFIG_FEATURE_HTTPD_CONFIG_WITH_MIME_TYPES is not set
+# CONFIG_FEATURE_HTTPD_CGI is not set
+# CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV is not set
+# CONFIG_FEATURE_HTTPD_ENCODE_URL_STR is not set
+# CONFIG_IFCONFIG is not set
+# CONFIG_FEATURE_IFCONFIG_STATUS is not set
+# CONFIG_FEATURE_IFCONFIG_SLIP is not set
+# CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ is not set
+# CONFIG_FEATURE_IFCONFIG_HW is not set
+# CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS is not set
+# CONFIG_IFUPDOWN is not set
+# CONFIG_FEATURE_IFUPDOWN_IP is not set
+# CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN is not set
+# CONFIG_FEATURE_IFUPDOWN_IPV4 is not set
+# CONFIG_FEATURE_IFUPDOWN_IPV6 is not set
+# CONFIG_FEATURE_IFUPDOWN_IPX is not set
+# CONFIG_FEATURE_IFUPDOWN_MAPPING is not set
+# CONFIG_INETD is not set
+# CONFIG_FEATURE_INETD_SUPPORT_BILTIN_ECHO is not set
+# CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DISCARD is not set
+# CONFIG_FEATURE_INETD_SUPPORT_BILTIN_TIME is not set
+# CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DAYTIME is not set
+# CONFIG_FEATURE_INETD_SUPPORT_BILTIN_CHARGEN is not set
+# CONFIG_FEATURE_INETD_RPC is not set
+# CONFIG_IP is not set
+# CONFIG_FEATURE_IP_ADDRESS is not set
+# CONFIG_FEATURE_IP_LINK is not set
+# CONFIG_FEATURE_IP_ROUTE is not set
+# CONFIG_FEATURE_IP_TUNNEL is not set
+# CONFIG_IPCALC is not set
+# CONFIG_FEATURE_IPCALC_FANCY is not set
+# CONFIG_IPADDR is not set
+# CONFIG_IPLINK is not set
+# CONFIG_IPROUTE is not set
+# CONFIG_IPTUNNEL is not set
+# CONFIG_NAMEIF is not set
+# CONFIG_NC is not set
+# CONFIG_NC_GAPING_SECURITY_HOLE is not set
+# CONFIG_NETSTAT is not set
+# CONFIG_NSLOOKUP is not set
+# CONFIG_PING is not set
+# CONFIG_FEATURE_FANCY_PING is not set
+# CONFIG_PING6 is not set
+# CONFIG_FEATURE_FANCY_PING6 is not set
+# CONFIG_ROUTE is not set
+# CONFIG_TELNET is not set
+# CONFIG_FEATURE_TELNET_TTYPE is not set
+# CONFIG_FEATURE_TELNET_AUTOLOGIN is not set
+# CONFIG_TELNETD is not set
+# CONFIG_FEATURE_TELNETD_INETD is not set
+# CONFIG_TFTP is not set
+# CONFIG_FEATURE_TFTP_GET is not set
+# CONFIG_FEATURE_TFTP_PUT is not set
+# CONFIG_FEATURE_TFTP_BLOCKSIZE is not set
+# CONFIG_FEATURE_TFTP_DEBUG is not set
+# CONFIG_TRACEROUTE is not set
+# CONFIG_FEATURE_TRACEROUTE_VERBOSE is not set
+# CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE is not set
+# CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set
+# CONFIG_VCONFIG is not set
+# CONFIG_WGET is not set
+# CONFIG_FEATURE_WGET_STATUSBAR is not set
+# CONFIG_FEATURE_WGET_AUTHENTICATION is not set
+# CONFIG_FEATURE_WGET_IP6_LITERAL is not set
+
+#
+# udhcp Server/Client
+#
+# CONFIG_UDHCPD is not set
+# CONFIG_UDHCPC is not set
+# CONFIG_DUMPLEASES is not set
+# CONFIG_FEATURE_UDHCP_SYSLOG is not set
+# CONFIG_FEATURE_UDHCP_DEBUG is not set
+# CONFIG_ZCIP is not set
+
+#
+# Process Utilities
+#
+# CONFIG_FREE is not set
+# CONFIG_FUSER is not set
+# CONFIG_KILL is not set
+# CONFIG_KILLALL is not set
+# CONFIG_PIDOF is not set
+# CONFIG_FEATURE_PIDOF_SINGLE is not set
+# CONFIG_FEATURE_PIDOF_OMIT is not set
+# CONFIG_PS is not set
+# CONFIG_FEATURE_PS_WIDE is not set
+# CONFIG_RENICE is not set
+# CONFIG_BB_SYSCTL is not set
+# CONFIG_TOP is not set
+# CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE is not set
+# CONFIG_UPTIME is not set
+
+#
+# Shells
+#
+CONFIG_FEATURE_SH_IS_ASH=y
+# CONFIG_FEATURE_SH_IS_HUSH is not set
+# CONFIG_FEATURE_SH_IS_LASH is not set
+# CONFIG_FEATURE_SH_IS_MSH is not set
+# CONFIG_FEATURE_SH_IS_NONE is not set
+CONFIG_ASH=y
+
+#
+# Ash Shell Options
+#
+CONFIG_ASH_JOB_CONTROL=y
+# CONFIG_ASH_READ_NCHARS is not set
+# CONFIG_ASH_READ_TIMEOUT is not set
+CONFIG_ASH_ALIAS=y
+CONFIG_ASH_MATH_SUPPORT=y
+CONFIG_ASH_MATH_SUPPORT_64=y
+# CONFIG_ASH_GETOPTS is not set
+# CONFIG_ASH_CMDCMD is not set
+# CONFIG_ASH_BUILTIN_ECHO is not set
+# CONFIG_ASH_MAIL is not set
+CONFIG_ASH_OPTIMIZE_FOR_SIZE=y
+# CONFIG_ASH_RANDOM_SUPPORT is not set
+# CONFIG_ASH_EXPAND_PRMT is not set
+# CONFIG_HUSH is not set
+# CONFIG_LASH is not set
+# CONFIG_MSH is not set
+
+#
+# Bourne Shell Options
+#
+# CONFIG_FEATURE_SH_EXTRA_QUIET is not set
+# CONFIG_FEATURE_SH_STANDALONE_SHELL is not set
+# CONFIG_FEATURE_COMMAND_EDITING is not set
+# CONFIG_FEATURE_COMMAND_EDITING_VI is not set
+CONFIG_FEATURE_COMMAND_HISTORY=0
+# CONFIG_FEATURE_COMMAND_SAVEHISTORY is not set
+# CONFIG_FEATURE_COMMAND_TAB_COMPLETION is not set
+# CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION is not set
+# CONFIG_FEATURE_SH_FANCY_PROMPT is not set
+
+#
+# System Logging Utilities
+#
+# CONFIG_SYSLOGD is not set
+# CONFIG_FEATURE_ROTATE_LOGFILE is not set
+# CONFIG_FEATURE_REMOTE_LOG is not set
+# CONFIG_FEATURE_IPC_SYSLOG is not set
+CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=0
+# CONFIG_LOGREAD is not set
+# CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING is not set
+# CONFIG_KLOGD is not set
+# CONFIG_LOGGER is not set
+
+#
+# Linux System Utilities
+#
+# CONFIG_DMESG is not set
+# CONFIG_FBSET is not set
+# CONFIG_FEATURE_FBSET_FANCY is not set
+# CONFIG_FEATURE_FBSET_READMODE is not set
+# CONFIG_FDFLUSH is not set
+# CONFIG_FDFORMAT is not set
+# CONFIG_FDISK is not set
+# FDISK_SUPPORT_LARGE_DISKS is not set
+# CONFIG_FEATURE_FDISK_WRITABLE is not set
+# CONFIG_FEATURE_AIX_LABEL is not set
+# CONFIG_FEATURE_SGI_LABEL is not set
+# CONFIG_FEATURE_SUN_LABEL is not set
+# CONFIG_FEATURE_OSF_LABEL is not set
+# CONFIG_FEATURE_FDISK_ADVANCED is not set
+# CONFIG_FREERAMDISK is not set
+# CONFIG_FSCK_MINIX is not set
+# CONFIG_MKFS_MINIX is not set
+# CONFIG_FEATURE_MINIX2 is not set
+# CONFIG_GETOPT is not set
+# CONFIG_HEXDUMP is not set
+# CONFIG_HWCLOCK is not set
+# CONFIG_FEATURE_HWCLOCK_LONGOPTIONS is not set
+# CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS is not set
+# CONFIG_IPCRM is not set
+# CONFIG_IPCS is not set
+# CONFIG_LOSETUP is not set
+# CONFIG_MDEV is not set
+# CONFIG_FEATURE_MDEV_CONF is not set
+# CONFIG_MKSWAP is not set
+# CONFIG_MORE is not set
+# CONFIG_FEATURE_USE_TERMIOS is not set
+# CONFIG_PIVOT_ROOT is not set
+CONFIG_SWITCH_ROOT=y
+# CONFIG_RDATE is not set
+# CONFIG_READPROFILE is not set
+CONFIG_SWAPONOFF=y
+CONFIG_MOUNT=y
+# CONFIG_FEATURE_MOUNT_NFS is not set
+CONFIG_UMOUNT=y
+
+#
+# Common options for mount/umount
+#
+CONFIG_FEATURE_MOUNT_LOOP=y
+# CONFIG_FEATURE_MTAB_SUPPORT is not set
+
+#
+# Debugging Options
+#
+# CONFIG_DEBUG is not set
+# CONFIG_NO_DEBUG_LIB is not set
+# CONFIG_DMALLOC is not set
+# CONFIG_EFENCE is not set
diff --git a/recipes-kernel/linux/linux-hackndev-2.6/palmtx/defconfig b/recipes-kernel/linux/linux-hackndev-2.6/palmtx/defconfig
new file mode 100644
index 0000000..3d61c6d
--- /dev/null
+++ b/recipes-kernel/linux/linux-hackndev-2.6/palmtx/defconfig
@@ -0,0 +1,1347 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hnd3
+# Mon Aug 27 18:29:55 2007
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=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_SYSVIPC_SYSCTL=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 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_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+# CONFIG_ELF_CORE is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+# CONFIG_IOSCHED_DEADLINE is not set
+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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+# CONFIG_BOARD_IRQ_MAP_BIG is not set
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+# CONFIG_HTC_HW6X00 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_TUNGE2 is not set
+# CONFIG_MACH_OMAP_PALMTC is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_XSCALE_PALMTT5 is not set
+CONFIG_MACH_XSCALE_PALMTX=y
+# CONFIG_PALMTX_DEBUG is not set
+CONFIG_PALMTX_BATTERY=m
+CONFIG_PALMTX_PM=y
+CONFIG_PALMTX_PCMCIA=m
+CONFIG_PALMTX_BORDER=m
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_ZIRE31 is not set
+CONFIG_GPIOED=m
+CONFIG_GPIOEDNG=m
+# CONFIG_MACH_PALMZ72 is not set
+# CONFIG_MACH_XSCALE_PALMTREO650 is not set
+# CONFIG_MACH_XSCALE_TREO680 is not set
+# CONFIG_MACH_T700WX is not set
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_MACH_LOOXC550 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA27x=y
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+CONFIG_IWMMXT=y
+# CONFIG_ARMBOOT_PROC is not set
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+CONFIG_PCCARD=m
+# CONFIG_PCMCIA_DEBUG is not set
+CONFIG_PCMCIA=m
+CONFIG_PCMCIA_LOAD_CIS=y
+CONFIG_PCMCIA_IOCTL=y
+
+#
+# PC-card bridges
+#
+CONFIG_PCMCIA_PXA2XX=m
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+# CONFIG_NO_IDLE_HZ is not set
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="mem=32M"
+# CONFIG_XIP_KERNEL is not set
+# CONFIG_KEXEC is not set
+# CONFIG_TXTOFFSET_DELTA is not set
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options
+#
+CONFIG_PM=y
+CONFIG_PM_LEGACY=y
+# CONFIG_PM_DEBUG is not set
+# CONFIG_DPM_DEBUG is not set
+# CONFIG_PM_SYSFS_DEPRECATED is not set
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=m
+# 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_XFRM_MIGRATE 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 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_TCP_MD5SIG is not set
+# 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=y
+
+#
+# IrDA protocols
+#
+# CONFIG_IRLAN is not set
+# CONFIG_IRNET is not set
+CONFIG_IRCOMM=m
+# CONFIG_IRDA_ULTRA is not set
+
+#
+# IrDA options
+#
+# CONFIG_IRDA_CACHE_LAST_LSAP is not set
+# CONFIG_IRDA_FAST_RR is not set
+# CONFIG_IRDA_DEBUG is not set
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+# CONFIG_IRTTY_SIR is not set
+
+#
+# Dongle support
+#
+
+#
+# Old SIR device drivers
+#
+# CONFIG_IRPORT_SIR is not set
+
+#
+# Old Serial dongle support
+#
+
+#
+# FIR device drivers
+#
+CONFIG_PXA_FICP=y
+CONFIG_BT=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+# CONFIG_BT_HCIDTL1 is not set
+# CONFIG_BT_HCIBT3C is not set
+CONFIG_BT_BCM2035UART=m
+# CONFIG_BT_HCIBLUECARD is not set
+# CONFIG_BT_HCIBTUART is not set
+# CONFIG_BT_HCIVHCI is not set
+CONFIG_IEEE80211=m
+# CONFIG_IEEE80211_DEBUG is not set
+CONFIG_IEEE80211_CRYPT_WEP=m
+CONFIG_IEEE80211_CRYPT_CCMP=m
+CONFIG_IEEE80211_SOFTMAC=m
+# CONFIG_IEEE80211_SOFTMAC_DEBUG 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=m
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI 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 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_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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
+
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_SMC91X is not set
+# CONFIG_DM9000 is not set
+# CONFIG_SMC911X is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# PCMCIA network device support
+#
+# CONFIG_NET_PCMCIA is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+CONFIG_PPP=y
+# CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPP_FILTER is not set
+# CONFIG_PPP_ASYNC is not set
+# CONFIG_PPP_SYNC_TTY is not set
+# CONFIG_PPP_DEFLATE is not set
+# CONFIG_PPP_BSDCOMP is not set
+# CONFIG_PPP_MPPE is not set
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=y
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+CONFIG_INPUT_TSDEV=y
+CONFIG_INPUT_TSDEV_SCREEN_X=320
+CONFIG_INPUT_TSDEV_SCREEN_Y=480
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+CONFIG_KEYBOARD_PXA27x=y
+# CONFIG_KEYBOARD_GPIO is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_ADS7846 is not set
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+# CONFIG_TOUCHSCREEN_PALMTC is not set
+CONFIG_TOUCHSCREEN_WM97XX=y
+# CONFIG_TOUCHSCREEN_WM9705 is not set
+CONFIG_TOUCHSCREEN_WM9712=y
+# CONFIG_TOUCHSCREEN_WM9713 is not set
+# CONFIG_TOUCHSCREEN_WM97XX_PXA is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_LIBPS2 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 is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+# CONFIG_SERIAL_PXA_IR is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=16
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=m
+# CONFIG_NVRAM is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=m
+CONFIG_I2C_CHARDEV=m
+
+#
+# I2C Algorithms
+#
+# CONFIG_I2C_ALGOBIT is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+# CONFIG_I2C_ALGOPXA is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_PXA=m
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# 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 is not set
+# CONFIG_I2C_ADCM2650 is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCA9535 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_RTC8564 is not set
+# CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_I2C_OV9640 is not set
+# CONFIG_I2C_OV96XX 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_MASTER=y
+
+#
+# SPI Master Controller Drivers
+#
+# CONFIG_SPI_BITBANG is not set
+CONFIG_SPI_PXA2XX=y
+
+#
+# SPI Protocol Masters
+#
+# CONFIG_SPI_AT25 is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+# CONFIG_BATTERY_DS2760 is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+# CONFIG_BATTCHARGE_MONITOR is not set
+
+#
+# Multimedia Capabilities Port drivers
+#
+# CONFIG_ADC is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+# CONFIG_LEDS_TRIGGER_HWTIMER is not set
+CONFIG_LEDS_TRIGGER_MMC_CARD=y
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+# CONFIG_LEDS_TRIGGER_SHARED 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_CPIA is not set
+# CONFIG_VIDEO_SAA5246A is not set
+# CONFIG_VIDEO_SAA5249 is not set
+# CONFIG_TUNER_3036 is not set
+# CONFIG_PXACI is not set
+
+#
+# Radio Adapters
+#
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+# CONFIG_LCD_CLASS_DEVICE is not set
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+CONFIG_FIRMWARE_EDID=y
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+CONFIG_FB_PXA_PARAMETERS=y
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+CONFIG_LOGO_LINUX_CLUT224=y
+
+#
+# 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 is not set
+# CONFIG_SND_VERBOSE_PROCFS is not set
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+CONFIG_SND_AC97_CODEC=y
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+# CONFIG_SND_PXA2xx_I2SOUND is not set
+CONFIG_SND_PXA2XX_PCM=y
+CONFIG_SND_PXA2XX_AC97=y
+# CONFIG_SND_RECON is not set
+
+#
+# PCMCIA devices
+#
+# CONFIG_SND_VXPOCKET is not set
+# CONFIG_SND_PDAUDIOCF is not set
+
+#
+# SoC audio support
+#
+# CONFIG_SND_SOC is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+CONFIG_AC97_BUS=y
+
+#
+# HID Devices
+#
+CONFIG_HID=y
+# CONFIG_HID_DEBUG 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 is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+CONFIG_USB_GADGET_PXA27X=y
+CONFIG_USB_PXA27X=y
+# CONFIG_USB_PXA27X_DMA is not set
+# CONFIG_USB_GADGET_SX2 is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+# CONFIG_USB_ZERO is not set
+CONFIG_USB_ETH=m
+# CONFIG_USB_ETH_RNDIS is not set
+# CONFIG_USB_GADGETFS is not set
+# CONFIG_USB_FILE_STORAGE is not set
+# CONFIG_USB_G_SERIAL is not set
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+CONFIG_USB_PXA2XX_GPIO=y
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_PXA=y
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP 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_EPOCH=1904
+# CONFIG_RTC_DEBUG is not set
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=m
+CONFIG_RTC_INTF_PROC=m
+CONFIG_RTC_INTF_DEV=m
+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+
+#
+# RTC drivers
+#
+# CONFIG_RTC_DRV_CMOS is not set
+# 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_RS5C348 is not set
+# CONFIG_RTC_DRV_RS5C372 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=m
+# 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 is not set
+# CONFIG_EXT4DEV_FS is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+# 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 is not set
+# CONFIG_INOTIFY is not set
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+CONFIG_AUTOFS_FS=y
+CONFIG_AUTOFS4_FS=y
+# 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_AUFS 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_CRAMFS is not set
+CONFIG_SQUASHFS=y
+CONFIG_SQUASHFS_EMBEDDED=y
+CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
+# CONFIG_SQUASHFS_VMALLOC is not set
+# CONFIG_SQUASHFS_LZMA 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
+# CONFIG_UNION_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=m
+# CONFIG_NFS_V3 is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# 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 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=y
+# 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=y
+# 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=y
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM 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 is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_SMALLOOPS is not set
+# CONFIG_DEBUG_KERNEL is not set
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_DEBUG_BUGVERBOSE is not set
+CONFIG_FRAME_POINTER=y
+# CONFIG_DEBUG_USER is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+# CONFIG_CRYPTO_SHA1 is not set
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+CONFIG_CRYPTO_CBC=m
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+CONFIG_CRYPTO_AES=m
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-hackndev-2.6/palmtx/init b/recipes-kernel/linux/linux-hackndev-2.6/palmtx/init
new file mode 100755
index 0000000..fe4a191
--- /dev/null
+++ b/recipes-kernel/linux/linux-hackndev-2.6/palmtx/init
@@ -0,0 +1,195 @@
+#!/bin/sh
+# $Id: $
+# authors: Cristiano P.
+#
+
+# TODO: echo only if VERBOSE
+# TODO: check the whole thing ...
+
+# defaults:
+VERBOSE=true
+FORCE_FSCK=false
+UMOUNT_FILES_DEV=false
+
+FILES_DEV=/dev/mmcblk0p1
+FILES_MNT=/mnt/mmc
+ROOT_DEV=$FILES_MNT/opie-image-v0.8.4-palmtx.rootfs.ext2
+SWAP_DEV=none
+
+MODULES_DIR="/lib/modules"
+POST_MODULES_SCRIPT=""
+
+echo mounting sysfs
+mount -n -t sysfs sys /sys >/dev/null 2>&1 || mount -t sysfs sys /sys
+
+echo mounting proc filesystem
+mount -n -t proc none /proc >/dev/null 2>&1 || mount -t proc none /proc
+
+# try to get model name from /proc/cpuinfo
+MODEL_NAME=`awk -F: '/Hardware/ { print $2 }' </proc/cpuinfo | sed 's/^ *//;s/ *$//'`
+
+[ $VERBOSE = "true" ] && echo Model name: $MODEL_NAME
+
+# device specific configuration
+case $MODEL_NAME in
+ "Palm TX")
+ FILES_MNT=/media/mmc1
+ ;;
+
+ "Palm LifeDrive")
+ HDD_DEV=/dev/hda
+ HDD_OFFSET=91814912
+ LOOP_DEV=/dev/loop0
+ ;;
+
+ *)
+ ;;
+esac
+
+echo initram init started
+
+if [ -f /etc/modules.initrd ]; then
+ echo loading initial modules
+ cat /etc/modules.initrd | while read module; do
+ echo loading module: $module
+ /sbin/insmod $MODULES_DIR/$module > /dev/null
+ done
+fi
+
+
+# device specific actions ...
+case $MODEL_NAME in
+ "Palm LifeDrive")
+ echo Mounting LifeDrive data partition...
+ losetup -o $HDD_OFFSET $LOOP_DEV $HDD_DEV
+ FILES_DEV=$LOOP_DEV
+ FILES_MNT=/mnt/hda
+ ;;
+
+ *)
+ ;;
+esac
+
+
+if [ -b $FILES_DEV ]; then
+ FILES_DEV_MOUNTED=false
+ echo -n "attempting to mount $FILES_DEV: "
+ /bin/mount -t vfat -o rw $FILES_DEV $FILES_MNT > /dev/null 2>&1
+ [ $? ] && FILES_DEV_MOUNTED=true
+
+ if [ $FILES_DEV_MOUNTED = "true" ]; then
+ echo "mounted on $FILES_MNT."
+ /bin/sleep 1
+ echo -n "sourcing linux.boot.cfg: "
+ # todo: check parameters/files?
+ if [ -f $FILES_MNT/linux.boot.cfg ]; then
+ echo found.
+ . $FILES_MNT/linux.boot.cfg
+
+ if [ -f $FILES_MNT/modules.initrd ]; then
+ echo loading additional modules now:
+ cat $FILES_MNT/modules.initrd | while read module; do
+ loading module: $module
+ /sbin/insmod $MODULES_DIR/$module > /dev/null
+ done
+ fi
+ else
+ echo not found.
+ fi
+ else
+ echo "could not mount."
+ FILES_DEV_MOUNTED=false
+ fi
+else
+ echo device $FILES_DEV not found.
+ FILES_DEV_MOUNTED=false
+fi
+
+# this script could be used to update the rootfs before booting familiar (new modules, scripts, config, ...)
+echo -n "post_module script: "
+if [ -n "$POST_MODULES_SCRIPT" ]; then
+ if [ -f "$POST_MODULES_SCRIPT" ]; then
+ echo found $POST_MODULES_SCRIPT .
+ $POST_MODULES_SCRIPT
+ fi
+else
+ echo not found.
+fi
+
+# probably swap should/can be enabled by familiar (add to /etc/fstab?)
+# is it the right place to mount swap?
+if [ -n "$SWAP_DEV" -a $SWAP_DEV != "none" ]; then
+ echo -n "mount swap at $SWAP_DEV: "
+
+ if [ -f $SWAP_DEV -o -b $SWAP_DEV ]; then
+ /sbin/swapon $SWAP_DEV > /dev/null 2>&1
+ echo done.
+ else
+ echo not found.
+ fi
+else
+ echo "no swap specified."
+fi
+
+# force fsck if specified
+if [ $FORCE_FSCK = "true" ]; then
+ echo "checking rootfs [$ROOT_DEV]"
+ if [ $VERBOSE = "true" ]; then
+ /sbin/e2fsck -f -y $ROOT_DEV
+ else
+ /sbin/e2fsck -f -y $ROOT_DEV > /dev/null 2>&1
+ fi
+fi
+
+echo -n "mounting rootfs: "
+
+# todo: calculate root dev id? (256*major + minor)
+if [ -f $ROOT_DEV ]; then
+ #echo 0x701 > /proc/sys/kernel/real-root-dev
+ mount -n $ROOT_DEV /newroot -o rw loop 2>/dev/null
+ [ $? ] && ROOT_MOUNTED=true
+ # this shouldn't be possible if image is on FILES_DEV
+ UMOUNT_FILES_DEV=false
+elif [ -b $ROOT_DEV ]; then
+ mount -n $ROOT_DEV /newroot -o rw 2>/dev/null
+ [ $? ] && ROOT_MOUNTED=true
+else
+ echo "not a file or a block device."
+ ROOT_MOUNTED=false
+fi
+
+# TODO: should initial /dev (/oldroot/dev) be unmounted after init by GPE?
+if [ $ROOT_MOUNTED = "true" ]; then
+ echo mounted
+
+ # umount mmc if forced by UMOUNT_FILES_DEV
+ if [ $UMOUNT_FILES_DEV = "true" -a $FILES_DEV_MOUNTED = "true" ]; then
+ umount -l $FILES_DEV
+ [ $? ] && FILES_DEV_MOUNTED=false
+ [ $FILES_DEV_MOUNTED = "false" ] && echo "$FILES_DEV umounted"
+ fi
+
+ # move mmc's mount point on new rootfs
+ if [ $FILES_DEV_MOUNTED = "true" ]; then
+ echo moving $FILES_MNT to /newroot$FILES_MNT
+ mount --move $FILES_MNT /newroot$FILES_MNT
+ fi
+
+ # force umount sys and proc
+ umount -l /sys
+ umount -l /proc
+
+ # method 2: use switch_root (needs initramfs)
+ exec /sbin/switch_root -c /dev/console /newroot /sbin/init 5
+
+ echo "* * * switch_root failed! * * *"
+else
+ echo "failed!"
+ echo could not mount root fs: init failed!
+ echo please, reset, check your configuration and retry.
+ sleep 100000
+fi
+
+# TODO: run ezhikov's keyshell here?
+exec /bin/sh
+
diff --git a/recipes-kernel/linux/linux-hackndev-2.6/palmtx/initramfs_list b/recipes-kernel/linux/linux-hackndev-2.6/palmtx/initramfs_list
new file mode 100644
index 0000000..821a7cc
--- /dev/null
+++ b/recipes-kernel/linux/linux-hackndev-2.6/palmtx/initramfs_list
@@ -0,0 +1,243 @@
+
+#####################
+# ../initramfs/root
+# Last modified: 1156149630
+
+dir /bin 755 0 0
+file /bin/busybox ../busybox-1.1.0/busybox 4755 0 0
+slink /bin/awk busybox 777 0 0
+slink /bin/ash busybox 777 0 0
+slink /bin/cat busybox 777 0 0
+slink /bin/chgrp busybox 777 0 0
+slink /bin/chmod busybox 777 0 0
+slink /bin/chown busybox 777 0 0
+slink /bin/cp busybox 777 0 0
+slink /bin/df busybox 777 0 0
+slink /bin/dmesg busybox 777 0 0
+slink /bin/echo busybox 777 0 0
+slink /bin/false busybox 777 0 0
+slink /bin/getopt busybox 777 0 0
+slink /bin/grep busybox 777 0 0
+slink /bin/hostname busybox 777 0 0
+slink /bin/kill busybox 777 0 0
+slink /bin/ln busybox 777 0 0
+slink /bin/ls busybox 777 0 0
+slink /bin/mkdir busybox 777 0 0
+slink /bin/mknod busybox 777 0 0
+slink /bin/mktemp busybox 777 0 0
+slink /bin/more busybox 777 0 0
+slink /bin/mount busybox 777 0 0
+slink /bin/mt busybox 777 0 0
+slink /bin/mv busybox 777 0 0
+slink /bin/pidof busybox 777 0 0
+slink /bin/ping busybox 777 0 0
+slink /bin/ps busybox 777 0 0
+slink /bin/pwd busybox 777 0 0
+slink /bin/rm busybox 777 0 0
+slink /bin/rmdir busybox 777 0 0
+slink /bin/sed busybox 777 0 0
+slink /bin/sh busybox 777 0 0
+slink /bin/sleep busybox 777 0 0
+slink /bin/stty busybox 777 0 0
+slink /bin/su busybox 777 0 0
+slink /bin/sync busybox 777 0 0
+slink /bin/touch busybox 777 0 0
+slink /bin/true busybox 777 0 0
+slink /bin/umount busybox 777 0 0
+slink /bin/uname busybox 777 0 0
+slink /bin/stat busybox 777 0 0
+dir /dev 755 0 0
+slink /dev/log /tmp/log 777 0 0
+dir /dev/pts 755 0 0
+dir /dev/shm 755 0 0
+nod /dev/mem 640 0 0 c 1 1
+nod /dev/kmem 640 0 0 c 1 2
+nod /dev/null 666 0 0 c 1 3
+nod /dev/zero 666 0 0 c 1 5
+nod /dev/random 666 0 0 c 1 8
+nod /dev/urandom 666 0 0 c 1 9
+nod /dev/ram 640 0 0 b 1 1
+nod /dev/ram0 640 0 0 b 1 0
+nod /dev/ram1 640 0 0 b 1 1
+nod /dev/ram2 640 0 0 b 1 2
+nod /dev/ram3 640 0 0 b 1 3
+slink /dev/loop0 loop/0 777 0 0
+slink /dev/loop1 loop/1 777 0 0
+nod /dev/rtc 640 0 0 c 10 135
+nod /dev/console 666 0 0 c 5 1
+nod /dev/tty 666 0 0 c 5 0
+nod /dev/tty0 666 0 0 c 4 0
+nod /dev/tty1 666 0 0 c 4 1
+nod /dev/tty2 666 0 0 c 4 2
+nod /dev/tty3 666 0 0 c 4 3
+nod /dev/tty4 666 0 0 c 4 4
+nod /dev/tty5 666 0 0 c 4 5
+nod /dev/tty6 666 0 0 c 4 6
+nod /dev/tty7 666 0 0 c 4 7
+nod /dev/ttyp0 666 0 0 c 3 0
+nod /dev/ttyp1 666 0 0 c 3 1
+nod /dev/ttyp2 666 0 0 c 3 2
+nod /dev/ttyp3 666 0 0 c 3 3
+nod /dev/ttyp4 666 0 0 c 3 4
+nod /dev/ttyp5 666 0 0 c 3 5
+nod /dev/ttyp6 666 0 0 c 3 6
+nod /dev/ttyp7 666 0 0 c 3 7
+nod /dev/ttyp8 666 0 0 c 3 8
+nod /dev/ttyp9 666 0 0 c 3 9
+nod /dev/ptyp0 666 0 0 c 2 0
+nod /dev/ptyp1 666 0 0 c 2 1
+nod /dev/ptyp2 666 0 0 c 2 2
+nod /dev/ptyp3 666 0 0 c 2 3
+nod /dev/ptyp4 666 0 0 c 2 4
+nod /dev/ptyp5 666 0 0 c 2 5
+nod /dev/ptyp6 666 0 0 c 2 6
+nod /dev/ptyp7 666 0 0 c 2 7
+nod /dev/ptyp8 666 0 0 c 2 8
+nod /dev/ptyp9 666 0 0 c 2 9
+nod /dev/ptmx 666 0 0 c 5 2
+nod /dev/ttyP0 666 0 0 c 57 0
+nod /dev/ttyP1 666 0 0 c 57 1
+nod /dev/ttyP2 666 0 0 c 57 2
+nod /dev/ttyP3 666 0 0 c 57 3
+nod /dev/ttyS0 666 0 0 c 4 64
+nod /dev/ttyS1 666 0 0 c 4 65
+nod /dev/ttyS2 666 0 0 c 4 66
+nod /dev/ttyS3 666 0 0 c 4 67
+nod /dev/fb0 640 0 0 c 29 0
+nod /dev/fb1 640 0 0 c 29 32
+nod /dev/fb2 640 0 0 c 29 64
+nod /dev/fb3 640 0 0 c 29 96
+nod /dev/psaux 666 0 0 c 10 1
+dir /dev/input 755 0 0
+nod /dev/input/mice 640 0 0 c 13 63
+nod /dev/input/mouse0 660 0 0 c 13 32
+nod /dev/input/mouse1 660 0 0 c 13 33
+nod /dev/input/mouse2 660 0 0 c 13 34
+nod /dev/input/mouse3 660 0 0 c 13 35
+nod /dev/input/event0 660 0 0 c 13 64
+nod /dev/input/event1 660 0 0 c 13 65
+nod /dev/input/event2 660 0 0 c 13 66
+nod /dev/input/event3 660 0 0 c 13 67
+nod /dev/mtd0 640 0 0 c 90 0
+nod /dev/mtd1 640 0 0 c 90 2
+nod /dev/mtd2 640 0 0 c 90 4
+nod /dev/mtd3 640 0 0 c 90 6
+nod /dev/mtdblock0 640 0 0 b 31 0
+nod /dev/mtdblock1 640 0 0 b 31 1
+nod /dev/mtdblock2 640 0 0 b 31 2
+nod /dev/mtdblock3 640 0 0 b 31 3
+dir /dev/net 755 0 0
+nod /dev/net/tun 660 0 0 c 10 200
+nod /dev/hda 640 0 0 b 3 0
+nod /dev/hda1 640 0 0 b 3 1
+nod /dev/hda2 640 0 0 b 3 2
+nod /dev/hda3 640 0 0 b 3 3
+nod /dev/hda4 640 0 0 b 3 4
+nod /dev/hda5 640 0 0 b 3 5
+nod /dev/hda6 640 0 0 b 3 6
+nod /dev/hda7 640 0 0 b 3 7
+nod /dev/hda8 640 0 0 b 3 8
+nod /dev/hda9 640 0 0 b 3 9
+nod /dev/hda10 640 0 0 b 3 10
+nod /dev/hda11 640 0 0 b 3 11
+nod /dev/hda12 640 0 0 b 3 12
+nod /dev/hda13 640 0 0 b 3 13
+nod /dev/hda14 640 0 0 b 3 14
+nod /dev/hdb 640 0 0 b 3 64
+nod /dev/hdb1 640 0 0 b 3 65
+nod /dev/hdb2 640 0 0 b 3 66
+nod /dev/hdb3 640 0 0 b 3 67
+nod /dev/hdb4 640 0 0 b 3 68
+nod /dev/hdb5 640 0 0 b 3 69
+nod /dev/hdb6 640 0 0 b 3 70
+nod /dev/hdb7 640 0 0 b 3 71
+nod /dev/hdb8 640 0 0 b 3 72
+nod /dev/hdb9 640 0 0 b 3 73
+nod /dev/hdb10 640 0 0 b 3 74
+nod /dev/hdb11 640 0 0 b 3 75
+nod /dev/hdb12 640 0 0 b 3 76
+nod /dev/hdb13 640 0 0 b 3 77
+nod /dev/hdb14 640 0 0 b 3 78
+nod /dev/mmcblk0 666 0 0 b 254 0
+nod /dev/mmcblk0p1 666 0 0 b 254 1
+nod /dev/mmcblk0p2 666 0 0 b 254 2
+nod /dev/mmcblk0p3 666 0 0 b 254 3
+nod /dev/mmcblk0p4 666 0 0 b 254 4
+nod /dev/mmcblk0p5 666 0 0 b 254 5
+nod /dev/mmcblk0p6 666 0 0 b 254 6
+nod /dev/mmcblk0p7 666 0 0 b 254 7
+nod /dev/mmcblk0p8 666 0 0 b 254 8
+nod /dev/mmcblk0p9 666 0 0 b 254 9
+dir /dev/loop 755 0 0
+nod /dev/loop/0 644 0 0 b 7 0
+nod /dev/loop/1 644 0 0 b 7 1
+nod /dev/loop/2 644 0 0 b 7 2
+nod /dev/loop/3 644 0 0 b 7 3
+nod /dev/loop/4 644 0 0 b 7 4
+nod /dev/loop/5 644 0 0 b 7 5
+slink /dev/loop2 loop/2 777 0 0
+slink /dev/loop3 loop/3 777 0 0
+slink /dev/loop4 loop/4 777 0 0
+slink /dev/loop5 loop/5 777 0 0
+dir /etc 755 0 0
+slink /etc/mtab ../proc/mounts 777 0 0
+dir /lib 755 0 0
+dir /lib/modules 755 0 0
+dir /media 755 0 0
+dir /media/mmc1 755 0 0
+dir /mnt 755 0 0
+dir /mnt/mmc 755 0 0
+dir /newroot 755 0 0
+dir /proc 755 0 0
+dir /root 755 0 0
+dir /sbin 755 0 0
+slink /sbin/getty ../bin/busybox 777 0 0
+slink /sbin/halt ../bin/busybox 777 0 0
+slink /sbin/init ../bin/busybox 777 0 0
+slink /sbin/insmod ../bin/busybox 777 0 0
+slink /sbin/klogd ../bin/busybox 777 0 0
+slink /sbin/lsmod ../bin/busybox 777 0 0
+slink /sbin/rmmod ../bin/busybox 777 0 0
+slink /sbin/route ../bin/busybox 777 0 0
+slink /sbin/sulogin ../bin/busybox 777 0 0
+slink /sbin/swapoff ../bin/busybox 777 0 0
+slink /sbin/swapon ../bin/busybox 777 0 0
+slink /sbin/syslogd ../bin/busybox 777 0 0
+slink /sbin/switch_root ../bin/busybox 777 0 0
+slink /sbin/e2fsck ../bin/busybox 777 0 0
+slink /sbin/fsck.ext2 ../bin/busybox 777 0 0
+slink /sbin/fsck.ext3 ../bin/busybox 777 0 0
+dir /sys 755 0 0
+dir /tmp 755 0 0
+dir /usr 755 0 0
+dir /usr/bin 755 0 0
+slink /usr/bin/[ ../../bin/busybox 777 0 0
+slink /usr/bin/[[ ../../bin/busybox 777 0 0
+slink /usr/bin/chvt ../../bin/busybox 777 0 0
+slink /usr/bin/clear ../../bin/busybox 777 0 0
+slink /usr/bin/du ../../bin/busybox 777 0 0
+slink /usr/bin/env ../../bin/busybox 777 0 0
+slink /usr/bin/expr ../../bin/busybox 777 0 0
+slink /usr/bin/find ../../bin/busybox 777 0 0
+slink /usr/bin/free ../../bin/busybox 777 0 0
+slink /usr/bin/hostid ../../bin/busybox 777 0 0
+slink /usr/bin/id ../../bin/busybox 777 0 0
+slink /usr/bin/logger ../../bin/busybox 777 0 0
+slink /usr/bin/logname ../../bin/busybox 777 0 0
+slink /usr/bin/tail ../../bin/busybox 777 0 0
+slink /usr/bin/test ../../bin/busybox 777 0 0
+slink /usr/bin/tty ../../bin/busybox 777 0 0
+slink /usr/bin/uptime ../../bin/busybox 777 0 0
+slink /usr/bin/xargs ../../bin/busybox 777 0 0
+slink /usr/bin/yes ../../bin/busybox 777 0 0
+slink /usr/bin/basename ../../bin/busybox 777 0 0
+slink /usr/bin/cmp ../../bin/busybox 777 0 0
+slink /usr/bin/dc ../../bin/busybox 777 0 0
+slink /usr/bin/dirname ../../bin/busybox 777 0 0
+slink /usr/bin/head ../../bin/busybox 777 0 0
+slink /usr/bin/sort ../../bin/busybox 777 0 0
+slink /usr/bin/strings ../../bin/busybox 777 0 0
+slink /usr/bin/tee ../../bin/busybox 777 0 0
+slink /usr/bin/uniq ../../bin/busybox 777 0 0
+dir /usr/sbin 755 0 0
+file /init ../init 755 0 0
diff --git a/recipes-kernel/linux/linux-hackndev-2.6/palmz72/defconfig b/recipes-kernel/linux/linux-hackndev-2.6/palmz72/defconfig
new file mode 100644
index 0000000..f849049
--- /dev/null
+++ b/recipes-kernel/linux/linux-hackndev-2.6/palmz72/defconfig
@@ -0,0 +1,1422 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hnd2
+# Mon Jul 23 21:44:35 2007
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=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_SYSVIPC_SYSCTL=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 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_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+# CONFIG_ELF_CORE is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+# CONFIG_IOSCHED_DEADLINE is not set
+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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+# CONFIG_BOARD_IRQ_MAP_BIG is not set
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_XSCALE_PALMTREO650 is not set
+# CONFIG_MACH_XSCALE_TREO680 is not set
+# CONFIG_MACH_T700WX is not set
+# CONFIG_MACH_TUNGE2 is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_XSCALE_PALMTT5 is not set
+# CONFIG_MACH_XSCALE_PALMTX is not set
+CONFIG_MACH_PALMZ72=y
+CONFIG_PALMZ72_PM=m
+CONFIG_PALMZ72_BATTERY=m
+# CONFIG_MACH_OMAP_PALMTC is not set
+# CONFIG_MACH_ZIRE31 is not set
+CONFIG_GPIOED=m
+CONFIG_GPIOEDNG=m
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA27x=y
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+CONFIG_IWMMXT=y
+# CONFIG_ARMBOOT_PROC is not set
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+# CONFIG_NO_IDLE_HZ is not set
+CONFIG_HZ=100
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="mem=32M"
+# CONFIG_XIP_KERNEL is not set
+# CONFIG_KEXEC is not set
+# CONFIG_TXTOFFSET_DELTA is not set
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options
+#
+CONFIG_PM=y
+CONFIG_PM_LEGACY=y
+# CONFIG_PM_DEBUG is not set
+# CONFIG_DPM_DEBUG is not set
+# CONFIG_PM_SYSFS_DEPRECATED is not set
+CONFIG_APM_EMULATION=m
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=m
+# 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_XFRM_MIGRATE is not set
+CONFIG_NET_KEY=m
+# CONFIG_NET_KEY_MIGRATE 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 is not set
+CONFIG_NET_IPIP=m
+CONFIG_NET_IPGRE=m
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+CONFIG_INET_AH=m
+CONFIG_INET_ESP=m
+CONFIG_INET_IPCOMP=m
+CONFIG_INET_XFRM_TUNNEL=m
+CONFIG_INET_TUNNEL=m
+CONFIG_INET_XFRM_MODE_TRANSPORT=m
+CONFIG_INET_XFRM_MODE_TUNNEL=m
+CONFIG_INET_XFRM_MODE_BEET=m
+CONFIG_INET_DIAG=m
+CONFIG_INET_TCP_DIAG=m
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# 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=m
+
+#
+# IrDA protocols
+#
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
+CONFIG_IRCOMM=m
+# CONFIG_IRDA_ULTRA is not set
+
+#
+# IrDA options
+#
+# CONFIG_IRDA_CACHE_LAST_LSAP is not set
+# CONFIG_IRDA_FAST_RR is not set
+# CONFIG_IRDA_DEBUG is not set
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+CONFIG_IRTTY_SIR=m
+
+#
+# Dongle support
+#
+# CONFIG_DONGLE is not set
+
+#
+# Old SIR device drivers
+#
+CONFIG_IRPORT_SIR=m
+
+#
+# Old Serial dongle support
+#
+# CONFIG_DONGLE_OLD is not set
+
+#
+# FIR device drivers
+#
+CONFIG_PXA_FICP=m
+CONFIG_BT=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_BCM2035UART=m
+CONFIG_BT_HCIVHCI=m
+CONFIG_IEEE80211=m
+# CONFIG_IEEE80211_DEBUG is not set
+CONFIG_IEEE80211_CRYPT_WEP=m
+CONFIG_IEEE80211_CRYPT_CCMP=m
+CONFIG_IEEE80211_SOFTMAC=m
+# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set
+CONFIG_WIRELESS_EXT=y
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=m
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=m
+# CONFIG_MTD_DEBUG is not set
+CONFIG_MTD_CONCAT=m
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+# CONFIG_MTD_CHAR is not set
+# CONFIG_MTD_BLKDEVS is not set
+# CONFIG_MTD_BLOCK is not set
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+# CONFIG_MTD_JEDECPROBE 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 is not set
+# 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_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_SHARP_SL is not set
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI 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 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_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_SMC91X is not set
+# CONFIG_DM9000 is not set
+# CONFIG_SMC911X is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+CONFIG_PPP=m
+# CONFIG_PPP_MULTILINK is not set
+CONFIG_PPP_FILTER=y
+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 is not set
+CONFIG_SLHC=m
+CONFIG_SHAPER=m
+CONFIG_NETCONSOLE=m
+CONFIG_NETPOLL=y
+# CONFIG_NETPOLL_RX is not set
+# CONFIG_NETPOLL_TRAP is not set
+CONFIG_NET_POLL_CONTROLLER=y
+
+#
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+CONFIG_INPUT_TSDEV=m
+CONFIG_INPUT_TSDEV_SCREEN_X=320
+CONFIG_INPUT_TSDEV_SCREEN_Y=480
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+CONFIG_KEYBOARD_PXA27x=y
+# CONFIG_KEYBOARD_PALMIR is not set
+CONFIG_KEYBOARD_PALMWK=m
+CONFIG_KEYBOARD_GPIO=y
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_ADS7846 is not set
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+# CONFIG_TOUCHSCREEN_PALMTC is not set
+CONFIG_TOUCHSCREEN_WM97XX=m
+# CONFIG_TOUCHSCREEN_WM9705 is not set
+CONFIG_TOUCHSCREEN_WM9712=y
+# CONFIG_TOUCHSCREEN_WM9713 is not set
+# CONFIG_TOUCHSCREEN_WM97XX_PXA is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_LIBPS2 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 is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+# CONFIG_SERIAL_PXA_IR is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=m
+# CONFIG_NVRAM is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=m
+CONFIG_I2C_CHARDEV=m
+
+#
+# I2C Algorithms
+#
+# CONFIG_I2C_ALGOBIT is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+CONFIG_I2C_ALGOPXA=m
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_PXA=m
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# 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 is not set
+# CONFIG_I2C_ADCM2650 is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCA9535 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_RTC8564 is not set
+# CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_I2C_OV9640 is not set
+CONFIG_I2C_OV96XX=m
+CONFIG_I2C_DEBUG_CORE=y
+CONFIG_I2C_DEBUG_ALGO=y
+CONFIG_I2C_DEBUG_BUS=y
+CONFIG_I2C_DEBUG_CHIP=y
+
+#
+# SPI support
+#
+CONFIG_SPI=y
+CONFIG_SPI_MASTER=y
+
+#
+# SPI Master Controller Drivers
+#
+CONFIG_SPI_BITBANG=m
+CONFIG_SPI_PXA2XX=y
+
+#
+# SPI Protocol Masters
+#
+# CONFIG_SPI_AT25 is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# 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_ADM1029 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 is not set
+# CONFIG_SENSORS_LM77 is not set
+# CONFIG_SENSORS_LM78 is not set
+# CONFIG_SENSORS_LM80 is not set
+# CONFIG_SENSORS_LM83 is not set
+# CONFIG_SENSORS_LM85 is not set
+# 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_PC87427 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_W83793 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
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=m
+# CONFIG_BATTERY_DS2760 is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+# CONFIG_BATTCHARGE_MONITOR is not set
+
+#
+# Multimedia Capabilities Port drivers
+#
+# CONFIG_ADC is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=m
+
+#
+# LED drivers
+#
+CONFIG_LEDS_PALMZ72=m
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=m
+# CONFIG_LEDS_TRIGGER_HWTIMER is not set
+CONFIG_LEDS_TRIGGER_MMC_CARD=m
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+# CONFIG_LEDS_TRIGGER_SHARED is not set
+
+#
+# Multimedia devices
+#
+CONFIG_VIDEO_DEV=m
+CONFIG_VIDEO_V4L1=y
+CONFIG_VIDEO_V4L1_COMPAT=y
+CONFIG_VIDEO_V4L2=y
+
+#
+# Video Capture Adapters
+#
+
+#
+# Video Capture Adapters
+#
+# CONFIG_VIDEO_ADV_DEBUG is not set
+CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
+# CONFIG_VIDEO_CPIA is not set
+# CONFIG_VIDEO_SAA5246A is not set
+# CONFIG_VIDEO_SAA5249 is not set
+# CONFIG_TUNER_3036 is not set
+CONFIG_PXACI=m
+
+#
+# Radio Adapters
+#
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+# CONFIG_LCD_CLASS_DEVICE is not set
+CONFIG_BACKLIGHT_CORGI=y
+# CONFIG_BACKLIGHT_PXAPWM is not set
+CONFIG_FB=y
+CONFIG_FIRMWARE_EDID=y
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+CONFIG_FB_PXA_PARAMETERS=y
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+CONFIG_LOGO_LINUX_CLUT224=y
+
+#
+# Sound
+#
+CONFIG_SOUND=m
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+CONFIG_SND_SEQUENCER=m
+# CONFIG_SND_SEQ_DUMMY is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_PCM_OSS_PLUGINS=y
+# CONFIG_SND_SEQUENCER_OSS is not set
+# CONFIG_SND_DYNAMIC_MINORS is not set
+CONFIG_SND_SUPPORT_OLD_API=y
+# CONFIG_SND_VERBOSE_PROCFS is not set
+CONFIG_SND_VERBOSE_PRINTK=y
+CONFIG_SND_DEBUG=y
+CONFIG_SND_DEBUG_DETECT=y
+
+#
+# Generic devices
+#
+CONFIG_SND_AC97_CODEC=m
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_VIRMIDI is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+CONFIG_SND_PXA2xx_I2SOUND=m
+CONFIG_SND_PXA2XX_PCM=m
+CONFIG_SND_PXA2XX_AC97=m
+# CONFIG_SND_RECON is not set
+
+#
+# SoC audio support
+#
+# CONFIG_SND_SOC is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+CONFIG_AC97_BUS=m
+
+#
+# HID Devices
+#
+CONFIG_HID=y
+# CONFIG_HID_DEBUG 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 is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=m
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+CONFIG_USB_GADGET_PXA27X=y
+CONFIG_USB_PXA27X=m
+# CONFIG_USB_PXA27X_DMA is not set
+# CONFIG_USB_GADGET_SX2 is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+# CONFIG_USB_ZERO is not set
+CONFIG_USB_ETH=m
+# CONFIG_USB_ETH_RNDIS is not set
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+# CONFIG_USB_PXA2XX_GPIO is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=m
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=m
+CONFIG_MMC_PXA=m
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP is not set
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=m
+CONFIG_RTC_EPOCH=1970
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=m
+CONFIG_RTC_INTF_PROC=m
+CONFIG_RTC_INTF_DEV=m
+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+
+#
+# RTC drivers
+#
+# CONFIG_RTC_DRV_CMOS is not set
+# 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_RS5C348 is not set
+# CONFIG_RTC_DRV_RS5C372 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=m
+# 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 is not set
+# CONFIG_EXT4DEV_FS is not set
+# 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 is not set
+# CONFIG_INOTIFY is not set
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+CONFIG_AUTOFS_FS=y
+CONFIG_AUTOFS4_FS=y
+CONFIG_FUSE_FS=m
+
+#
+# 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_AUFS 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_JFFS2_FS is not set
+# CONFIG_CRAMFS is not set
+CONFIG_SQUASHFS=y
+CONFIG_SQUASHFS_EMBEDDED=y
+CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
+# CONFIG_SQUASHFS_VMALLOC is not set
+# CONFIG_SQUASHFS_LZMA 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
+# CONFIG_UNION_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=m
+# CONFIG_NFS_V3 is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# 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 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=y
+# 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=y
+# 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=y
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM 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 is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_SMALLOOPS is not set
+# CONFIG_DEBUG_KERNEL is not set
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_DEBUG_BUGVERBOSE is not set
+CONFIG_FRAME_POINTER=y
+# CONFIG_DEBUG_USER is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_HASH=m
+CONFIG_CRYPTO_MANAGER=m
+CONFIG_CRYPTO_HMAC=m
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=m
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+CONFIG_CRYPTO_CBC=m
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+CONFIG_CRYPTO_DES=m
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+CONFIG_CRYPTO_AES=m
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+CONFIG_CRYPTO_DEFLATE=m
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-hackndev-2.6_git.bb b/recipes-kernel/linux/linux-hackndev-2.6_git.bb
new file mode 100644
index 0000000..ac05b61
--- /dev/null
+++ b/recipes-kernel/linux/linux-hackndev-2.6_git.bb
@@ -0,0 +1,72 @@
+DESCRIPTION = "Hack&Dev's Linux kernel for Palm devices."
+HOMEPAGE = "http://www.hackndev.com/"
+SECTION = "kernel"
+LICENSE = "GPLv2"
+# This was in sane-srcrevs.inc - doesn't look sane to me (for git recipe)
+# SRCREV_pn-linux-hackndev-2.6 ?= "1308"
+SRCREV = "8f62c3b8a7e7de042846211f387a867f6703f272"
+PR = "r14"
+
+COMPATIBLE_MACHINE = "(palmld|palmtc|palmtt3|palmtt5|palmtx|palmz31|palmz72|palmt650)"
+
+SRC_URI = "git://git.hackndev.com/hackndev/linux-hnd.git;protocol=git;tag=master \
+ file://defconfig "
+S = "${WORKDIR}/git"
+
+K_MAJOR = "2"
+K_MINOR = "6"
+K_MICRO = "21"
+HHV="hnd3"
+PV = "${K_MAJOR}.${K_MINOR}.${K_MICRO}-${HHV}"
+
+inherit kernel
+
+do_configure() {
+
+ if [ -f ${WORKDIR}/defconfig ]; then
+ install -m 0644 ${WORKDIR}/defconfig ${S}/.config || die "No configuration for ${MACHINE} available."
+ else
+ install -m 0644 ${S}/arch/arm/configs/${MACHINE}_defconfig ${S}/.config \
+ || die "No default configuration for ${MACHINE} available."
+ fi
+
+ if [ "${TARGET_OS}" = "linux-gnueabi" -o "${TARGET_OS}" = "linux-uclibceabi" ]; then
+ echo "CONFIG_AEABI=y" >> ${S}/.config
+ echo "CONFIG_OABI_COMPAT=y" >> ${S}/.config
+ else
+ echo "# CONFIG_AEABI is not set" >> ${S}/.config
+ echo "# CONFIG_OABI_COMPAT is not set" >> ${S}/.config
+ fi
+
+ if [ -f ${WORKDIR}/initramfs_list ]; then
+ install -m 0644 ${WORKDIR}/busybox-config ${WORKDIR}/busybox-1.1.0/.config \
+ || die "No busybox configuration available."
+
+ echo "CROSS_COMPILER_PREFIX=\"${TARGET_PREFIX}\"" >> ${WORKDIR}/busybox-1.1.0/.config
+ echo "USING_CROSS_COMPILER=y" >> ${WORKDIR}/busybox-1.1.0/.config
+
+ MY_UID=`id -u`
+ MY_GID=`id -g`
+
+ echo "CONFIG_INITRAMFS_SOURCE=\"../initramfs_list\"" >> ${S}/.config
+ echo "CONFIG_INITRAMFS_ROOT_UID=${MY_UID}" >> ${S}/.config
+ echo "CONFIG_INITRAMFS_ROOT_GID=${MY_GID}" >> ${S}/.config
+ else
+ echo "CONFIG_INITRAMFS_SOURCE=\"\"" >> ${S}/.config
+ echo "CONFIG_INITRAMFS_ROOT_UID=0" >> ${S}/.config
+ echo "CONFIG_INITRAMFS_ROOT_GID=0" >> ${S}/.config
+
+ fi
+
+ yes '' | oe_runmake oldconfig
+
+}
+
+
+do_compile_prepend() {
+ if [ -f ${WORKDIR}/initramfs_list ]; then
+ cd ${WORKDIR}/busybox-1.1.0
+ oe_runmake 'CC=${CC}' 'CROSS=${HOST_PREFIX}'
+ cd -
+ fi
+}
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/0001-time-prevent-the-loop-in-timespec_add_ns-from-bei.patch b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/0001-time-prevent-the-loop-in-timespec_add_ns-from-bei.patch
new file mode 100644
index 0000000..ad10b67
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/0001-time-prevent-the-loop-in-timespec_add_ns-from-bei.patch
@@ -0,0 +1,34 @@
+From 38332cb98772f5ea757e6486bed7ed0381cb5f98 Mon Sep 17 00:00:00 2001
+From: Segher Boessenkool <segher@kernel.crashing.org>
+Date: Tue, 4 Mar 2008 14:59:54 -0800
+Subject: [PATCH] time: prevent the loop in timespec_add_ns() from being optimised away
+
+Since some architectures don't support __udivdi3().
+
+Signed-off-by: Segher Boessenkool <segher@kernel.crashing.org>
+Cc: john stultz <johnstul@us.ibm.com>
+Cc: Ingo Molnar <mingo@elte.hu>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+---
+ include/linux/time.h | 4 ++++
+ 1 files changed, 4 insertions(+), 0 deletions(-)
+
+diff --git a/include/linux/time.h b/include/linux/time.h
+index 2091a19..d32ef0a 100644
+--- a/include/linux/time.h
++++ b/include/linux/time.h
+@@ -174,6 +174,10 @@ static inline void timespec_add_ns(struct timespec *a, u64 ns)
+ {
+ ns += a->tv_nsec;
+ while(unlikely(ns >= NSEC_PER_SEC)) {
++ /* The following asm() prevents the compiler from
++ * optimising this loop into a modulo operation. */
++ asm("" : "+r"(ns));
++
+ ns -= NSEC_PER_SEC;
+ a->tv_sec++;
+ }
+--
+1.6.0.6
+
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/asus620/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/asus620/defconfig
new file mode 100644
index 0000000..8a8222a
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/asus620/defconfig
@@ -0,0 +1,1354 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:36 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+# CONFIG_BOARD_IRQ_MAP_BIG is not set
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+CONFIG_MACH_A620=y
+CONFIG_A620_LCD=y
+CONFIG_A620_BUTTONS=y
+CONFIG_A620_PCMCIA=y
+CONFIG_A620_TS=y
+# CONFIG_A620_FLASHFAKE is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+
+#
+# HTC_HW6X00
+#
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_MACH_MIOA701 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_RECON is not set
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_MACH_LOOXN560 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA25x=y
+# CONFIG_PXA_SSP is not set
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+# CONFIG_IWMMXT is not set
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_PXA=y
+CONFIG_PXA25x_ALTERNATE_FREQS=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+# CONFIG_BT_HCIVHCI is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=m
+CONFIG_MTD_DEBUG=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+# CONFIG_MTD_JEDECPROBE 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 is not set
+# 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_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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=m
+# CONFIG_MTD_NAND_VERIFY_WRITE is not set
+# CONFIG_MTD_NAND_ECC_SMC is not set
+CONFIG_MTD_NAND_IDS=m
+CONFIG_MTD_NAND_DISKONCHIP=m
+# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set
+CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0
+# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set
+# CONFIG_MTD_NAND_SHARPSL is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+CONFIG_SERIAL_PXA_IR=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_RS232_SERIAL=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+# CONFIG_BATTERY_DS2760 is not set
+CONFIG_ADC_BATTERY=y
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+# CONFIG_ADC_ADS7846_SSP is not set
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_BBKEYS is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+# CONFIG_LEDS_TRIGGER_HWTIMER is not set
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+# CONFIG_FB_PXA_PARAMETERS is not set
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+# CONFIG_SND is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=m
+# CONFIG_HID_DEBUG is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+CONFIG_USB_GADGET_PXA2XX=y
+CONFIG_USB_PXA2XX=y
+# CONFIG_USB_PXA2XX_SMALL is not set
+# CONFIG_USB_GADGET_PXA27X is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+# CONFIG_USB_PXA2XX_GPIO is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_PXA is not set
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP 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=y
+
+#
+# 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_CMOS is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_JFFS2_FS 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_REED_SOLOMON=m
+CONFIG_REED_SOLOMON_DEC16=y
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/asus730/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/asus730/defconfig
new file mode 100644
index 0000000..6e79c0a
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/asus730/defconfig
@@ -0,0 +1,1475 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:37 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+# CONFIG_BOARD_IRQ_MAP_BIG is not set
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+CONFIG_MACH_A730=y
+# CONFIG_ASUS730_WM9712 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+
+#
+# HTC_HW6X00
+#
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_MACH_MIOA701 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_RECON is not set
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_MACH_LOOXN560 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA27x=y
+# CONFIG_PXA_SSP is not set
+# CONFIG_PXA27x_VOLTAGE is not set
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+CONFIG_IWMMXT=y
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+CONFIG_PCCARD=y
+CONFIG_PCMCIA_DEBUG=y
+CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
+CONFIG_PCMCIA_IOCTL=y
+
+#
+# PC-card bridges
+#
+CONFIG_PCMCIA_PXA2XX=y
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_PXA=y
+CONFIG_PXA25x_ALTERNATE_FREQS=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+CONFIG_MTD_CONCAT=y
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+CONFIG_MTD_GEN_PROBE=y
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_CFI_NOSWAP=y
+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+CONFIG_MTD_CFI_GEOMETRY=y
+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 is not set
+# 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_OTP is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+# CONFIG_MTD_XIP 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_IPAQ is not set
+# CONFIG_MTD_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=y
+CONFIG_IDE_MAX_HWIFS=4
+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_IDECS=y
+# CONFIG_BLK_DEV_IDECD is not set
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY 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_IDEDMA 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
+
+#
+# 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=m
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# PCMCIA network device support
+#
+# CONFIG_NET_PCMCIA is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+# CONFIG_KEYBOARD_PXA27x is not set
+# CONFIG_KEYBOARD_GPIO is not set
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+CONFIG_SERIAL_PXA_IR=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+# CONFIG_I2C_ALGOBIT is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_PXA=y
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# 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 is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+CONFIG_SENSORS_PCA9535=y
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_RTC8564 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 is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+# CONFIG_POWER_SUPPLY is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+# CONFIG_ADC_ADS7846_SSP is not set
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_BBKEYS is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+# CONFIG_LEDS_TRIGGER_HWTIMER is not set
+# CONFIG_LEDS_TRIGGER_IDE_DISK is not set
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+# CONFIG_FB_PXA_PARAMETERS is not set
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+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_AC97_CODEC=m
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+CONFIG_SND_PXA2XX_PCM=m
+CONFIG_SND_PXA2XX_AC97=m
+# CONFIG_SND_RECON is not set
+
+#
+# PCMCIA devices
+#
+# CONFIG_SND_VXPOCKET is not set
+# CONFIG_SND_PDAUDIOCF is not set
+
+#
+# SoC audio support
+#
+# CONFIG_SND_SOC is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+CONFIG_AC97_BUS=m
+
+#
+# HID Devices
+#
+# CONFIG_HID 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 is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+CONFIG_USB_GADGET_PXA27X=y
+CONFIG_USB_PXA27X=y
+# CONFIG_USB_PXA27X_DMA is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+# CONFIG_USB_PXA2XX_GPIO is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_PXA=y
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP 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=y
+
+#
+# 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_CMOS is not set
+# 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_RS5C372 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_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=y
+CONFIG_JFFS2_RTIME=y
+# 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 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+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
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/aximx50/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/aximx50/defconfig
new file mode 100644
index 0000000..9252c73
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/aximx50/defconfig
@@ -0,0 +1,1337 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:37 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+# CONFIG_BOARD_IRQ_MAP_BIG is not set
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+
+#
+# HTC_HW6X00
+#
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+CONFIG_MACH_X50=y
+CONFIG_X50_VGA=y
+CONFIG_X50_BUTTONS=y
+CONFIG_X50_TS=y
+CONFIG_DRAM_BASE=0xa8000000
+# CONFIG_MACH_MIOA701 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_RECON is not set
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_MACH_LOOXN560 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA27x=y
+# CONFIG_PXA_SSP is not set
+# CONFIG_PXA27x_VOLTAGE is not set
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+CONFIG_IWMMXT=y
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_PXA=y
+CONFIG_PXA25x_ALTERNATE_FREQS=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=m
+CONFIG_MTD_DEBUG=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+# CONFIG_MTD_JEDECPROBE 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 is not set
+# 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_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+CONFIG_KEYBOARD_PXA27x=y
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_ADC=y
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+CONFIG_SERIAL_PXA_IR=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+# CONFIG_BATTERY_DS2760 is not set
+# CONFIG_ADC_BATTERY is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+CONFIG_ADC_ADS7846_SSP=y
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_BBKEYS is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HWTIMER=y
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+# CONFIG_FB_PXA_PARAMETERS is not set
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+# CONFIG_SND is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+# CONFIG_HID 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 is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+CONFIG_USB_GADGET_PXA27X=y
+CONFIG_USB_PXA27X=y
+# CONFIG_USB_PXA27X_DMA is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+# CONFIG_USB_PXA2XX_GPIO is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_PXA=y
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP 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=y
+
+#
+# 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_CMOS is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_JFFS2_FS 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/eteng500/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/eteng500/defconfig
new file mode 100644
index 0000000..3048418
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/eteng500/defconfig
@@ -0,0 +1,1326 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:38 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+# CONFIG_GENERIC_TIME is not set
+CONFIG_MMU=y
+CONFIG_NO_IOPORT=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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX 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
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+# CONFIG_BOARD_IRQ_MAP_BIG is not set
+CONFIG_PLAT_S3C24XX=y
+CONFIG_CPU_S3C244X=y
+CONFIG_S3C2410_BOOT_ERROR_RESET=y
+# CONFIG_S3C2410_PM_DEBUG is not set
+# CONFIG_S3C2410_PM_CHECK is not set
+CONFIG_S3C2410_LOWLEVEL_UART_PORT=0
+CONFIG_S3C2410_DMA=y
+# CONFIG_S3C2410_DMA_DEBUG is not set
+
+#
+# S3C2400 Machines
+#
+CONFIG_S3C2410_PM=y
+CONFIG_S3C2410_GPIO=y
+CONFIG_S3C2410_CLOCK=y
+
+#
+# S3C2410 Machines
+#
+# CONFIG_ARCH_SMDK2410 is not set
+# CONFIG_ARCH_H1940 is not set
+CONFIG_PM_H1940=y
+# CONFIG_MACH_N30 is not set
+# CONFIG_ARCH_BAST is not set
+# CONFIG_MACH_OTOM is not set
+# CONFIG_MACH_AML_M5900 is not set
+# CONFIG_MACH_VR1000 is not set
+# CONFIG_MACH_QT2410 is not set
+
+#
+# S3C2412 Machines
+#
+# CONFIG_MACH_SMDK2413 is not set
+# CONFIG_MACH_VSTMS is not set
+CONFIG_CPU_S3C2440=y
+CONFIG_S3C2440_DMA=y
+
+#
+# S3C2440 Machines
+#
+# CONFIG_MACH_ANUBIS is not set
+# CONFIG_MACH_OSIRIS is not set
+# CONFIG_MACH_RX3715 is not set
+# CONFIG_ARCH_S3C2440 is not set
+# CONFIG_MACH_NEXCODER_2440 is not set
+CONFIG_MACH_G500=y
+
+#
+# S3C2442 Machines
+#
+# CONFIG_MACH_RX1950 is not set
+# CONFIG_MACH_HTCHERMES is not set
+# CONFIG_MACH_HTC_TRINITY is not set
+
+#
+# S3C2443 Machines
+#
+# CONFIG_MACH_SMDK2443 is not set
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# 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=y
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+# CONFIG_OUTER_CACHE is not set
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=200
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=m
+CONFIG_MTD_DEBUG=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+# CONFIG_MTD_JEDECPROBE 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 is not set
+# 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_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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=m
+# CONFIG_MTD_NAND_VERIFY_WRITE is not set
+# CONFIG_MTD_NAND_ECC_SMC is not set
+CONFIG_MTD_NAND_IDS=m
+CONFIG_MTD_NAND_S3C2410=m
+# CONFIG_MTD_NAND_S3C2410_DEBUG is not set
+CONFIG_MTD_NAND_S3C2410_HWECC=y
+CONFIG_MTD_NAND_S3C2410_CLKSTOP=y
+# CONFIG_MTD_NAND_DISKONCHIP is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_S3C2410=y
+# CONFIG_TOUCHSCREEN_S3C2410_DEBUG is not set
+CONFIG_TOUCHSCREEN_S3C2410_ALT=y
+# CONFIG_TOUCHSCREEN_ADC is not set
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_LIBPS2 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_S3C2410=y
+# CONFIG_SERIAL_S3C2410_CONSOLE is not set
+CONFIG_SERIAL_CORE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+# CONFIG_POWER_SUPPLY is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+# CONFIG_ADC_ADS7846_SSP is not set
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_BBKEYS is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+CONFIG_LEDS_S3C24XX=y
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+# CONFIG_LEDS_TRIGGER_HWTIMER is not set
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_BACKLIGHT_S3C2410=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON 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
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+# CONFIG_SND is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+# CONFIG_HID 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 is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+# CONFIG_USB_GADGET_PXA27X is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+CONFIG_USB_GADGET_S3C2410=y
+CONFIG_USB_S3C2410=y
+# CONFIG_USB_S3C2410_DEBUG is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_S3C2440=y
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP 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=y
+
+#
+# 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_CMOS is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 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_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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_JFFS2_FS 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+# CONFIG_DEBUG_S3C2410_PORT is not set
+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=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/gcc4x-limits.patch b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/gcc4x-limits.patch
new file mode 100644
index 0000000..02f3a5d
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/gcc4x-limits.patch
@@ -0,0 +1,10 @@
+--- linux/scripts/mod/sumversion.c.orig 2008-11-15 12:22:04.000000000 +0000
++++ linux/scripts/mod/sumversion.c 2008-11-15 12:22:21.000000000 +0000
+@@ -7,6 +7,7 @@
+ #include <ctype.h>
+ #include <errno.h>
+ #include <string.h>
++#include <linux/limits.h>
+ #include "modpost.h"
+
+ /*
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h1910/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h1910/defconfig
new file mode 100644
index 0000000..f77e63c
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h1910/defconfig
@@ -0,0 +1,1407 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:38 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+CONFIG_BOARD_IRQ_MAP_BIG=y
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+CONFIG_ARCH_H1900=y
+CONFIG_IPAQ_H1900_LCD=y
+CONFIG_IPAQ_H1900_BUTTONS=y
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+
+#
+# HTC_HW6X00
+#
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X30 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_MACH_MIOA701 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_RECON is not set
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_MACH_LOOXN560 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA25x=y
+# CONFIG_PXA_SSP is not set
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+# CONFIG_IWMMXT is not set
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_PXA=y
+CONFIG_PXA25x_ALTERNATE_FREQS=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=m
+CONFIG_MTD_DEBUG=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+# CONFIG_MTD_JEDECPROBE 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 is not set
+# 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_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+# CONFIG_KEYBOARD_ASIC3 is not set
+# CONFIG_KEYBOARD_GPIO is not set
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+# CONFIG_TOUCHSCREEN_ADC is not set
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+CONFIG_SERIAL_PXA_IR=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=m
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+# CONFIG_I2C_ALGOBIT is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_PXA=m
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# 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 is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCA9535 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_RTC8564 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 is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+# CONFIG_POWER_SUPPLY is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+# CONFIG_ADC_ADS7846_SSP is not set
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+CONFIG_HTC_ASIC3=y
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_BBKEYS is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_ASIC3 is not set
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+# CONFIG_LEDS_TRIGGER_HWTIMER is not set
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+# CONFIG_FB_PXA_PARAMETERS is not set
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+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_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+CONFIG_SND_H1910=m
+CONFIG_SND_PXA2xx_I2SOUND=m
+# CONFIG_SND_PXA2XX_AC97 is not set
+# CONFIG_SND_RECON is not set
+
+#
+# SoC audio support
+#
+# CONFIG_SND_SOC is not set
+CONFIG_SND_UDA1380=m
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+# CONFIG_HID is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+CONFIG_USB_GADGET_PXA2XX=y
+CONFIG_USB_PXA2XX=y
+# CONFIG_USB_PXA2XX_SMALL is not set
+# CONFIG_USB_GADGET_PXA27X is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+# CONFIG_USB_PXA2XX_GPIO is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_PXA is not set
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP is not set
+CONFIG_MMC_ASIC3=y
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+CONFIG_RTC_DEBUG=y
+
+#
+# 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_CMOS is not set
+# 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_RS5C372 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_JFFS2_FS 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h2200/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h2200/defconfig
new file mode 100644
index 0000000..b3f1a4c
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h2200/defconfig
@@ -0,0 +1,1803 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Wed Jan 28 17:24:55 2009
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+CONFIG_BOARD_IRQ_MAP_BIG=y
+CONFIG_DMABOUNCE=y
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+CONFIG_ARCH_H2200=y
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+
+#
+# HTC_HW6X00
+#
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_RECON is not set
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_MACH_LOOXC550 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA25x=y
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+# CONFIG_IWMMXT is not set
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+CONFIG_PCCARD=y
+CONFIG_PCMCIA_DEBUG=y
+CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
+CONFIG_PCMCIA_IOCTL=y
+
+#
+# PC-card bridges
+#
+CONFIG_PCMCIA_PXA2XX=y
+CONFIG_PCMCIA_H2200=y
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+# CONFIG_OABI_COMPAT 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_PXA=y
+CONFIG_PXA25x_ALTERNATE_FREQS=y
+
+#
+# Floating point emulation
+#
+
+#
+# At least one emulation must be selected
+#
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=m
+
+#
+# IrDA protocols
+#
+CONFIG_IRLAN=m
+# CONFIG_IRNET is not set
+CONFIG_IRCOMM=m
+CONFIG_IRDA_ULTRA=y
+
+#
+# IrDA options
+#
+CONFIG_IRDA_CACHE_LAST_LSAP=y
+CONFIG_IRDA_FAST_RR=y
+CONFIG_IRDA_DEBUG=y
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+CONFIG_IRTTY_SIR=m
+
+#
+# Dongle support
+#
+# CONFIG_DONGLE is not set
+
+#
+# Old SIR device drivers
+#
+# CONFIG_IRPORT_SIR is not set
+
+#
+# Old Serial dongle support
+#
+
+#
+# FIR device drivers
+#
+# CONFIG_USB_IRDA is not set
+# CONFIG_SIGMATEL_FIR is not set
+CONFIG_PXA_FICP=m
+# CONFIG_MCS_FIR is not set
+CONFIG_BT=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+# CONFIG_BT_HCIUSB is not set
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+# CONFIG_BT_HCIBCM203X is not set
+# CONFIG_BT_HCIBPA10X is not set
+# CONFIG_BT_HCIBFUSB is not set
+# CONFIG_BT_HCIDTL1 is not set
+# CONFIG_BT_HCIBT3C is not set
+# CONFIG_BT_HCIBLUECARD is not set
+# CONFIG_BT_HCIBTUART is not set
+# CONFIG_BT_HCIVHCI is not set
+CONFIG_IEEE80211=m
+# CONFIG_IEEE80211_DEBUG is not set
+CONFIG_IEEE80211_CRYPT_WEP=m
+CONFIG_IEEE80211_CRYPT_CCMP=m
+CONFIG_IEEE80211_CRYPT_TKIP=m
+CONFIG_IEEE80211_SOFTMAC=m
+# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set
+CONFIG_WIRELESS_EXT=y
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+CONFIG_MTD_CONCAT=y
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=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 is not set
+# CONFIG_MTD_JEDECPROBE 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 is not set
+# 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_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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_H1900 is not set
+CONFIG_MTD_NAND_IDS=y
+CONFIG_MTD_NAND_HAMCOP=y
+# CONFIG_MTD_NAND_DISKONCHIP is not set
+# CONFIG_MTD_NAND_SHARPSL 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 is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_UB is not set
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=y
+CONFIG_IDE_MAX_HWIFS=4
+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_IDECS=y
+# CONFIG_BLK_DEV_IDECD is not set
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY 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_IDEDMA 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
+
+#
+# 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=m
+
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=m
+# CONFIG_SMC91X is not set
+# CONFIG_DM9000 is not set
+# CONFIG_SMC911X is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+CONFIG_NET_RADIO=y
+CONFIG_NET_WIRELESS_RTNETLINK=y
+
+#
+# Obsolete Wireless cards support (pre-802.11)
+#
+# CONFIG_STRIP is not set
+# CONFIG_PCMCIA_WAVELAN is not set
+# CONFIG_PCMCIA_NETWAVE is not set
+
+#
+# Wireless 802.11 Frequency Hopping cards support
+#
+# CONFIG_PCMCIA_RAYCS is not set
+
+#
+# Wireless 802.11b ISA/PCI cards support
+#
+CONFIG_HERMES=m
+CONFIG_ATMEL=m
+
+#
+# Wireless 802.11b Pcmcia/Cardbus cards support
+#
+CONFIG_PCMCIA_HERMES=m
+CONFIG_PCMCIA_SPECTRUM=m
+CONFIG_AIRO_CS=m
+CONFIG_PCMCIA_ATMEL=m
+CONFIG_PCMCIA_WL3501=m
+CONFIG_USB_ZD1201=m
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_FIRMWARE=y
+# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set
+CONFIG_HOSTAP_CS=m
+CONFIG_ZD1211RW=m
+# CONFIG_ZD1211RW_DEBUG is not set
+# CONFIG_ACX is not set
+CONFIG_NET_WIRELESS=y
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_3C589=m
+CONFIG_PCMCIA_3C574=m
+CONFIG_PCMCIA_FMVJ18X=m
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PCMCIA_NMCLAN=m
+CONFIG_PCMCIA_SMC91C92=m
+CONFIG_PCMCIA_XIRC2PS=m
+CONFIG_PCMCIA_AXNET=m
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+CONFIG_PPPOE=m
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+CONFIG_KEYBOARD_H2200=y
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_ADC=y
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+CONFIG_SERIAL_PXA_IR=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=m
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+# CONFIG_I2C_ALGOBIT is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_PXA=m
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# 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 is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCA9535 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_RTC8564 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 is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+CONFIG_W1=y
+
+#
+# 1-wire Bus Masters
+#
+# CONFIG_W1_MASTER_DS2490 is not set
+# CONFIG_W1_MASTER_DS2482 is not set
+CONFIG_W1_MASTER_DS1WM=y
+
+#
+# 1-wire Slaves
+#
+# CONFIG_W1_SLAVE_THERM is not set
+# CONFIG_W1_SLAVE_SMEM is not set
+# CONFIG_W1_SLAVE_DS2433 is not set
+CONFIG_W1_SLAVE_DS2760=y
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+CONFIG_BATTERY_DS2760=y
+# CONFIG_ADC_BATTERY is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+# CONFIG_ADC_ADS7846_SSP is not set
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+CONFIG_ADC_SAMCOP=y
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_BBKEYS is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+CONFIG_SOC_HAMCOP=y
+CONFIG_SOC_SAMCOP_DMA=y
+# CONFIG_SOC_SAMCOP_DMA_DEBUG is not set
+CONFIG_SOC_MQ11XX=y
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+CONFIG_LEDS_HAMCOP=y
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HWTIMER=y
+CONFIG_LEDS_TRIGGER_IDE_DISK=y
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# 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_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_BACKLIGHT_H2200=y
+CONFIG_LCD_H2200=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_PXA is not set
+# CONFIG_FB_MBX is not set
+CONFIG_FB_MQ1100=y
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+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_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+CONFIG_SND_H2200=m
+CONFIG_SND_PXA2xx_I2SOUND=m
+# CONFIG_SND_PXA2XX_AC97 is not set
+# CONFIG_SND_RECON is not set
+
+#
+# USB devices
+#
+# CONFIG_SND_USB_AUDIO is not set
+
+#
+# PCMCIA devices
+#
+# CONFIG_SND_VXPOCKET is not set
+# CONFIG_SND_PDAUDIOCF is not set
+
+#
+# SoC audio support
+#
+# CONFIG_SND_SOC is not set
+CONFIG_SND_UDA1380=m
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=m
+# CONFIG_HID_DEBUG is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+CONFIG_USB=m
+# CONFIG_USB_DEBUG is not set
+
+#
+# Miscellaneous USB options
+#
+# CONFIG_USB_DEVICEFS 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_SL811_HCD=m
+CONFIG_USB_SL811_CS=m
+
+#
+# USB Device Class drivers
+#
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
+
+#
+# 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=m
+# CONFIG_USB_HIDINPUT_POWERBOOK is not set
+# CONFIG_HID_FF is not set
+# CONFIG_USB_HIDDEV 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
+# CONFIG_USB_GTCO is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+
+#
+# USB Network Adapters
+#
+CONFIG_USB_CATC=m
+CONFIG_USB_KAWETH=m
+CONFIG_USB_PEGASUS=m
+CONFIG_USB_RTL8150=m
+CONFIG_USB_USBNET_MII=m
+CONFIG_USB_USBNET=m
+CONFIG_USB_NET_AX8817X=m
+CONFIG_USB_NET_CDCETHER=m
+CONFIG_USB_NET_DM9601=m
+CONFIG_USB_NET_GL620A=m
+CONFIG_USB_NET_NET1080=m
+CONFIG_USB_NET_PLUSB=m
+CONFIG_USB_NET_MCS7830=m
+CONFIG_USB_NET_RNDIS_HOST=m
+CONFIG_USB_NET_CDC_SUBSET=m
+CONFIG_USB_ALI_M5632=y
+CONFIG_USB_AN2720=y
+CONFIG_USB_BELKIN=y
+CONFIG_USB_ARMLINUX=y
+CONFIG_USB_EPSON2888=y
+CONFIG_USB_KC2190=y
+CONFIG_USB_NET_ZAURUS=m
+CONFIG_USB_MON=y
+
+#
+# USB port drivers
+#
+
+#
+# USB Serial Converter support
+#
+CONFIG_USB_SERIAL=m
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_AIRCABLE=m
+CONFIG_USB_SERIAL_AIRPRIME=m
+CONFIG_USB_SERIAL_ARK3116=m
+CONFIG_USB_SERIAL_BELKIN=m
+CONFIG_USB_SERIAL_WHITEHEAT=m
+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
+CONFIG_USB_SERIAL_CP2101=m
+CONFIG_USB_SERIAL_CYPRESS_M8=m
+CONFIG_USB_SERIAL_EMPEG=m
+CONFIG_USB_SERIAL_FTDI_SIO=m
+CONFIG_USB_SERIAL_FUNSOFT=m
+CONFIG_USB_SERIAL_VISOR=m
+CONFIG_USB_SERIAL_IPAQ=m
+CONFIG_USB_SERIAL_IR=m
+CONFIG_USB_SERIAL_EDGEPORT=m
+CONFIG_USB_SERIAL_EDGEPORT_TI=m
+CONFIG_USB_SERIAL_GARMIN=m
+CONFIG_USB_SERIAL_IPW=m
+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
+CONFIG_USB_SERIAL_KEYSPAN=m
+CONFIG_USB_SERIAL_KEYSPAN_MPR=y
+CONFIG_USB_SERIAL_KEYSPAN_USA28=y
+CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
+CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
+CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19=y
+CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
+CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
+CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
+CONFIG_USB_SERIAL_KLSI=m
+CONFIG_USB_SERIAL_KOBIL_SCT=m
+CONFIG_USB_SERIAL_MCT_U232=m
+CONFIG_USB_SERIAL_MOS7720=m
+CONFIG_USB_SERIAL_MOS7840=m
+CONFIG_USB_SERIAL_NAVMAN=m
+CONFIG_USB_SERIAL_PL2303=m
+CONFIG_USB_SERIAL_HP4X=m
+CONFIG_USB_SERIAL_SAFE=m
+# CONFIG_USB_SERIAL_SAFE_PADDED is not set
+CONFIG_USB_SERIAL_SIERRAWIRELESS=m
+CONFIG_USB_SERIAL_TI=m
+CONFIG_USB_SERIAL_CYBERJACK=m
+CONFIG_USB_SERIAL_XIRCOM=m
+CONFIG_USB_SERIAL_OPTION=m
+CONFIG_USB_SERIAL_OMNINET=m
+CONFIG_USB_SERIAL_DEBUG=m
+CONFIG_USB_EZUSB=y
+
+#
+# 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_BERRY_CHARGE 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_IOWARRIOR is not set
+
+#
+# USB DSL modem support
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+CONFIG_USB_GADGET_PXA2XX=y
+CONFIG_USB_PXA2XX=y
+# CONFIG_USB_PXA2XX_SMALL is not set
+# CONFIG_USB_GADGET_PXA27X is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+CONFIG_USB_PXA2XX_GPIO=y
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_PXA is not set
+# CONFIG_MMC_TMIO is not set
+CONFIG_MMC_SAMCOP=y
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+CONFIG_RTC_DEBUG=y
+
+#
+# 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_CMOS is not set
+# 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_RS5C372 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_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=y
+CONFIG_JFFS2_RTIME=y
+# 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 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+CONFIG_CRYPTO_AES=m
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+CONFIG_CRYPTO_MICHAEL_MIC=m
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+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
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h3600/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h3600/defconfig
new file mode 100644
index 0000000..5f6104d
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h3600/defconfig
@@ -0,0 +1,1324 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:39 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+# CONFIG_GENERIC_TIME is not set
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_RPC is not set
+CONFIG_ARCH_SA1100=y
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+# CONFIG_BOARD_IRQ_MAP_BIG is not set
+
+#
+# SA11x0 Implementations
+#
+# CONFIG_SA1100_ASSABET is not set
+# CONFIG_SA1100_CERF is not set
+# CONFIG_SA1100_COLLIE is not set
+# CONFIG_SA1100_H3100 is not set
+CONFIG_SA1100_H3600=y
+# CONFIG_SA1100_H3800 is not set
+CONFIG_SA1100_H3XXX=y
+# CONFIG_SA1100_BADGE4 is not set
+# CONFIG_SA1100_JORNADA56X is not set
+# CONFIG_SA1100_JORNADA720 is not set
+# CONFIG_SA1100_JORNADA820 is not set
+# CONFIG_SA1100_XDA is not set
+# CONFIG_SA1100_HACKKIT is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_PLEB is not set
+# CONFIG_SA1100_SHANNON is not set
+# CONFIG_SA1100_SIMPAD is not set
+# CONFIG_SA1100_SSP is not set
+# CONFIG_H3600_SLEEVE is not set
+CONFIG_SA1100_USB=m
+# CONFIG_SA1100_USB_NETLINK is not set
+# CONFIG_SA1100_USB_CHAR is not set
+CONFIG_IPAQ_H3600_LCD=y
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_SA1100=y
+CONFIG_CPU_32v4=y
+CONFIG_CPU_ABRT_EV4=y
+CONFIG_CPU_CACHE_V4WB=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WB=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+
+#
+# Bus support
+#
+CONFIG_ISA=y
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
+CONFIG_NODES_SHIFT=2
+CONFIG_SELECT_MEMORY_MODEL=y
+# CONFIG_FLATMEM_MANUAL is not set
+CONFIG_DISCONTIGMEM_MANUAL=y
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_DISCONTIGMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_NEED_MULTIPLE_NODES=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=1
+# CONFIG_LEDS is not set
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_SA1110=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+CONFIG_MTD_CONCAT=y
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+# CONFIG_MTD_JEDECPROBE 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 is not set
+# 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_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNP is not set
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET 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_PPP=m
+# CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=m
+# CONFIG_PPP_SYNC_TTY is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+CONFIG_KEYBOARD_MICRO=y
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# 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_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_IPAQ_MICRO=y
+# CONFIG_TOUCHSCREEN_ADC is not set
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_SA1100=y
+CONFIG_SERIAL_SA1100_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+# CONFIG_BATTERY_DS2760 is not set
+# CONFIG_ADC_BATTERY is not set
+CONFIG_IPAQ_MICRO_BATTERY=y
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+# CONFIG_ADC_ADS7846_SSP is not set
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+CONFIG_IPAQ_MICRO=y
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_BBKEYS is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# Multimedia Capabilities Port drivers
+#
+# CONFIG_MCP_SA11X0 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HWTIMER=y
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+CONFIG_FB_SA1100=y
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB 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=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+# CONFIG_SND is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+# CONFIG_HID is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+# CONFIG_USB_GADGET_PXA27X is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP 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=y
+
+#
+# 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_CMOS is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_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=y
+CONFIG_JFFS2_RTIME=y
+# 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 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+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
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h3800/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h3800/defconfig
new file mode 100644
index 0000000..27ed4f4
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h3800/defconfig
@@ -0,0 +1,1322 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:40 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+# CONFIG_GENERIC_TIME is not set
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_RPC is not set
+CONFIG_ARCH_SA1100=y
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+# CONFIG_BOARD_IRQ_MAP_BIG is not set
+
+#
+# SA11x0 Implementations
+#
+# CONFIG_SA1100_ASSABET is not set
+# CONFIG_SA1100_CERF is not set
+# CONFIG_SA1100_COLLIE is not set
+# CONFIG_SA1100_H3100 is not set
+# CONFIG_SA1100_H3600 is not set
+CONFIG_SA1100_H3800=y
+CONFIG_SA1100_H3XXX=y
+# CONFIG_SA1100_BADGE4 is not set
+# CONFIG_SA1100_JORNADA56X is not set
+# CONFIG_SA1100_JORNADA720 is not set
+# CONFIG_SA1100_JORNADA820 is not set
+# CONFIG_SA1100_XDA is not set
+# CONFIG_SA1100_HACKKIT is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_PLEB is not set
+# CONFIG_SA1100_SHANNON is not set
+# CONFIG_SA1100_SIMPAD is not set
+# CONFIG_SA1100_SSP is not set
+CONFIG_SA1100_USB=m
+# CONFIG_SA1100_USB_NETLINK is not set
+# CONFIG_SA1100_USB_CHAR is not set
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_SA1100=y
+CONFIG_CPU_32v4=y
+CONFIG_CPU_ABRT_EV4=y
+CONFIG_CPU_CACHE_V4WB=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WB=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+
+#
+# Bus support
+#
+CONFIG_ISA=y
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
+CONFIG_NODES_SHIFT=2
+CONFIG_SELECT_MEMORY_MODEL=y
+# CONFIG_FLATMEM_MANUAL is not set
+CONFIG_DISCONTIGMEM_MANUAL=y
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_DISCONTIGMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_NEED_MULTIPLE_NODES=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=1
+# CONFIG_LEDS is not set
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_SA1110=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+CONFIG_MTD_CONCAT=y
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+# CONFIG_MTD_JEDECPROBE 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 is not set
+# 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_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNP is not set
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET 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_PPP=m
+# CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=m
+# CONFIG_PPP_SYNC_TTY is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+CONFIG_KEYBOARD_ASIC2=y
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# 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_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_ASIC2=y
+# CONFIG_TOUCHSCREEN_ADC is not set
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_SA1100=y
+CONFIG_SERIAL_SA1100_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+# CONFIG_BATTERY_DS2760 is not set
+# CONFIG_ADC_BATTERY is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+# CONFIG_ADC_ADS7846_SSP is not set
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+CONFIG_ADC_ASIC2=y
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+CONFIG_HTC_ASIC2=y
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_BBKEYS is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# Multimedia Capabilities Port drivers
+#
+# CONFIG_MCP_SA11X0 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HWTIMER=y
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+CONFIG_FB_SA1100=y
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB 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=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+# CONFIG_SND is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+# CONFIG_HID is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+# CONFIG_USB_GADGET_PXA27X is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP is not set
+# CONFIG_MMC_ASIC1 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=y
+
+#
+# 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_CMOS is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_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=y
+CONFIG_JFFS2_RTIME=y
+# 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 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+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
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h3900/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h3900/defconfig
new file mode 100644
index 0000000..6aee3f7
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h3900/defconfig
@@ -0,0 +1,1443 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:40 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+CONFIG_BOARD_IRQ_MAP_BIG=y
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+CONFIG_MACH_H3900=y
+CONFIG_IPAQ_H3900_LCD=y
+CONFIG_IPAQ_H3900_BACKLIGHT=y
+CONFIG_IPAQ_H3900_BATTERY=y
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+
+#
+# HTC_HW6X00
+#
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X30 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_MACH_MIOA701 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_RECON is not set
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_MACH_LOOXN560 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA25x=y
+# CONFIG_PXA_SSP is not set
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+# CONFIG_IWMMXT is not set
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_PXA=y
+CONFIG_PXA25x_ALTERNATE_FREQS=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+# CONFIG_BT_HCIUART is not set
+# CONFIG_BT_HCIVHCI is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+CONFIG_MTD_CONCAT=y
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+# CONFIG_MTD_JEDECPROBE 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 is not set
+# 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_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+CONFIG_KEYBOARD_ASIC2=y
+# CONFIG_KEYBOARD_ASIC3 is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_ASIC2=y
+# CONFIG_TOUCHSCREEN_ADC is not set
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+CONFIG_SERIAL_PXA_IR=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=m
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+# CONFIG_I2C_ALGOBIT is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_PXA=m
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# 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 is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCA9535 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_RTC8564 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 is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+# CONFIG_BATTERY_DS2760 is not set
+# CONFIG_ADC_BATTERY is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+# CONFIG_ADC_ADS7846_SSP is not set
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+CONFIG_ADC_ASIC2=y
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+CONFIG_HTC_ASIC2=y
+CONFIG_HTC_ASIC3=y
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_BBKEYS is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_ASIC3 is not set
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HWTIMER=y
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+# CONFIG_FB_PXA_PARAMETERS is not set
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+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_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+# CONFIG_SND_PXA2XX_AC97 is not set
+# CONFIG_SND_RECON is not set
+
+#
+# SoC audio support
+#
+# CONFIG_SND_SOC is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=m
+# CONFIG_HID_DEBUG is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+CONFIG_USB_GADGET_PXA2XX=y
+CONFIG_USB_PXA2XX=y
+# CONFIG_USB_PXA2XX_SMALL is not set
+# CONFIG_USB_GADGET_PXA27X is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+# CONFIG_USB_PXA2XX_GPIO is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_PXA is not set
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP is not set
+CONFIG_MMC_ASIC3=y
+# CONFIG_MMC_ASIC1 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=y
+
+#
+# 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_CMOS is not set
+# 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_RS5C372 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_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=y
+CONFIG_JFFS2_RTIME=y
+# 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 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+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
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h4000/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h4000/defconfig
new file mode 100644
index 0000000..563dccf
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h4000/defconfig
@@ -0,0 +1,1569 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:40 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+CONFIG_BOARD_IRQ_MAP_BIG=y
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+CONFIG_MACH_H4000=y
+CONFIG_MACH_H4300=y
+CONFIG_IPAQ_H4000_LCD=y
+CONFIG_IPAQ_H4000_PCMCIA=y
+CONFIG_IPAQ_H4000_BT=m
+CONFIG_IPAQ_H4300_KBD=y
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+
+#
+# HTC_HW6X00
+#
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X30 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_MACH_MIOA701 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_RECON is not set
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_MACH_LOOXN560 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA25x=y
+CONFIG_PXA_SSP=y
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+# CONFIG_IWMMXT is not set
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+CONFIG_PCCARD=y
+CONFIG_PCMCIA_DEBUG=y
+CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
+CONFIG_PCMCIA_IOCTL=y
+
+#
+# PC-card bridges
+#
+CONFIG_PCMCIA_PXA2XX=y
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_PXA=y
+CONFIG_PXA25x_ALTERNATE_FREQS=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=m
+
+#
+# IrDA protocols
+#
+CONFIG_IRLAN=m
+# CONFIG_IRNET is not set
+CONFIG_IRCOMM=m
+CONFIG_IRDA_ULTRA=y
+
+#
+# IrDA options
+#
+CONFIG_IRDA_CACHE_LAST_LSAP=y
+CONFIG_IRDA_FAST_RR=y
+CONFIG_IRDA_DEBUG=y
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+CONFIG_IRTTY_SIR=m
+
+#
+# Dongle support
+#
+# CONFIG_DONGLE is not set
+
+#
+# Old SIR device drivers
+#
+# CONFIG_IRPORT_SIR is not set
+
+#
+# Old Serial dongle support
+#
+
+#
+# FIR device drivers
+#
+CONFIG_PXA_FICP=m
+CONFIG_BT=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+# CONFIG_BT_HCIDTL1 is not set
+# CONFIG_BT_HCIBT3C is not set
+# CONFIG_BT_HCIBLUECARD is not set
+# CONFIG_BT_HCIBTUART is not set
+# CONFIG_BT_HCIVHCI is not set
+CONFIG_IEEE80211=m
+# CONFIG_IEEE80211_DEBUG is not set
+# CONFIG_IEEE80211_CRYPT_WEP is not set
+CONFIG_IEEE80211_CRYPT_CCMP=m
+CONFIG_IEEE80211_CRYPT_TKIP=m
+# CONFIG_IEEE80211_SOFTMAC is not set
+CONFIG_WIRELESS_EXT=y
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+CONFIG_MTD_CONCAT=y
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+# CONFIG_MTD_JEDECPROBE 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 is not set
+# 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_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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_H1900 is not set
+CONFIG_MTD_NAND_IDS=y
+CONFIG_MTD_NAND_DISKONCHIP=y
+# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set
+CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0
+# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set
+# CONFIG_MTD_NAND_SHARPSL 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 is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+CONFIG_NET_RADIO=y
+CONFIG_NET_WIRELESS_RTNETLINK=y
+
+#
+# Obsolete Wireless cards support (pre-802.11)
+#
+# CONFIG_STRIP is not set
+# CONFIG_PCMCIA_WAVELAN is not set
+# CONFIG_PCMCIA_NETWAVE is not set
+
+#
+# Wireless 802.11 Frequency Hopping cards support
+#
+# CONFIG_PCMCIA_RAYCS is not set
+
+#
+# Wireless 802.11b ISA/PCI cards support
+#
+# CONFIG_HERMES is not set
+# CONFIG_ATMEL is not set
+
+#
+# Wireless 802.11b Pcmcia/Cardbus cards support
+#
+# CONFIG_AIRO_CS is not set
+# CONFIG_PCMCIA_WL3501 is not set
+# CONFIG_HOSTAP is not set
+CONFIG_ACX=m
+# CONFIG_ACX_MEM is not set
+CONFIG_ACX_CS=y
+CONFIG_NET_WIRELESS=y
+
+#
+# PCMCIA network device support
+#
+# CONFIG_NET_PCMCIA is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+# CONFIG_KEYBOARD_ASIC3 is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_ADC=y
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+CONFIG_SERIAL_PXA_IR=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_RS232_SERIAL=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=m
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+# CONFIG_I2C_ALGOBIT is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_PXA=m
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# 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 is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCA9535 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_RTC8564 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 is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+# CONFIG_BATTERY_DS2760 is not set
+CONFIG_ADC_BATTERY=y
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+CONFIG_ADC_ADS7846_SSP=y
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+CONFIG_HTC_ASIC3=y
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_BBKEYS is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+CONFIG_LEDS_ASIC3=y
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HWTIMER=y
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+# CONFIG_FB_PXA_PARAMETERS is not set
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+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_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+CONFIG_SND_H4000=m
+CONFIG_SND_PXA2xx_I2SOUND=m
+# CONFIG_SND_PXA2XX_AC97 is not set
+# CONFIG_SND_RECON is not set
+
+#
+# PCMCIA devices
+#
+# CONFIG_SND_VXPOCKET is not set
+# CONFIG_SND_PDAUDIOCF is not set
+
+#
+# SoC audio support
+#
+# CONFIG_SND_SOC is not set
+CONFIG_SND_UDA1380=m
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=m
+# CONFIG_HID_DEBUG is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+CONFIG_USB_GADGET_PXA2XX=y
+CONFIG_USB_PXA2XX=y
+# CONFIG_USB_PXA2XX_SMALL is not set
+# CONFIG_USB_GADGET_PXA27X is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+CONFIG_USB_PXA2XX_GPIO=y
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_PXA is not set
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP is not set
+CONFIG_MMC_ASIC3=y
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+CONFIG_RTC_DEBUG=y
+
+#
+# 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_CMOS is not set
+# 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_RS5C372 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_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=y
+CONFIG_JFFS2_RTIME=y
+# 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 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+CONFIG_CRYPTO_AES=m
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+CONFIG_CRYPTO_MICHAEL_MIC=m
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+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_REED_SOLOMON=y
+CONFIG_REED_SOLOMON_DEC16=y
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h5000/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h5000/defconfig
new file mode 100644
index 0000000..f4dba6c
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/h5000/defconfig
@@ -0,0 +1,1701 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:41 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+CONFIG_BOARD_IRQ_MAP_BIG=y
+CONFIG_DMABOUNCE=y
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+CONFIG_ARCH_H5400=y
+CONFIG_IPAQ_H5400_LCD=y
+CONFIG_IPAQ_H5400_BL=y
+CONFIG_IPAQ_H5400_WIFI=m
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+
+#
+# HTC_HW6X00
+#
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_MACH_MIOA701 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_RECON is not set
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_MACH_LOOXN560 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA25x=y
+# CONFIG_PXA_SSP is not set
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+# CONFIG_IWMMXT is not set
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_PXA=y
+CONFIG_PXA25x_ALTERNATE_FREQS=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=m
+
+#
+# IrDA protocols
+#
+CONFIG_IRLAN=m
+# CONFIG_IRNET is not set
+CONFIG_IRCOMM=m
+CONFIG_IRDA_ULTRA=y
+
+#
+# IrDA options
+#
+CONFIG_IRDA_CACHE_LAST_LSAP=y
+CONFIG_IRDA_FAST_RR=y
+CONFIG_IRDA_DEBUG=y
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+CONFIG_IRTTY_SIR=m
+
+#
+# Dongle support
+#
+# CONFIG_DONGLE is not set
+
+#
+# Old SIR device drivers
+#
+# CONFIG_IRPORT_SIR is not set
+
+#
+# Old Serial dongle support
+#
+
+#
+# FIR device drivers
+#
+# CONFIG_USB_IRDA is not set
+# CONFIG_SIGMATEL_FIR is not set
+CONFIG_PXA_FICP=m
+# CONFIG_MCS_FIR is not set
+CONFIG_BT=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+# CONFIG_BT_HCIUSB is not set
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+# CONFIG_BT_HCIBCM203X is not set
+# CONFIG_BT_HCIBPA10X is not set
+# CONFIG_BT_HCIBFUSB is not set
+# CONFIG_BT_HCIVHCI is not set
+CONFIG_IEEE80211=m
+# CONFIG_IEEE80211_DEBUG is not set
+# CONFIG_IEEE80211_CRYPT_WEP is not set
+CONFIG_IEEE80211_CRYPT_CCMP=m
+CONFIG_IEEE80211_CRYPT_TKIP=m
+# CONFIG_IEEE80211_SOFTMAC is not set
+CONFIG_WIRELESS_EXT=y
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+CONFIG_MTD_CONCAT=y
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+CONFIG_MTD_GEN_PROBE=y
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_CFI_NOSWAP=y
+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+CONFIG_MTD_CFI_GEOMETRY=y
+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 is not set
+# 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_OTP is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+# CONFIG_MTD_XIP is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_PHYSMAP_START=0x8000000
+CONFIG_MTD_PHYSMAP_LEN=0
+CONFIG_MTD_PHYSMAP_BANKWIDTH=2
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+# CONFIG_MTD_IPAQ is not set
+# CONFIG_MTD_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_UB is not set
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+CONFIG_NET_RADIO=y
+CONFIG_NET_WIRELESS_RTNETLINK=y
+
+#
+# Obsolete Wireless cards support (pre-802.11)
+#
+# CONFIG_STRIP is not set
+# CONFIG_USB_ZD1201 is not set
+# CONFIG_HOSTAP is not set
+# CONFIG_ACX is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+CONFIG_GPIODEV_KEYS2=y
+# CONFIG_GPIODEV_DIAGONAL is not set
+# CONFIG_KEYBOARD_GPIO is not set
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_ADC=y
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+CONFIG_SERIAL_PXA_IR=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_H5400_BUZZER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=m
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+# CONFIG_I2C_ALGOBIT is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_PXA=m
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# 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 is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCA9535 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_RTC8564 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 is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+CONFIG_W1=y
+
+#
+# 1-wire Bus Masters
+#
+# CONFIG_W1_MASTER_DS2490 is not set
+# CONFIG_W1_MASTER_DS2482 is not set
+CONFIG_W1_MASTER_DS1WM=y
+
+#
+# 1-wire Slaves
+#
+# CONFIG_W1_SLAVE_THERM is not set
+# CONFIG_W1_SLAVE_SMEM is not set
+# CONFIG_W1_SLAVE_DS2433 is not set
+CONFIG_W1_SLAVE_DS2760=y
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+CONFIG_BATTERY_DS2760=y
+# CONFIG_ADC_BATTERY is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+# CONFIG_ADC_ADS7846_SSP is not set
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+CONFIG_ADC_SAMCOP=y
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+# CONFIG_IPAQ_SAMCOP_FSI is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_BBKEYS is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+CONFIG_SOC_SAMCOP=y
+# CONFIG_SOC_HAMCOP is not set
+CONFIG_SOC_SAMCOP_DMA=y
+# CONFIG_SOC_SAMCOP_DMA_DEBUG is not set
+CONFIG_SOC_MQ11XX=y
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+CONFIG_LEDS_SAMCOP=y
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HWTIMER=y
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# 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_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_PXA is not set
+# CONFIG_FB_MBX is not set
+CONFIG_FB_MQ1100=y
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+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_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+# CONFIG_SND_PXA2XX_AC97 is not set
+# CONFIG_SND_RECON is not set
+
+#
+# USB devices
+#
+# CONFIG_SND_USB_AUDIO is not set
+
+#
+# SoC audio support
+#
+CONFIG_SND_SOC=m
+
+#
+# SoC Platforms
+#
+
+#
+# SoC Audio for the Atmel AT91
+#
+
+#
+# SoC Audio for the Intel PXA2xx
+#
+CONFIG_SND_PXA2XX_SOC=m
+CONFIG_SND_PXA2XX_SOC_I2S=m
+# CONFIG_SND_PXA2XX_SOC_MAGICIAN is not set
+# CONFIG_SND_PXA2XX_SOC_BLUEANGEL is not set
+CONFIG_SND_PXA2XX_SOC_H5000=m
+# CONFIG_SND_PXA2XX_SOC_MIOA701 is not set
+
+#
+# SoC Audio for the Freescale i.MX
+#
+
+#
+# SoC Audio for the Samsung S3C24XX
+#
+# CONFIG_SND_SOC_AC97_CODEC is not set
+# CONFIG_SND_SOC_WM8711 is not set
+# CONFIG_SND_SOC_WM8510 is not set
+# CONFIG_SND_SOC_WM8731 is not set
+# CONFIG_SND_SOC_WM8750 is not set
+# CONFIG_SND_SOC_WM8753 is not set
+# CONFIG_SND_SOC_WM8772 is not set
+# CONFIG_SND_SOC_WM8971 is not set
+# CONFIG_SND_SOC_WM8956 is not set
+# CONFIG_SND_SOC_WM8960 is not set
+# CONFIG_SND_SOC_WM8976 is not set
+# CONFIG_SND_SOC_WM8974 is not set
+# CONFIG_SND_SOC_WM8980 is not set
+# CONFIG_SND_SOC_WM9705 is not set
+# CONFIG_SND_SOC_WM9713 is not set
+# CONFIG_SND_SOC_WM9712 is not set
+# CONFIG_SND_SOC_UDA1380 is not set
+CONFIG_SND_SOC_AK4535=m
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=m
+# CONFIG_HID_DEBUG 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=m
+# CONFIG_USB_DEBUG is not set
+
+#
+# Miscellaneous USB options
+#
+# CONFIG_USB_DEVICEFS 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=m
+# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
+# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO 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=m
+# CONFIG_USB_HIDINPUT_POWERBOOK is not set
+# CONFIG_HID_FF is not set
+# CONFIG_USB_HIDDEV 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
+# CONFIG_USB_GTCO 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_MII is not set
+# CONFIG_USB_USBNET is not set
+CONFIG_USB_MON=y
+
+#
+# USB port drivers
+#
+
+#
+# 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_BERRY_CHARGE 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_IOWARRIOR is not set
+
+#
+# USB DSL modem support
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+CONFIG_USB_GADGET_PXA2XX=y
+CONFIG_USB_PXA2XX=y
+# CONFIG_USB_PXA2XX_SMALL is not set
+# CONFIG_USB_GADGET_PXA27X is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+# CONFIG_USB_PXA2XX_GPIO is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_PXA is not set
+# CONFIG_MMC_TMIO is not set
+CONFIG_MMC_SAMCOP=y
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+CONFIG_RTC_DEBUG=y
+
+#
+# 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_CMOS is not set
+# 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_RS5C372 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_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=y
+CONFIG_JFFS2_RTIME=y
+# 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 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+CONFIG_CRYPTO_AES=m
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+CONFIG_CRYPTO_MICHAEL_MIC=m
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+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
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcalpine/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcalpine/defconfig
new file mode 100644
index 0000000..a0693f3
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcalpine/defconfig
@@ -0,0 +1,1347 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:42 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+# CONFIG_BOARD_IRQ_MAP_BIG is not set
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+CONFIG_MACH_HTCALPINE=y
+CONFIG_HTCALPINE_CPLD=y
+CONFIG_HTCALPINE_PHONE=m
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+
+#
+# HTC_HW6X00
+#
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_MACH_MIOA701 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_RECON is not set
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_MACH_LOOXN560 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA27x=y
+# CONFIG_PXA_SSP is not set
+# CONFIG_PXA27x_VOLTAGE is not set
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+CONFIG_IWMMXT=y
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_PXA=y
+CONFIG_PXA25x_ALTERNATE_FREQS=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+# CONFIG_BT_HCIVHCI is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=m
+CONFIG_MTD_DEBUG=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+# CONFIG_MTD_JEDECPROBE 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 is not set
+# 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_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+# CONFIG_KEYBOARD_PXA27x is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_ADC=y
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+CONFIG_SERIAL_PXA_IR=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+# CONFIG_POWER_SUPPLY is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+CONFIG_ADC_ADS7846_SSP=y
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_BBKEYS is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+# CONFIG_LEDS_TRIGGER_HWTIMER is not set
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+# CONFIG_FB_PXA_PARAMETERS is not set
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+# CONFIG_SND is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=m
+# CONFIG_HID_DEBUG 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 is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+CONFIG_USB_GADGET_PXA27X=y
+CONFIG_USB_PXA27X=y
+# CONFIG_USB_PXA27X_DMA is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+# CONFIG_USB_PXA2XX_GPIO is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_PXA is not set
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP 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=y
+
+#
+# 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_CMOS is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_JFFS2_FS 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcapache/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcapache/defconfig
new file mode 100644
index 0000000..86b275b
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcapache/defconfig
@@ -0,0 +1,1437 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:43 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+CONFIG_BOARD_IRQ_MAP_SMALL=y
+# CONFIG_BOARD_IRQ_MAP_BIG is not set
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+CONFIG_MACH_HTCAPACHE=y
+# CONFIG_MACH_BLUEANGEL is not set
+
+#
+# HTC_HW6X00
+#
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_MACH_MIOA701 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_RECON is not set
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_MACH_LOOXN560 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA27x=y
+CONFIG_PXA_SSP=y
+CONFIG_PXA27x_VOLTAGE=y
+CONFIG_PXA27x_VOLTAGE_MAX158xx=y
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+CONFIG_IWMMXT=y
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_PXA=y
+CONFIG_PXA25x_ALTERNATE_FREQS=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+# CONFIG_BT_HCIVHCI is not set
+CONFIG_IEEE80211=m
+# CONFIG_IEEE80211_DEBUG is not set
+# CONFIG_IEEE80211_CRYPT_WEP is not set
+CONFIG_IEEE80211_CRYPT_CCMP=m
+CONFIG_IEEE80211_CRYPT_TKIP=m
+# CONFIG_IEEE80211_SOFTMAC is not set
+CONFIG_WIRELESS_EXT=y
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=m
+CONFIG_MTD_DEBUG=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+# CONFIG_MTD_JEDECPROBE 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 is not set
+# 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_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+CONFIG_NET_RADIO=y
+CONFIG_NET_WIRELESS_RTNETLINK=y
+
+#
+# Obsolete Wireless cards support (pre-802.11)
+#
+# CONFIG_STRIP is not set
+# CONFIG_HOSTAP is not set
+CONFIG_ACX=m
+CONFIG_ACX_MEM=y
+# CONFIG_ACX_CS is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS=y
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+CONFIG_KEYBOARD_PXA27x=y
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_ADC=y
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+CONFIG_SERIAL_PXA_IR=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=m
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+# CONFIG_I2C_ALGOBIT is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_PXA=m
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# 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 is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCA9535 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_RTC8564 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 is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+# CONFIG_POWER_SUPPLY is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+# CONFIG_ADC_ADS7846_SSP is not set
+# CONFIG_ADC_TSC2200_SSP is not set
+CONFIG_ADC_AD7877=y
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+CONFIG_HTC_EGPIO=y
+CONFIG_HTC_BBKEYS=y
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+CONFIG_LEDS_GPIO=y
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+# CONFIG_LEDS_TRIGGER_HWTIMER is not set
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+# CONFIG_FB_PXA_PARAMETERS is not set
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+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_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+CONFIG_SND_HTCAPACHE=m
+CONFIG_SND_PXA2xx_I2SOUND=m
+# CONFIG_SND_PXA2XX_AC97 is not set
+# CONFIG_SND_RECON is not set
+
+#
+# SoC audio support
+#
+# CONFIG_SND_SOC is not set
+CONFIG_SND_AK4641=m
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=m
+# CONFIG_HID_DEBUG 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 is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+CONFIG_USB_GADGET_PXA27X=y
+CONFIG_USB_PXA27X=y
+# CONFIG_USB_PXA27X_DMA is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+# CONFIG_USB_PXA2XX_GPIO is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_PXA=y
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP 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=y
+
+#
+# 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_CMOS is not set
+# 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=m
+# CONFIG_RTC_DRV_RS5C372 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_JFFS2_FS 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+CONFIG_CRYPTO_AES=m
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+CONFIG_CRYPTO_MICHAEL_MIC=m
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcbeetles/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcbeetles/defconfig
new file mode 100644
index 0000000..0755cb2
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcbeetles/defconfig
@@ -0,0 +1,1354 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:43 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+CONFIG_BOARD_IRQ_MAP_BIG=y
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+
+#
+# HTC_HW6X00
+#
+CONFIG_MACH_HTCBEETLES=y
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_HTCSABLE_LCD is not set
+# CONFIG_HTCSABLE_BACKLIGHT is not set
+# CONFIG_HTCSABLE_ROM is not set
+# CONFIG_HTCSABLE_BT is not set
+# CONFIG_HTCSABLE_PHONE is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X30 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_MACH_MIOA701 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_RECON is not set
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_MACH_LOOXN560 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA27x=y
+# CONFIG_PXA_SSP is not set
+# CONFIG_PXA27x_VOLTAGE is not set
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+CONFIG_IWMMXT=y
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_PXA=y
+CONFIG_PXA25x_ALTERNATE_FREQS=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+# CONFIG_BT_HCIVHCI is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=m
+CONFIG_MTD_DEBUG=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+# CONFIG_MTD_JEDECPROBE 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 is not set
+# 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_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+# CONFIG_KEYBOARD_ASIC3 is not set
+CONFIG_KEYBOARD_PXA27x=y
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_ADC=y
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+CONFIG_SERIAL_PXA_IR=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+# CONFIG_POWER_SUPPLY is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+CONFIG_ADC_ADS7846_SSP=y
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+CONFIG_HTC_ASIC3=y
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_BBKEYS is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_ASIC3 is not set
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+# CONFIG_LEDS_TRIGGER_HWTIMER is not set
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+# CONFIG_FB_PXA_PARAMETERS is not set
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+# CONFIG_SND is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=m
+# CONFIG_HID_DEBUG 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 is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+CONFIG_USB_GADGET_PXA27X=y
+CONFIG_USB_PXA27X=y
+# CONFIG_USB_PXA27X_DMA is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+# CONFIG_USB_PXA2XX_GPIO is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_PXA is not set
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP is not set
+# CONFIG_MMC_ASIC3 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=y
+
+#
+# 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_CMOS is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_JFFS2_FS 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcblueangel/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcblueangel/defconfig
new file mode 100644
index 0000000..233a966
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcblueangel/defconfig
@@ -0,0 +1,1590 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:43 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+CONFIG_BOARD_IRQ_MAP_BIG=y
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+CONFIG_MACH_BLUEANGEL=y
+CONFIG_MACH_BLUEANGEL_LCD=y
+CONFIG_MACH_BLUEANGEL_BACKLIGHT=y
+CONFIG_MACH_BLUEANGEL_DS1WM=y
+CONFIG_MACH_BLUEANGEL_PCMCIA=y
+CONFIG_MACH_BLUEANGEL_SUSPEND=y
+CONFIG_MACH_BLUEANGEL_LEDS=y
+CONFIG_MACH_BLUEANGEL_ASIC3_LEDS=y
+CONFIG_MACH_BLUEANGEL_KEYPAD=y
+CONFIG_MACH_BLUEANGEL_POWER=y
+CONFIG_MACH_BLUEANGEL_ROM=y
+CONFIG_MACH_BLUEANGEL_DPRAM=y
+CONFIG_MACH_BLUEANGEL_PHONE=m
+
+#
+# HTC_HW6X00
+#
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X30 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_MACH_MIOA701 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_RECON is not set
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_MACH_LOOXN560 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA25x=y
+CONFIG_PXA26x=y
+CONFIG_PXA_SSP=y
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+# CONFIG_IWMMXT is not set
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+CONFIG_PCCARD=y
+CONFIG_PCMCIA_DEBUG=y
+CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
+CONFIG_PCMCIA_IOCTL=y
+
+#
+# PC-card bridges
+#
+CONFIG_PCMCIA_PXA2XX=y
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_PXA=y
+CONFIG_PXA25x_ALTERNATE_FREQS=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+# CONFIG_BT_HCIDTL1 is not set
+# CONFIG_BT_HCIBT3C is not set
+# CONFIG_BT_HCIBLUECARD is not set
+# CONFIG_BT_HCIBTUART is not set
+# CONFIG_BT_HCIVHCI is not set
+CONFIG_IEEE80211=m
+# CONFIG_IEEE80211_DEBUG is not set
+# CONFIG_IEEE80211_CRYPT_WEP is not set
+CONFIG_IEEE80211_CRYPT_CCMP=m
+CONFIG_IEEE80211_CRYPT_TKIP=m
+# CONFIG_IEEE80211_SOFTMAC is not set
+CONFIG_WIRELESS_EXT=y
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+CONFIG_MTD_CONCAT=y
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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=m
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=m
+# 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 is not set
+# 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=m
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=m
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+# CONFIG_MTD_XIP 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_IPAQ is not set
+# CONFIG_MTD_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+CONFIG_NET_RADIO=y
+CONFIG_NET_WIRELESS_RTNETLINK=y
+
+#
+# Obsolete Wireless cards support (pre-802.11)
+#
+# CONFIG_STRIP is not set
+# CONFIG_PCMCIA_WAVELAN is not set
+# CONFIG_PCMCIA_NETWAVE is not set
+
+#
+# Wireless 802.11 Frequency Hopping cards support
+#
+# CONFIG_PCMCIA_RAYCS is not set
+
+#
+# Wireless 802.11b ISA/PCI cards support
+#
+# CONFIG_HERMES is not set
+# CONFIG_ATMEL is not set
+
+#
+# Wireless 802.11b Pcmcia/Cardbus cards support
+#
+# CONFIG_AIRO_CS is not set
+# CONFIG_PCMCIA_WL3501 is not set
+# CONFIG_HOSTAP is not set
+CONFIG_ACX=m
+# CONFIG_ACX_MEM is not set
+CONFIG_ACX_CS=y
+CONFIG_NET_WIRELESS=y
+
+#
+# PCMCIA network device support
+#
+# CONFIG_NET_PCMCIA is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+CONFIG_KEYBOARD_ASIC3=y
+CONFIG_KEYBOARD_TSC2200=y
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_TSC2200=y
+CONFIG_TOUCHSCREEN_ADC=y
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+CONFIG_SERIAL_PXA_IR=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+CONFIG_TIHTC=m
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=m
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+# CONFIG_I2C_ALGOBIT is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_PXA=m
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# 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 is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCA9535 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_RTC8564 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 is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+CONFIG_W1=y
+
+#
+# 1-wire Bus Masters
+#
+# CONFIG_W1_MASTER_DS2482 is not set
+CONFIG_W1_MASTER_DS1WM=y
+
+#
+# 1-wire Slaves
+#
+# CONFIG_W1_SLAVE_THERM is not set
+# CONFIG_W1_SLAVE_SMEM is not set
+# CONFIG_W1_SLAVE_DS2433 is not set
+CONFIG_W1_SLAVE_DS2760=y
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+CONFIG_BATTERY_DS2760=y
+# CONFIG_ADC_BATTERY is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+# CONFIG_ADC_ADS7846_SSP is not set
+CONFIG_ADC_TSC2200_SSP=y
+# CONFIG_ADC_AD7877 is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+CONFIG_HTC_ASIC3=y
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_BBKEYS is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2101 is not set
+CONFIG_SOC_TSC2200=y
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+CONFIG_LEDS_ASIC3=y
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HWTIMER=y
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_PXA is not set
+# CONFIG_FB_MBX is not set
+CONFIG_FB_W100=y
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+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_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+# CONFIG_SND_PXA2XX_AC97 is not set
+# CONFIG_SND_RECON is not set
+
+#
+# PCMCIA devices
+#
+# CONFIG_SND_VXPOCKET is not set
+# CONFIG_SND_PDAUDIOCF is not set
+
+#
+# SoC audio support
+#
+CONFIG_SND_SOC=m
+
+#
+# SoC Platforms
+#
+
+#
+# SoC Audio for the Atmel AT91
+#
+
+#
+# SoC Audio for the Intel PXA2xx
+#
+CONFIG_SND_PXA2XX_SOC=m
+CONFIG_SND_PXA2XX_SOC_I2S=m
+CONFIG_SND_PXA2XX_SOC_SSP=m
+# CONFIG_SND_PXA2XX_SOC_MAGICIAN is not set
+CONFIG_SND_PXA2XX_SOC_BLUEANGEL=m
+# CONFIG_SND_PXA2XX_SOC_H5000 is not set
+# CONFIG_SND_PXA2XX_SOC_MIOA701 is not set
+
+#
+# SoC Audio for the Freescale i.MX
+#
+
+#
+# SoC Audio for the Samsung S3C24XX
+#
+# CONFIG_SND_SOC_AC97_CODEC is not set
+# CONFIG_SND_SOC_WM8711 is not set
+# CONFIG_SND_SOC_WM8510 is not set
+# CONFIG_SND_SOC_WM8731 is not set
+# CONFIG_SND_SOC_WM8750 is not set
+# CONFIG_SND_SOC_WM8753 is not set
+# CONFIG_SND_SOC_WM8772 is not set
+# CONFIG_SND_SOC_WM8971 is not set
+# CONFIG_SND_SOC_WM8956 is not set
+# CONFIG_SND_SOC_WM8960 is not set
+# CONFIG_SND_SOC_WM8976 is not set
+# CONFIG_SND_SOC_WM8974 is not set
+# CONFIG_SND_SOC_WM8980 is not set
+# CONFIG_SND_SOC_WM9705 is not set
+# CONFIG_SND_SOC_WM9713 is not set
+# CONFIG_SND_SOC_WM9712 is not set
+CONFIG_SND_SOC_UDA1380=m
+# CONFIG_SND_SOC_AK4535 is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=m
+# CONFIG_HID_DEBUG is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+CONFIG_USB_GADGET_PXA2XX=y
+CONFIG_USB_PXA2XX=y
+# CONFIG_USB_PXA2XX_SMALL is not set
+# CONFIG_USB_GADGET_PXA27X is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+CONFIG_USB_PXA2XX_GPIO=y
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_PXA is not set
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP is not set
+CONFIG_MMC_ASIC3=y
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+CONFIG_RTC_DEBUG=y
+
+#
+# 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_CMOS is not set
+# 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_RS5C372 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_JFFS2_FS=m
+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=y
+CONFIG_JFFS2_RTIME=y
+# 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 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+CONFIG_CRYPTO_AES=m
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+CONFIG_CRYPTO_MICHAEL_MIC=m
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htchimalaya/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htchimalaya/defconfig
new file mode 100644
index 0000000..b2a461f
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htchimalaya/defconfig
@@ -0,0 +1,1350 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:44 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+CONFIG_BOARD_IRQ_MAP_BIG=y
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+CONFIG_MACH_HIMALAYA=y
+# CONFIG_MACH_HIMALAYA_ASIC3 is not set
+# CONFIG_MACH_HIMALAYA_ROM is not set
+# CONFIG_HIMALAYA_LEDS is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+
+#
+# HTC_HW6X00
+#
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X30 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_MACH_MIOA701 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_RECON is not set
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_MACH_LOOXN560 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA25x=y
+CONFIG_PXA26x=y
+# CONFIG_PXA_SSP is not set
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+# CONFIG_IWMMXT is not set
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_PXA=y
+CONFIG_PXA25x_ALTERNATE_FREQS=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+# CONFIG_BT_HCIVHCI is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=m
+CONFIG_MTD_DEBUG=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+# CONFIG_MTD_JEDECPROBE 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 is not set
+# 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_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+# CONFIG_KEYBOARD_ASIC3 is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_ADC=y
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+CONFIG_SERIAL_PXA_IR=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+# CONFIG_POWER_SUPPLY is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+CONFIG_ADC_ADS7846_SSP=y
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+CONFIG_HTC_ASIC3=y
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_BBKEYS is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_ASIC3 is not set
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+# CONFIG_LEDS_TRIGGER_HWTIMER is not set
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_CFB_FILLRECT is not set
+# CONFIG_FB_CFB_COPYAREA is not set
+# CONFIG_FB_CFB_IMAGEBLIT is not set
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_PXA is not set
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+# CONFIG_SND is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=m
+# CONFIG_HID_DEBUG is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+CONFIG_USB_GADGET_PXA2XX=y
+CONFIG_USB_PXA2XX=y
+# CONFIG_USB_PXA2XX_SMALL is not set
+# CONFIG_USB_GADGET_PXA27X is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+# CONFIG_USB_PXA2XX_GPIO is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_PXA is not set
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP is not set
+# CONFIG_MMC_ASIC3 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=y
+
+#
+# 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_CMOS is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_JFFS2_FS 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcsable/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcsable/defconfig
new file mode 100644
index 0000000..0eccbe2
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcsable/defconfig
@@ -0,0 +1,1465 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:44 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+CONFIG_BOARD_IRQ_MAP_BIG=y
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+
+#
+# HTC_HW6X00
+#
+# CONFIG_MACH_HTCBEETLES is not set
+CONFIG_MACH_HW6900=y
+CONFIG_HTCSABLE_LCD=y
+CONFIG_HTCSABLE_BACKLIGHT=y
+# CONFIG_HTCSABLE_ROM is not set
+# CONFIG_HTCSABLE_BT is not set
+# CONFIG_HTCSABLE_PHONE is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X30 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_MACH_MIOA701 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_RECON is not set
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_MACH_LOOXN560 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA27x=y
+# CONFIG_PXA_SSP is not set
+# CONFIG_PXA27x_VOLTAGE is not set
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+CONFIG_IWMMXT=y
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_PXA=y
+CONFIG_PXA25x_ALTERNATE_FREQS=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+# CONFIG_BT_HCIVHCI is not set
+CONFIG_IEEE80211=m
+# CONFIG_IEEE80211_DEBUG is not set
+# CONFIG_IEEE80211_CRYPT_WEP is not set
+CONFIG_IEEE80211_CRYPT_CCMP=m
+CONFIG_IEEE80211_CRYPT_TKIP=m
+# CONFIG_IEEE80211_SOFTMAC is not set
+CONFIG_WIRELESS_EXT=y
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=m
+CONFIG_MTD_DEBUG=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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=m
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=m
+# 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 is not set
+# 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 is not set
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_CFI_STAA is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_IPAQ is not set
+# CONFIG_MTD_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+CONFIG_NET_RADIO=y
+CONFIG_NET_WIRELESS_RTNETLINK=y
+
+#
+# Obsolete Wireless cards support (pre-802.11)
+#
+# CONFIG_STRIP is not set
+# CONFIG_HOSTAP is not set
+CONFIG_ACX=m
+CONFIG_ACX_MEM=y
+# CONFIG_ACX_CS is not set
+CONFIG_ACX_HTCSABLE=m
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+# CONFIG_KEYBOARD_ASIC3 is not set
+CONFIG_KEYBOARD_PXA27x=y
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_ADC=y
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+CONFIG_SERIAL_PXA_IR=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=m
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+# CONFIG_I2C_ALGOBIT is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_PXA=m
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# 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 is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCA9535 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_RTC8564 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 is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+# CONFIG_POWER_SUPPLY is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+CONFIG_ADC_ADS7846_SSP=y
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+CONFIG_HTC_ASIC3=y
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_BBKEYS is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_ASIC3 is not set
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+# CONFIG_LEDS_TRIGGER_HWTIMER is not set
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+# CONFIG_FB_PXA_PARAMETERS is not set
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+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_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+CONFIG_SND_HTCSABLE=m
+CONFIG_SND_PXA2xx_I2SOUND=m
+# CONFIG_SND_PXA2XX_AC97 is not set
+# CONFIG_SND_RECON is not set
+
+#
+# SoC audio support
+#
+# CONFIG_SND_SOC is not set
+CONFIG_SND_AK4641=m
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=m
+# CONFIG_HID_DEBUG 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 is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+CONFIG_USB_GADGET_PXA27X=y
+CONFIG_USB_PXA27X=y
+# CONFIG_USB_PXA27X_DMA is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+# CONFIG_USB_PXA2XX_GPIO is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_PXA is not set
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP is not set
+CONFIG_MMC_ASIC3=y
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+CONFIG_RTC_DEBUG=y
+
+#
+# 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_CMOS is not set
+# 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_RS5C372 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_JFFS2_FS=m
+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=y
+CONFIG_JFFS2_RTIME=y
+# 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 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+CONFIG_CRYPTO_AES=m
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+CONFIG_CRYPTO_MICHAEL_MIC=m
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcuniversal/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcuniversal/defconfig
new file mode 100644
index 0000000..8ceed2b
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcuniversal/defconfig
@@ -0,0 +1,1471 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:45 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+CONFIG_BOARD_IRQ_MAP_BIG=y
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+CONFIG_MACH_HTCUNIVERSAL=y
+CONFIG_HTCUNIVERSAL_CORE=y
+CONFIG_HTCUNIVERSAL_UDC=y
+CONFIG_HTCUNIVERSAL_POWER=y
+CONFIG_HTCUNIVERSAL_BACKLIGHT=y
+CONFIG_HTCUNIVERSAL_LCD=y
+CONFIG_HTCUNIVERSAL_TS2=m
+CONFIG_HTCUNIVERSAL_BUTTONS=y
+CONFIG_HTCUNIVERSAL_BLUETOOTH=m
+CONFIG_HTCUNIVERSAL_ASIC3_LEDS=y
+CONFIG_HTCUNIVERSAL_PHONE=m
+# CONFIG_HTCUNIVERSAL_MDOC_G3 is not set
+CONFIG_HTCUNIVERSAL_AK4641=m
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+
+#
+# HTC_HW6X00
+#
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X30 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_MACH_MIOA701 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_RECON is not set
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_MACH_LOOXN560 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA27x=y
+# CONFIG_PXA_SSP is not set
+# CONFIG_PXA27x_VOLTAGE is not set
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+CONFIG_IWMMXT=y
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_PXA=y
+CONFIG_PXA25x_ALTERNATE_FREQS=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+# CONFIG_BT_HCIVHCI is not set
+CONFIG_IEEE80211=m
+# CONFIG_IEEE80211_DEBUG is not set
+# CONFIG_IEEE80211_CRYPT_WEP is not set
+CONFIG_IEEE80211_CRYPT_CCMP=m
+CONFIG_IEEE80211_CRYPT_TKIP=m
+# CONFIG_IEEE80211_SOFTMAC is not set
+CONFIG_WIRELESS_EXT=y
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=m
+CONFIG_MTD_DEBUG=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+# CONFIG_MTD_JEDECPROBE 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 is not set
+# 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_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+CONFIG_NET_RADIO=y
+CONFIG_NET_WIRELESS_RTNETLINK=y
+
+#
+# Obsolete Wireless cards support (pre-802.11)
+#
+# CONFIG_STRIP is not set
+# CONFIG_HOSTAP is not set
+CONFIG_ACX=m
+CONFIG_ACX_MEM=y
+# CONFIG_ACX_CS is not set
+CONFIG_ACX_HTCUNIVERSAL=m
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+CONFIG_KEYBOARD_ASIC3=y
+CONFIG_KEYBOARD_PXA27x=y
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_ADC=m
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+CONFIG_SERIAL_PXA_IR=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=m
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+# CONFIG_I2C_ALGOBIT is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_PXA=m
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# 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 is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCA9535 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_RTC8564 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 is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+CONFIG_W1=y
+
+#
+# 1-wire Bus Masters
+#
+# CONFIG_W1_MASTER_DS2482 is not set
+CONFIG_W1_MASTER_DS1WM=y
+
+#
+# 1-wire Slaves
+#
+# CONFIG_W1_SLAVE_THERM is not set
+# CONFIG_W1_SLAVE_SMEM is not set
+# CONFIG_W1_SLAVE_DS2433 is not set
+CONFIG_W1_SLAVE_DS2760=y
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+CONFIG_BATTERY_DS2760=y
+# CONFIG_ADC_BATTERY is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+CONFIG_ADC_ADS7846_SSP=y
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+CONFIG_HTC_ASIC3=y
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_BBKEYS is not set
+CONFIG_HTC_ASIC3_DS1WM=y
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+CONFIG_LEDS_ASIC3=y
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HWTIMER=y
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+# CONFIG_FB_PXA_PARAMETERS is not set
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+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_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+CONFIG_SND_HTCUNIVERSAL=m
+CONFIG_SND_PXA2xx_I2SOUND=m
+# CONFIG_SND_PXA2XX_AC97 is not set
+# CONFIG_SND_RECON is not set
+
+#
+# SoC audio support
+#
+# CONFIG_SND_SOC is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=m
+# CONFIG_HID_DEBUG 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 is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+CONFIG_USB_GADGET_PXA27X=y
+CONFIG_USB_PXA27X=y
+# CONFIG_USB_PXA27X_DMA is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+# CONFIG_USB_PXA2XX_GPIO is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_PXA is not set
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP is not set
+CONFIG_MMC_ASIC3=y
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+CONFIG_RTC_DEBUG=y
+
+#
+# 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_CMOS is not set
+# 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_RS5C372 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_JFFS2_FS 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+CONFIG_CRYPTO_AES=m
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+CONFIG_CRYPTO_MICHAEL_MIC=m
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcwallaby/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcwallaby/defconfig
new file mode 100644
index 0000000..bee3188
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/htcwallaby/defconfig
@@ -0,0 +1,1322 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:45 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+# CONFIG_GENERIC_TIME is not set
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_RPC is not set
+CONFIG_ARCH_SA1100=y
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+# CONFIG_BOARD_IRQ_MAP_BIG is not set
+
+#
+# SA11x0 Implementations
+#
+# CONFIG_SA1100_ASSABET is not set
+# CONFIG_SA1100_CERF is not set
+# CONFIG_SA1100_COLLIE is not set
+# CONFIG_SA1100_H3100 is not set
+# CONFIG_SA1100_H3600 is not set
+# CONFIG_SA1100_H3800 is not set
+# CONFIG_SA1100_BADGE4 is not set
+# CONFIG_SA1100_JORNADA56X is not set
+# CONFIG_SA1100_JORNADA720 is not set
+# CONFIG_SA1100_JORNADA820 is not set
+CONFIG_SA1100_XDA=y
+# CONFIG_SA1100_HACKKIT is not set
+# CONFIG_SA1100_LART is not set
+# CONFIG_SA1100_PLEB is not set
+# CONFIG_SA1100_SHANNON is not set
+# CONFIG_SA1100_SIMPAD is not set
+# CONFIG_SA1100_SSP is not set
+CONFIG_SA1100_USB=m
+# CONFIG_SA1100_USB_NETLINK is not set
+# CONFIG_SA1100_USB_CHAR is not set
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_SA1100=y
+CONFIG_CPU_32v4=y
+CONFIG_CPU_ABRT_EV4=y
+CONFIG_CPU_CACHE_V4WB=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WB=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+
+#
+# Bus support
+#
+CONFIG_ISA=y
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
+CONFIG_NODES_SHIFT=2
+CONFIG_SELECT_MEMORY_MODEL=y
+# CONFIG_FLATMEM_MANUAL is not set
+CONFIG_DISCONTIGMEM_MANUAL=y
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_DISCONTIGMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_NEED_MULTIPLE_NODES=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=1
+# CONFIG_LEDS is not set
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_SA1110=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=m
+CONFIG_MTD_DEBUG=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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=m
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=m
+# 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 is not set
+# 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 is not set
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_CFI_STAA is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_IPAQ is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNP is not set
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET 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_PPP=m
+# CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=m
+# CONFIG_PPP_SYNC_TTY is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# 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_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+# CONFIG_TOUCHSCREEN_ADC is not set
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_SA1100=y
+CONFIG_SERIAL_SA1100_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+# CONFIG_BATTERY_DS2760 is not set
+# CONFIG_ADC_BATTERY is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+# CONFIG_ADC_ADS7846_SSP is not set
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_BBKEYS is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# Multimedia Capabilities Port drivers
+#
+# CONFIG_MCP_SA11X0 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HWTIMER=y
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+CONFIG_FB_SA1100=y
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB 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=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+# CONFIG_SND is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+# CONFIG_HID is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+# CONFIG_USB_GADGET_PXA27X is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP 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=y
+
+#
+# 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_CMOS is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_JFFS2_FS=m
+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=y
+CONFIG_JFFS2_RTIME=y
+# 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 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/hx4700/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/hx4700/defconfig
new file mode 100644
index 0000000..5d3f16e
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/hx4700/defconfig
@@ -0,0 +1,1823 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Wed Jan 28 17:22:38 2009
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+CONFIG_LBD=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+CONFIG_LSF=y
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+CONFIG_BOARD_IRQ_MAP_BIG=y
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+CONFIG_MACH_H4700=y
+CONFIG_HX4700_NAVPOINT=y
+CONFIG_HX4700_CORE=y
+CONFIG_HX4700_BLUETOOTH=m
+CONFIG_HX4700_PCMCIA=y
+CONFIG_HX4700_LCD=y
+CONFIG_HX4700_LEDS=y
+CONFIG_HX4700_POWER2=y
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+
+#
+# HTC_HW6X00
+#
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X30 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_RECON is not set
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_MACH_LOOXC550 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA27x=y
+CONFIG_PXA_SUSPEND_SAVE_EXTRA_REGS=y
+# CONFIG_PXA27x_VOLTAGE is not set
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+CONFIG_IWMMXT=y
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+CONFIG_PCCARD=y
+CONFIG_PCMCIA_DEBUG=y
+CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
+CONFIG_PCMCIA_IOCTL=y
+
+#
+# PC-card bridges
+#
+CONFIG_PCMCIA_PXA2XX=y
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+# CONFIG_OABI_COMPAT 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_PXA=y
+CONFIG_PXA25x_ALTERNATE_FREQS=y
+
+#
+# Floating point emulation
+#
+
+#
+# At least one emulation must be selected
+#
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=m
+
+#
+# IrDA protocols
+#
+CONFIG_IRLAN=m
+# CONFIG_IRNET is not set
+CONFIG_IRCOMM=m
+CONFIG_IRDA_ULTRA=y
+
+#
+# IrDA options
+#
+CONFIG_IRDA_CACHE_LAST_LSAP=y
+CONFIG_IRDA_FAST_RR=y
+CONFIG_IRDA_DEBUG=y
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+CONFIG_IRTTY_SIR=m
+
+#
+# Dongle support
+#
+# CONFIG_DONGLE is not set
+
+#
+# Old SIR device drivers
+#
+# CONFIG_IRPORT_SIR is not set
+
+#
+# Old Serial dongle support
+#
+
+#
+# FIR device drivers
+#
+# CONFIG_USB_IRDA is not set
+# CONFIG_SIGMATEL_FIR is not set
+CONFIG_PXA_FICP=m
+# CONFIG_MCS_FIR is not set
+CONFIG_BT=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+# CONFIG_BT_HCIUSB is not set
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+# CONFIG_BT_HCIBCM203X is not set
+# CONFIG_BT_HCIBPA10X is not set
+# CONFIG_BT_HCIBFUSB is not set
+# CONFIG_BT_HCIDTL1 is not set
+# CONFIG_BT_HCIBT3C is not set
+# CONFIG_BT_HCIBLUECARD is not set
+# CONFIG_BT_HCIBTUART is not set
+# CONFIG_BT_HCIVHCI is not set
+CONFIG_IEEE80211=m
+# CONFIG_IEEE80211_DEBUG is not set
+CONFIG_IEEE80211_CRYPT_WEP=m
+CONFIG_IEEE80211_CRYPT_CCMP=m
+CONFIG_IEEE80211_CRYPT_TKIP=m
+CONFIG_IEEE80211_SOFTMAC=m
+# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set
+CONFIG_WIRELESS_EXT=y
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+CONFIG_MTD_CONCAT=y
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=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 is not set
+CONFIG_MTD_GEN_PROBE=y
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_CFI_NOSWAP=y
+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+CONFIG_MTD_CFI_GEOMETRY=y
+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 is not set
+# 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_OTP is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+# CONFIG_MTD_XIP 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_IPAQ is not set
+# CONFIG_MTD_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# 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_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=y
+CONFIG_IDE_MAX_HWIFS=4
+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_IDECS=y
+# CONFIG_BLK_DEV_IDECD is not set
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY 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_IDEDMA 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
+
+#
+# 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=m
+
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=m
+# CONFIG_SMC91X is not set
+# CONFIG_DM9000 is not set
+# CONFIG_SMC911X is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+CONFIG_NET_RADIO=y
+CONFIG_NET_WIRELESS_RTNETLINK=y
+
+#
+# Obsolete Wireless cards support (pre-802.11)
+#
+# CONFIG_STRIP is not set
+# CONFIG_PCMCIA_WAVELAN is not set
+# CONFIG_PCMCIA_NETWAVE is not set
+
+#
+# Wireless 802.11 Frequency Hopping cards support
+#
+# CONFIG_PCMCIA_RAYCS is not set
+
+#
+# Wireless 802.11b ISA/PCI cards support
+#
+CONFIG_HERMES=m
+CONFIG_ATMEL=m
+
+#
+# Wireless 802.11b Pcmcia/Cardbus cards support
+#
+CONFIG_PCMCIA_HERMES=m
+CONFIG_PCMCIA_SPECTRUM=m
+CONFIG_AIRO_CS=m
+CONFIG_PCMCIA_ATMEL=m
+CONFIG_PCMCIA_WL3501=m
+CONFIG_USB_ZD1201=m
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_FIRMWARE=y
+# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set
+CONFIG_HOSTAP_CS=m
+CONFIG_ZD1211RW=m
+# CONFIG_ZD1211RW_DEBUG is not set
+CONFIG_ACX=m
+# CONFIG_ACX_USB is not set
+CONFIG_ACX_MEM=y
+# CONFIG_ACX_CS is not set
+CONFIG_ACX_HX4700=m
+CONFIG_NET_WIRELESS=y
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_3C589=m
+CONFIG_PCMCIA_3C574=m
+CONFIG_PCMCIA_FMVJ18X=m
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PCMCIA_NMCLAN=m
+CONFIG_PCMCIA_SMC91C92=m
+CONFIG_PCMCIA_XIRC2PS=m
+CONFIG_PCMCIA_AXNET=m
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+CONFIG_PPPOE=m
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+# CONFIG_KEYBOARD_ASIC3 is not set
+# CONFIG_KEYBOARD_PXA27x is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+CONFIG_MOUSE_NAVPOINT=y
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_ADC=y
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_CS=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+CONFIG_SERIAL_PXA_IR=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_RS232_SERIAL=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=m
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+# CONFIG_I2C_ALGOBIT is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_PXA=m
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# 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 is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCA9535 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_RTC8564 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 is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+CONFIG_W1=y
+
+#
+# 1-wire Bus Masters
+#
+# CONFIG_W1_MASTER_DS2490 is not set
+# CONFIG_W1_MASTER_DS2482 is not set
+CONFIG_W1_MASTER_DS1WM=y
+
+#
+# 1-wire Slaves
+#
+# CONFIG_W1_SLAVE_THERM is not set
+# CONFIG_W1_SLAVE_SMEM is not set
+# CONFIG_W1_SLAVE_DS2433 is not set
+CONFIG_W1_SLAVE_DS2760=y
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+CONFIG_BATTERY_DS2760=y
+CONFIG_ADC_BATTERY=y
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+CONFIG_ADC_ADS7846_SSP=y
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+CONFIG_HTC_ASIC3=y
+# CONFIG_HTC_PASIC3 is not set
+CONFIG_HTC_EGPIO=y
+# CONFIG_HTC_BBKEYS is not set
+CONFIG_HTC_ASIC3_DS1WM=y
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+CONFIG_LEDS_ASIC3=y
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HWTIMER=y
+CONFIG_LEDS_TRIGGER_IDE_DISK=y
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# 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_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_PXA is not set
+# CONFIG_FB_MBX is not set
+CONFIG_FB_W100=y
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+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_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+CONFIG_SND_HX4700=m
+CONFIG_SND_PXA2xx_I2SOUND=m
+# CONFIG_SND_PXA2XX_AC97 is not set
+# CONFIG_SND_RECON is not set
+
+#
+# USB devices
+#
+# CONFIG_SND_USB_AUDIO is not set
+
+#
+# PCMCIA devices
+#
+# CONFIG_SND_VXPOCKET is not set
+# CONFIG_SND_PDAUDIOCF is not set
+
+#
+# SoC audio support
+#
+# CONFIG_SND_SOC is not set
+CONFIG_SND_AK4641=m
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=m
+# CONFIG_HID_DEBUG 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=m
+# CONFIG_USB_DEBUG is not set
+
+#
+# Miscellaneous USB options
+#
+# CONFIG_USB_DEVICEFS 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 is not set
+CONFIG_USB_SL811_HCD=m
+CONFIG_USB_SL811_CS=m
+
+#
+# USB Device Class drivers
+#
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
+
+#
+# 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=m
+# CONFIG_USB_HIDINPUT_POWERBOOK is not set
+# CONFIG_HID_FF is not set
+# CONFIG_USB_HIDDEV 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
+# CONFIG_USB_GTCO is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+
+#
+# USB Network Adapters
+#
+CONFIG_USB_CATC=m
+CONFIG_USB_KAWETH=m
+CONFIG_USB_PEGASUS=m
+CONFIG_USB_RTL8150=m
+CONFIG_USB_USBNET_MII=m
+CONFIG_USB_USBNET=m
+CONFIG_USB_NET_AX8817X=m
+CONFIG_USB_NET_CDCETHER=m
+CONFIG_USB_NET_DM9601=m
+CONFIG_USB_NET_GL620A=m
+CONFIG_USB_NET_NET1080=m
+CONFIG_USB_NET_PLUSB=m
+CONFIG_USB_NET_MCS7830=m
+CONFIG_USB_NET_RNDIS_HOST=m
+CONFIG_USB_NET_CDC_SUBSET=m
+CONFIG_USB_ALI_M5632=y
+CONFIG_USB_AN2720=y
+CONFIG_USB_BELKIN=y
+CONFIG_USB_ARMLINUX=y
+CONFIG_USB_EPSON2888=y
+CONFIG_USB_KC2190=y
+CONFIG_USB_NET_ZAURUS=m
+CONFIG_USB_MON=y
+
+#
+# USB port drivers
+#
+
+#
+# USB Serial Converter support
+#
+CONFIG_USB_SERIAL=m
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_AIRCABLE=m
+CONFIG_USB_SERIAL_AIRPRIME=m
+CONFIG_USB_SERIAL_ARK3116=m
+CONFIG_USB_SERIAL_BELKIN=m
+CONFIG_USB_SERIAL_WHITEHEAT=m
+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
+CONFIG_USB_SERIAL_CP2101=m
+CONFIG_USB_SERIAL_CYPRESS_M8=m
+CONFIG_USB_SERIAL_EMPEG=m
+CONFIG_USB_SERIAL_FTDI_SIO=m
+CONFIG_USB_SERIAL_FUNSOFT=m
+CONFIG_USB_SERIAL_VISOR=m
+CONFIG_USB_SERIAL_IPAQ=m
+CONFIG_USB_SERIAL_IR=m
+CONFIG_USB_SERIAL_EDGEPORT=m
+CONFIG_USB_SERIAL_EDGEPORT_TI=m
+CONFIG_USB_SERIAL_GARMIN=m
+CONFIG_USB_SERIAL_IPW=m
+CONFIG_USB_SERIAL_KEYSPAN_PDA=m
+CONFIG_USB_SERIAL_KEYSPAN=m
+CONFIG_USB_SERIAL_KEYSPAN_MPR=y
+CONFIG_USB_SERIAL_KEYSPAN_USA28=y
+CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
+CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
+CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19=y
+CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
+CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
+CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
+CONFIG_USB_SERIAL_KLSI=m
+CONFIG_USB_SERIAL_KOBIL_SCT=m
+CONFIG_USB_SERIAL_MCT_U232=m
+CONFIG_USB_SERIAL_MOS7720=m
+CONFIG_USB_SERIAL_MOS7840=m
+CONFIG_USB_SERIAL_NAVMAN=m
+CONFIG_USB_SERIAL_PL2303=m
+CONFIG_USB_SERIAL_HP4X=m
+CONFIG_USB_SERIAL_SAFE=m
+# CONFIG_USB_SERIAL_SAFE_PADDED is not set
+CONFIG_USB_SERIAL_SIERRAWIRELESS=m
+CONFIG_USB_SERIAL_TI=m
+CONFIG_USB_SERIAL_CYBERJACK=m
+CONFIG_USB_SERIAL_XIRCOM=m
+CONFIG_USB_SERIAL_OPTION=m
+CONFIG_USB_SERIAL_OMNINET=m
+CONFIG_USB_SERIAL_DEBUG=m
+CONFIG_USB_EZUSB=y
+
+#
+# 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_BERRY_CHARGE 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_IOWARRIOR is not set
+
+#
+# USB DSL modem support
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+CONFIG_USB_GADGET_PXA27X=y
+CONFIG_USB_PXA27X=y
+# CONFIG_USB_PXA27X_DMA is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+CONFIG_USB_PXA2XX_GPIO=y
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_PXA is not set
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP is not set
+CONFIG_MMC_ASIC3=y
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+CONFIG_RTC_DEBUG=y
+
+#
+# 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_CMOS is not set
+# 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_RS5C372 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_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=y
+CONFIG_JFFS2_RTIME=y
+# 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 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+CONFIG_CRYPTO_AES=m
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+CONFIG_CRYPTO_MICHAEL_MIC=m
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+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
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/linux-2.6.git-9d20fdd58e74d4d26dc5216efaaa0f800c23dd3a.patch b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/linux-2.6.git-9d20fdd58e74d4d26dc5216efaaa0f800c23dd3a.patch
new file mode 100644
index 0000000..f3c27d3
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/linux-2.6.git-9d20fdd58e74d4d26dc5216efaaa0f800c23dd3a.patch
@@ -0,0 +1,144 @@
+From: Bill Gatliff <bgat@billgatliff.com>
+Date: Thu, 31 May 2007 21:02:22 +0000 (+0100)
+Subject: [ARM] 4423/1: add ATAGS support
+X-Git-Tag: v2.6.23-rc1~1101^2^7~5
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=9d20fdd58e74d4d26dc5216efaaa0f800c23dd3a
+
+[ARM] 4423/1: add ATAGS support
+
+Examines the ATAGS pointer (r2) at boot, and interprets
+a nonzero value as a reference to an ATAGS structure. A
+suitable ATAGS structure replaces the kernel's command line.
+
+Signed-off-by: Bill Gatliff <bgat@billgatliff.com>
+Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
+---
+
+diff --git a/arch/arm/kernel/head-common.S b/arch/arm/kernel/head-common.S
+index a52da0d..024a9cf 100644
+--- a/arch/arm/kernel/head-common.S
++++ b/arch/arm/kernel/head-common.S
+@@ -20,7 +20,8 @@ __switch_data:
+ .long _end @ r7
+ .long processor_id @ r4
+ .long __machine_arch_type @ r5
+- .long cr_alignment @ r6
++ .long __atags_pointer @ r6
++ .long cr_alignment @ r7
+ .long init_thread_union + THREAD_START_SP @ sp
+
+ /*
+@@ -29,6 +30,7 @@ __switch_data:
+ *
+ * r0 = cp#15 control register
+ * r1 = machine ID
++ * r2 = atags pointer
+ * r9 = processor ID
+ */
+ .type __mmap_switched, %function
+@@ -47,11 +49,12 @@ __mmap_switched:
+ strcc fp, [r6],#4
+ bcc 1b
+
+- ldmia r3, {r4, r5, r6, sp}
++ ldmia r3, {r4, r5, r6, r7, sp}
+ str r9, [r4] @ Save processor ID
+ str r1, [r5] @ Save machine type
++ str r2, [r6] @ Save atags pointer
+ bic r4, r0, #CR_A @ Clear 'A' bit
+- stmia r6, {r0, r4} @ Save control register values
++ stmia r7, {r0, r4} @ Save control register values
+ b start_kernel
+
+ /*
+@@ -215,3 +218,34 @@ ENTRY(lookup_machine_type)
+ bl __lookup_machine_type
+ mov r0, r5
+ ldmfd sp!, {r4 - r6, pc}
++
++/* Determine validity of the r2 atags pointer. The heuristic requires
++ * that the pointer be aligned, in the first 16k of physical RAM and
++ * that the ATAG_CORE marker is first and present. Future revisions
++ * of this function may be more lenient with the physical address and
++ * may also be able to move the ATAGS block if necessary.
++ *
++ * r8 = machinfo
++ *
++ * Returns:
++ * r2 either valid atags pointer, or zero
++ * r5, r6 corrupted
++ */
++
++ .type __vet_atags, %function
++__vet_atags:
++ tst r2, #0x3 @ aligned?
++ bne 1f
++
++ ldr r5, [r2, #0] @ is first tag ATAG_CORE?
++ subs r5, r5, #ATAG_CORE_SIZE
++ bne 1f
++ ldr r5, [r2, #4]
++ ldr r6, =ATAG_CORE
++ cmp r5, r6
++ bne 1f
++
++ mov pc, lr @ atag pointer is ok
++
++1: mov r2, #0
++ mov pc, lr
+diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S
+index 41f98b4..7898cbc 100644
+--- a/arch/arm/kernel/head.S
++++ b/arch/arm/kernel/head.S
+@@ -29,6 +29,10 @@
+ #define KERNEL_RAM_VADDR (PAGE_OFFSET + TEXT_OFFSET)
+ #define KERNEL_RAM_PADDR (PHYS_OFFSET + TEXT_OFFSET)
+
++#define ATAG_CORE 0x54410001
++#define ATAG_CORE_SIZE ((2*4 + 3*4) >> 2)
++
++
+ /*
+ * swapper_pg_dir is the virtual address of the initial page table.
+ * We place the page tables 16K below KERNEL_RAM_VADDR. Therefore, we must
+@@ -61,7 +65,7 @@
+ *
+ * This is normally called from the decompressor code. The requirements
+ * are: MMU = off, D-cache = off, I-cache = dont care, r0 = 0,
+- * r1 = machine nr.
++ * r1 = machine nr, r2 = atags pointer.
+ *
+ * This code is mostly position independent, so if you link the kernel at
+ * 0xc0008000, you call this at __pa(0xc0008000).
+@@ -85,6 +89,7 @@ ENTRY(stext)
+ bl __lookup_machine_type @ r5=machinfo
+ movs r8, r5 @ invalid machine (r5=0)?
+ beq __error_a @ yes, error 'a'
++ bl __vet_atags
+ bl __create_page_tables
+
+ /*
+diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
+index 650eac1..5be2e98 100644
+--- a/arch/arm/kernel/setup.c
++++ b/arch/arm/kernel/setup.c
+@@ -63,6 +63,8 @@ unsigned int processor_id;
+ unsigned int __machine_arch_type;
+ EXPORT_SYMBOL(__machine_arch_type);
+
++unsigned int __atags_pointer __initdata;
++
+ unsigned int system_rev;
+ EXPORT_SYMBOL(system_rev);
+
+@@ -780,7 +782,9 @@ void __init setup_arch(char **cmdline_p)
+ if (mdesc->soft_reboot)
+ reboot_setup("s");
+
+- if (mdesc->boot_params)
++ if (__atags_pointer)
++ tags = phys_to_virt(__atags_pointer);
++ else if (mdesc->boot_params)
+ tags = phys_to_virt(mdesc->boot_params);
+
+ /*
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/looxc550/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/looxc550/defconfig
new file mode 100644
index 0000000..7b6cef9
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/looxc550/defconfig
@@ -0,0 +1,1351 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:46 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+CONFIG_BOARD_IRQ_MAP_BIG=y
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+
+#
+# HTC_HW6X00
+#
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_LOOXN560_SOUND is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_MACH_MIOA701 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_RECON is not set
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+CONFIG_MACH_LOOXN560=y
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA27x=y
+# CONFIG_PXA_SSP is not set
+# CONFIG_PXA27x_VOLTAGE is not set
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+CONFIG_IWMMXT=y
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_PXA=y
+CONFIG_PXA25x_ALTERNATE_FREQS=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+# CONFIG_BT_HCIVHCI is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=m
+CONFIG_MTD_DEBUG=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+# CONFIG_MTD_JEDECPROBE 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 is not set
+# 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_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+# CONFIG_KEYBOARD_PXA27x is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_ADC=y
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+CONFIG_SERIAL_PXA_CONSOLE=y
+CONFIG_SERIAL_PXA_COUNT=4
+CONFIG_SERIAL_PXA_IR=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+# CONFIG_BATTERY_DS2760 is not set
+CONFIG_ADC_BATTERY=y
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+CONFIG_ADC_ADS7846_SSP=y
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+CONFIG_HTC_EGPIO=y
+# CONFIG_HTC_BBKEYS is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+# CONFIG_LEDS_TRIGGER_HWTIMER is not set
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+# CONFIG_FB_PXA_PARAMETERS is not set
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+CONFIG_FONT_8x8=y
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+# CONFIG_SND is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=m
+# CONFIG_HID_DEBUG 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 is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+CONFIG_USB_GADGET_PXA27X=y
+CONFIG_USB_PXA27X=y
+# CONFIG_USB_PXA27X_DMA is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+# CONFIG_USB_PXA2XX_GPIO is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_PXA=y
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP 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=y
+
+#
+# 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_CMOS is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_JFFS2_FS 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/magician/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/magician/defconfig
new file mode 100644
index 0000000..1f4467c
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/magician/defconfig
@@ -0,0 +1,1679 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:42 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=y
+CONFIG_ARCH_MTD_XIP=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+CONFIG_BOARD_IRQ_MAP_SMALL=y
+# CONFIG_BOARD_IRQ_MAP_BIG is not set
+
+#
+# Intel PXA2xx Implementations
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_TOSHIBA_TMIO_OHCI is not set
+# CONFIG_ARCH_ESERIES is not set
+# CONFIG_MACH_A620 is not set
+# CONFIG_MACH_A716 is not set
+# CONFIG_MACH_A730 is not set
+# CONFIG_ARCH_H1900 is not set
+# CONFIG_ARCH_H2200 is not set
+# CONFIG_MACH_H3900 is not set
+# CONFIG_MACH_H4000 is not set
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_HX2750 is not set
+# CONFIG_ARCH_H5400 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_HTCUNIVERSAL is not set
+# CONFIG_MACH_HTCALPINE is not set
+CONFIG_MACH_MAGICIAN=y
+CONFIG_MAGICIAN_PM=y
+CONFIG_MAGICIAN_TS=m
+CONFIG_MAGICIAN_LCD=y
+CONFIG_MAGICIAN_PHONE=m
+# CONFIG_MACH_HTCAPACHE is not set
+# CONFIG_MACH_BLUEANGEL is not set
+
+#
+# HTC_HW6X00
+#
+# CONFIG_MACH_HTCBEETLES is not set
+# CONFIG_MACH_HW6900 is not set
+# CONFIG_MACH_HTCATHENA is not set
+# CONFIG_ARCH_AXIMX3 is not set
+# CONFIG_ARCH_AXIMX5 is not set
+# CONFIG_MACH_X50 is not set
+# CONFIG_MACH_MIOA701 is not set
+# CONFIG_ARCH_ROVERP1 is not set
+# CONFIG_ARCH_ROVERP5P is not set
+# CONFIG_MACH_XSCALE_PALMLD is not set
+# CONFIG_MACH_T3XSCALE is not set
+# CONFIG_MACH_RECON is not set
+# CONFIG_MACH_GHI270HG is not set
+# CONFIG_MACH_GHI270 is not set
+# CONFIG_MACH_LOOXN560 is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_TRIZEPS4 is not set
+CONFIG_PXA27x=y
+CONFIG_PXA_SSP=m
+CONFIG_PXA_SUSPEND_SAVE_EXTRA_REGS=y
+CONFIG_PXA27x_VOLTAGE=m
+CONFIG_PXA27x_VOLTAGE_MAX158xx=m
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+CONFIG_IWMMXT=y
+CONFIG_XSCALE_PMU=y
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+CONFIG_CPU_FREQ_DEBUG=y
+CONFIG_CPU_FREQ_STAT=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=m
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=m
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_FREQ_PXA=m
+CONFIG_PXA25x_ALTERNATE_FREQS=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=m
+
+#
+# IrDA protocols
+#
+CONFIG_IRLAN=m
+# CONFIG_IRNET is not set
+CONFIG_IRCOMM=m
+CONFIG_IRDA_ULTRA=y
+
+#
+# IrDA options
+#
+CONFIG_IRDA_CACHE_LAST_LSAP=y
+CONFIG_IRDA_FAST_RR=y
+CONFIG_IRDA_DEBUG=y
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+CONFIG_IRTTY_SIR=m
+
+#
+# Dongle support
+#
+# CONFIG_DONGLE is not set
+
+#
+# Old SIR device drivers
+#
+# CONFIG_IRPORT_SIR is not set
+
+#
+# Old Serial dongle support
+#
+
+#
+# FIR device drivers
+#
+# CONFIG_USB_IRDA is not set
+# CONFIG_SIGMATEL_FIR is not set
+CONFIG_PXA_FICP=m
+# CONFIG_MCS_FIR is not set
+CONFIG_BT=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUSB=m
+# CONFIG_BT_HCIUSB_SCO is not set
+# CONFIG_BT_HCIUART is not set
+# CONFIG_BT_HCIBCM203X is not set
+# CONFIG_BT_HCIBPA10X is not set
+# CONFIG_BT_HCIBFUSB is not set
+# CONFIG_BT_HCIVHCI is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+CONFIG_MTD_CONCAT=y
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+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 is not set
+# 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 is not set
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+# CONFIG_MTD_XIP is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_PHYSMAP_START=0x8000000
+CONFIG_MTD_PHYSMAP_LEN=0
+CONFIG_MTD_PHYSMAP_BANKWIDTH=2
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+# CONFIG_MTD_IPAQ is not set
+# CONFIG_MTD_SHARP_SL is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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 is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_UB is not set
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+# CONFIG_KEYBOARD_PXA27x is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_ADC=m
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_PXA=y
+# CONFIG_SERIAL_PXA_CONSOLE is not set
+CONFIG_SERIAL_PXA_COUNT=4
+CONFIG_SERIAL_PXA_IR=y
+CONFIG_SERIAL_CORE=y
+# CONFIG_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_SA1100_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+CONFIG_TIHTC=m
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=m
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+# CONFIG_I2C_ALGOBIT is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_PXA=m
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# 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 is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCA9535 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_RTC8564 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 is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+CONFIG_W1=y
+
+#
+# 1-wire Bus Masters
+#
+# CONFIG_W1_MASTER_DS2490 is not set
+# CONFIG_W1_MASTER_DS2482 is not set
+CONFIG_W1_MASTER_DS1WM=y
+
+#
+# 1-wire Slaves
+#
+# CONFIG_W1_SLAVE_THERM is not set
+# CONFIG_W1_SLAVE_SMEM is not set
+# CONFIG_W1_SLAVE_DS2433 is not set
+CONFIG_W1_SLAVE_DS2760=y
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+CONFIG_BATTERY_DS2760=y
+CONFIG_ADC_BATTERY=y
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+CONFIG_ADC_ADS7846_SSP=m
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_ATI_W228x is not set
+CONFIG_HTC_PASIC3=y
+CONFIG_HTC_EGPIO=y
+# CONFIG_HTC_BBKEYS is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_T7L66XB is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TC6393XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+CONFIG_LEDS_PASIC3=y
+CONFIG_LEDS_GPIO=y
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HWTIMER=y
+CONFIG_LEDS_TRIGGER_BACKLIGHT=y
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# 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_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+# CONFIG_FB_PXA_PARAMETERS is not set
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+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_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+# CONFIG_SND_PXA2XX_AC97 is not set
+# CONFIG_SND_RECON is not set
+
+#
+# USB devices
+#
+# CONFIG_SND_USB_AUDIO is not set
+
+#
+# SoC audio support
+#
+CONFIG_SND_SOC=m
+
+#
+# SoC Platforms
+#
+
+#
+# SoC Audio for the Atmel AT91
+#
+
+#
+# SoC Audio for the Intel PXA2xx
+#
+CONFIG_SND_PXA2XX_SOC=m
+CONFIG_SND_PXA2XX_SOC_I2S=m
+CONFIG_SND_PXA2XX_SOC_SSP=m
+CONFIG_SND_PXA2XX_SOC_MAGICIAN=m
+# CONFIG_SND_PXA2XX_SOC_BLUEANGEL is not set
+# CONFIG_SND_PXA2XX_SOC_H5000 is not set
+# CONFIG_SND_PXA2XX_SOC_MIOA701 is not set
+
+#
+# SoC Audio for the Freescale i.MX
+#
+
+#
+# SoC Audio for the Samsung S3C24XX
+#
+# CONFIG_SND_SOC_AC97_CODEC is not set
+# CONFIG_SND_SOC_WM8711 is not set
+# CONFIG_SND_SOC_WM8510 is not set
+# CONFIG_SND_SOC_WM8731 is not set
+# CONFIG_SND_SOC_WM8750 is not set
+# CONFIG_SND_SOC_WM8753 is not set
+# CONFIG_SND_SOC_WM8772 is not set
+# CONFIG_SND_SOC_WM8971 is not set
+# CONFIG_SND_SOC_WM8956 is not set
+# CONFIG_SND_SOC_WM8960 is not set
+# CONFIG_SND_SOC_WM8976 is not set
+# CONFIG_SND_SOC_WM8974 is not set
+# CONFIG_SND_SOC_WM8980 is not set
+# CONFIG_SND_SOC_WM9705 is not set
+# CONFIG_SND_SOC_WM9713 is not set
+# CONFIG_SND_SOC_WM9712 is not set
+CONFIG_SND_SOC_UDA1380=m
+# CONFIG_SND_SOC_AK4535 is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=m
+# CONFIG_HID_DEBUG 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=m
+# CONFIG_USB_DEBUG is not set
+
+#
+# Miscellaneous USB options
+#
+# CONFIG_USB_DEVICEFS 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=m
+# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
+# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO 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=m
+# CONFIG_USB_HIDINPUT_POWERBOOK is not set
+# CONFIG_HID_FF is not set
+# CONFIG_USB_HIDDEV 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
+# CONFIG_USB_GTCO 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_MII is not set
+# CONFIG_USB_USBNET is not set
+CONFIG_USB_MON=y
+
+#
+# USB port drivers
+#
+
+#
+# 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_BERRY_CHARGE 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_IOWARRIOR is not set
+
+#
+# USB DSL modem support
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+CONFIG_USB_GADGET_PXA27X=y
+CONFIG_USB_PXA27X=y
+# CONFIG_USB_PXA27X_DMA is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+# CONFIG_USB_PXA2XX_GPIO is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_PXA=y
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP 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=y
+
+#
+# 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_CMOS is not set
+# 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_RS5C372 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SA1100=y
+# CONFIG_RTC_DRV_TEST 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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_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=y
+CONFIG_JFFS2_RTIME=y
+# 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 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+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
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/rx1950/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/rx1950/defconfig
new file mode 100644
index 0000000..fc4388e
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/rx1950/defconfig
@@ -0,0 +1,1383 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:46 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+# CONFIG_GENERIC_TIME is not set
+CONFIG_MMU=y
+CONFIG_NO_IOPORT=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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX 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
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+# CONFIG_BOARD_IRQ_MAP_BIG is not set
+CONFIG_PLAT_S3C24XX=y
+CONFIG_CPU_S3C244X=y
+# CONFIG_S3C2410_BOOT_ERROR_RESET is not set
+# CONFIG_S3C2410_PM_DEBUG is not set
+# CONFIG_S3C2410_PM_CHECK is not set
+CONFIG_S3C2410_LOWLEVEL_UART_PORT=0
+CONFIG_S3C2410_DMA=y
+# CONFIG_S3C2410_DMA_DEBUG is not set
+
+#
+# S3C2400 Machines
+#
+CONFIG_CPU_S3C2410_DMA=y
+CONFIG_S3C2410_PM=y
+CONFIG_S3C2410_GPIO=y
+CONFIG_S3C2410_CLOCK=y
+
+#
+# S3C2410 Machines
+#
+# CONFIG_ARCH_SMDK2410 is not set
+# CONFIG_ARCH_H1940 is not set
+CONFIG_PM_H1940=y
+# CONFIG_MACH_N30 is not set
+# CONFIG_ARCH_BAST is not set
+# CONFIG_MACH_OTOM is not set
+# CONFIG_MACH_AML_M5900 is not set
+# CONFIG_MACH_VR1000 is not set
+# CONFIG_MACH_QT2410 is not set
+
+#
+# S3C2412 Machines
+#
+# CONFIG_MACH_SMDK2413 is not set
+# CONFIG_MACH_VSTMS is not set
+CONFIG_CPU_S3C2440=y
+CONFIG_S3C2440_DMA=y
+
+#
+# S3C2440 Machines
+#
+# CONFIG_MACH_ANUBIS is not set
+# CONFIG_MACH_OSIRIS is not set
+# CONFIG_MACH_RX3715 is not set
+# CONFIG_ARCH_S3C2440 is not set
+# CONFIG_MACH_NEXCODER_2440 is not set
+# CONFIG_MACH_G500 is not set
+CONFIG_CPU_S3C2442=y
+
+#
+# S3C2442 Machines
+#
+CONFIG_MACH_RX1950=y
+# CONFIG_MACH_HTCHERMES is not set
+# CONFIG_MACH_HTC_TRINITY is not set
+
+#
+# S3C2443 Machines
+#
+# CONFIG_MACH_SMDK2443 is not set
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# 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=y
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+# CONFIG_OUTER_CACHE is not set
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=200
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+# CONFIG_TXTOFFSET_DELTA is not set
+CONFIG_ATAGS_PROC=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+# CONFIG_BT_HCIVHCI is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=m
+CONFIG_MTD_DEBUG=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+# CONFIG_MTD_JEDECPROBE 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 is not set
+# 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_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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=m
+# CONFIG_MTD_NAND_VERIFY_WRITE is not set
+# CONFIG_MTD_NAND_ECC_SMC is not set
+CONFIG_MTD_NAND_IDS=m
+CONFIG_MTD_NAND_S3C2410=m
+# 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
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+CONFIG_INPUT_TSDEV=y
+CONFIG_INPUT_TSDEV_SCREEN_X=240
+CONFIG_INPUT_TSDEV_SCREEN_Y=320
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_S3C2410=y
+CONFIG_TOUCHSCREEN_S3C2410_DEBUG=y
+CONFIG_TOUCHSCREEN_S3C2410_ALT=y
+# CONFIG_TOUCHSCREEN_ADC is not set
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_LIBPS2 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED 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_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+# CONFIG_BATTERY_DS2760 is not set
+# CONFIG_ADC_BATTERY is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+# CONFIG_ADC_ADS7846_SSP is not set
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+# CONFIG_HTC_ASIC3 is not set
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_BBKEYS is not set
+# CONFIG_HTC_ASIC3_DS1WM is not set
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+CONFIG_LEDS_S3C24XX=y
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+# CONFIG_LEDS_TRIGGER_HWTIMER is not set
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_BACKLIGHT_S3C2410=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_BACKLIGHT is not set
+CONFIG_FB_MODE_HELPERS=y
+# CONFIG_FB_TILEBLITTING is not set
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON 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
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+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_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+# CONFIG_SND_S3C2410 is not set
+
+#
+# SoC audio support
+#
+# CONFIG_SND_SOC is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=m
+# CONFIG_HID_DEBUG 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 is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+# CONFIG_USB_GADGET_PXA27X is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+CONFIG_USB_GADGET_S3C2410=y
+CONFIG_USB_S3C2410=y
+# CONFIG_USB_S3C2410_DEBUG is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_S3C2440=y
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP 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=y
+
+#
+# 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_CMOS is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 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_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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_JFFS2_FS 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=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=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/rx3000/defconfig b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/rx3000/defconfig
new file mode 100644
index 0000000..582be18
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6-2.6.21/rx3000/defconfig
@@ -0,0 +1,1507 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.21-hh20
+# Tue Dec 2 15:36:46 2008
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+# CONFIG_GENERIC_TIME is not set
+CONFIG_MMU=y
+CONFIG_NO_IOPORT=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_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=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_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# 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=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+# CONFIG_UID16 is not set
+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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=m
+CONFIG_IOSCHED_DEADLINE=m
+CONFIG_IOSCHED_CFQ=m
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX 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_NS9XXX 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
+# CONFIG_BOARD_IRQ_MAP_SMALL is not set
+CONFIG_BOARD_IRQ_MAP_BIG=y
+CONFIG_PLAT_S3C24XX=y
+CONFIG_CPU_S3C244X=y
+CONFIG_S3C2410_BOOT_ERROR_RESET=y
+# CONFIG_S3C2410_PM_DEBUG is not set
+# CONFIG_S3C2410_PM_CHECK is not set
+CONFIG_S3C2410_LOWLEVEL_UART_PORT=2
+CONFIG_S3C2410_DMA=y
+# CONFIG_S3C2410_DMA_DEBUG is not set
+
+#
+# S3C2400 Machines
+#
+CONFIG_S3C2410_PM=y
+CONFIG_S3C2410_GPIO=y
+CONFIG_S3C2410_CLOCK=y
+
+#
+# S3C2410 Machines
+#
+# CONFIG_ARCH_SMDK2410 is not set
+# CONFIG_ARCH_H1940 is not set
+CONFIG_PM_H1940=y
+# CONFIG_MACH_N30 is not set
+# CONFIG_ARCH_BAST is not set
+# CONFIG_MACH_OTOM is not set
+# CONFIG_MACH_AML_M5900 is not set
+# CONFIG_MACH_VR1000 is not set
+# CONFIG_MACH_QT2410 is not set
+
+#
+# S3C2412 Machines
+#
+# CONFIG_MACH_SMDK2413 is not set
+# CONFIG_MACH_VSTMS is not set
+CONFIG_CPU_S3C2440=y
+CONFIG_S3C2440_DMA=y
+
+#
+# S3C2440 Machines
+#
+# CONFIG_MACH_ANUBIS is not set
+# CONFIG_MACH_OSIRIS is not set
+CONFIG_MACH_RX3715=y
+CONFIG_RX3000_BACKLIGHT=y
+CONFIG_RX3000_LEDS=y
+CONFIG_RX3000_BATTERY=y
+CONFIG_RX3000_BLUETOOTH=m
+CONFIG_RX3000_BUTTONS=y
+CONFIG_RX3000_SERIAL=y
+CONFIG_RX3000_TS=y
+CONFIG_RX3000_UDC=m
+# CONFIG_ARCH_S3C2440 is not set
+# CONFIG_MACH_NEXCODER_2440 is not set
+# CONFIG_MACH_G500 is not set
+
+#
+# S3C2442 Machines
+#
+# CONFIG_MACH_RX1950 is not set
+# CONFIG_MACH_HTCHERMES is not set
+# CONFIG_MACH_HTC_TRINITY is not set
+
+#
+# S3C2443 Machines
+#
+# CONFIG_MACH_SMDK2443 is not set
+
+#
+# Linux As Bootloader
+#
+# CONFIG_LAB is not set
+
+#
+# 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=y
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+# CONFIG_OUTER_CACHE is not set
+
+#
+# Bus support
+#
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_PREEMPT=y
+CONFIG_NO_IDLE_HZ=y
+CONFIG_HZ=200
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_ZONE_DMA_FLAG=1
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="keepinitrd"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+CONFIG_TXTOFFSET_DELTA=y
+CONFIG_TXTOFFSET_DELTA_VALUE=0x00090000
+CONFIG_ATAGS_PROC=y
+
+#
+# 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=m
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+CONFIG_DPM_DEBUG=y
+CONFIG_PM_SYSFS_DEPRECATED=y
+CONFIG_APM_EMULATION=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=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_BOOTP is not set
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_IP_MROUTE 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=m
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK is not set
+# CONFIG_NF_CONNTRACK_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
+# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+# CONFIG_NETFILTER_XT_MATCH_REALM is not set
+# CONFIG_NETFILTER_XT_MATCH_SCTP is not set
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+# CONFIG_NETFILTER_XT_MATCH_STRING is not set
+# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_QUEUE is not set
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+CONFIG_IP_NF_MATCH_AH=m
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
+CONFIG_IP_NF_FILTER=m
+CONFIG_IP_NF_TARGET_REJECT=m
+CONFIG_IP_NF_TARGET_LOG=m
+CONFIG_IP_NF_TARGET_ULOG=m
+CONFIG_IP_NF_MANGLE=m
+# CONFIG_IP_NF_TARGET_TOS is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+CONFIG_IP_NF_RAW=m
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP6_NF_QUEUE is not set
+CONFIG_IP6_NF_IPTABLES=m
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_OWNER is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_AH is not set
+# CONFIG_IP6_NF_MATCH_MH is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_FILTER is not set
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_RAW 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=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+# CONFIG_BT_HCIVHCI is not set
+CONFIG_IEEE80211=m
+# CONFIG_IEEE80211_DEBUG is not set
+# CONFIG_IEEE80211_CRYPT_WEP is not set
+CONFIG_IEEE80211_CRYPT_CCMP=m
+CONFIG_IEEE80211_CRYPT_TKIP=m
+# CONFIG_IEEE80211_SOFTMAC is not set
+CONFIG_WIRELESS_EXT=y
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES 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=y
+CONFIG_MTD_DEBUG_VERBOSE=0
+CONFIG_MTD_CONCAT=y
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=m
+CONFIG_MTD_BLKDEVS=m
+CONFIG_MTD_BLOCK=m
+# CONFIG_MTD_BLOCK_RO is not set
+# 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 is not set
+# CONFIG_MTD_JEDECPROBE 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 is not set
+# 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_RAM is not set
+# CONFIG_MTD_ROM is not set
+# 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_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+CONFIG_MTD_MTDRAM=m
+CONFIG_MTDRAM_TOTAL_SIZE=0
+CONFIG_MTDRAM_ERASE_SIZE=256
+# 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=y
+# 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 is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK 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=m
+
+#
+# PHY device support
+#
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+CONFIG_NET_RADIO=y
+CONFIG_NET_WIRELESS_RTNETLINK=y
+
+#
+# Obsolete Wireless cards support (pre-802.11)
+#
+# CONFIG_STRIP is not set
+# CONFIG_HOSTAP is not set
+CONFIG_ACX=m
+CONFIG_ACX_MEM=y
+# CONFIG_ACX_CS is not set
+CONFIG_ACX_RX3000=m
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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 is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+# CONFIG_PPPOE is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=m
+# 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 is not set
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+# CONFIG_INPUT_LED_TRIGGER is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_GPIODEV_KEYS is not set
+# CONFIG_GPIODEV_KEYS2 is not set
+# CONFIG_GPIODEV_DIAGONAL is not set
+CONFIG_KEYBOARD_ASIC3=y
+CONFIG_KEYBOARD_GPIO=y
+CONFIG_INPUT_MOUSE=y
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_NAVPOINT is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_S3C2410=y
+# CONFIG_TOUCHSCREEN_S3C2410_DEBUG is not set
+# CONFIG_TOUCHSCREEN_S3C2410_ALT is not set
+# CONFIG_TOUCHSCREEN_ADC is not set
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+CONFIG_INPUT_MISC=y
+CONFIG_INPUT_UINPUT=m
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_LIBPS2 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED 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_RS232_SERIAL is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_NVRAM is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_TIHTC is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=m
+# CONFIG_I2C_CHARDEV is not set
+
+#
+# I2C Algorithms
+#
+# CONFIG_I2C_ALGOBIT is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+CONFIG_I2C_S3C2410=m
+# 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 is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCA9535 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_RTC8564 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 is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+CONFIG_W1=y
+
+#
+# 1-wire Bus Masters
+#
+# CONFIG_W1_MASTER_DS2482 is not set
+CONFIG_W1_MASTER_DS1WM=y
+
+#
+# 1-wire Slaves
+#
+# CONFIG_W1_SLAVE_THERM is not set
+# CONFIG_W1_SLAVE_SMEM is not set
+# CONFIG_W1_SLAVE_DS2433 is not set
+CONFIG_W1_SLAVE_DS2760=y
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PDA_POWER=y
+CONFIG_APM_POWER=y
+CONFIG_BATTERY_DS2760=y
+# CONFIG_ADC_BATTERY is not set
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia Capabilities Port drivers
+#
+CONFIG_ADC=y
+# CONFIG_ADC_ADS7846_SSP is not set
+# CONFIG_ADC_TSC2200_SSP is not set
+# CONFIG_ADC_AD7877 is not set
+
+#
+# Compaq/iPAQ Drivers
+#
+
+#
+# Compaq/HP iPAQ Drivers
+#
+# CONFIG_IPAQ_SLEEVE is not set
+# CONFIG_SLEEVE_DEBUG is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_ASIC2 is not set
+CONFIG_HTC_ASIC3=y
+# CONFIG_ATI_W228x is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_BBKEYS is not set
+CONFIG_HTC_ASIC3_DS1WM=y
+# CONFIG_SOC_SAMCOP is not set
+# CONFIG_SOC_HAMCOP is not set
+# CONFIG_SOC_MQ11XX is not set
+# CONFIG_SOC_TC6387XB is not set
+# CONFIG_SOC_TSC2101 is not set
+# CONFIG_SOC_TSC2200 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_S3C24XX is not set
+CONFIG_LEDS_ASIC3=y
+# CONFIG_LEDS_GPIO is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+# CONFIG_LEDS_TRIGGER_HWTIMER is not set
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+CONFIG_LEDS_TRIGGER_SHARED=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_CORGI=y
+CONFIG_BACKLIGHT_S3C2410=y
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_IMAGEON 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
+# CONFIG_FB_VSFB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+CONFIG_FONT_MINI_4x6=y
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+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_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+# CONFIG_SND_S3C2410 is not set
+
+#
+# SoC audio support
+#
+CONFIG_SND_SOC=m
+
+#
+# SoC Platforms
+#
+
+#
+# SoC Audio for the Atmel AT91
+#
+
+#
+# SoC Audio for the Intel PXA2xx
+#
+
+#
+# SoC Audio for the Freescale i.MX
+#
+
+#
+# SoC Audio for the Samsung S3C24XX
+#
+CONFIG_SND_S3C24XX_SOC=m
+CONFIG_SND_S3C24XX_SOC_I2S=m
+CONFIG_SND_S3C24XX_SOC_RX3000=m
+# CONFIG_SND_SOC_AC97_CODEC is not set
+# CONFIG_SND_SOC_WM8711 is not set
+# CONFIG_SND_SOC_WM8510 is not set
+# CONFIG_SND_SOC_WM8731 is not set
+# CONFIG_SND_SOC_WM8750 is not set
+# CONFIG_SND_SOC_WM8753 is not set
+# CONFIG_SND_SOC_WM8772 is not set
+# CONFIG_SND_SOC_WM8971 is not set
+# CONFIG_SND_SOC_WM8956 is not set
+# CONFIG_SND_SOC_WM8960 is not set
+# CONFIG_SND_SOC_WM8976 is not set
+# CONFIG_SND_SOC_WM8974 is not set
+# CONFIG_SND_SOC_WM8980 is not set
+# CONFIG_SND_SOC_WM9705 is not set
+# CONFIG_SND_SOC_WM9713 is not set
+# CONFIG_SND_SOC_WM9712 is not set
+CONFIG_SND_SOC_UDA1380=m
+# CONFIG_SND_SOC_AK4535 is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=m
+# CONFIG_HID_DEBUG 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 is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_PXA2XX is not set
+# CONFIG_USB_GADGET_PXA27X is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_MQ11XX is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+CONFIG_USB_GADGET_S3C2410=y
+CONFIG_USB_S3C2410=y
+# CONFIG_USB_S3C2410_DEBUG is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_CHAR is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_S3C2440 is not set
+# CONFIG_MMC_TMIO is not set
+# CONFIG_MMC_SAMCOP is not set
+CONFIG_MMC_ASIC3=y
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+CONFIG_RTC_DEBUG=y
+
+#
+# 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_CMOS is not set
+# 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_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_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=m
+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=m
+# 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 is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+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=m
+
+#
+# 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_JFFS2_FS 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=m
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=m
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 is not set
+# CONFIG_CIFS_EXPERIMENTAL 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=m
+# 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=m
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=m
+# 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=y
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+CONFIG_PRINTK_TIME=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+CONFIG_TIMER_STATS=y
+# CONFIG_DEBUG_SLAB is not set
+CONFIG_DEBUG_PREEMPT=y
+# 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_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 is not set
+CONFIG_DEBUG_VM=y
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+# CONFIG_DEBUG_S3C2410_PORT is not set
+CONFIG_DEBUG_S3C2410_UART=2
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_MANAGER=m
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+# CONFIG_CRYPTO_MD5 is not set
+CONFIG_CRYPTO_SHA1=m
+# 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+CONFIG_CRYPTO_AES=m
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+# CONFIG_CRYPTO_DEFLATE is not set
+CONFIG_CRYPTO_MICHAEL_MIC=m
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
diff --git a/recipes-kernel/linux/linux-handhelds-2.6.inc b/recipes-kernel/linux/linux-handhelds-2.6.inc
new file mode 100644
index 0000000..acd1ee0
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6.inc
@@ -0,0 +1,125 @@
+SECTION = "kernel"
+DESCRIPTION = "handhelds.org Linux kernel 2.6 for PocketPCs and other consumer handheld devices."
+LICENSE = "GPLv2"
+
+COMPATIBLE_HOST = "arm.*-linux"
+COMPATIBLE_MACHINE ?= "(asus620|asus730|aximx50|aximx50v|eseries|h1910|h2200|h3600|h3800|h3900|h4000|h5000|htcalpine|htcapache|htcblueangel|htchermes|htchimalaya|htcsable|htcuniversal|htcwallaby|hx4700|ghi270|looxc550|jornada56x|magician|rx1950|rx3000)"
+
+# SRC_URI *must* be overriden in includer, but this is a good reference
+SRC_URI ?= "${HANDHELDS_CVS};module=linux/kernel26;tag=${@'K' + bb.data.getVar('PV',d,1).replace('.', '-')} \
+ file://24-hostap_cs_id.diff \
+ file://hrw-pcmcia-ids-r2.patch \
+ file://defconfig"
+
+S = "${WORKDIR}/kernel26"
+
+inherit kernel
+
+
+K_MAJOR ?= "${@bb.data.getVar('PV',d,1).split('-')[0].split('.')[0]}"
+K_MINOR ?= "${@bb.data.getVar('PV',d,1).split('-')[0].split('.')[1]}"
+K_MICRO ?= "${@bb.data.getVar('PV',d,1).split('-')[0].split('.')[2]}"
+HHV ?= "${@bb.data.getVar('PV',d,1).split('-')[1].split('hh')[-1]}"
+
+KERNEL_PRIORITY = "${@'%d' % (int(bb.data.getVar('K_MAJOR',d,1)) * 100000000 + int(bb.data.getVar('K_MINOR',d,1)) * 1000000 + int(bb.data.getVar('K_MICRO',d,1)) * 10000 + float(bb.data.getVar('HHV',d,1)))}"
+
+do_configure() {
+
+ if [ `grep EXTRAVERSION Makefile | grep hh | awk '{print $3}' | sed s/-hh//` != ${HHV} ]; then
+ die "-hh version mismatch"
+ fi
+
+ rm -f ${S}/.config
+
+ if [ ! -e ${WORKDIR}/defconfig ]; then
+ die "No default configuration for ${MACHINE} available."
+ fi
+
+ if [ -n "${KERNEL_INITRAMFS_PATH}" -a "${ANGSTROMLIBC}" = "glibc" ]; then
+ if [ ! -f ${KERNEL_INITRAMFS_PATH} ]; then
+ echo "Kernel is requested to be built with internal initramfs."
+ echo "The initramfs image must exist prior to building the kernel, but it does not"
+ echo "exist at the specified path ${KERNEL_INITRAMFS_PATH}. You may need to bitbake"
+ echo "it separately, possibly, with a different set of bitbake options. Please"
+ echo "consult documentation for your distro."
+ exit 1
+ fi
+
+ # Kernel expects non-compressed cpio
+ gzip -d -c ${KERNEL_INITRAMFS_PATH} >${WORKDIR}/initramfs.cpio
+ echo "CONFIG_INITRAMFS_SOURCE=\"${WORKDIR}/initramfs.cpio\"" >> ${S}/.config
+ fi
+
+ if [ "${TARGET_OS}" = "linux-gnueabi" -o "${TARGET_OS}" = "linux-uclibceabi" ]; then
+ echo "CONFIG_AEABI=y" >> ${S}/.config
+ echo "CONFIG_OABI_COMPAT=y" >> ${S}/.config
+ else
+ echo "# CONFIG_AEABI is not set" >> ${S}/.config
+ echo "# CONFIG_OABI_COMPAT is not set" >> ${S}/.config
+ fi
+
+ sed -e '/CONFIG_AEABI/d' \
+ -e '/CONFIG_OABI_COMPAT=/d' \
+ -e '/CONFIG_INITRAMFS_SOURCE=/d' \
+ '${WORKDIR}/defconfig' >>'${S}/.config'
+
+ yes '' | oe_runmake oldconfig
+
+}
+
+do_deploy_append() {
+ #reflash.ctl is required to reflash using bootldr
+ # format:
+ # name file md5sumfile destination
+ echo "${MACHINE}-kernel-${DATETIME} ${KERNEL_IMAGE_BASE_NAME} - kernel" >> ${DEPLOY_DIR_IMAGE}/reflash.ctl
+ gen_haret_startup
+
+ if [ -n "${KERNEL_INITRAMFS_PATH}" -a "${ANGSTROMLIBC}" = "glibc" ]; then
+ cp ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGE_BASE_NAME}.bin ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-$(basename ${KERNEL_INITRAMFS_PATH} | awk -F. '{print $1}')-${PV}-${PR}-${MACHINE}.bin
+ fi
+}
+
+
+gen_haret_startup() {
+ cat >${DEPLOY_DIR_IMAGE}/startup.txt <<EOF
+# This is startup file for HaRET, Linux bootloader for WinCE
+# http://handhelds.org/wiki/HaRET
+
+set kernel "${KERNEL_IMAGE_BASE_NAME}.bin"
+
+# Boot choices. Uncomment 'set' statements in exactly one section
+
+## Choice 1 - Boot from SD/MMC card
+# Have 2 partition on a card:
+# 1st - FAT with HaRET executable, this file and zImage above
+# 2nd - EXT2 with rootfs tarball extracted
+set cmdline "root=/dev/mmcblk0p2 rootdelay=10 console=ttyS0,115200n8 console=tty0"
+
+## Choice 2 - Boot from CF card, setup like above
+#set cmdline "root=/dev/hda2 rootdelay=10 console=ttyS0,115200n8 console=tty0"
+
+## Choice 3 - Boot kernel with builtin interactive bootloader (initramfs-bootmenu-image)
+# rootdelay is a wait before scanning for the available partitions
+# if root= is also specified, interactive selection will be skipped and
+# direct boot will happen.
+#set cmdline "rootdelay=3 console=ttyS0,115200n8 console=tty0"
+
+## Choice 4 - Boot rootfs image as initramfs (works only for smaller images)
+# have a cpio.gz file below together with zImage, no EXT2 partition required
+#set initrd "<image>.rootfs.cpio.gz"
+#set cmdline "rdinit=/sbin/init console=ttyS0,115200n8 console=tty0"
+
+## Choice 5 - Boot via NFS over USB networking (must be kernel-builtin
+# or initramfs-*-image works too)
+# 192.168.x.x - Server address (the other side)
+# 192.168.y.y - Handheld's address
+#set cmdline "root=/dev/nfs nfsroot=192.168.x.x:<nfs_path> ip=192.168.y.y:192.168.x.x:192.168.x.x:255.255.255.0:pda:usb0 console=ttyS0,115200n8 console=tty0"
+
+## Choice 6 - Boot from MTD partition, for devices with lots of flash
+# to have both WinCE and Linux there. Note the value of root param,
+# that's how it should be, not "/dev/mtdblockN".
+#set cmdline "root=mtdN console=ttyS0,115200n8 console=tty0"
+
+bootlinux
+EOF
+}
diff --git a/recipes-kernel/linux/linux-handhelds-2.6_2.6.21-hh20.bb b/recipes-kernel/linux/linux-handhelds-2.6_2.6.21-hh20.bb
new file mode 100644
index 0000000..f0aa26a
--- /dev/null
+++ b/recipes-kernel/linux/linux-handhelds-2.6_2.6.21-hh20.bb
@@ -0,0 +1,23 @@
+SECTION = "kernel"
+DESCRIPTION = "handhelds.org Linux kernel 2.6 for PocketPCs and other consumer handheld devices."
+LICENSE = "GPLv2"
+PR = "r26"
+
+DEFAULT_PREFERENCE = "-1"
+
+# Override where to look for defconfigs and patches,
+# we have per-kernel-release sets.
+FILESPATHPKG =. "linux-handhelds-2.6-2.6.21/${MACHINE}:linux-handhelds-2.6-2.6.21:"
+
+SRC_URI = "${HANDHELDS_CVS};module=linux/kernel26;tag=${@'K' + bb.data.getVar('PV',d,1).replace('.', '-')} \
+ file://linux-2.6.git-9d20fdd58e74d4d26dc5216efaaa0f800c23dd3a.patch \
+ http://www.rpsys.net/openzaurus/patches/archive/export_atags-r0a.patch;name=rppatch35 \
+ file://gcc4x-limits.patch \
+ file://0001-time-prevent-the-loop-in-timespec_add_ns-from-bei.patch \
+ file://defconfig"
+
+require linux-handhelds-2.6.inc
+
+# ${RPSRC}/export_atags-r0a.patch;status=pending;name=rppatch35 \
+SRC_URI[rppatch35.md5sum] = "8ab51e8ff728f4155db64b9bb6ea6d71"
+SRC_URI[rppatch35.sha256sum] = "75d4c6ddbfc5e4fff7690a3308e2574f89a0e2709fb91caccb29067a9dad251a"
diff --git a/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/LinuxSH-2.6.17.patch b/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/LinuxSH-2.6.17.patch
new file mode 100644
index 0000000..8c4b54d
--- /dev/null
+++ b/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/LinuxSH-2.6.17.patch
@@ -0,0 +1,56290 @@
+diff -ruN linux-2.6.17-vanilla/CVS/Entries linux-2.6.17/CVS/Entries
+--- linux-2.6.17-vanilla/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/CVS/Entries 2006-07-12 16:54:18.000000000 +0000
+@@ -0,0 +1,21 @@
++/.cvsignore/1.1/Wed May 12 13:52:16 2004/-ko/
++/ChangeLog-1999/1.1.1.1/Mon Oct 15 20:44:29 2001//
++/ChangeLog-2000/1.1.1.1/Mon Oct 15 20:44:31 2001//
++/ChangeLog-2001/1.1/Mon Jan 7 03:57:47 2002/-ko/
++/ChangeLog-2002/1.3/Sun May 4 19:29:45 2003//
++/ChangeLog-2003/1.2/Sun Jan 4 18:29:21 2004//
++/ChangeLog-2004/1.1/Mon Jan 31 12:17:59 2005/-ko/
++/ChangeLog-2005/1.1/Fri Jan 27 16:07:15 2006/-ko/
++D/Documentation////
++D/arch////
++D/drivers////
++D/include////
++D/lib////
++D/mm////
++D/net////
++D/scripts////
++D/sound////
++/AGAINST-2.6.17/1.1/Wed Jul 5 08:46:47 2006/-ko/
++/ChangeLog/1.366/Wed Jul 5 07:19:04 2006/-ko/
++/Makefile/1.102/Wed Jul 5 14:49:57 2006/-ko/
++/localversion-sh/1.1/Wed Jul 5 07:22:47 2006/-ko/
+diff -ruN linux-2.6.17-vanilla/CVS/Entries.Log linux-2.6.17/CVS/Entries.Log
+--- linux-2.6.17-vanilla/CVS/Entries.Log 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/CVS/Entries.Log 2006-07-12 16:54:18.000000000 +0000
+@@ -0,0 +1,6 @@
++A D/fs////
++A D/init////
++A D/kernel////
++R D/kernel////
++R D/init////
++R D/fs////
+diff -ruN linux-2.6.17-vanilla/CVS/Repository linux-2.6.17/CVS/Repository
+--- linux-2.6.17-vanilla/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/CVS/Repository 2006-07-12 16:54:18.000000000 +0000
+@@ -0,0 +1 @@
++linux
+diff -ruN linux-2.6.17-vanilla/CVS/Root linux-2.6.17/CVS/Root
+--- linux-2.6.17-vanilla/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/CVS/Root 2006-07-12 16:54:18.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/ChangeLog linux-2.6.17/ChangeLog
+--- linux-2.6.17-vanilla/ChangeLog 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/ChangeLog 2006-07-12 16:54:18.000000000 +0000
+@@ -0,0 +1,19 @@
++2006-06-05 Adrian McMenamin <adrian@mcmen.demon.co.uk>
++
++ Dreamcast AICA driver tidy
++
++ * sound/sh/aica.c: code tidying of whitespace and returns
++ * sound/sh/Kconfig: tidying
++
++
++2006-06-04 Adrian McMenamin <adrian@mcmen.demon.co.uk>
++
++ Dreamcast AICA sound support added
++
++ * sound/Kconfig: Added here and updated to support ALSA SH devices
++ * sound/Makefile: Added here and updated to support ALSA SH devices
++ * sound/sh: New directory to hold ALSA files for SH devices
++ * sound/sh/aica.c: New file to add AICA sound support
++ * sound/sh/aica.h: Header to upport AICA sound
++ * sound/sh/Kconfig: New file to add AICA sound support
++ * sound/sh/Makefile: New file required to add AICA sound support
+diff -ruN linux-2.6.17-vanilla/ChangeLog-1999 linux-2.6.17/ChangeLog-1999
+--- linux-2.6.17-vanilla/ChangeLog-1999 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/ChangeLog-1999 2006-07-12 16:54:18.000000000 +0000
+@@ -0,0 +1,902 @@
++1999-12-23 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/sys_sh.c (do_mmap2, old_mmap, sys_mmap2): Follow
++ the change of 2.3.32.
++
++ * arch/sh/kernel/head.S (_start): Change the name of label from _stext.
++
++ * include/linux/linkage.h: Dont prepend "_" for label.
++ * arch/sh/vmlinux.lds.S: Likewise.
++ * include/asm-sh/system.h (switch_to): Likewise.
++
++ * include/asm-sh/stat.h: Follow the change of 2.3.34.
++
++ * arch/sh/kernel/entry.S: Added getrlimit, mmap2, truncate64,
++ ftruncate64, stat64, lstat64, and fstat64.
++ * include/asm-sh/unistd.h: Likewise.
++
++1999-12-22 John Hassey <hassey@gte.net>
++
++ * arch/sh/kernel/irq_onchip.c (init_IRQ): Initialize the interrupt
++ controller.
++
++1999-12-19 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/defconfig: Updated.
++ * arch/sh/config.in (CONFIG_SUPERH): Defined.
++ (CONFIG_CF_ENABLER): New config.
++
++ * arch/sh/kernel/irq_imask.c: New file.
++ * arch/sh/kernel/entry.S (restore_all): Inherit IMASK of SR.
++ * arch/sh/kernel/Makefile: Use CONFIG_CF_ENABLER.
++ * arch/sh/kernel/cf-enabler.c: New file.
++
++ * include/asm-sh/irq.h (TIMER_PRIORITY): Changed from 1.
++ The reason is for my board. Should consider later.
++
++1999-12-14 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/string.h (struct_cpy): Follow the changes of
++ 2.3.32.
++ * arch/sh/kernel/process.c (copy_thread): Use struct_cpy.
++
++1999-12-12 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/config.in: Added PCI support configuration.
++ * arch/sh/kernel/time.c (get_cpu_mhz): New function.
++
++1999-12-11 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/cache.h: Follow the change of 2.3.30.
++
++1999-12-09 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/irq.h (TIMER_IPR_OFFSET): Spell fixed.
++
++1999-12-07 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/pgtable.h: Updated for 2.3.30.
++ * include/asm-sh/pgtable-2level.h (set_pte, set_pmd, set_pgd): Added.
++ * include/asm-sh/page.h (__pte, __pmd, __pgd): Added.
++ * include/asm-sh/hardirq.h: Follow the change of 2.3.30.
++
++ * arch/sh/mm/init.c (__handle_bad_pmd, __handle_bad_pmd_kernel,
++ get_pte_kernel_slow, get_pte_slow): Use set_pmd.
++ * include/asm-sh/pgalloc.h (pte_alloc_kernel, pte_alloc): Ditto.
++
++1999-11-30 Toshiharu Nozawa <nozawat@hitachi-ul.co.jp>
++
++ * arch/sh/kernel/time.c (time_init): Implement better mesurement
++ using RTC interrupt.
++
++1999-11-28 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/setup.c (setup_arch): Updated for 2.3.30.
++ * include/asm-sh/io.h (IO_SPACE_LIMIT): Added for 2.3.30.
++ (inw_p, outw_p): Added.
++
++ * include/asm-sh/ide.h (ide_default_io_base): Changed for my board.
++ * include/asm-sh/hdreg.h (ide_ioreg_t): Changed to unsigend int.
++
++ * arch/sh/config.in: Added block device configuration.
++
++1999-11-26 Toshiharu Nozawa <nozawat@hitachi-ul.co.jp>
++
++ * drivers/char/sh-scif.c (sci_receive_chars): Add dummy read
++ before clearing flag.
++
++ * arch/sh/kernel/time.c (time_init): Implement better mesurement.
++
++1999-11-25 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/pgalloc.h: New file.
++ * include/asm-sh/pgalloc-2level.h: New file.
++ * arch/sh/kernel/pci-sh.c: New file.
++ * include/asm-sh/pci.h: New file.
++ * arch/sh/kernel/irq.c: Follow the changes of 2.3.29.
++ * arch/sh/mm/init.c, arch/sh/mm/fault.c, arch/sh/mm/ioremap.c:
++ Likewise.
++
++ * include/asm-sh/highmem.h: Removed.
++
++1999-11-23 Toshiharu Nozawa <nozawat@hitachi-ul.co.jp>
++
++ * arch/sh/kernel/time.c (time_init): Implement getting clock
++ (system clock and module clock) information.
++
++1999-11-18 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/char/{sh-scif.c,sh-sci.c}: Avoid race conditions.
++ Don't initialize the module if c_cflags is same.
++
++1999-11-17 Toshiharu Nozawa <nozawat@hitachi-ul.co.jp>
++
++ * drivers/char/sh-scif.c: Use ctrl_in, ctrl_out for SCSCR, SCSMR
++ and SCFCR. It's accessed as byte for SH-3.
++
++1999-11-16 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/io.h (ctrl_in, ctrl_out): New macro.
++
++1999-11-15 Sugioka Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/kernel/entry.S (system_call): Bug fix. Change
++ cmp/ge --> cmp/hs.
++
++1999-11-14 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/irq_onchip.c: Include <linux/config.h>.
++
++ * include/asm-sh/dma.h: Include <asm/io.h>.
++
++ * include/asm-sh/div64.h: New file.
++
++ * arch/sh/kernel/process.c (get_wchan): New function.
++
++ * arch/sh/mm/init.c (paging_init,mem_init,si_meminfo): Follow the
++ changes of 2.2.27.
++ * include/asm-sh/processor.h (KSTK_EIP, KSTK_ESP): Ditto.
++
++ * drivers/char/sh-scif.c: Incorporate changes of sh-sci.c,
++ to be real TTY support.
++
++1999-11-10 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache.c (__flush_page_to_ram): Renamed from
++ flush_page_to_ram.
++
++ * include/asm-sh/dma.h (MAX_DMA_ADDRESS): Add __MEMORY_START.
++ * include/asm-sh/pgtable.h (page_pte_prot): Removed.
++ (__flush_page_to_ram): Renamed from flush_page_to_ram.
++ (flush_page_to_ram): New Macro.
++
++1999-11-10 YAEGASHI Takeshi <yaegashi@ma.kcom.ne.jp>
++
++ * include/asm-sh/pgtable.h (_PAGE_CHG_MASK, PAGE_NONE,
++ PAGE_SHARED, PAGE_COPY, PAGE_READONLY, PAGE_KERNEL,
++ PAGE_KERNEL_RO): Add _PAGE_CACHABLE.
++
++1999-11-06 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/mmu_context.h (set_asid): Don't change
++ the value of other part of PTEH.
++
++ * include/asm-sh/shmparam.h (SHMLBA): Incorporate the changes
++ of pre-2.3.26-2.
++
++1999-11-05 YAEGASHI Takeshi <yaegashi@ma.kcom.ne.jp>
++
++ * arch/sh/kernel/sys_sh.c (sys_mmap): Bug fix for arguments.
++
++1999-11-03 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/page.h (__pa,__va,MAP_NR): Changed not using
++ __PAGE_OFFSET.
++
++ * arch/sh/kernel/setup.c (parse_mem_cmdline): Followed the changes
++ of __pa and __va.
++
++ * include/asm-sh/pgtable-2level.h (SWP_ENTRY): Moved to pgtable.h.
++ * include/asm-sh/page.h (__pte,__pmd,__pgd): Removed.
++
++ Do we need getrlimit changes?
++
++1999-10-31 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/fault.c (__flush_tlb_page): Bug fix. Set ASID before
++ doing the flush of TLB.
++
++ Cosmetic changes around SuperH MM.
++ * arch/sh/mm/fault.c (update_mmu_cache): Don't set PTEH register.
++
++ * arch/sh/kernel/process.c (copy_thread): Removed setting
++ p->mm->context. It's done in copy_mm.
++ * include/asm-sh/mmu_context.h (destroy_context): Don't
++ need to reset mm->context.
++
++1999-10-30 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/fault.c: Handle TLB miss of vmalloc area.
++
++ * drivers/char/sh-sci.c: Include serialP.h, not include
++ serial_reg.h.
++ (sci_transmit_chars): Bug fix. Clear GS_TX_INTEN flag
++ when clearing TIE flag.
++
++1999-10-29 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/resource.h (INIT_RLIMITS): Follow the change
++ of 2.3.24.
++ * include/asm-sh/pgtable-2level.h (pgd_clear): Do nothing.
++ * arch/sh/kernel/setup.c (setup_arch): Follow the changes of
++ 2.3.24.
++
++ * include/asm-sh/uaccess.h (__strnlen_user): Minor fix.
++
++1999-10-28 YAEGASHI Takeshi <yaegashi@ma.kcom.ne.jp>
++
++ * arch/sh/lib/checksum.S: Bug fix. Change bf/s --> bt/s.
++
++1999-10-28 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/uaccess.h (__strnlen_user): Bug fix. Don't
++ fetch the memory over the boundary.
++ (strnlen_user): Bug fix. 'n ' could be large value when it's
++ used through strlen_user. Don't use access_ok with 'n'.
++
++1999-10-27 YAEGASHI Takeshi <yaegashi@ma.kcom.ne.jp>
++
++ * arch/sh/kernel/irq_onchip.c: Support extended on-chip I/O.
++ * include/asm-sh/irq.h (NR_IRQS): Ditto.
++
++ * include/asm-sh/io.h (outsb,outsw,outsl,insb,insw,insl): Added.
++
++ * drivers/char/sh-scif.c: Add SH-3 support.
++
++ * arch/sh/kernel/time.c (do_timer_interrupt): Increment the
++ register.
++
++ * arch/sh/kernel/entry.S (INTEVT): Use INTEVTE2 for SH7709.
++
++ * arch/sh/config.in: Introduce CONFIG_CPU_SUBTYPE.
++ Config added for Network device drivers.
++
++1999-10-27 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/string.h (memscan): Bug fix. Use memchr.
++
++ * include/asm-sh/bitops.h (ext2_set_bit and others): Little
++ endian support.
++
++ * arch/sh/kernel/head.S: Remove entry for MEMORY_END, followed
++ changes of setup.c. Reported by Jiu Zheng.
++
++1999-10-26 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/spinlock.h: This file is used only for SMP.
++ Reported by Manfred Spraul.
++
++1999-10-24 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/ioctls.h
++ (TCGETS,TCSETS,TCSETSW,TCSETSF,TIOCGLCKTRMIOS,TIOCSLCKTRMIOS): Use
++ Immediate 0x54XX value as struct termios is different between
++ kernel and glibc.
++
++ * arch/sh/kernel/entry.S (system_call): Add debug output to LED.
++
++ * drivers/char/sh-sci.c (sci_set_real_termios): Bug fix.
++ Enable receive interrupt, or we lose inputs.
++
++1999-10-23 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/pgtable.h (pte_pagenr): substract the offset
++ __MEMORY_START.
++ (mk_pte): add the offset __MEMORY_START.
++
++1999-10-22 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/setup.c (setup_arch): Follow the change of 2.3.23.
++ * arch/sh/mm/init.c (show_mem, pageing_init, mem_init, and bad
++ page handling): Follow the change of 2.3.23.
++ * include/asm-sh/highmem.h, include/asm-sh/pgtable-2level.h: New
++ headers.
++ * include/asm-sh/dma.h (MAX_DMA_ADDRESS): Defined.
++ * include/asm-sh/pgtable.h: Follow the changes of 2.3.23.
++ * drivers/char/{sh-scif.c,sh-sci.c} (serial_console_init):
++ Follow the interface change of 2.3.23.
++
++ * arch/sh/kernel/setup.c (MEMORY_END): Removed.
++
++1999-10-21 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/entry.S (restore_all, debug): Bug fix. Fix SSR
++ race condition (SSR could be modified by interrupts).
++
++1999-10-20 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/system.h (__sti,__cli,__save_and_cli): Relax the
++ register constraints.
++ (__save_and_cli): Improve a bit.
++
++1999-10-19 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/char/{sh-scif.c,sh-sci.c}: Bug fix. FLAGS is long
++ instead of short. Fix typo for cli (not cil).
++ Thanks to Alexei Minayev and Jiu Zheng.
++
++ * arch/sh/kernel/irq_onchip.c (disable_onChip_irq,
++ enable_onChip_irq): Protect critical regions.
++
++1999-10-17 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/string.h (__HAVE_ARCH_MEMCHR): Defined.
++ * arch/sh/lib/memchr.S: New file.
++
++ * include/asm-sh/spinlock.h: Merged with Kaz'.
++
++ * arch/sh/kernel/setup.c (setup_arch): Set command_line.
++
++ * arch/sh/kernel/entry.S (exception_handling_table): Set
++ 'none' for entry #0, to avoid spurious interrupt. Questionable.
++
++1999-10-16 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/char/{sh-scif.c,sh-sci.c}: Protect critical regions.
++ Bug fix for sci_chars_in_buffer (it's for *transmit* not receive).
++
++1999-10-15 Tetsuya Okada <okayan@c-creators.co.jp>
++
++ * arch/sh/config.in, arch/sh/kernel/time.c (set_rtc_time):
++ Implemented.
++
++1999-10-14 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/entry.S (system_call): Bug fix of the case
++ with arguments on the stack.
++
++1999-10-12 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/uaccess.h (__strnlen_user,strnlen_user): Changed
++ from {__,}strlen_user.
++
++ * arch/sh/kernel/entry.S (sys_call_table): sys_mmap.
++ * arch/sh/kernel/sys_sh.c (sys_mmap): Implemented.
++
++1999-10-11 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/char/{sh-scif.c,sh-sci.c} (gdb_detach):
++ Conditionalize the interaction with the value of in_gdb.
++
++ * arch/sh/mm/init.c (paging_init): Initialize asid.
++
++ * arch/sh/kernel/irq_onchip.c (no_irq_type): Moved to irq.c.
++
++ * include/asm-sh/checksum.h (ip_fast_csum): cmp/eq works only
++ for register "r0".
++ Thanks to Mikhail Sogrine <sogrine@Informatik.Uni-Tuebingen.De>
++ and Tetsuya Okada <okayan@c-creators.co.jp>
++
++1999-10-10 Tetsuya Okada <okayan@c-creators.co.jp>
++
++ * arch/sh/kernel/time.c (get_rtc_time): Implemented for on chip
++ RTC.
++
++1999-10-09 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/entry.S (none): Do nothing for NMI.
++
++ * drivers/char/sh-scif.c (sci_transmit_chars,sci_receive_chars):
++ Bug fix for counting room.
++
++1999-10-06 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/{signal.h,socket.h,termbits.h,termios.h,types.h}:
++ Updated.
++
++ * include/asm-sh/smplock.h: Merge Kaz's. And rename it from
++ smp_lock.h.
++
++1999-10-05 Sugioka Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/mm/init.c: Initialized to MMU_CONTEXT_FIRST_VERSION.
++
++1999-10-05 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/vmlinux.lds.S: New section ".empty_zero_page".
++
++ * drivers/char/sh-scif.c (gdb_detach): Change trap #.
++ (SCSCR_INIT): New macro.
++ (SCI_IRP_OFFSET): Bug fix.
++
++ * arch/sh/kernel/entry.S (fixup_syscall_argerr): Implemented.
++
++ * include/asm-sh/uaccess.h: Use .balign.
++
++1999-10-04 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/char/sh-sci.c: Implement TTY.
++
++ * drivers/char/sh-scif.c (sci_enable_tx_interrupts): Handle
++ interrupt request flag correctly.
++ (sci_interrupt): Call sci_enable_tx_interrupts.
++
++1999-10-03 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/irq_onchip.c
++ (enable_onChip_irq,disable_onChip_irq): Fixed the address
++ calculation.
++
++1999-10-02 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/ioctls.h (TIOCMBIS,TIOCMBIC,TIOCMSET): Fixed the
++ typo of type.
++
++ * arch/sh/kernel/entry.S (handle_exception): Fixed the entry
++ position.
++
++ * drivers/char/sh-scif.c: Implement serial TTY.
++
++1999-10-01 Tetsuya Okada <okayan@c-creators.co.jp>
++
++ * drivers/char/sh-scif.c: Conditionalize with
++ CONFIG_DEBUG_KERNEL_WITH_GDB_STUB.
++
++1999-09-28 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/config.in(CONFIG_MEMORY_END): Removed.
++
++ * arch/sh/vmlinux.lds.S (section .data.disk_image): Removed.
++
++ * arch/sh/kernel/test-img.c: Removed.
++ * arch/sh/kernel/Makefile(O_OBJS): Remove test-img.o.
++
++ * arch/sh/kernel/signal.c (setup_frame,setup_rt_frame): Bug fix
++ for little endian machine.
++
++ * arch/sh/lib/memcpy.S: Bug fix: CONFIG_LITTLE_ENDIAN -->
++ __LITTLE_ENDIAN__.
++
++1999-09-24 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/defconfig: Updated.
++
++ * arch/sh/kernel/head.S: Assumes arguments come with register R4&R5.
++ * arch/sh/kernel/setup.c (setup_arch): Introduce new boot interface
++ "BabeFace".
++
++ * include/asm-sh/bugs.h (check_bugs): Set loops_per_sec, and display
++ CPU type.
++
++ * include/asm-sh/processor.h: New enumeration for CPU type.
++
++ * arch/sh/mm/cache.c (detect_cpu_and_cache_system): New function.
++
++ * arch/sh/config.in: Follow the change of the name of sh-sci.c and
++ sh-scif.c.
++
++ * driver/char/{sh-sci.c,sh-scif.c}: Renamed since they're
++ almost same between SH-3 and SH-4.
++ Thanks to Mikhail Sogrine <sogrine@Informatik.Uni-Tuebingen.De>.
++
++1999-09-23 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/entry.S, include/asm-sh/ptrace.h: Stack layout change.
++ (error): Bug fix.
++
++ * arch/sh/kernel/signal.c, arch/sh/kernel/process.c: Follow the
++ interface change of ptrace.h.
++
++ * include/asm-sh/ptrace.h: Rename the member u_regs to regs.
++ Introduce new member "sp".
++
++ * include/asm-sh/sigcontext.h(struct sigcntext): Rename the members.
++
++ * include/asm-sh/elf.h (ELF_PLAT_INIT): Taken from Kaz'
++ Implementation. Don't know if it's really needed or not.
++
++1999-09-22 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/head.S: Set SR register.
++
++ * arch/sh/mm/cache.c (flush_icache_range): Bug fix. Tag address
++ for IC Address Array is virtual address, not physical.
++ (flush_cache_range): Likewise.
++ (cache_flush_area): Likewise.
++ (follow_page): Removed.
++
++1999-09-21 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/process.c (show_regs): Format change a bit.
++
++ * include/asm-sh/delay.h (__delay,__udelay): Kaz' Implementatin.
++
++ * arch/sh/lib/memmove.S: Don't include <linux/config.h>, use
++ __LITTLE_ENDIAN__ instead.
++ * arch/sh/lib/memcpy.S: Likewise.
++ * arch/sh/kernel/signal.c: Likewise.
++ * include/asm-sh/elf.h: Likewise.
++ * include/asm-sh/byteorder.h: Likewise.
++ * include/asm-sh/checksum.h: Likewise.
++ (csum_tcpudp_nofold,csum_ipv6_magic): Improve a bit. (Don't branch)
++ (ip_fast_csum,csum_fold): Merge Kaz' Implementation.
++
++1999-09-20 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/{atomic.h,bitops.h}: Use save_and_cli.
++
++1999-09-19 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/entry.S (ret_from_irq): Just return when
++ interrupted from kernel space.
++
++ * arch/sh/kernel/irq.c (do_IRQ): set syscall_nr = -1.
++
++ * arch/sh/mm/fault.c (update_mmu_cache): Flush icache when needed.
++
++ * arch/sh/kernel/process.c (show_regs): Display TEA value.
++ * arch/sh/kernel/traps.c (show_registers): Removed.
++
++1999-09-18 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/entry.S (system_call): Bug fix: TRA contains
++ the value = imm x 4.
++
++ * arch/sh/mm/init.c (paging_init): Use ctrl_outl.
++
++ * arch/sh/config.in (CONFIG_MEMORY_END): New config variable.
++
++ * arch/sh/kernel/{entry.S,head.S,irq_onchip.c,setup.c,time.c},
++ arch/sh/mm/{cache.c,fault.c}: Use __sh3__ and __SH4__ to
++ distinguish CPU.
++
++ * include/asm-sh/addrspace.h, include/asm-sh/cache.h,
++ include/asm-sh/elf.h, include/asm-sh/mmu_context.h,
++ include/asm-sh/pgtable.h: Likewise.
++
++ * arch/sh/Makefile (AFLAGS): Add processor specific flag.
++
++ * arch/sh/kernel/head.S: Merge Kaz' implementation of SH-4 FPU
++ initialization.
++
++ * arch/sh/kernel/time.c: SH-4 Support.
++
++ * drivers/char/sh4scif.c: New file.
++
++ * include/asm-sh/io.h (ctrl_in{b,w,l},ctrl_out{b,w,l}): New
++ Interfaces for memory mapped control register access.
++
++1999-09-17 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/fault.c (__flush_tlb_page): SH-4 Support.
++
++ * arch/sh/kernel/signal.c (setup_frame, setup_rt_frame):
++ Add flush_icache_range.
++
++ * arch/sh/mm/cache.c: SH-4 Support.
++
++1999-09-15 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/mmu_context.h (MMU_TTB): Change for SH-4.
++ * arch/sh/kernel/entry.S (MMU_TEA): Change for SH-4.
++
++ * arch/sh/Makefile (LIBS): Nuke the 'gniibe' dependency.
++ Suggested by Mikhail Sogrine <sogrine@Informatik.Uni-Tuebingen.De>.
++
++1999-09-13 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/traps.c, include/asm-sh/semaphore.h,
++ include/asm-sh/spinlock.h: Updated to 2.3.18.
++
++ * arch/sh/Makefile (HOSTCC): Removed.
++ Suggested by Mikhail Sogrine <sogrine@Informatik.Uni-Tuebingen.De>.
++
++1999-09-12 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/entry.S: Add SH-4 Support.
++
++1999-09-09 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/hardirq.h (synchronize_irq): barrier.
++
++1999-09-08 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/delay.h (__delay): Fixed.
++
++ * include/asm-sh/checksum.h (csum_tcpudp_nofold): Support both
++ endianess.
++
++ * include/asm-sh/bugs.h, arch/sh/mm/fault.c,
++ arch/sh/kernel/traps.c, arch/sh/kernel/time.c,
++ arch/sh/kernel/ptrace.c, arch/sh/kernel/irq_onchip.c:
++ Update to 2.3.17.
++
++1999-09-07 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/atomic.h (__atomic_fool_gcc): Add "volatile".
++
++ SH4 Merge. Phase #1.
++ * include/asm-sh/io.h,arch/sh/Makefile: Merged.
++
++ * include/asm-sh/addrspace.h: Replaced to Kaz's Implementation.
++
++ * arch/sh/kernel/process.c (dump_thread,dump_fpu): Use Kaz's
++ Implementation.
++ (copy_thread,flush_thread,exit_thread): Merged.
++ (last_task_used_math): New Variable.
++
++1999-09-06 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache.c (cache_flush_all): Rename from
++ __fluch_cache_all, to distinguish the cache-flush-function for TLB
++ handling. This is the mere function to flush cache, with no
++ relation to TLB handling.
++ (cache_flush_area,cache_purge_area,cache_wback_area): Implemented,
++ not works as expected on SH7708S, though.
++
++ * include/asm-sh/cache.h
++ (cache_flush_area,cache_purge_areacache_wback_area):
++ Add declarations.
++
++ * include/asm-sh/io.h (dma_cache_inv,dma_cache_wback,
++ dma_cache_wback_inv): Define appropriate functions.
++
++1999-09-05 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/checksum.h (ip_fast_csum): Fix bug.
++
++ * arch/sh/kernel/head.S: Call cache_init.
++
++ * arch/sh/mm/cache.c: New file.
++
++ * arch/sh/vmlinux.lds.S: Include <linux/config.h>.
++ * arch/sh/Makefile: Don't use -imacros.
++
++ * arch/sh/lib/memmove.S: New Implementation.
++ * arch/sh/lib/wordcopy.S: Removed.
++
++1999-09-04 Toshi Morita <tm2@best.com>
++
++ * include/asm-sh/unistd.h (_syscall0,1,2,3,4): Add "memory" clobber.
++
++1999-09-04 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/system.h (switch_to): Save/restore GBR, so that
++ driver can use GBR. Suggested by Toshi Morita <tm2@best.com>.
++
++ * include/asm-sh/{hdreg.h,ide.h}: New file (Updated to 2.3.16).
++ * arch/sh/kernel/irq.c (free_irq): Update to 2.3.16 (of i386
++ version).
++ * include/asm-sh/uaccess.h (__range_ok: SIZE): Coerce to interger.
++ * include/asm-sh/system.h (__xchg): Add volatile qualifier for PTR.
++
++ * include/asm-sh/bugs.h (check_bugs): Use __init instead of
++ __initfunc.
++
++ * arch/sh/lib/memcpy.S: New implementation.
++ * arch/sh/lib/memset.S: New implementation.
++
++1999-09-03 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/sys_sh.c (sys_oldmmap, sys_oldselect,
++ sys_olduname): Removed.
++
++ * arch/sh/kernel/head.S: Implement SH4 cache initialization.
++ When clearing BSS, utilize predecrement feature of SuperH.
++
++1999-09-03 John Hassey <hassey@gte.net>
++
++ * arch/sh/kernel/head.S (CACHE_INIT): Fix to appropriate value 0xd.
++
++1999-09-02 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/Makefile (archmrproper): Delete vmlinux.lds on "mrproper".
++
++1999-09-01 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/checksum.h, arch/sh/lib/checksum.S:
++ Implemented with the interface of i386 version.
++ * arch/sh/lib/csum_partial_copy.c, arch/sh/lib/checksum.c: Removed.
++
++1999-08-29 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/processor.h (thread_saved_pc): Implemented.
++
++ * arch/sh/kernel/entry.S (interrupt_table): Fill `do_IRQ'.
++
++1999-08-28 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/char/sh3sci.c (put_char): Wow! GCC 2.95.1 does super
++ optimization! Introduce barrier between asm statement.
++
++ * arch/sh/kernel/test-img.c: New image.
++ * arch/sh/kernel/setup.c (setup_arch): Set initrd_end to
++ __bss_start.
++
++ New System Call Interface. Thanks to YAEGASHI Takeshi for
++ the discussion.
++ * arch/sh/kernel/entry.S (system_call): Implement systemcall
++ which has more than five arguments.
++
++ * include/asm-sh/unistd.h (_syscall0,1,2,3,4): Use trapa #0.
++ * arch/sh/kernel/process.c (kernel_thread): Ditto.
++ * arch/sh/kernel/signal.c (setup_frame, setup_rt_frame): Ditto.
++
++ * arch/sh/kernel/entry.S
++ (general_exception,tlb_miss,interrupt,handle_exception): Avoid
++ potential races. We should stay BL=1 to avoid breakage of
++ hardware registers (such as TRA, MMU_TEA, k2, or k3).
++
++ * arch/sh/kernel/traps.c (DO_ERROR): Add STI.
++
++ New IRQ Programming Interface.
++ * arch/sh/kernel/irq.c, include/asm-sh/irq.h: Implemented.
++ * arch/sh/kernel/irq_onchip.c: New file.
++
++ * arch/sh/kernel/time.c (time_init): Use new scheme.
++
++1999-08-27 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/Makefile (arch/sh/vmlinux.lds): Add support for
++ a generation of the ldscript.
++
++ * arch/sh/vmlinux.lds.S: Renemed from vmlinux.lds.S, and
++ introduce using CONFIG_MEMORY_START, and CONFIG_LITTLE_ENDIAN.
++
++ * include/asm-sh/elf.h (EM_SH): Delete and...
++ * include/linux/elf.h (EM_SH): Add here.
++
++ Updated to 2.3.15.
++ * include/asm/sh/pgtable.h (io_remap_page_range): Added.
++
++1999-08-26 NIIBE Yutaka <gniibe@m17n.org>
++
++ * asm-sh/pgtable.h (SET_PAGE_DIR): Removed.
++
++ * mm/fault.c (do_page_fault): Store the address to thread
++ structure.
++
++ * asm-sh/processor.h (start_thread): Make it macro, instead of
++ inline function to avoid inclusion of ptrace.h.
++ Add the member "address" to store the memory address to be paged.
++
++ * asm-sh/system.h (rmb, wmb): Added.
++
++ * defconfig: New file.
++ * config.in: Add processor type selection, endianness, and memory
++ start address.
++
++1999-08-25 John Hassey <hassey@gte.net>
++
++ * asm-sh/byteorder.h: Add little endian support.
++
++ * kernel/head.S: Check if cache is enabled already.
++ Don't flush it, if it is the case.
++
++ * vmlinux.lds(___bss_start,__end): Aligned to 4-byte.
++
++1999-08-25 NIIBE Yutaka <gniibe@m17n.org>
++
++ * asm-sh/elf.h (ELF_DATA): Support little endian.
++
++ * drivers/block/rd.c (rd_request): Add minimum hack to
++ support ramdisk for root filesystem.
++
++1999-08-24 NIIBE Yutaka <gniibe@m17n.org>
++
++ * mm/init.c (mem_init): Bug fix for counting datapages.
++
++ * asm-sh/string.h (strncpy,strncmp): Clean up.
++ * asm-sh/system.h (xchg_u32): Bug fix.
++ * kernel/process.c (__switch_to, copy_thread): Handle the case where
++ mm == 0.
++
++ * kernel/head.S(_stext:1): Fixed to correct mask value.
++ Reported by John Hassey <hassey@gte.net>.
++
++1999-08-23 NIIBE Yutaka <gniibe@m17n.org>
++
++ * asm-sh/cache.h, asm-sh/hardirq.h, asm-sh/init.h, asm-sh/io.h,
++ asm-sh/mmu_context.h, asm-sh/page.h, asm-sh/pgtable.h,
++ asm-sh/processor.h, asm-sh/semaphore.h, asm-sh/softirq.h,
++ asm-sh/spinlock.h, asm-sh/system.h, asm-sh/unistd.h:
++ Update to 2.3.14.
++
++ * asm-sh/hw_irq.h: New file (2.3.14).
++
++ * kernel/entry.S (sys_idle), kernel/process.c (sys_idle): Removed
++ (Update to 2.3.14).
++
++ * mm/init.c, mm/fault.c, kernel/init_task.c: Updated to 2.3.14.
++ * kernel/signal.c (do_signal): Update to 2.3.14.
++ * kernel/traps.c (DO_ERROR): Updated to 2.3.14.
++
++ * config.in: Remove support of JAVA binaries.
++
++1999-08-22 NIIBE Yutaka <gniibe@m17n.org>
++
++ * kernel/entry.S (signal_return): Revert the changes of 08-19.
++ (DO_FAULT): Remove unblocking of interrupt (not needed).
++ (interrupt): Set return address ret_from_irq, instead of
++ ret_from_syscall.
++
++ * string.h (strncpy): Fix uninitialized __limit.
++
++ * kernel/signal.c (setup_frame,setup_rt_frame): Support both endians.
++
++1999-08-19 Niibe Yutaka <gniibe@m17n.org>
++
++ * Second version, named "OSHIDASHI".
++ Linux 2.2.11.
++
++ * system.h (__sti, __cli, __save_and_cli): Bug fix.
++ * kernel/entry.S (signal_return, DO_FAULT): Bug fix.
++
++ * string.h: Remove useless "earlyclobber" constraints from asm
++ statements.
++ * uaccess.h,string.h,system.h: Don't write "r0" directly, instead
++ use %n specification.
++
++ * socket.h, pgtable.h (ZERO_PAGE), mm/ioremap.c (__ioremap), mm/init.c
++ (show_mem): Updated to 2.2.11.
++
++ * kernel/traps.c: Implement exception handling for address error,
++ reserved instruction and illegal slot instruction.
++
++ * kernel/test-img.c (root_fs_image): compressed by GNU zip.
++ * kernel/setup.c (setup_arch), kernel/test-img.c: New root file
++ system image which includes executable using signal.
++
++ * kernel/entry.S (ret_with_reschedule): Bug fix for access
++ tsk->sigpending.
++ (nmi, debug): Removed (because this is only for my board).
++
++ * kernel/entry.S (exception_handling_table): set sys_ni_syscall
++ for ioperm, iopl, and vm86.
++ * kernel/ioport.c, kernel/vm86.c: Removed.
++
++ * sigcontext.h, kernel/signal.c: Signal handling implemented.
++
++ * sh3sci.c (put_char): Clean up a bit.
++
++1999-08-18 Niibe Yutaka <gniibe@m17n.org>
++
++ * Initial version, named "YORIKIRI".
++
++ It boots! It runs ELF executable! It forks!
++
++ Environment:
++ Linux 2.2.10.
++ Kyoto Micro Computer's SH-3 Evaluation Board (SH7708 60MHz).
++ GDB 4.18 with patch for the board.
++ GNU binutils snapshot 1999-08-17.
++ EGCS 1.1.2.
++
++ Start writing ChangeLog:
++ * vmlinux.lds: Linker script for vmlinux.
++
++ * kernel/vm86.c, kernel/traps.c, kernel/time.c, kernel/sys_sh.c,
++ kernel/sh_ksyms.c, kernel/setup.c, kernel/irq.c,
++ kernel/ioport.c, kernel/init_task.c, kernel/head.S,
++ kernel/entry.S, kernel/signal.c, kernel/ptrace.c,
++ kernel/process.c: It works!
++
++ * kernel/test-img.c: Root fs image with
++ /dev/console --> /dev/tty0 (4,0)
++ /linuxrc printing "Hello World!.
++
++ * lib/checksum.c, lib/csum_partial_copy.c, lib/delay.c, lib/memcpy.S,
++ lib/memmove.S, lib/memset.S, lib/old-checksum.c, lib/wordcopy.S:
++ Taken from GCC outputs, newlib-1.8.0, and other part of Linux.
++
++ * mm/extable.c, mm/fault.c, mm/init.c, mm/ioremap.c:
++ Implement SH-3 MMU.
++
++ * semaphore-helper.h, atomic.h, current.h, mman.h, processor.h,
++ unistd.h, bugs.h, softirq.h, user.h, bitops.h, shmparam.h,
++ namei.h, elf.h, ioctls.h, posix_types.h, statfs.h, termios.h,
++ termbits.h, signal.h, siginfo.h, unaligned.h, semaphore.h,
++ uaccess.h, system.h, cache.h, pgtable.h: Header files.
++
++ * mmu_context.h: New file. Idea taken from MIPS Implementation.
++
++Little History:
++
++I've started the project which ports Linux to SuperH in the summer of
++1998. Got the CPU programming manual and hardware manual from
++Hitachi, prepared GNU tool-chains (binutils, gcc) on my Intel box.
++
++I've asked Hitachi for hardware information of thier Windows CE
++machine, but it seemed that it was difficult for Hitachi to disclose
++the information (NDA wrt Microsoft???). Anyway, I've started writing
++some code with Linux version 2.1.63.
++
++As there's no platform running the code, I got bored. Hence, in June
++1999, I bought "SH-3 Evaluation Kit" made by Kyoto Micro Computer,
++which is available from CQ publishing company (in Japan). At first,
++I've port GDB for that board, it helps me much for understanding the
++CPU. Then, I port Linux 2.2.10.
++
++ -- Niibe Yutaka
++ at ETL, Tsukuba, Japan.
++ 1999-08-18
+diff -ruN linux-2.6.17-vanilla/ChangeLog-2000 linux-2.6.17/ChangeLog-2000
+--- linux-2.6.17-vanilla/ChangeLog-2000 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/ChangeLog-2000 2006-07-12 16:54:18.000000000 +0000
+@@ -0,0 +1,2069 @@
++2000-12-28 Mitch Davis <mdavis@pocketpenguins.com>
++
++ * Changelog, arch/sh/kernel/Makefile,
++ arch/sh/kernel/mach_foobar.c: Replaced FOOBAR with DMIDA.
++
++2000-12-26 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/char/Makefile: Added CONFIG_SH_DREAMCAST.
++ * drivers/char/maple.{h,c}: New files.
++ * drivers/char/dc_keyb.c: New file.
++
++ * drivers/video/Config.in (CONFIG_FB_DC): Added.
++ * drivers/video/Makefile (obj-$(CONFIG_FB_DC)): Added.
++ * drivers/video/dcfb.c: New file.
++ * drivers/video/fbmem.c: Added CONFIG_FB_DC.
++
++ * include/asm-sh/io.h: Added CONFIG_SH_DREAMCAST.
++ * include/asm-sh/io_dc.h: New file.
++ * include/asm-sh/machvec.h: Added MACH_DREAMCAST.
++ * include/asm-sh/keyboard.h (kbd_init_hw): Added code for
++ MACH_DREAMCAST.
++
++ * arch/sh/kernel/Makefile (obj-$(CONFIG_SH_DREAMCAST)): Added.
++ * arch/sh/kernel/setup_dc.c: New file.
++ * arch/sh/kernel/io_dc.c: New file.
++ * arch/sh/kernel/mach_dc.c: New file.
++
++ * arch/sh/config.in: Added Dreamcast support, whatever it means.
++
++2000-12-25 Philipp Rumpf <prumpf@tux.org>
++
++ * arch/sh/kernel/rtc.c, include/asm-sh/rtc.h: New files.
++ * arch/sh/config.in [CONFIG_SH_RTC]: made SH onchip RTC support
++ conditional.
++ * arch/sh/kernel/Makefile [CONFIG_SH_RTC]: Likewise.
++ * arch/sh/kernel/mach_dmida.c, arch/sh/kernel/mach_se.c,
++ arch/sh/kernel/mach_hp600.c, arch/sh/kernel/mach_unknown.c: Likewise.
++ * arch/sh/kernel/time.c (get_timer_frequency): modified to work with
++ non-standard RTCs.
++ (do_timer_interrupt): Likewise.
++ (set_rtc_time) (get_rtc_time): removed functions
++
++2000-12-25 Philipp Rumpf <prumpf@tux.org>
++
++ * arch/sh/kernel/mach_ec3104.c, arch/sh/kernel/io_ec3104.c,
++ arch/sh/kernel/setup_ec3104.c, include/asm-sh/ec3104.h,
++ include/asm-sh/io_ec3104.h, include/asm-sh/serial-ec3104.h,
++ include/asm-sh/keyboard-ec3104.h,
++ drivers/char/ec3104_keyb.c: New files
++
++ * arch/sh/config.in, arch/sh/kernel/Makefile, include/asm-sh/io.h,
++ include/asm-sh/irq.h, include/asm-sh/machvec.h: Added support for
++ the EC3104 companion chip.
++
++ * include/asm-sh/serial.h [CONFIG_SH_EC3104]: Use alternate header
++ file for EC3104.
++ * include/asm-sh/keyboard.h [CONFIG_SH_EC3104]: Likewise.
++
++2000-12-25 Philipp Rumpf <prumpf@tux.org>
++
++ * drivers/video/epson1355fb.c: New file
++ * drivers/video/Config.in, drivers/video/Makefile,
++ drivers/video/fbmem.c: added epson 1355 support
++
++2000-12-24 Philipp Rumpf <prumpf@tux.org>
++
++ * arch/sh/boot/compressed/head.S (init_sr): initialize imask to 15
++ * arch/sh/kernel/fpu.c: Remove '$' for register specification.
++
++2000-12-22 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/Makefile, arch/sh/mm/Makefile, arch/sh/lib/Makefile
++ arch/sh/overdrive/Makefile: New style Makefile.
++
++ * Updated to 2.4.0-test13-pre4.
++
++ * Updated to 2.4.0-test12. Mostyly done by Greg Banks.
++
++2000-11-26 Takashi Yoshii <yoshii-takashi@hitachi-ul.co.jp>
++
++ * arch/sh/boot/compressed/head.S (fake_headers_as_bzImage): Added.
++
++2000-11-23 David Howells <dhowells@redhat.com>
++
++ * arch/sh/kernel/traps.c (handle_unaligned_ins):
++ Use copy_from_user, copy_to_user (were __copy_user).
++ (handle_unaligned_delayslot): Likewise.
++ (do_address_error): Likewise.
++
++2000-11-23 David Howells <dhowells@redhat.com>
++
++ * arch/sh/kernel/traps.c: New Variable.
++ (die_if_no_fixup): Return integer.
++ (handle_unaligned_ins): Retern integer.
++ (handle_unaligned_delayslot, handle_unaligned_access): New
++ functions.
++
++2000-11-22 NIIBE Yutaka <gniibe@m17n.org>
++
++ Updated to 2.4.0-test11.
++ * arch/sh/kernel/time.c (set_rtc_time): Add declaration of abs.
++ (time_init): Remove unused variable 'i'.
++ * arch/sh/kernel/setup_hd64461.c (setup_hd64461): Ifdef-out
++ access of INTC_ICR1.
++
++ * include/asm-sh/pgtable.h(module_map, module_umap): Removed.
++ * include/asm-sh/xor.h, include/asm-sh/module.h: New files.
++ * arch/sh/config.in (CONFIG_EISA, CONFIG_MCA): Added.
++
++2000-11-17 YAEGASHI Takeshi <yaegashi@ma.kcom.ne.jp>
++
++ * arch/sh/config.in: Add HP620/680/690 support.
++
++ * include/asm-sh/machvec.h, arch/sh/kenrnel/mach_hp600.c: Add
++ HP620/680/690 machine vectors.
++
++ * arch/sh/kernel/setup.c: Add struct screen_info.
++
++ * drivers/char/scan_keyb.[ch], drivers/char/hp600_keyb.c: Add HP620
++ keyboard support. Reverse bit order of scan table. Use kernel
++ timer instead of task queue.
++
++ * drivers/net/smc9194.c: Bug fix.
++
++ * drivers/video/hitfb.c: API clean up. Add 8bpp support for HP620.
++
++ * include/asm-sh/ide.h, arch/sh/kernel/io_hd64461.c: Add ide1 ports.
++
++ * include/asm-sh/hd64461.h: Add more register definitions.
++
++2000-11-15 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/kernel/time.c (time_init): clock calculation bug fixed.
++
++ * arch/sh/io_generic.c: Follow the change of I/O func.
++
++2000-11-11 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/Makefile (CFLAGS, AFLAGS): Use -m4-nofpu.
++
++ * arch/sh/kernel/io.c, arch/sh/kernel/io_generic.c,
++ arch/sh/kernel/io_hd64461.c, arch/sh/kernel/io_hd64465.c,
++ arch/sh/kernel/io_se.c, arch/sh/kernel/setup_hd64461.c,
++ arch/sh/overdrive/io.c, include/asm-sh/io.h,
++ include/asm-sh/io_generic.h, include/asm-sh/io_hd64461.h,
++ include/asm-sh/io_hd64465.h, include/asm-sh/io_od.h,
++ include/asm-sh/io_se.h, include/asm-sh/io_unknown.h,
++ include/asm-sh/machvec.h: Clean up the API.
++ arch/sh/kernel/process.c: Follow the change of I/O func.
++
++ * include/asm-sh/pgtable-2level.h (pgd_none, pgd_bad, pgd_present,
++ pmd_offset): Make them static inline.
++ * include/asm-sh/pgtable.h (pte_read, pte_exec, pte_dirty,
++ pte_young, pte_write, pte_shared, pte_rdprotect, pte_exprotect,
++ pte_mkclean, pte_mkold, pte_wrprotect, pte_mkread, pte_mkexec,
++ pte_mkdirty, pte_mkyoung, pte_mkwrite, pte_modify): Likewise.
++ * include/asm-sh/siginfo.h (copy_siginfo): Likewise.
++ * include/asm-sh/uaccess.h (verify_area): Likewise.
++
++ * include/asm-sh/io.h(___raw_readq, ___raw_writeq): Removed.
++
++ * arch/sh/kernel/entry.S (call_dae): Remove STI().
++ * arch/sh/kernel/traps.c (handle_unaligned): Use __LITTLE_ENDIAN__
++ instead.
++
++2000-11-11 Jesper Skov <jskov@redhat.com>
++
++ * arch/sh/kernel/traps.c (handle_unaligned, do_address_error):
++ New functions.
++ Added bad alignment handling, based on original code by Philipp
++ Rumpf, bug fixed, and enhanced to handle r0-indexed access as well.
++ (DO_ERROR(7), DO_ERROR(8)): Removed.
++ (trap_init): Dont' set exception_handling_table[7] and [8].
++ * arch/sh/kernel/entry.S (address_error_load, address_error_store,
++ call_dae): New entries.
++
++2000-11-11 Philipp Rumpf <prumpf@parcelfarce.linux.theplanet.co.uk>
++
++ * arch/sh/kernel/time.c (get_cpu_mhz, rtc_interrupt, irq1): Removed.
++ (get_timer_frequency): New function.
++ (time_init): New way of get the frequency.
++
++2000-11-11 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/Makefile (arch/sh/vmlinux.lds): Add -traditional.
++ (O_OBJS): Add io_generic.o unconditionally.
++
++2000-11-11 Jesper Skov <jskov@redhat.com>
++
++ * arch/sh/kernel/entry.S, arch/sh/kernel/head.S,
++ arch/sh/kernel/irq.c, arch/sh/kernel/irq_imask.c,
++ arch/sh/kernel/process.c, arch/sh/kernel/traps.c,
++ arch/sh/lib/checksum.S, include/asm-sh/current.h,
++ include/asm-sh/delay.h, include/asm-sh/processor.h,
++ include/asm-sh/system.h: Remove '$' for register specification.
++ * arch/sh/lib/checksum.S (SRC, DST): Use "..." for CPP.
++ * arch/sh/kernel/Makefile (.S.o): Remove -traditional flag.
++ * arch/sh/lib/Makefile: Ditto.
++
++2000-11-07 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/kernel/irq_ipr.c (ipr_irq_demux): Set port mode register
++ before read data register.
++
++ * include/asm-sh/irq.h (PORT_PxCR): Defined.
++
++2000-11-04 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/kernel/time.c (do_gettimeoffset): Implemented.
++ (time_init): TMU0 counter value changed.
++
++ * include/asm-sh/timex.h (CLOCK_TICK_RATE) Changed.
++
++2000-11-03 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/kernel/irq_ipr.c Add PINT interrupt hanlers.
++ (ipr_irq_demux): IPR/PINT interrupt demux added.
++ (pint_irq_type, pint_map): Added.
++ (init_IRQ): Add PINT initializer.
++ (*_IPR_*): Fixed typo.
++
++ * arch/sh/kernel/setup_hd64461.c (hd64461_irq_demux): use __irq_demux
++
++ * include/asm-sh/irq.h (NR_IRQS): changed.
++ (irq_demux): Changed.
++ (__irq_demux): Defined.
++ (PINT_IRQ_BASE, PINT0_IRQ, PINT8_IRQ, PINT0_IPR_ADDR, PINT8_IPR_ADDR,
++ PINT0_IPR_POS, PINT8_IPR_POS, PINT0_PRIORITY, PINT8_PRIORITY): added.
++ (PORT_PADR, PORT_PBDR, PORT_PCDR, PORT_PFDR): added.
++ (*_IPR_*): Fixed typo.
++
++2000-11-02 Takashi Yoshii <yoshii-takashi@hitachi-ul.co.jp>
++
++ * arch/sh/kernel/dma.c: New file.
++
++ * include/asm-sh/dma.h (SH_MAX_DMA_CHANNELS): Added.
++ (SAR, DAR, DMATCR, CHCR, DMAOR, DMTE_IRQ, DMA_MODE_READ,
++ DMA_MODE_WRITE, DMA_AUTOINIT, REQ_L, REQ_E, RACK_H, RACK_L, ACK_R,
++ ACK_W, ACK_H, ACK_L, DM_INC, DM_DEC, SM_INC, SM_DEC, RS_DUAL, RS_IN,
++ RS_OUT, TM_BURST, TS_8, TS_16, TS_32, TS_64, TS_BLK, CHCR_DE,
++ CHCR_TE, CHCR_IE, DMAOR_COD, DMAOR_AE, DMAOR_NMIF, DMAOR_DME):
++ Added.
++ (struct dma_info_t): defined.
++ (clear_dma_ff, claim_dma_lock, release_dma_lock, setup_dma,
++ enable_dma,disable_dma, set_dma_mode, set_dma_addr, set_dma_count,
++ get_dma_residue): Declared.
++
++ * include/asm-sh/irq.h (DMTE0_IRQ, DMTE1_IRQ, DMTE2_IRQ, DMTE3_IRQ,
++ DMAE_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY): Added macros.
++
++2000-11-02 NIIBE Yutaka <gniibe@m17n.org>
++
++ Updated to 2.4.0-test10.
++ * include/asm-sh/ptrace.h (PTRACE_SETOPTIONS): Added
++ (PTRACE_O_TRACESYSGOOD): Added.
++ * include/asm-sh/param.h (CLOCKS_PER_SEC): Added.
++ * arch/sh/kernel/ptrace.c (sys_ptrace:PTRACE_DETACH): Set
++ child->ptrace =0.
++ (sys_ptrace): Add the case of PTRACE_SETOPTIONS.
++ (syscall_trace): Handle ptrace flag 0x80.
++
++2000-10-27 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/mach_unknown.c (mv_ioremap_nocache): Removed.
++ * arch/sh/kernel/mach_se.c (mv_ioremap_nocache): Removed.
++ * arch/sh/kernel/io_unknown.c (ioremap_nocache): Removed.
++ * arch/sh/kernel/io_generic.c (generic_ioremap_nocache): Removed.
++
++ * include/asm-sh/io_unknown.h (unknown_ioremap_nocache,
++ __ioremap_nocache): Removed.
++ * include/asm-sh/io_se.h (__ioremap_nocache): Removed.
++ * include/asm-sh/io_od.h (__ioremap_nocache): Removed.
++ * include/asm-sh/io_hd64465.h (__ioremap_nocache): Removed.
++ * include/asm-sh/io_generic.h (generic_ioremap_nocache): Removed.
++ * include/asm-sh/io.h (__ioremap_nocache): Removed.
++ * include/asm-sh/io.h (ioremap_nocache): Removed.
++ * include/asm-sh/machvec.h (struct sh_machine_vector): Removed
++ ioremap_nocache.
++
++ * arch/sh/mm/fault.c (update_mmu_cache): SH-3 doesn't have PTEA.
++
++2000-10-27 Bryan Rittmeyer <bryan@ixiacom.com>
++
++ * arch/sh/kernel/setup.c (setup_arch): Declare mv_unknown.
++ * arch/sh/kernel/sh_ksyms.c: Removed comment for memcmp.
++
++2000-10-27 David Woodhouse <dwmw2@infradead.org>
++
++ * arch/sh/kernel/time.c (get_cpu_mhz): Add .align 2 for speed
++ detection.
++
++2000-10-27 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/fault.c (__do_page_fault): Removed (now it's call_dpf
++ in entry.S).
++ (__do_page_fault): Rename from __do_page_fault1.
++
++ * arch/sh/kernel/entry.S (call_dpf): New entry.
++ (tlb_miss_load, tlb_miss_store, initial_page_write,
++ tlb_protection_violation_load, tlb_protection_violation_store): Use
++ call_dpf.
++
++ * include/asm-sh/pgalloc-2level.h (get_pmd_fast, free_pmd_fast,
++ free_pmd_slow, pmd_alloc): Make them static inline.
++
++ * arch/sh/mm/ioremap.c (remap_area_pages): Use pgd_offset_k.
++ (remap_area_pte): Use _PAGE_HW_SHARED.
++ (remap_area_pages): Remove set_pgdir.
++
++ * include/asm-sh/pgalloc.h (set_pgdir): Removed.
++ (get_pgd_slow, get_pgd_fast, free_pgd_fast, free_pgd_slow,
++ get_pte_fast, free_pte_fast, free_pte_slow, pte_alloc_kernel,
++ pte_alloc, pmd_free, flush_tlb_pgtables): Make them static inline.
++ (get_pgd_slow, free_pgd_slow): Use 2KB PGD.
++
++2000-10-13 Greg Banks <gbanks@pocketpenguins.com>
++
++ * arch/sh/config.in: HD64465 PCMCIA support. These changes
++ needed for the PCMCIA host bridge driver currently submitted
++ to the PCMCIA maintainer.
++ * arch/sh/kernel/io_hd64465.c: IO routines for HD64465.
++ * arch/sh/kernel/mach_dmida.c: Added machine DMIDA.
++ * arch/sh/kernel/Makefile: Added machine DMIDA. Added HD64465.
++ Reorged how O_OBJS list is built.
++ * arch/sh/kernel/setup_hd64465.c: Setup and IRQ handling for HD64465.
++ * arch/sh/kernel/sh_ksyms.c: Exported various symbols to make
++ PCMCIA modules work.
++ * arch/sh/mm/fault.c: TLB miss handler sets TC/SA bits of
++ PTEA according to bits in PTE.
++ * include/asm-sh/hd64465.h: Register defines for HD64465.
++ * include/asm-sh/io.h: Added machine DMIDA
++ * include/asm-sh/io_hd64461.h: Function declaration.
++ * include/asm-sh/io_hd64465.h: IO declarations for HD64465.
++ * include/asm-sh/machvec.h: HD64465 support.
++ * include/asm-sh/mmu_context.h: PTEA define.
++ * include/asm-sh/pgtable.h: PAGE_KERNEL_PCC(slot, type) is a
++ pgprot_t which can be used to setup SH7750 PCMCIA space mappings.
++
++2000-09-29 Bryan Rittmeyer <bryan@ixiacom.com>
++
++ * arch/sh/kernel/sh_ksyms.c (memcpy, memset, memmove, memcmp,
++ flush_dcache_page): Added.
++
++2000-09-29 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/unistd.h (setup): Removed.
++
++2000-09-28 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/system.h (switch_to): Add T-flag to the clobber
++ list of asm statements.
++
++2000-09-28 Jesper Skov <jskov@redhat.com>
++
++ * include/asm-sh/string.h: Add T-flag to the clobber list of asm
++ statements.
++ * include/asm-sh/delay.h: Same.
++ * include/asm-sh/checksum.h: Same.
++ * include/asm-sh/bitops.h: Same.
++ * arch/sh/kernel/time.c: Same.
++ * arch/sh/kernel/irq_imask.c: Same.
++ * arch/sh/kernel/process.c: Same.
++ * include/asm-sh/uaccess.h: Same. Plus clobber memory in
++ copy_to_user and clear_user.
++
++2000-09-28 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/entry.S (sys_fcntl64): Added.
++ * include/asm/unistd.h (__NR_fcntl64): Added.
++
++2000-09-27 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm/unistd.h (_syscall0, _syscall1, _syscall2, _syscall3,
++ _syscall4, _syscall5): Don't put "$" prefix for register name.
++ * include/asm-sh/system.h (switch_to): Likewise.
++ * arch/sh/kernel/sh_bios.c (sh_bios_call): Likewise.
++ * arch/sh/kernel/process.c (kernel_thread): Likewise.
++ Use __sc0 and __sc3.
++
++ * arch/sh/lib/checksum.S (SRC, DST): Don't use variable arguments.
++
++ * drivers/char/sh-sci.c (sci_set_termios_cflag): Call init_pins
++ AFTER setting baud.
++
++2000-09-26 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/system.h (smp_mb, smp_rmb, smp_wmb): Use CONFIG_SMP
++ instead of __SMP__.
++
++2000-09-25 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/system.h (smp_mb, smp_rmb, smp_wmb): New macros.
++ (__sti, __cli, (xchg_u32, xchg_u8): Make them static inline.
++
++ * include/asm-sh/bitops.h (set_bit, clear_bit, change_bit,
++ test_and_set_bit, test_and_clear_bit, test_and_change_bit, test_bit,
++ ffz, find_next_zero_bit, ext2_set_bit, ext2_clear_bit,
++ ext2_test_bit, ext2_find_next_zero_bit): Make them static inline.
++ (smp_mb__before_clear_bit, smp_mb__after_clear_bit): New macros.
++
++ * include/asm-sh/atomic.h (atomic_t): Use volatile int member
++ regardless of CONFIG_SMP or not.
++ (__atomic_fool_gcc): Removed.
++ (atomic_add, atomic_sub, atomic_add_return, atomic_sub_return,
++ atomic_clear_mask, atomic_set_mask): Make them static inline.
++
++2000-09-25 NIIBE Yutaka <gniibe@m17n.org>
++
++ Follow the change of test9-pre6.
++ * include/asm-sh/resource.h (RLIMIT_LOCKS): Added.
++ (INIT_RLIMITS): Added new entry for LOCKS.
++
++ * include/asm-sh/fcntl.h (F_INPROGRESS, LOCK_MAND, LOCK_READ,
++ LOCK_WRITE, LOCK_RW, F_LINUX_SPECIFIC_BASE): Added.
++
++2000-09-18 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/pci.h (pcibios_set_master,
++ pcibios_penalize_isa_irq, (pci_map_single, pci_unmap_single,
++ pci_map_sg, pci_unmap_sg, pci_dma_sync_single, pci_dma_sync_sg):
++ Make them static.
++
++2000-09-18 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/setup_cqreek.c: Remove mv_port_2addr.
++ * include/asm/io_hd64461.h (__isa_port2addr, __ioremap, __iounmap):
++ Added.
++
++2000-09-18 NIIBE Yutaka <gniibe@m17n.org>
++
++ Follow new cache handling scheme. Because now is the transition
++ time (I think it's not fully changed to use "flush_dcache_page"),
++ let's leave flush_page_to_ram.
++
++ * arch/sh/mm/cache.c (clear_user_page, copy_user_page): Implemented.
++ (__flush_page_to_ram): New function.
++ (flush_page_to_ram): Use __flush_page_to_ram.
++
++ * include/asm-sh/page.h (clear_user_page, copy_user_page): Define
++ function for SH-4.
++
++ Revert the changes of 2000-09-09.
++ * arch/sh/mm/cache.c (flush_cache_page): Reverted.
++ * include/asm-sh/pgtable.h (flush_cache_page): Ditto.
++
++2000-09-18 YAEGASHI Takeshi <yaegashi@ma.kcom.ne.jp>
++
++ SCI error handling(frame/parity/overrun error, BREAK)
++
++ * include/asm-sh/irq.h: Add *_BRI_IRQ definitions.
++
++ * arch/sh/kernel/irq_ipr.c (init_IRQ): Add make_ipr_irq() calls for
++ *_BRI_IRQ.
++
++ * drivers/char/sh-sci.h : Add BRI to irq table, new macros.
++
++ * drivers/char/sh-sci.h (sci_handle_errors, sci_handle_breaks,
++ sci_br_interrupt): added.
++ (sci_receive_chars): Add error handling for SCIF(checking SCxSR).
++ (sci_er_interrupt): Add error handling for SCI(sci_handle_errors).
++ (sci_init): Add BRI initialization.
++
++2000-09-09 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/pgtable.h (flush_cache_page): Do nothing.
++ * arch/sh/mm/cache.c (flush_cache_page): Removed.
++
++2000-09-08 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/irq_imask.c (startup_imask_irq,
++ shutdown_imask_irq): Don't do anything. When used with
++ proble_irq, interrupt may be masked.
++ NOTE: For IMASK, default is "all enabled"
++
++ * arch/sh/kernel/irq_ipr.c (make_ipr_irq): Revert the changes on
++ 09-05. It's done with disable_irq_nosync.
++
++2000-09-06 NIIBE Yutaka <gniibe@m17n.org>
++
++ Follow the changes of 2.4.0-test8-pre5.
++
++ * arch/sh/kernel/process.c (copy_thread): Add "unused" argument.
++ It's "stack_top" from do_fork.
++ (sys_fork, sys_clone, sys_vfork): Add last argument 0.
++
++2000-09-05 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/irq_ipr.c (make_ipr_irq): Initialize status, action
++ and depth field.
++
++2000-09-04 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * drivers/char/sh-sci.h (SCIF_ORER): Added.
++ * drivers/char/sh-sci.c (sci_er_interrupt): Handle overrun error
++ for SH-4 SCIF.
++ (sci_set_baud): Set SCSMR bit0,1(clock select) every time.
++
++2000-09-04 NIIBE Yutaka <gniibe@m17n.org>
++
++ Follow the changes of 2.4.0-test8-pre3.
++
++ * arch/sh/kernel/signal.c (do_signal): Use pending.signal, instead
++ of signal (taskstruct structure chane for siganal).
++
++ * include/asm-sh/uaccess.h (put_user_ret, get_user_ret,
++ __put_user_ret, __get_user_ret, copy_to_user_ret,
++ __copy_to_user_ret, copy_from_user_ret, __copy_from_user_ret):
++ Removed.
++
++2000-09-04 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache.c (cache_init): Re-initialize the cache system,
++ even if it's already initialized.
++ (detect_cpu_and_cache_system): Be conservative.
++
++2000-09-03 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/pgtable.h (_PAGE_PRESENT): Use hardware V-bit.
++ (_PAGE_U0_SHARED): New macro to implement user space shared page.
++ (_PAGE_HW_SHARED): We need this hardware setting.
++ (_PAGE_FLAGS_HARDWARE_DEFAULT): Removed.
++ (_PAGE_FLAGS_HARDWARE_MASK): Include SZ-bit, SH-bit and WT-bit.
++ (_PAGE_FLAGS_HARD): Hardware PTE flags setting (for SZ=4KB).
++ (_PAGE_SHARED): Use U0_SHARED for SH-4, HW_SHARED for SH-3, because
++ there's alias issue on SH-4.
++ (PAGE_NONE, PAGE_SHARED, PAGE_COPY, PAGE_READONLY, PAGE_KERNEL,
++ PAGE_KERNEL_RO): Includd _PAGE_FLAGS_HARD.
++
++ (PAGE_KERNEL, PAGE_KERNEL_RO): Include _PAGE_HW_SHARED.
++
++ (_PAGE_ACCESSED, _PAGE_PROTNONE): Layout changed.
++ (SWP_TYPE, SWP_OFFSET, SWP_ENTRY): Likewise.
++
++ * arch/sh/mm/fault.c (update_mmu_cache): Don't OR the hardware value
++ to PTE. It's now already included.
++
++2000-08-31 Jesper Skov <jskov@redhat.com>
++
++ * arch/sh/mm/fault.c (__do_page_fault): Fixed bug that caused
++ infinite cycle of faults when writing to a page for the first time.
++
++2000-08-30 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/head.S: Move the alignment expression before .text
++ directive.
++
++2000-08-28 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.0-test7.
++
++2000-08-25 Jesper Skov <jskov@redhat.com>
++
++ * arch/sh/vmlinux.lds.S: Discard .exitcalls from modules.
++
++ * Documentation/Configure.help: Fixed CPU selection description.
++
++2000-08-24 Bryan Rittmeyer <bryan@ixiacom.com>
++
++ * drivers/char/sh-sci.h (BPS_57600): Added.
++ * drivers/char/sh-sci.c (sci_set_baud): Support 57600 baud.
++
++2000-08-24 Toshinobu Sugioka <sugioka@itonet.co.jp>
++
++ * net/ipv4/ip_sockglue.c: Include
++ <linux/netfilter_ipv4/ipchains_core.h>.
++
++2000-08-24 NIIBE Yutaka <gniibe@m17n.org>
++
++ * net/ipv4/ip_sockglue.c (ip_setsockopt): Bug fix. Ipchains didn't
++ work. When IP_FW_XXX command is invoked, we don't need to get the
++ VAL with get_user, it might got EFAULT when the optval is not
++ aligned as 4-byte. (Ipchains uses string as OPTVAL).
++
++2000-08-23 Greg Banks <gbanks@pocketpenguins.com>
++
++ (These entries were written by gniibe.)
++ * arch/sh/kernel/entry.S (system_call): Remove setting of return
++ value.
++
++ * arch/sh/kernel/sh_ksyms.c (strlen): Exported.
++ (DECLARE_EXPORT): New macro.
++ (__udivsi3_i4, __sdivsi3_i4, __movstr_i4_even, __movstr_i4_odd,
++ __ashrdi3, __ashldi3): Exported.
++
++2000-08-23 NIIBE Yutaka <gniibe@m17n.org>
++
++ Follow the change of 2.4.0-test7-pre7.
++ * include/asm-sh/fcntl.h (F_GETLK64, F_SETLK64, F_SETLKW64): New
++ macros.
++ (flock64): Added.
++
++ Updated to 2.4.0-test7-pre7.
++ * include/asm-sh/unistd.h (__NR_getdents64): Added.
++ * include/asm-sh/mmu_context.h (init_new_context): Return 0.
++
++ * arch/sh/kernel/mach_se.c: Include <linux/config.h>.
++ * arch/sh/kernel/mach_unknown.c: Likewise.
++ * arch/sh/kernel/setup_cqreek.c: Likewise.
++ * include/asm-sh/dma.h: Likewise.
++ * include/asm-sh/machvec_init.h: Likewise.
++
++ * arch/sh/kernel/entry.S (sys_getdents64): Added.
++
++ * arch/sh/kernel/cf-enabler.c: Don't include <linux/config.h>.
++ * arch/sh/kernel/io.c: Ditto.
++ * arch/sh/kernel/io_generic.c: Likewise.
++
++2000-08-20 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/fault.c (update_mmu_cache): Bug fix. This routine
++ is called by ptrace when PTE does not have information.
++
++2000-08-19 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/setup_cqreek.c (setup_cqreek): Work around.
++ Let it not sleep.
++
++ * arch/sh/kernel/setup_cqreek.c (struct cqreek_irq_data): New
++ structure.
++ (disable_cqreek_irq, enable_cqreek_irq, mask_and_ack_cqreek,
++ init_cqreek_IRQ): Generalized to handle both cases of IDE and ISA.
++
++ * mm/vmscan.c (try_to_swap_out): We need to call flush_page_to_ram.
++
++ * arch/sh/mm/cache.c (flush_page_to_ram): Semantics change.
++ We invalidate the cache line too.
++ (flush_cache_page): No need to do any for physically tagged cache.
++
++ * mm/memory.c (break_cow, do_anonymous_page, do_no_page): Revert the
++ changes of 2000-08-17. NOTE: In fact, we need to flush I-cache at
++ break_cow and do_anonymous_page, but it's buggy software if it's
++ goes fetch the instruction from that page...
++ (do_swap_page): flush_page_to_ram instead of flush_dcache_page.
++
++2000-08-17 NIIBE Yutaka <gniibe@m17n.org>
++
++ * mm/memory.c (do_anonymous_page): We need to flush I-cache and
++ D-cache here, as it's newly allocated page.
++ (do_no_page): We need to flush D-cache.
++ (do_swap_page): Flush D-cache & I-cache here. There're cases
++ where read_swap_cache is called asynchronously and pages are
++ cached.
++
++ * Revert the change for fs/buffer.c (end_buffer_io_async). It's
++ more than needed. We only need to flush when kernel WRITES to the
++ page (from I/O), not READ (to I/O).
++
++ * Revert the changes for mm/memory.c (do_wp_page: case 1): We have
++ valid PTE here (it's read-only but works).
++
++2000-08-16 NIIBE Yutaka <gniibe@m17n.org>
++
++ * fs/buffer.c (end_buffer_io_async): Flush D-cache. When kernel
++ writes to the page, we should flush USER cache so that USER doesn't
++ read stale data.
++
++ * mm/memory.c (do_swap_page): Bug fix. We need to flush D-cache.
++ For newly allocated page, D-cache may contain stale USER data.
++ (break_cow): Likewise. Note that flush_cache_page is not good for
++ physically tagged architecture. (For old implementation, flushing
++ routine was called before setting PTE.)
++ (do_wp_page: case 1): Likewise.
++
++2000-08-13 NIIBE Yutaka <gniibe@m17n.org>
++
++ * mm/memory.c (break_cow): Bug fix. We need to flush I-cache.
++ For newly allocated page, I-cache may contain stale USER data.
++
++ * arch/sh/mm/init.c (mem_init): Flush empty_zero_page.
++
++2000-08-11 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache.c (check_cache_page): Renamed from
++ check_dcache_page.
++
++2000-08-10 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.0-test6.
++
++ * arch/sh/mm/cache.c (check_dcache_page): New debug function.
++ * arch/sh/kernel/traps.c (dump_stack): Only output call trace.
++
++ Cosmetic changes for TLB handling.
++ * arch/sh/mm/fault.c (__flush_tlb_page): First argument is ASID now
++ (instead of MM).
++ (__flush_tlb_page): Don't take MM as argument.
++ (handle_vmalloc_fault): Removed.
++ (do_page_fault): Don't call handle_vmalloc_fault.
++ (__do_page_fault1, __do_page_fault): New functions.
++ (update_mmu_cache): Use pte_shared.
++ (flush_tlb_page): Handle the case where MM != CURRENT->MM.
++ (flush_tlb_range): Likewise.
++
++ * include/asm-sh/pgtable.h (pte_shared): New inline function.
++ (_PAGE_SHARED): New macro.
++ (PAGE_SHARED): Added _PAGE_SHARED.
++
++ * arch/sh/kernel/entry.S (tlb_miss_load, tlb_miss_store,
++ initial_page_write, tlb_protection_violation_load,
++ tlb_protection_violation_store): Call __do_page_fault.
++ Don't call STI().
++
++ Follow the change of 2.4.0-test6-pre10.
++ * include/asm-sh/page.h (virt_to_page, VALID_PAGE): New macro.
++ (MAP_NR): Removed.
++
++2000-08-09 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.0-test6-pre9.
++
++ * arch/sh/mm/cache.c (flush_cache_page): Call flush_dcache_page.
++ (flush_cache_range): Call flush_cache_all.
++ (flush_dcache_page): New function. Flush D-cache for the page.
++
++ * arch/sh/mm/fault.c (update_mmu_cache): Use flush_dcache_page.
++
++ * arch/sh/mm/cache.c (flush_icache_page, flush_page_to_ram): Revert
++ the changes on 08-05.
++
++ * include/asm-sh/pgtable.h (flush_dcache_page): Added declaration
++ for SH-4.
++
++ Import changes from 2.4.0-test6-pre8.
++ * arch/sh/mm/init.c: Use virt_to_page to get page.
++ * include/asm-sh/processor.h: Likewise.
++ * include/asm-sh/pgtable.h (ZERO_PAGE): Likewise.
++ (pte_pagenr): Removed.
++
++2000-08-09 Toshinobu Sugioka <sugioka@itonet.co.jp>.
++
++ * arch/sh/kernel/signal.c (save_sigcontext_fpu): Bug fix.
++ We can't use immediate value for __copy_to_user.
++
++2000-08-08 NIIBE Yutaka <gniibe@m17n.org>
++
++ Import changes from 2.4.0-test6-pre7. (by Keith Owens)
++ * include/asm-sh/hardirq.h (irq_cpustat_t, in_interrupt, in_irq,
++ hardirq_trylock, irq_enter, irq_exit): Clean them up.
++ * include/asm-sh/softirq.h (cpu_bh_disable, cpu_bh_enable,
++ in_softirq): Likewise.
++ * arch/sh/kernel/irq.c: Likewise.
++ * arch/sh/kernel/entry.S (ret_from_syscall): Use __irq_stat.
++
++ Import changes from 2.4.0-test6-pre7. (Perhaps, by David S. Miller)
++ * include/asm-sh/pgtable.h (flush_dcache_page): Added.
++ (page_address): Remove debug functionality.
++ * include/asm-sh/system.h: Remove set_rmb.
++
++2000-08-05 Jesper Skov <jskov@redhat.com>
++
++ Changes to use SCI/F for PPP.
++ * drivers/char/sh-sci.c (sci_sched_event, do_softint): Added.
++ (sci_transmit_chars): Call sci_sched_event.
++ (SCI_EVENT_WRITE_WAKEUP): New definition.
++ (sci_port): Added members 'tqueue' and 'event'.
++
++ Cosmetic changes.
++ * include/asm-sh/irq.h (SCIF_ERI_IRQ and others): Add condition for
++ CONFIG_CPU_SUBTYPE_SH7707.
++ * arch/sh/kernel/semaphore.c (semaphore_wake_lock): Added.
++ * arch/sh/config.in (CONFIG_GDB_STUB_VBR): We need this regardless
++ of CONFIG_DEBUG_KERNEL_WITH_GDB_STUB.
++
++2000-08-05 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache.c (flush_page_to_ram): Use save_and_cli.
++ (flush_icache_page, flush_icache_range): Ditto.
++
++2000-08-04 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache.c (icache_purge_range, flush_cache_range):
++ Use of A-bit was wrong. We need better way to handle this...
++
++ * arch/sh/mm/fault.c (update_mmu_cache): Bug fix. Don't deref
++ vma, when it's NULL.
++ (handle_vmalloc_fault): Work around. Don't call __flush_tlb_page
++ when mm==NULL.
++
++2000-08-04 NIIBE Yutaka <gniibe@m17n.org>
++
++ Machvec support.
++ * arch/sh/kernel/setup.c: Remove WEAK references.
++ (get_mv_byname): Use .macvec.init. section.
++ * include/asm-sh/machvec_init.h (__initmv): Use
++ .macvec.init. section.
++ * arch/sh/vmlinux.lds.S (.machvec.init): Added new section for
++ Machine Vector.
++
++ CqREEK support.
++ * arch/sh/config.in: Added CONFIG_SH_CQREEK.
++ * arch/sh/kernel/Makefile (O_OBJS): Added CqREEK Bridge support.
++ * arch/sh/kernel/setup_cqreek.c: New file.
++
++2000-08-02 Stuart Menefy <stuart.menefy@st.com>
++
++ (These entries were written by gniibe.)
++ * arch/sh/kernel/Makefile: Add io_generic.o for UNKNOWN.
++
++ * arch/sh/kernel/io_generic.c (generic_io_base): New variable.
++ (generic_inw_p, generic_inl_p, generic_outw_p, generic_outl_p):
++ New functions.
++ * include/asm-sh/io_generic.h: Likewise.
++
++ * arch/sh/kernel/io_unknown.c: Remove unused inclusions.
++ * arch/sh/kernel/setup.c (parse_cmdline): Added I/O base and
++ MMIO enable feature.
++
++ * include/asm-sh/machvec_init.h: UNKNOWN could use GENERIC feature.
++
++2000-08-01 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/overdrive/io.c: Include <asm/processor.h>.
++
++ * arch/sh/kernel/irq_ipr.c (init_IRQ): Remove the variable 'i'.
++ * arch/sh/kernel/setup_se.c (init_se_IRQ): Likewise.
++
++ * include/asm-sh/machvec.h (struct sh_machine_vector): Bit field
++ int should be unsigned.
++
++ * include/asm-sh/ide.h (ide_default_irq_hp600,
++ ide_default_io_base_hp600): Make them static. No reason for
++ "static", matter of taste, but all other functions in this
++ file use "static".
++
++ * include/asm-sh/keyboard.h: Added "extern" qualifier. Removed
++ __init for declaration. Remove <linux/config.h>.
++
++ * include/asm-sh/irq.h (irq_demux, hd64461_irq_demux): Make them
++ extern.
++
++ * include/asm-sh/{io_hd64461.h,io_od.h,io_generic.h,io_se.h,
++ io_unknown.h}: Added "extern" qualifier.
++
++ * arch/sh/kernel/mach_hp600.c (hd64461_irq_demux): Removed.
++ Include asm/irq.h.
++
++ * arch/sh/defconfig: Updated.
++
++2000-08-01 Jesper Skov <jskov@redhat.com>
++
++ * arch/sh/config.in: Add SH7707 support.
++ * arch/sh/defconfig: Ditto.
++ * arch/sh/kernel/entry.S: Ditto.
++ * arch/sh/kernel/irq_ipr.c: Ditto.
++ * drivers/char/sh-sci.c: Ditto.
++ * drivers/char/sh-sci.h: Ditto.
++ * include/asm-sh/bugs.h: Ditto.
++ * include/asm-sh/irq.h: Ditto.
++ * include/asm-sh/processor.h: Ditto.
++
++2000-08-01 YAEGASHI Takeshi <yaegashi@ma.kcom.ne.jp>
++
++ * arch/sh/config.in, arch/sh/kernel/entry.S,
++ Documentation/Concigure.help: Add CONFIG_GDB_STUB_VBR.
++
++ * include/asm-sh/delay.h: Fix __udelay_val.
++
++ * drivers/video/hitfb.c (hitfb_encode_fix): Add break;
++
++ * drivers/char/hp600_keyb.c, drivers/char/scan_keyb.c: Fix key scan
++ tables and routines.
++
++2000-08-01 Stuart Menefy <stuart.menefy@st.com>
++
++ (These entries were written by gniibe.)
++ * Documentation/sh/new-machine.txt, arch/sh/kernel/io.c,
++ arch/sh/kernel/io_unknown.c, arch/sh/kernel/led_se.c,
++ arch/sh/kernel/mach_hp600.c, arch/sh/kernel/mach_se.c,
++ arch/sh/kernel/mach_unknown.c, arch/sh/lib/strcasecmp.c,
++ include/asm-sh/io_generic.h, include/asm-sh/io_hp600.h,
++ include/asm-sh/io_od.h, include/asm-sh/io_se.h,
++ include/asm-sh/io_unknown.h, include/asm-sh/machvec.h,
++ include/asm-sh/machvec_init.h: New files.
++
++ Overdrive support.
++ * arch/sh/overdrive/Makefile, arch/sh/overdrive/fpga.c,
++ arch/sh/overdrive/fpga.h, arch/sh/overdrive/galileo.c,
++ arch/sh/overdrive/gt64111.h, arch/sh/overdrive/io.c,
++ arch/sh/overdrive/irq.c, arch/sh/overdrive/led.c,
++ arch/sh/overdrive/mach.c, arch/sh/overdrive/overdrive.h,
++ arch/sh/overdrive/overdrive.ttf, arch/sh/overdrive/pcidma.c
++ arch/sh/overdrive/setup.c: New files
++
++ arch/sh/Makefile: Added support for OverDrive.
++
++ arch/sh/config.in: Remove CONFIG_IOPORT_START.
++ Added CONFIG_HEARTBEAT.
++
++ arch/sh/kernel/Makefile: Set O_OBJS for each machines.
++
++ arch/sh/kernel/cf-enabler.c (cf_init): Make it static.
++ arch/sh/kernel/io_generic.c: Make the functions generic.
++ arch/sh/kernel/io_hd64461.c: Make the functions specific.
++ arch/sh/kernel/io_se.c: Likewise.
++
++ arch/sh/kernel/irq.c (do_IRQ): Call irq_demux.
++
++ arch/sh/kernel/irq_imask.c (disable_imask_irq): Make it static.
++ arch/sh/kernel/irq_ipr.c: (disable_ipr_irq) Likewise.
++
++ arch/sh/kernel/pci-sh.c (pcibios_init, pcibios_setup): New functions.
++
++ arch/sh/kernel/setup.c (sh_mv): New variable.
++ (parse_cmdline): Support machine selection.
++
++ arch/sh/kernel/setup_hd64461.c (hd64461_irq_demux): New function.
++
++ arch/sh/kernel/setup_se.c (init_se_IRQ): Use new make_ipr_irq.
++
++ arch/sh/kernel/time.c: Support CONFIG_HEARTBEAT. Check MACH_HP600
++ at runtime.
++
++ arch/sh/lib/Makefile: Don't add -D__ASSEMBLY__. Add strcasecmp.o.
++
++ arch/sh/lib/checksum.S: Alignment fix.
++
++ arch/sh/mm/Makefile: Don't include ioremap.o.
++
++ include/asm-sh/dma.h: Added isa_dma_bridge_buggy.
++
++ include/asm-sh/hd64461.h: Added CONFIG_HD64461_IRQ.
++ include/asm-sh/ide.h: Added _hp600 functions.
++
++ include/asm-sh/io.h: Introduce Alpha convention.
++
++ include/asm-sh/irq.h: Added ACTUAL_NR_IRQS.
++
++ include/asm-sh/keyboard.h: Use MACH_HP600.
++
++ include/asm-sh/pci.h: Updated.
++
++ drivers/char/sh-sci.c, drivers/char/sh-sci.h: Counter support.
++ Don't set IPR in the driver.
++
++ drivers/net/Config.in: Remove condition CONFIG_SH_SOLUTION_ENGINE
++ for CONFIG_STNIC.
++
++ drivers/net/stnic.c: Check MACH_SE at runtime.
++
++ drivers/pci/pci.ids: Add GT-64111.
++ include/linux/pci_ids.h: Likewise.
++
++2000-07-31 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/bugs.h (check_bugs): Distinguish CPU type.
++
++2000-07-30 NIIBE Yutaka <gniibe@m17n.org>
++
++ Updated to 2.4.0-test5.
++
++2000-07-27 NIIBE Yutaka <gniibe@m17n.org>
++
++ Updated to 2.4.0-test5-pre6.
++
++ * include/asm-sh/sh_bios.h: Don't include
++ <config/sh/standard/bios.h>.
++
++2000-07-26 NIIBE Yutaka <gniibe@m17n.org>
++
++ Updated to 2.4.0-test5-pre5.
++
++ * include/asm-sh/mmu_context.h (switch_mm): Setting the bit only
++ when prev != next.
++
++ * arch/sh/kernel/sh_bios.c: Include <linux/config.h> instead of
++ <config/sh/standard/bios.h>.
++
++ * arch/sh/kernel/setup.c: We (already) include <linux/console.h>,
++ don't need including for CONFIG_SH_EARLY_PRINTK again.
++
++ * include/asm-sh/checksum.h: Include <linux/config.h>.
++
++ * include/asm-sh/serial.h: Not include <linux/config.h>.
++
++ * mm/mmap.c (exit_mmap): Flushing TLB is not needed.
++
++2000-07-24 NIIBE Yutaka <gniibe@m17n.org>
++
++ Updated to 2.4.0-test5-pre4.
++
++ * drivers/char/sh-sci.c: IRDA is for SH7709 only.
++
++2000-07-22 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/entry.S (debug_trap, debug_kernel):
++ #ifdef/#endif change, this is needed for SH BIOS call too.
++
++ * arch/sh/boot/compressed/head.S (init_sr): Set Block=0,
++ so that we can use BIOS call.
++
++2000-07-21 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Documentation/Configure.help (CONFIG_CPU_SUBTYPE_SH7708,
++ CONFIG_CF_ENABLER, CONFIG_SH_SCI): Updated.
++
++ (CONFIG_SH_SCIF): Removed.
++
++ * arch/sh/defconfig (CONFIG_SH_EARLY_PRINTK): Updated.
++
++ * drivers/char/tty_io.c (console_init): Don't call
++ sh_console_unregister.
++
++ * drivers/char/sh-sci.c (sci_console_init): Call
++ sh_console_unregister here, instead.
++
++2000-07-20 NIIBE Yutaka <gniibe@m17n.org>
++
++ Follow the changes of 2.4.0-test5-pre3.
++ * arch/sh/defconfig: Updated.
++
++2000-07-20 YAEGASHI Takeshi <yaegashi@ma.kcom.ne.jp>
++
++ * sh-sci.h (PORT_IRDA, SH3_IRDA_IRQS): New definition.
++ (SCI_INIT, SCI_NPORTS): Fixed for CONFIG_CPU_SUBTYPE_SH7708.
++
++ * sh-sci.c (sci_init_pins_irda): New Function.
++
++2000-07-19 Hiroshi Ito <ito@mlb.co.jp>
++
++ * arch/sh/mm/cache.c (detect_cpu_and_cache_system): Add __init
++ attribute.
++ * arch/sh/mm/cache.c (cache_system_info) Initialize it.
++
++2000-07-18 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/fault.c (update_mmu_cache): Bug fix. Avoid aliases
++ for shared page.
++ Reported by Stuart Menefy <stuart.menefy@st.com> on June 23th.
++
++ * arch/sh/mm/fault.c (__flush_tlb_phys): New function. Flush
++ TLB which corresponds the PHYS physical page.
++
++ * include/asm-sh/mmu_context.h (MMU_ITLB_DATA_ARRAY,
++ MMU_UTLB_DATA_ARRAY, MMU_UTLB_ENTRIES, MMU_U_ENTRY_SHIFT,
++ MMU_UTLB_VALID, MMU_ITLB_ENTRIES, MMU_U_ENTRY_SHIFT,
++ MMU_ITLB_VALID): New definition.
++
++2000-07-18 Stuart Menefy <stuart.menefy@st.com>
++
++ * mm/mmap.c (exit_mmap): Bug fix. Added flush_cache_range and
++ flush_tlb_range.
++
++ * arch/sh/kernel/entry.S (restore_all): Bug fix. Correct the
++ handling IMASK-bits.
++
++2000-07-13 Yutarou Ebihara <ebiharaml@si-linux.com>
++
++ * arch/sh/kernel/io_generic.c (insw, insl, outsw, outsl): Work
++ around implemented.
++
++2000-07-11 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/boot/compressed/Makefile (ZIMAGE_OFFSET): Add more
++ 64KB for the use of program loader which loads the image from
++ second storage.
++
++ Follow the changes of test3-pre9.
++ * arch/sh/kernel/time.c (do_settimeofday): Updated.
++ (do_gettimeofday): Use wall_jiffies.
++
++ * arch/sh/kernel/process.c (cpu_idle): Follow the change of
++ 2.4.0-test3-pre9.
++
++ * include/asm-sh/timex.h (cycles_t): Type changed to long long.
++
++ * arch/sh/kernel/entry.S (tsk_ptrace): Change the offset value,
++ following the change of linux/sched.h:(struct task_struct).
++
++2000-07-08 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/sh_ksyms.c (drive_info): Removed.
++ It's x86 specific code.
++
++ Follow the change of test3-pre5.
++ * include/asm-sh/bitops.h (minix_test_and_set_bit): Added.
++ * arch/sh/kernel/process.c (sys_execve): Remove lock_kernel and
++ unlock_kernel.
++ * arch/sh/kernel/signal.c (do_signal): Likewise.
++
++2000-07-07 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/bitops.h (set_bit, clear_bit, change_bit,
++ test_and_set_bit, test_and_clear_bit, test_and_change_bit,
++ test_bit, ext2_set_bit, ext2_clear_bit, ext2_test_bit):
++ Add qualifier `volatile'.
++
++2000-07-06 NIIBE Yutaka <gniibe@m17n.org>
++
++ Follow the change of test3-pre4.
++ * arch/sh/kernel/sys_sh.c (do_mmap2): Remove
++ lock_kernel/unlock_kernel.
++ (sys_pipe): Likewise.
++
++2000-07-04 NIIBE Yutaka <gniibe@m17n.org>
++
++ Use CONFIG_CPU_LITTLE_ENDIAN (it's used for MIPS).
++ * Documentation/Configure.help: Merge the help message.
++ * arch/sh/Makefile: Use CONFIG_CPU_LITTLE_ENDIAN, instead of
++ CONFIG_LITTLE_ENDIAN.
++ * arch/sh/defconfig: Likewise.
++ * arch/sh/vmlinux.lds.S: Likewise.
++
++ Follow the chane of test3-pre2.
++ * arch/sh/kernel/setup.c (rom_resources): Removed.
++
++ * include/asm-sh/softirq.h (in_softirq, cpu_bh_disable,
++ cpu_bh_enable): Use __local_bh_count and __local_irq_count.
++
++ * include/asm-sh/hardirq.h (local_irq_count, local_bh_count):
++ Define Macros.
++
++ * arch/sh/kernel/sh_ksyms.c (local_bh_count, local_irq_count):
++ Removed.
++
++ * arch/sh/kernel/irq.c (__local_bh_count): Renamed from
++ local_bh_count.
++ (__local_irq_count): Renamed from local_irq_count.
++
++2000-06-27 Yutarou Ebihara <ebiharaml@si-linux.com>
++
++ * arch/sh/kernel/cf-enabler.c (cf_init): Use ctrl_outw instead
++ of outw.
++
++2000-06-25 NIIBE Yutaka <gniibe@m17n.org>
++
++ Follow the change of 2.4.0-test2.
++ * arch/sh/kernel/time.c: Include <linux/config.h>.
++ * include/asm-sh/keyboard.h: Likewise.
++ * arch/sh/defconfig: Updated.
++
++2000-06-22 Stuart Menefy <stuart.menefy@st.com>
++
++ * driver/char/{sh-sci.c,sh-sci.h}, include/asm-sh/io.h: Changes to
++ support multiple SCI/SCIF ports concurrently. NOTE: new major device
++ number for on-chip serial ports.
++
++ * drivers/char/{Makefile,tty_io.c}, include/asm-sh/serial.h,
++ arch/sh/config.in, arch/sh/kernel/serup_se.c: Add support for 16550
++ compatible UARTS.
++
++2000-06-18 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/boot/compressed/misc.c (puts): Don't call put_string.
++
++ * arch/sh/Makefile (tool_prefix): Renamed from tool-prefix.
++
++ * include/asm/checksum.h (csum_ipv6_magic): Define only when
++ CONFIG_IPV6 is enabled.
++
++ Follow the change of 2.4.0-test1-ac20.
++ * arch/sh/kernel/setup.c (memparse): Removed.
++
++2000-06-17 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/defconfig: Updated.
++
++ Follow the change of 2.4.0-test1-ac19.
++ * arch/sh/kernel/entry.S (tsk_ptrace): Use ptrace field and
++ PT_TRACESYS.
++ * arch/sh/kernel/ptrace.c (sys_ptrace, syscall_trace): Likewise.
++ * arch/sh/kernel/signal.c (do_signal): Likewise.
++ * arch/sh/kernel/process.c (sys_execve): Likewise.
++
++2000-06-13 Stuart Menefy <stuart.menefy@st.com>
++
++ * include/asm-sh/uaccess.h: Fixed __copy_user to return the number
++ of bytes not copied rather than EFAULT when an error occurs.
++
++ * arch/sh/config.in, arch/sh/kernel/Makefile,
++ arch/sh/kernel/setup_od.c:
++ Added STMicroelectronics Overdrive support.
++
++ * arch/sh/kernel/setup.c, arch/sh/kernel/time.c,
++ drivers/char/sh-sci.h, include/asm-sh/processor.h:
++ Added recording of the various clock frequencies, and use the
++ module clock frequency when setting the serial port baud rate.
++
++ * drivers/char/sh-sci.c: Modifications to set the baud rate
++ when used as the console.
++
++2000-06-11 YAEGASHI Takeshi <yaegashi@ma.kcom.ne.jp>
++
++ * include/asm-sh/linux_logo.h: Needed for the frame buffer console.
++ Would anyone design and contribute our logo? :->
++
++ * net/ipv4/ipconfig.c: Remove inclusion of <asm/segment.h>.
++
++ * drivers/char/Makefile, include/asm-sh/keyboard.h,
++ drivers/char/scan_keyb.c, drivers/char/scan_keyb.h,
++ drivers/char/hp600_keyb.c: Add generic scan keyboard driver and
++ HP690 scan code table.
++
++ * arch/sh/kernel/Makefile, arch/sh/kernel/irq.c,
++ arch/sh/kernel/io_hd64461.c, arch/sh/kernel/setup_hd64461.c,
++ include/asm-sh/hd64461.h,: Add support for HD64461 companion chip.
++
++ * drivers/video/Config.in, drivers/video/Makefile,
++ drivers/video/fbmem.c, drivers/video/hitfb.c: Add support for
++ HD64461 frame buffer.
++
++ * drivers/char/vt.c: Add !defined(__sh__) to the #if conditionals to
++ avoid sys_ioperm().
++
++ * arch/sh/kernel/time.c, drivers/char/sh-sci.h,
++ include/asm-sh/ide.h: ad hoc work around for HP690...
++
++ * arch/sh/config.in: introduce new configs: CONFIG_SH_HP600,
++ CONFIG_HD64461, and so on.
++
++ * arch/sh/boot/compressed/Makefile: my kernel is now bigger than
++ 1MB...
++
++2000-06-09 Tadashi Kadowaki <kadowaki@white.plala.or.jp>
++
++ * arch/sh/Makefile (CFLAGS, AFLAGS, LDFLAGS): Support big endian.
++
++2000-06-08 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/ptrace.c (sys_ptrace): Bug fix. Change the
++ last argument of access_process_vm.
++
++ (ubc_set_tracing): Handle SH7709's UBC. I don't know it's right.
++ I see SH7729 manual.
++
++2000-06-08 YAEGASHI Takeshi <yaegashi@ma.kcom.ne.jp>
++
++ * include/asm-sh/pgtable.h (mk_pte_phys): Don't add + __MEMORY_START.
++ 2000-05-18 change is wrong.
++
++2000-06-07 Toshiharu Nozawa <nozawat@hitachi-ul.co.jp>
++
++ Compact Flash Support for SolutionEngine.
++ * arch/sh/kernel/cf-enabler.c (cf_init): Implemented for
++ SolutionEngine.
++
++ * include/asm-sh/hitachi_se.h (PA_MRSHPC_*, MRSHPC_*): Added.
++
++ * arch/sh/config.in: SolutionEngine may use enabler.
++
++2000-06-02 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/entry.S (Throughout): Use ".align 2" instead
++ of ".balign 4".
++ (debug_kernel): Renamed from "debug".
++ (debug_trap): Implemented.
++ (system_call): Call debug_trap.
++
++ * arch/sh/kernel/process.c (break_point_trap_software): New
++ function.
++ (break_point_trap): Define arguments.
++
++ * arch/sh/kernel/entry.S (system_call): Push/Pop registers
++ against syscall_trace, those may be clobbered.
++
++2000-06-01 NIIBE Yutaka <gniibe@m17n.org>
++
++ * net/sunrpc/clnt.c, fs/nfs/read.c, fs/nfs/proc.c,
++ fs/nfs/nfs3proc.c, fs/nfs/file.c, fs/nfs/dir.c: Remove inclusion
++ of <asm/segment.h>, as Trond agreed to do that.
++
++ * drivers/net/stnic.c (stnic_reset): Add last "\n".
++ (stnic_block_output): Added magic curses from oaknet.c.
++
++2000-05-25 NIIBE Yutaka <gniibe@m17n.org>
++
++ Follow the change of pre10-2.
++ * include/asm-sh/ide.h (ide_init_hwif_ports): set IDE_IRQ_OFFSET=0.
++
++2000-05-22 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/Makefile (OBJCOPY): Added -R .stab and -R .stabstr too.
++
++ * arch/sh/vmlinux.lds.S: Fill nop (=0x0009) for .text section.
++ (.empty_zero_page): Make it independent section.
++
++ * arch/sh/boot/compressed/Makefile: Remove setting of CFLAGS here.
++ (ZIMAGE_OFFSET): Calculate the value by shell.
++ (piggy.o: OBJCOPY): Added -R .empty_zero_page.
++
++ * arch/sh/boot/compressed/head.S (kernel_start_addr): Use _text.
++ Remove __ASSEMBLY__ for newer kernel.
++
++ * arch/sh/boot/compressed/misc.c (decompress_kernel): Return type
++ changed to void (was: int).
++ (memcpy): Let it return value.
++ (memset): Ditto.
++ (HEAP_SIZE): Make it big enough.
++ (decompress_kernel): Use _text for initialization of output_ptr.
++
++ * drivers/char/sh-sci.c (put_char, put_string, get_char,
++ handle_error, lowhex, highhex, hexchars): Moved to ...
++ drivers/char/sh-sci.h: ...here.
++ drivers/char/sh-sci.c (gdb_detach): Added __init qualifier.
++
++ Bug fix.
++ * include/asm-sh/uaccess.h (__copy_user): Bug fix for __N == 0.
++ Reported by Toshinobu Sugioka <sugioka@itonet.co.jp>.
++
++2000-05-18 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/pgtable.h (mk_pte_phys): Bug fix. Added
++ __MEMORY_START.
++
++ Bug fixes for swap entry encoding and pte encoding.
++ (_PAGE_FLAGS_HARDWARE_MASK): Mask V-bit.
++ (_PAGE_FLAGS_HARDWARE_DEFAULT): Enable V-bit.
++ Make _PAGE_PRESENT as software flag, and let it be the b0-bit.
++
++2000-05-17 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/fault.c (update_mmu_cache): We don't need to call
++ __flush_tlb_page. See the implementation of establish_pte in
++ mm/memory.c.
++ (handle_vmalloc_fault): Instead, call __flush_tlb_page here.
++ (update_mmu_cache): Conditionalize the setting of PTEH.
++ (handle_vmalloc_fault): Change the first argument type.
++
++2000-05-16 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/boot/compressed/Makefile (head.o): Remove dependency
++ to $(TOPDIR)/include/linux/tasks.h.
++
++ * arch/sh/boot/compressed/head.S: Removed #include <asm/segment.h>.
++
++2000-05-16 NIIBE Yutaka <gniibe@m17n.org>
++
++ Compressed vmlinux support by Stuart Menefy.
++ ftp.uk.linux.org:/pub/superh/linux-2.2.13-shpatch-0.03.gz
++ * arch/sh/boot/Makefile,
++ arch/sh/boot/compressed/Makefile,
++ arch/sh/boot/compressed/misc.c,
++ arch/sh/boot/compressed/install.sh,
++ arch/sh/boot/compressed/head.S: New files imported.
++
++2000-05-14 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/lib/checksum.S (csum_partial): Improved a bit.
++ * include/asm-sh/checksum.h (ip_fast_csum): Improved implementation
++ for both of code size and speed.
++ (csum_fold): Removed last line: "extu.w %0, %0". It's not needed,
++ as it always cast to unsigned short. Caution: the result value as
++ "unsigned int" is different.
++
++2000-05-13 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/time.c (time_init): Bug fix for SH-3's CPG.
++ Not fully implementation yet.
++
++ * include/asm-sh/smc37c93x.h (GPIO46_INDEX, GPIO47_INDEX): Added.
++ * arch/sh/kernel/setup_se.c (init_smsc): Added setting of
++ nIO{R,W}OP. Suggested by Toshiharu Nozawa <nozawat@hitachi-ul.co.jp>.
++
++ * include/asm-sh/unistd.h (_syscall5): Bug fix.
++
++ * arch/sh/kernel/irq.c (init_irq_proc): Added.
++
++2000-05-09 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/lib/checksum.S: Bug fix for big endian.
++
++ * arch/sh/kernel/ptrace.c (sys_ptrace): Follow the change of
++ 2.3.99-pre7-6.
++ * arch/sh/mm/fault.c (do_page_fault): Likewise.
++
++2000-05-08 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/net/stnic.c: New file by Kazumoto Kojima.
++ (stnic_probe): Changed the prototype.
++ (stnic_probe): Use new style probing API.
++
++ * include/asm-sh/hitachi_se.h (IRQ_STNIC): Added.
++
++ * arch/sh/kernel/time.c (time_init): New variable `bus_clock'.
++
++2000-05-08 Toshinobu Sugioka <sugioka@itonet.co.jp>
++
++ * include/asm-sh/checksum.h (csum_fold): Change the implementation
++ for readability and in case it is used with no cast to ushort.
++
++ * arch/sh/lib/checksum.S: Shift 8-bit when it's big endian.
++
++2000-05-06 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm/io.h (outb, outb_p, outw, outl): Fix the prototype.
++ * arch/sh/kernel/io_se.c (outb, outb_p, outw, outl): Follow the
++ change of io.h.
++
++ * arch/sh/kernel/io_generic.c (inb, inb_p, inw, inl, insb, insw,
++ insl, outb, outb_p, outw, outl, outsb, outsw, outsl): Fix the
++ prototype.
++
++ * arch/sh/kernel/setup_se.c (init_smsc): Removed setting of
++ POWER_CONTROL, since it is done by ACTIVATE.
++
++2000-05-05 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/char/sh-sci.h (SCI_IPR_ADDR): Fixed typo.
++ * arch/sh/kernel/setup_se.c (init_se_IRQ): Fixed the value, it is
++ inverted.
++
++2000-05-03 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/irq.c (do_IRQ): Don't call sti.
++
++ * arch/sh/kernel/irq_ipr.c (make_ipr_irq): Don't enable it at this
++ time. It will be enabled when request_irq is called.
++
++ Fixes for I/O handling.
++ * arch/sh/kernel/setup_se.c (smsc_config): Use outb_p.
++ (init_smsc): Set Power Control register.
++
++ * include/asm-sh/io.h (inb_p, outb_p): Added.
++ (inb, inw, inl): Fix the return value type.
++
++ * arch/sh/kernel/io_generic.c (delay, inb_p, outb_p): New functions.
++ * arch/sh/kernel/io_se.c (delay, inb_p, outb_p): New functions.
++
++ * include/asm/irq.h (INTC_IPRB): Fix typo.
++
++2000-05-03 NIIBE Yutaka <gniibe@m17n.org>
++
++ New I/O handling.
++ * arch/sh/kernel/io_generic.c: New file.
++
++ * arch/sh/config.in (CONFIG_IOPORT_START): New CONFIG variable.
++ (CONFIG_CF_ENABLER): Conditionalize it (Not for SolutionEngine).
++
++ * include/asm-sh/ide.h (ide_default_irq, ide_default_io_base):
++ Use PORT, instead of ADDR.
++
++ * include/asm-sh/io.h (inb_local, outb_local): Removed.
++ (inb,inw,inl,insb,insw,insl,outb,outw,outl,outsb,outsw,outsl):
++ Make them real function.
++ (sh_isa_slot,isa_readb,isa_readw,isa_readl,isa_writeb,
++ isa_writew,isa_writel,isa_memset_io,isa_memcpy_fromio): Added.
++
++ SolutionEngine support.
++ * include/asm-sh/smc37c93x.h: New file by Kazumoto Kojima.
++ * arch/sh/kernel/setup_se.c: New file by Kazumoto Kojima.
++ * include/asm-sh/hitachi_se.h: Ditto.
++
++ * arch/sh/kernel/Makefile (O_OBJS): Added irq_ipr.o, removing
++ irq_onchip.c. Added setup_se.c.
++
++2000-05-02 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/fault.c (do_page_fault): Bug fix. When "Oops", we
++ don't try to follow the page handling data when PGDIR==0.
++
++ * arch/sh/kernel/time.c (time_init): Removed IPR setting.
++ * arch/sh/kernel/irq_ipr.c (init_IRQ): ... moved to here.
++
++ * drivers/char/sh-sci.c (sci_init): Use new calling of set_ipr_data.
++ * drivers/char/sh-sci.h (SCI_IPR_POS, SCI_IPR_ADDR): New macros.
++ (SCI_IPR_OFFSET): Removed.
++
++ * arch/sh/kernel/irq_ipr.c (startup_ipr_irq, ipr_irq_type,
++ disable_ipr_irq, enable_ipr_irq, make_ipr_irq, mask_and_ack_ipr,
++ end_ipr_irq): Renamed from *_onChip_*.
++ (struct ipr_data): Added member POS. Remove OFFSET, and added ADDR.
++ (startup_onChip2_irq, onChip2_irq_type, disable_onChip2_irq,
++ enable_onChip2_irq, mask_and_ack_onChip2, end_onChip2_irq): Removed.
++
++ * include/asm-sh/irq.h (make_ipr_irq): Renamed from make_onChip_irq.
++ (set_ipr_data): Change the prototype for address.
++
++ * arch/sh/kernel/irq_ipr.c: Renamed from irq_onchip.c.
++
++2000-05-01 NIIBE Yutaka <gniibe@m17n.org>
++
++ Support of SH7709A.
++ * arch/sh/kernel/time.c (do_timer_interrupt): Remove Takeshi's
++ debugging code (output to Port C).
++
++ * drivers/char/sh-sci.h (PCLK): Added value for my SH7709A board.
++ * drivers/char/sh-sci.c (sci_set_termios_cflag): Added SH7709's
++ SCPCR/SCPDR handling.
++ (put_char, get_char): Added dummy read of SC_SR, Without this, some
++ garbage characters would appear on SH7709A.
++
++2000-04-30 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/entry.S (restore_all): Bug fix. We should consider
++ FPU exception within the critical region. We should not change the
++ IMASK value in this case. Or else, we would introduce a "hole" in
++ the critical region.
++
++ * arch/sh/mm/fault.c (update_mmu_cache): Bug fix. We need to flush
++ ITLB.
++
++ * arch/sh/kernel/time.c (time_init): Bug fix. The interval should
++ depend on HZ.
++
++2000-04-29 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache.c (flush_cache_all): Don't touch CCR.
++ (flush_cache_range): Don't call icache_purge_range.
++ (dcache_flush_range, dcache_purge_range): Removed.
++
++ * arch/sh/kernel/entry.S (system_call): Bug fix. Substract 0x40
++ from TRA number.
++
++ * arch/sh/kernel/signal.c (save_sigcontext_fpu): Cosmetic fix.
++ Use __copy_to_user as it's user-space value.
++
++2000-04-28 NIIBE Yutaka <gniibe@m17n.org>
++
++ Bug fixes of cache handling of SH-4.
++ * arch/sh/mm/cache.c (dcache_flush_range, dcache_purge_range,
++ dcache_wback_range): Renamed from cache_flush_area,
++ cache_purge_area, cache_wback_area, and only handle D-cache.
++
++ (icache_purge_range): New function.
++ (flush_icache_range): Use icache_purge_range.
++
++ (flush_icache_page): Bug fix. Rewritten.
++ (flush_cache_range): Bug fix. Rewritten.
++ (flush_page_to_ram): Implemented.
++
++ (cache_wback_all): Assumes it is called P2 area, and make
++ it inline function.
++ (cache_init): Jump to P2-area before calling cache_wback_all.
++ (flush_cache_all): Likewise.
++
++ (CACHE_IC_ENTRY_SHIFT, CACHE_IC_NUM_ENTRIES,
++ CACHE_OC_ENTRY_PHYS_MASK): New macros.
++
++ * include/asm-sh/cache.h (cache_flush_area, cache_purge_area,
++ cache_wback_area): Hide them as cache.c static function.
++
++2000-04-27 NIIBE Yutaka <gniibe@m17n.org>
++
++ Bug fix of cache handling of SH-4.
++ * arch/sh/mm/cache.c (flush_page_to_ram): Replaced from
++ __flush_page_to_ram.
++ * include/asm-sh/pgtable.h (__flush_page_to_ram): Removed.
++ (flush_page_to_ram): Declare directly.
++ * include/asm-sh/system.h (back_to_P1): Added one more nop.
++
++ Cosmetic change for TLB handling of SH-4.
++ * arch/sh/mm/fault.c (__flush_tlb_page): Removed useless
++ ITLB handling.
++
++ Updated to 2.3.99-pre6.
++ * include/asm-sh/{atomic.h,delay.h,hardirq.h,smplock.h,system.h}:
++ Follow the change of 2.3.99-pre6-7.
++ * arch/sh/mm/fault.c (__verify_write, do_page_fault): Follow the
++ change of 2.3.99-pre6-6.
++
++2000-04-24 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.3.99-pre6-5.
++
++2000-04-22 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/entry.S (debug, system_call, restore_all,
++ handle_exception): Change the order of push/pop, and accessing
++ memory on the stack. Introduce new syscall ABI.
++
++ * include/asm-sh/ptrace.h (struct pt_regs): Reorganize the
++ structure.
++ * include/asm-sh/sigcontext.h: Likewise.
++
++ * arch/sh/kernel/signal.c (setup_frame, setup_rt_frame):
++ Use New ABI.
++ * arch/sh/kernel/process.c (kernel_thread): Use New ABI.
++ * include/asm-sh/unistd.h (_syscall0, _syscall1, _syscall2,
++ _syscall3, _syscall4, _syscall5): Use New ABI.
++
++ * arch/sh/kernel/process.c (sys_execve, sys_vfork, sys_clone,
++ sys_fork): Follow the change of syscall ABI.
++ * arch/sh/kernel/signal.c (sys_sigsuspend, sys_rt_sigsuspend,
++ sys_sigaltstack, sys_sigreturn, sys_rt_sigreturn): Likewise.
++ * arch/sh/kernel/sys_sh.c (sys_pipe): Likewise.
++
++2000-04-21 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/time.c (RCR1_*, RCR2_*): Defined.
++ (set_rtc_time, get_rtc_time, get_cpu_mhz): Use them.
++
++ * arch/sh/kernel/time.c (get_rtc_time): Bug fix. Clear CF-bit every
++ time. Set RCR2_RTCEN to start RTC.
++
++ * include/asm-sh/elf.h (SET_PERSONALITY): Follow the change
++ of 2.3.99-pre6-3.
++
++2000-04-20 NIIBE Yutaka <gniibe@m17n.org>
++
++ Change how to set syscall_nr.
++ * arch/sh/kernel/entry.S (handle_exception): Set syscall_nr = -1,
++ as default.
++ (system_call): Set syscall_nr.
++ * arch/sh/kernel/entry.S (tlb_miss_load, tlb_miss_store,
++ initial_page_write, tlb_protection_violation_load,
++ tlb_protection_violation_store, error): Don't touch syscall_nr.
++ * arch/sh/kernel/fpu.c (do_fpu_state_restore, do_fpu_error): Likewise.
++ * arch/sh/kernel/traps.c (DO_ERROR): Likewise.
++ * arch/sh/kernel/irq.c (do_IRQ): Likewise.
++
++ Change IMASK irq handling implementation.
++ * arch/sh/kernel/entry.S (restore_all, STI): Use r6_bank, instead
++ of r5_bank.
++ * arch/sh/kernel/irq_imask.c (set_interrupt_registers): Likewise.
++ * arch/sh/kernel/head.S (_stext): Likewise.
++ * include/asm-sh/system.h (__sti): Likewise.
++
++ Change CURRENT implementation. Use $r7_bank1 to have pointer to
++ "current" task, instead of having stack pointer in $r4_bank1.
++ * include/asm-sh/current.h (get_current): Use $r7_bank.
++ * arch/sh/kernel/process.c (__switch_to): Save to $r7_bank.
++ * arch/sh/kernel/entry.S (system_call, ret_with_reschedule,
++ handle_exception): Use $r7_bank.
++ * arch/sh/kernel/traps.c (dump_stack): Likewise.
++ * arch/sh/kernel/head.S (_stext): Likewise.
++
++ Bug fix.
++ * arch/sh/mm/cache.c (flush_cache_all): Assume that it is called in
++ interrupt disabled state.
++ (flush_cache_all): Fixed race condition.
++
++ * arch/sh/kernel/fpu.c (do_fpu_state_restore): Release FPU.
++
++2000-04-16 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/fpu.c (do_fpu_state_restore, fpu_prepare_fd):
++ Handle complicated situation where it gets inconsistent. It would
++ be good if SH has some atomic op-code for handling SR register,
++ or ll/sc.
++
++ * arch/sh/kernel/process.c (__switch_to, dump_fpu, copy_thread):
++ Fix race conditions where FPU registers may be corrupted. I.e.,
++ protect unlazy_fpu.
++ * arch/sh/kernel/signal.c (save_sigcontext_fpu): Likewise.
++
++2000-04-14 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/entry.S (STI): It was wrong. Replace from
++ RESTORE_FLAGS.
++
++ * include/asm-sh/system.h (__restore_flags): Use __sti.
++
++ * arch/sh/kernel/irq_imask.c (set_interrupt_registers): Bug fix.
++ We do compare the b7-b4 bits.
++
++2000-04-09 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/irq_imask.c (imask_irq_type) : Change the name
++ so that output of /proc/interrupt looks good.
++ * arch/sh/kernel/irq_onchip.c (onChip_irq_type, onChip2_irq_type):
++ Likewise.
++
++ * arch/sh/kernel/entry.S (RESTORE_FLAGS): Bug fix. Compare
++ four bits properly.
++
++ * drivers/char/sh-sci.c (sci_init_drivers): Add CRTSCTS flag.
++
++ * include/asm-sh/elf.h (ELF_PLAT_INIT): Initialize SR register.
++
++ * arch/sh/kernel/signal.c (sys_sigsuspend, sys_rt_sigsuspend,
++ sys_sigaltstack, sys_sigreturn, sys_rt_sigreturn): Follow new
++ syscall ABI.
++
++ * arch/sh/kernel/sys_sh.c (sys_pipe): Follow new syscall ABI.
++
++ * arch/sh/kernel/entry.S (system_call): Bug fix. Access SP+8, since
++ $r2 and $r3 are on the stack.
++
++ * include/asm-sh/unistd.h (_syscall5): Follow the change of ABI.
++
++2000-04-08 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/config.in: Updated to 2.3.99-pre4-pre5.
++ * arch/sh/kernel/Makefile (.S.o, head.o): Likewise.
++ * arch/sh/lib/Makefile (.S.o): Likewise.
++ * arch/sh/mm/init.c (paging_init): Likewise.
++ * include/asm-sh/namei.h (__emul_prefix): Likewise.
++
++ * arch/sh/defconfig: Updated.
++
++ Syscall ABI changes suggested by Stuart Menefy.
++ * arch/sh/kernel/process.c (sys_fork, sys_clone, sys_vfork,
++ sys_execve): Follow new syscall ABI.
++
++ * arch/sh/kernel/entry.S: New macro COMPAT_OLD_SYSCALL_ABI.
++ New syscall ABI which use $r2 and $r3.
++
++2000-04-05 Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
++
++ * arch/sh/kernel/head.S: Initialize FPU.
++ * arch/sh/kernel/fpu.c (save_fpu, restore_fpu): Set FPSCR
++ register (SZ=0) before FMOV.S operation.
++ * arch/sh/kernel/entry.S (handle_exception, restore_all): Likewise.
++ * arch/sh/kernel/entry.S (handle_exception): Bug fix for setting $k1.
++ We should better not use delay slot for PC-relative-load.
++
++ * arch/sh/kernel/signal.c (restore_sigcontext): Fix the tsk.
++ (restore_sigcontext_fpu): Fix the structure member name.
++ (save_sigcontext_fpu): Likewise.
++
++2000-04-03 Ludovic LANGE <ludovic.lange@free.fr>
++
++ * include/asm-sh/ptrace.h (UBC_*): Fix the values.
++
++2000-04-01 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/hardirq.h (in_interrupt): Bug fix.
++ (local_bh_count): Moved from softirq.h.
++
++2000-03-25 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/char/sh-sci.c: Use module_init.
++
++ * arch/sh/defconfig: Updated.
++
++ * include/asm-sh/sigcontext.h(struct sigcontext): Following the
++ usage of GCC, change sc_xfpregs --> sc_xdregs.
++
++ * arch/sh/kernel/process.c (copy_thread): Don't use struct_cpy.
++ * include/asm-sh/string.h (struct_cpy): Removed. As we have memcpy
++ implementation.
++
++2000-03-22 NIIBE Yutaka <gniibe@m17n.org>
++
++ Merge "ptrace" by Kaz.
++ * arch/sh/kernel/ptrace.c (ubc_set_tracing, compute_next_pc):
++ New functions. Implemented by Kaz Kojima.
++
++ * arch/sh/kernel/process.c (break_point_trap): New function.
++ Implemented by Kaz Kojima.
++
++2000-03-21 Sugioka Toshinobu <sugioka@itonet.co.jp>
++
++ * include/asm-sh/uaccess.h (__clear_user): Bug fix.
++ (__strncpy_from_user): Bug fix.
++
++2000-03-20 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/unistd.h (__NR_mincore, __NR_madvise): Follow
++ the change of 2.33.99-pre2.
++ * include/asm-sh/mman.h (MADV_*): Likewise.
++ * arch/sh/kernel/entry.S: Likewise.
++
++ * drivers/char/sh-sci.c (sci_set_real_termios): Follow the change of
++ interface of generic_serial.h of 2.33.99-pre2.
++
++ * include/asm-sh/page.h (clear_user_page, copy_user_page): Follow
++ the change of 2.33.99-pre2.
++ * include/asm-sh/pci.h: Likewise.
++
++2000-03-11 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/ptrace.h: Change the order of the member,
++ so that implementation of ptrace gets straight.
++ Remove SP and use REGS[15] instead.
++ * include/asm-sh/sigcontext.h: Likewise.
++
++ * arch/sh/kernel/entry.S (debug, system_call, restore_all,
++ handle_exception): Change the order of push/pop, and reference.
++
++ * arch/sh/kernel/signal.c: Follow the change of struct pt_regs.
++ * arch/sh/kernel/process.c: Likewise.
++
++2000-03-10 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/config.in: Follow the change of 2.3.51.
++ * arch/sh/defconfig: Updated.
++
++ * arch/sh/kernel/signal.c (restore_sigcontext_fpu): New function.
++ (restore_sigcontext): Restore FPU context when used.
++ (save_sigcontext_fpu): New function.
++ (setup_sigcontext): Save FPU context.
++ Based on Kaz' implementation, preserving API of sigcontext.h.
++
++2000-03-09 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/sigcontext.h: Added members for FPU registers.
++ (Originally done by Kaz Kojima)
++
++2000-03-07 Terumitsu Kohama <tkohama@hipro.hitachi-hipro.co.jp>
++
++ * drivers/char/sh-sci.h (SCBRR_VALUE): Fix the expression.
++
++2000-03-07 Sugioka Toshinobu <sugioka@itonet.co.jp>
++
++ * include/asm-sh/system.h (jump_to_P2, back_to_P1): Improved.
++ * arch/sh/mm/fault.c (__flush_tlb_page): Bug fix for SH-4.
++ Change TLB from P2.
++
++ * include/asm-sh/processor.h (TASK_SIZE): Change the value
++ for SH7709/SH7750 (was: 0x80000000).
++
++2000-03-07 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/defconfig: Updated.
++
++ * include/asm-sh/system.h (jump_to_P2, back_to_P1): Moved
++ from cache.c.
++
++ * arch/sh/mm/cache.c: Use new macro.
++
++ * arch/sh/kernel/entry.S: Replace STI with RESTORE_FLAGS,
++ to allow exception in critical region (interrupt stopped).
++
++ Follow the changes of 2.3.49.
++ * include/asm-sh/pgtable.h (FIRST_USER_PGD_NR): New macro.
++ * include/asm-sh/socket.h (SO_PEERNAME): New macro.
++
++2000-03-06 NIIBE Yutaka <gniibe@m17n.org>
++
++ Use IMASK for cli/sti (instead of BL).
++ Suggested by Sugioka Toshinobu <sugioka@itonet.co.jp>.
++ (Initial implementation was done by Kaz Kojima for SH-4.)
++
++ * arch/sh/kernel/entry.S: Use r5_bank to hold the imask value.
++ * arch/sh/kernel/irq_imask.c: Likewise.
++ * arch/sh/kernel/head.S: Likewise.
++ * include/asm-sh/system.h (__sti, __cli, __save_flags,
++ __save_and_cli, __restore_flags): New Implementation.
++
++2000-03-06 Sugioka Toshinobu <sugioka@itonet.co.jp>
++
++ * drivers/char/sh-sci.h: Add SH-4 support.
++ * drivers/char/sh-sci.c (sci_set_baud, sci_set_termios_cflag):
++ Support lower baudrate.
++ (sci_rx_interrupt, sci_tx_interrupt): Always clear out interrupt
++ source to avoid interrupt loop.
++
++2000-03-05 Greg Banks <gregory.banks@nstc.nec.com.au>
++
++ * drivers/char/sh-sci.c (sci_set_baud), drivers/char/sh-sci.h
++ (BPS_*): Support more BPSs.
++
++2000-03-05 NIIBE Yutaka <gniibe@m17n.org>
++
++ Follow the changes of 2.3.48.
++ * arch/sh/kernel/setup.c (setup_arch): Call paging_init.
++ * include/asm-sh/pgtable.h: Declare paging_init.
++
++2000-03-04 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/lib/div.S: New file.
++ * arch/sh/kernel/fpu.c (enable_fpu_in_danger): New function.
++
++2000-03-03 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/system.h (__restore_flags): Inherit IMASK and SR.
++
++2000-03-02 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/processor.h (clear_fpu): Don't release_fpu().
++
++2000-03-01 Sugioka Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/mm/fault.c (__flush_tlb_page): Bug fix. The mask value
++ was wrong (was: 0x30).
++
++2000-02-29 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/process.c (kernel_thread): Call unlazy_fpu.
++
++ * arch/sh/kernel/fpu.c (do_fpu_state_restore): Bug fix. Grab FPU
++ before restore/unlazy_fpu/fpu_init or else, it causes system reset.
++
++ * arch/sh/kernel/irq.c (do_IRQ): Add __sti() before calling softirq.
++
++2000-02-27 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/char/sh-sci.h (SC_SR): Bug fix. It's 16-bit for SH-4.
++
++ * arch/sh/kernel/head.S: Removed initalization of FPU.
++ * arch/sh/kernel/setup.c (setup_arch): ...Moved here.
++ Besides, set used_math and flags of init_task.
++
++2000-02-26 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/user.h (struct user): Add u_fpvalid.
++
++ * arch/sh/kernel/head.S: SR.FD=1 on initialization.
++
++ * arch/sh/kernel/fpu.c (fpu_prepare_fd, do_fpu_state_restore,
++ do_fpu_error, fpu_init): Implemented.
++
++ * arch/sh/kernel/entry.S (restore_all, handle_exception): Handle FPU.
++
++2000-02-24 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/process.c (__switch_to): Call unlazy_fpu.
++ (last_task_used_math): Removed.
++
++ * include/asm-sh/elf.h (elf_fpregset_t): Change the definition.
++ * include/asm-sh/user.h (user_fpu_struct): Added.
++ (struct user): Added fpu support.
++
++ * arch/sh/kernel/Makefile (O_OBJS): Add fpu.o for CONFIG_CPU_SH4.
++
++2000-02-23 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/fault.c (do_page_fault): Bug fix. (The value
++ stored in MMU_TTB is kernel address (not physical address)).
++
++ * include/asm-sh/unistd.h (_syscall5): Added.
++ (_syscall4): Bug fix of register __sc7.
++
++2000-02-20 NIIBE Yutaka <gniibe@m17n.org>
++
++ Follow the changes of 2.3.45-47.
++ * include/asm-sh/page.h (get_order): Added.
++
++2000-02-14 NIIBE Yutaka <gniibe@m17n.org>
++
++ Follow the changes of 2.3.44.
++ * arch/sh/mm/init.c (paging_init): Use free_area_init_node.
++ * include/asm-sh/pgtable.h (__pgd_offset): Use pgd_index.
++ * arch/sh/mm/cache.c (flush_icache_page): Implemented.
++
++2000-02-13 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/time.c (time_init, get_rtc_time): Don't depend on
++ CONFIG_SH_CPU_RTC (Always enabled).
++
++ * arch/sh/config.in: Serial interface is "choice" (at least for now).
++ (CONFIG_SH_CPU_RTC): Removed.
++
++2000-02-11 NIIBE Yutaka <gniibe@m17n.org>
++
++ Follow the change of 2.3.43.
++ Softirq change:
++ * arch/sh/kernel/irq.c (do_IRQ): Change bottom half interface to
++ softirq.
++ * include/asm/softirq.h (local_bh_enable): Ditto.
++ Remove unused macros.
++ * arch/sh/kernel/entry.S (handle_softirq): Ditto.
++ (ret_from_irq): Branch to ret_from_syscall, so that softirq will
++ be called.
++ * arch/sh/kernel/signal.c (do_signal): Go back if kernel mode.
++ (setup_rt_frame): Bug fix. The number is NR_rt_sigreturn.
++ * include/asm-sh/hardirq.h (in_irq): Moved from softirq.h.
++
++ Memory management change:
++ * include/asm-sh/pgalloc.h (flush_tlb_pgtables): Added.
++ * include/asm-sh/mmu_context.h (enter_lazy_tlb): Added.
++ (switch_mm): Set bit of cpu_vm_mask befor activate_context.
++ * arch/sh/mm/init.c (show_mem): Remove calling show_net_buffers.
++ * include/asm-sh/page.h (PTE_MASK): Added.
++ * include/asm-sh/pgtable.h (_PAGE_CHG_MASK): Use PTE_MASK.
++
++2000-02-10 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/chare/sh-sci.h: New file.
++ * drivers/chare/sh-sci.c: Try to merge sh-scif.c.
++
++ * arch/sh/{config.in,defconfig}: Updated.
++
++2000-02-08 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/setup.c (setup_arch): Use init_bootmem_node,
++ instead of init_bootmem.
++
++ * arch/sh/mm/init.c (paging_init, mem_init): Get memory info from
++ NODE_DATA. See bootmem.c for detail. Use free_area_init_core,
++ instead of free_area_init.
++
++2000-02-06 NIIBE Yutaka <gniibe@m17n.org>
++
++ Follow the change of 2.3.42.
++ * arch/sh/defconfig: Updated.
++ * include/asm-sh/checksum.h: Include changes from 2.3.42.
++ * arch/sh/config.in: Change the semantics of CONFIG_SERIAL.
++ * drivers/char/Makefile: Likewise.
++
++ * drivers/chare/sh-sci.c: Remove locks, actually this *was* the
++ cause of the race condition!
++ (my_hd): Removed.
++
++2000-02-05 Peter Orem <pmorem@iptcorp.com>
++
++ * arch/sh/mm/fault.c (update_mmu_cache): Set PTEH register.
++
++2000-01-30 NIIBE Yutaka <gniibe@m17n.org>
++
++ Follow the changes of 2.3.41.
++ * include/asm-sh/system.h (xchg_u8): Added.
++ * include/asm-sh/pci.h: Added Dynamic DMA mapping stuff.
++ * include/asm-sh/scatterlist: Added.
++ * arch/sh/kernel/semaphore.c (Read-Write semaphoe): Implemented.
++ * include/asm-sh/semaphore.h (Read-Write semaphoe): Added.
++ * include/asm-sh/unistd.h (__NR_pivot_root): Added.
++ * include/asm-sh/types.h (dma_addr_t): Added.
++ * include/asm-sh/termios.h (TIOCM_LOOP): Added.
++ * include/asm-sh/siginfo.h (NSIGCHLD): Define as 6.
++ * arch/sh/kernel/entry.S (sys_pivot_root): Added.
++ * arch/sh/kernel/sys_sh.c (sys_uname): Apply change of 2.3.41.
++
++ * include/asm-sh/dma.h (MAX_DMA_ADDRESS): Remove +__MEMORY_START,
++ and set it 256MB.
++
++2000-01-29 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/entry.S (tlb_miss,general_exception): Set
++ return address to ret_from_irq. In case of system call,
++ it is overwritten to ret_from_syscall.
++
++2000-01-25 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/dma.h (MAX_DMA_ADDRESS): All area (512MB) can
++ be used with DMA.
++
++2000-01-25 Toshiharu Nozawa <nozawat@hitachi-ul.co.jp>
++
++ * arch/sh/mm/init.c (paging_init): Bug fix for
++ zones_size[ZONE_NORMAL].
++
++2000-01-23 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/siginfo.h: Follow the changes of 2.3.41-pre2.
++ * arch/sh/kernel/signal.c (do_signal): Likewise.
++
++2000-01-22 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/sys_sh.c (sys_pipe): Follow the ABI of Kaz'
++ Implementation.
++
++2000-01-21 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/fault.c (do_page_fault): Bug fix for OOPS.
++
++ * include/asm-sh/posix_types.h: Follow the changes of 2.3.40.
++
++2000-01-16 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/char/sh-sci.c (sci_er_interrupt): Kick transmission.
++
++2000-01-15 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/unistd.h (__NR_getrlimit, __NR_umount): Compatibility
++ change for libc.
++
++2000-01-13 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/signal.c (do_signal): set si_uid16.
++
++ * arch/sh/kernel/entry.S: Changed to support *16.
++
++ * include/asm-sh/unistd.h (*32): Added.
++
++ * include/asm-sh/msgbuf.h, include/asm-sh/ipcbuf.h,
++ include/asm-sh/sembuf.h, include/asm-sh/shmbuf.h: New files.
++
++ * include/asm-sh/siginfo.h: Support uid32/gid32.
++
++ * include/asm-sh/posix_types.h: Introduce uid16/32, gid16/32.
++
++2000-01-09 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/time.c (time_init): Remove INTERVAL.
++
++ Follow the changes of 2.3.35--2.3.38.
++ * include/asm/checksum.h (csum_partial_copy_to_user): Removed.
++ * include/sh/processor.h (get_task_struct): Added.
++ * arch/sh/kernel/setup.c (setup_arch): Add condition for
++ INITRD_START.
++
++
++Local Variables:
++mode: change-log
++left-margin: 8
++fill-column: 76
++version-control: never
++End:
+diff -ruN linux-2.6.17-vanilla/ChangeLog-2001 linux-2.6.17/ChangeLog-2001
+--- linux-2.6.17-vanilla/ChangeLog-2001 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/ChangeLog-2001 2006-07-12 16:54:18.000000000 +0000
+@@ -0,0 +1,1827 @@
++2001-12-28 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/fpu.c (do_fpu_error): Handle denormalized floating
++ point number. Remove un-needed grab_fpu.
++
++ * arch/sh/kernel/head.S (_stext): Don't initialize FPU, as FPU is
++ not used by kernel.
++ (SR): Initial value with FD=1 (no FPU use).
++
++ * include/asm-sh/processor.h (unlazy_fpu): Don't need to grab_fpu.
++ (clear_fpu): Call release_fpu.
++
++ * arch/sh/kernel/entry.S (PF_USEDFPU, __PF_USEDFPU): Removed.
++ (restore_all, handle_exception): Simplified.
++ (__fpu_prepare_fd, __init_task_flags): Removed
++
++ * arch/sh/kernel/fpu.c (enable_fpu_in_danger): Removed.
++ (fpu_prepare_fd): Removed.
++
++2001-12-28 Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
++
++ * include/asm-sh/processor.h (FPSCR_ENABLE_MASK, FPSCR_FLAG_MASK):
++ New macros.
++
++ * arch/sh/kernel/fpu.c (denormal_to_double, ieee_fpe_handler):
++ New functions.
++
++2001-12-26 Jeremy Siegel <jsiegel@mvista.com>
++
++ * arch/sh/kernel/traps.c: fix handle_unaligned_access() branch offsets
++ * arch/sh/mm/fault.c: check for null mmap when handling page fault
++
++2001-12-20 Takashi Yoshii <yoshii-takashi@hitachi-ul.co.jp>
++
++ * include/asm-sh/pgtable.h (pgprot_noncached): Defined and
++ implemented.
++
++2001-12-16 Paul Mundt <lethal@chaoticdreams.org>
++
++ * drivers/char/shwdt.c: Added a proper timer for pinging the device
++ periodically. Clock division ratio is now settable at load time ..
++ Numerous other small bug fixes.
++
++2001-12-14 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/hitachi_se.h (PA_BCR): Comment fix to sync mainline.
++
++ * drivers/block/rd.c (initrd_read): Don't need to flush the cache.
++ (This file can be removed.)
++ * include/linux/highmem.h (memclear_highpage_flush): Likewise.
++
++2001-12-12 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/kernel/rtc.c (sh_rtc_gettimeofday): Fix SH-4 RTC bug work
++ around.
++ (set_rtc_time, sh_rtc_settimeofday): Likewise. Remove schedule_timeout
++ call and merged to sh_rtc_settimeofday.
++
++2001-12-11 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/sys_sh.c-1.7: Removed.
++
++2001-12-10 NIIBE Yutaka <gniibe@m17n.org>
++
++ * mm/memory.c (do_wp_page): Re-introduce ifdef-out-ing
++ flush_cache_page.
++
++2001-12-06 M. R. Brown <mrbrown@0xd6.org>
++
++ * drivers/char/maple_keyb.c (dc_scan_kbd): Replaced calls to
++ memscan() with calls to memchr(). Credit goes to Robert M. Love for
++ the patch.
++
++2001-12-04 Jeremy Siegel <jsiegel@mvista.com>
++ * Include gdrom compile patch from Robert M. Love <rml@tech9.net>
++ * drivers/net/gdrom.c: as per patch
++ * include/asm-sh/segment.h: new file as per patch
++
++2001-12-03 Jeremy Siegel <jsiegel@mvista.com>
++ * init/main.c: Robert Love's <rml@tech9.net> patch adding gdrom
++ to bootable device list, as per M.R. Brown (mrbrown@0xd6.org)
++ * init/main.c: new file
++
++2001-11-30 Jeremy Siegel <jsiegel@mvista.com>
++ * drivers/char/shwdt.c: missing file copied from full tree
++ * updated to 2.5.0 (same as 2.4.15)
++
++2001-11-02 Jeremy Siegel <jsiegel@mvista.com>
++
++ * arch/sh/config.in: allow setting of CONFIG_SH_PCIDMA_NONCOHERENT
++ * include/asm-sh/stat.h: consistency w/glibc using either endian
++ * include/asm-sh/uaccess.h: add Tomoyoshi ASANO's big-endian fix
++ * arch/sh/kernel/{io_,pci-}7751se.c: minor cleanup
++
++2001-10-30 Jeremy Siegel <jsiegel@mvista.com>
++
++ * arch/sh/kernel/io_7751se.c: get pci.h from linux, not asm
++ * include/asm-sh/pci.h: define pci_dac_dma_supported()
++
++2001-10-16 M. R. Brown <mrbrown@0xd6.org>
++
++ * Branch merge of linux-2_4-branch.
++
++ * Added treelink.sh and treeunlink.sh to the scripts/ directory.
++
++ * Merged in NIIBE's updates from kernel/.
++
++2001-10-15 M. R. Brown <mrbrown@0xd6.org>
++
++ * Brought HEAD to a state ready for 2.5 development.
++
++ * linux-2_4-branch branch created. This allows for concurrent
++ development of the 2.4 and 2.5 trees.
++
++2001-10-14 NIIBE Yutaka <gniibe@server1.m17n.org>
++
++ * drivers/net/8139too.c (rtl8139_start_xmit): Fix merge gerbage.
++
++ * arch/sh/kernel/setup_se.c (init_se_IRQ): Remove
++ CONFIG_SH_7751_SOLUTION_ENGINE section.
++ * include/asm-sh/hitachi_se.h (PA_BCR): Likewise.
++
++2001-10-13 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/Makefile (CFLAGS, AFLAGS): Use -m4 -mno-implicit-fp for
++ SH4 compile. We used to use -m4-nofpu but it's not compatible
++ to -m4 (differs in calling convention).
++
++2001-10-13 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.13-pre2.
++
++2001-10-12 David Woodhouse <dwmw2@redhat.com>
++
++ * arch/sh/config.in: Set default memory sizes for Solution Engines
++
++2001-10-11 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.12.
++ * Updated to 2.4.11.
++
++2001-10-04 Paul Mundt <lethal@chaoticdreams.org>
++
++ * arch/sh/mm/fault.c (do_page_fault): Don't kill init when out
++ of memory.
++
++2001-10-01 M. R. Brown <mrbrown@0xd6.org>
++
++ * drivers/video/pvr2fb.c (pvr2fb_init): Make fb_find_mode() default
++ to 16bpp instead of 32bpp.
++
++2001-09-26 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/uaccess.h (__put_user_u64): New macro.
++ * arch/sh/kernel/signal.c: Include <linux/personality.h>.
++ * drivers/char/sh-sci.c (banner): Fix __initdata.
++
++ * Updated to 2.4.10.
++
++2001-09-15 Paul Mundt <lethal@chaoticdreams.org>
++
++ * arch/sh/Makefile: Remove usage of $(tool_prefix) and needless
++ redefinition of CROSS_COMPILE. Obey toplevel CROSS_COMPILE
++ instead.
++
++2001-09-13 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/sys_sh.c (arch_get_unmapped_area): Don't
++ COLOUR_ALIGN when it comes with MAP_PRIVATE.
++
++2001-09-13 Paul Mundt <lethal@chaoticdreams.org>
++
++ * Documentation/Configure.help: Add CONFIG_SH_WDT description.
++ * arch/sh/config.in: Add watchdog card menu, and watchdog driver.
++ * drivers/char/Makefile: Add CONFIG_SH_WDT support.
++ * drivers/char/shwdt.c: New file.
++
++2001-09-11 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/softirq.h (__cpu_raise_softirq): Removed.
++ * Updated to 2.4.10-pre6.
++
++2001-09-10 David Woodhouse <dwmw2@infradead.org>
++
++ * arch/sh/mm/cache-sh3.c: Clearer definitions of CCR_CACHE_VAL and
++ CCR_CACHE_INIT.
++ * arch/sh/mm/cache-sh4.c: Likewise.
++
++2001-09-03 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/keyboard.h (kbd_rate): Removed.
++ * Updated to 2.4.10-pre4.
++
++2001-08-31 M. R. Brown <mrbrown@0xd6.org>
++
++ * arch/sh/kernel/Makefile: Add dependency for rtc-aica.o for
++ CONFIG_SH_DREAMCAST.
++ * arch/sh/kernel/mach_dc.c: Add prototypes and pointers for the AICA
++ RTC routines to the machvec.
++ * arch/sh/kernel/time.c (time_init): Remove checks for
++ MACH_DREAMCAST as we can just use the RTC routines defined in the
++ machvec.
++ * arch/sh/kernel/rtc-aica.c: New file.
++
++2001-08-31 Jeremy Siegel <jsiegel@mvista.com>
++
++ * include/asm-sh/system.h: make __cli_and_save() volatile again
++
++2001-08-24 David Woodhouse <dwmw2@infradead.org>
++
++ * arch/sh/mm/cache-sh3.c: We were missing a loop over the ways in
++ __flush_wback_region(). Also disable interrupts between reading
++ an entry and writing it back modified.
++ * arch/sh/kernel/pcibios.c: Generic versions of five pcibios_xxx()
++ functions which can be shared between platforms.
++ * arch/sh/kernel/pci_st40.c: Use $1.
++ * arch/sh/kernel/pci-dc.c: Use $1.
++ * arch/sh/kernel/pci-sh7751.c: Use $1.
++ * arch/sh/kernel/Makefile: Use $1.
++
++2001-08-23 David Woodhouse <dwmw2@infradead.org>
++
++ * arch/sh/config.in: Add CONFIG_MEMORY_SIZE, clean up
++ platform-specific memory start/size definitions.
++ * include/asm-sh/page.h: Define __MEMORY_SIZE.
++ * arch/sh/kernel/setup.c: Use __MEMORY_SIZE instead of hardcoded 4MiB.
++
++2001-08-22 David Woodhouse <dwmw2@infradead.org>
++
++ * drivers/net/via-rhine.c: Update to version LK1.1.11 from
++ 2.4.9-ac9 (set dev->base_addr before first call to wait_for_reset()
++ and free the bounce buffers only if we allocated any in the first
++ place.
++
++2001-08-20 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/elf.h: Removed inclusion of <asm/byteorder.h>.
++
++2001-08-17 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/net/8139too.c: Include <linux/completion.h>.
++ * drivers/maple/maple.c: Likewise.
++ (kmapled_exited, maple_exit, kmapled_thread): Use new "completion"
++ interface.
++
++ * include/asm-sh/keyboard.h (kbd_rate): New function.
++ * include/asm-sh/io.h (page_to_bus): New macro.
++ * include/asm-sh/mmzone.h (page_to_phys): Defined.
++
++ * Updated to 2.4.9.
++
++2001-08-14 David Woodhouse <dwmw2@infradead.org>
++
++ * arch/sh/kernel/pci-dma.c: Use dma_cache_wback_inv() in
++ pci_alloc_consistent instead of flush_cache_all(), which is
++ a nop on SH3. If the size is so large that it's quicker just
++ to flush the whole cache, that's a decision for the
++ arch-specific cache management code to make.
++
++2001-08-11 David Woodhouse <dwmw2@infradead.org>
++
++ * arch/sh/config.in: New CONFIG_SH_PCIDMA_NONCOHERENT option
++ * include/asm-sh/pci.h: Include cache management calls for the
++ case where the above option is set.
++ * arch/sh/kernel/sh_ksyms.c: include linux/pci.h not asm/pci.h
++
++2001-08-11 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.8.
++
++2001-08-10 Jeremy Siegel <jsiegel@mvista.com>
++ Change SH7751 to separate machine type.
++ Added new files:
++ * arch/sh/kernel/{io,setup,mach,led}_7751se.c
++ * include/asm-sh/{io,hitachi}_7751se.h
++ Modified files:
++ * arch/sh/kernel/Makefile, arh/sh/kernel/{io,led}_se.c
++ * arch/sh/kernel/pci-{7751se,sh7751}.c
++ * include/asm-sh/{io,pci,machvec}.h
++
++2001-08-10 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache-sh4.c (__flush_wback_region,
++ __flush_purge_region): Comment fix for the arguments.
++ * arch/sh/mm/cache-sh3.c (__flush_wback_region,
++ __flush_purge_region): Likewise.
++
++2001-08-10 David Woodhouse <dwmw2@infradead.org>
++
++ * arch/sh/mm/cache-sh3.c: Implementation of cache management
++ routines __flush_{wback,invalidate,purge}_region. Required for
++ SH3 platforms which have DMA hardware.
++ * include/asm-sh/pgtable.h: Take the 'extern' definitions of the
++ above out of #ifdef __SH4__
++
++2001-08-10 David Woodhouse <dwmw2@infradead.org>
++
++ * drivers/mtd/maps/solutionengine.c: Map driver for flash chips
++ and PROM on Solution Engine and similar boards.
++ * drivers/mtd/maps/Config.in: Appropriate magic.
++ * drivers/mtd/maps/Makefile: Ditto.
++
++2001-08-10 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.8-pre8.
++
++ Bug fix for dis-contiguous page handling.
++ * include/asm-sh/mmzone.h (is_valid_page): New inline function.
++ (VALID_PAGE): Use is_valid_page.
++
++2001-08-09 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.8-pre7.
++
++ * arch/sh/mm/fault.c (update_mmu_cache): Use __set_bit (was:
++ set_bit).
++ * arch/sh/mm/cache-sh4.c (copy_user_page): Set PG_mapped flag
++ in advance. Because it will be mapped real soon now.
++ (clear_user_page): Ditto.
++
++ * include/asm-sh/pgtable.h (__flush_cache_page): Removed.
++ * arch/sh/mm/cache-sh4.c (__flush_dcache_page): Renamed from
++ __flush_cache_page and make it static. Removed u0, as it's
++ always 0. Removed the statements of case u0!=0.
++ (flush_dcache_page): Call __flush_dcache_page.
++
++ * arch/sh/mm/fault.c (update_mmu_cache): We only need to flush
++ cache of kernel mapped address.
++
++2001-08-08 YAEGASHI Takeshi <t@keshi.org>
++
++ * drivers/video/pvr2fb.c:
++ (pvr2_modedb): fix "vga_640x480" entry.
++ (pvr2fb_set_var): set SCROLL_YREDRAW to speed up scroll.
++ (pvr2_setcolreg): fix bit field manipulation for RGB565.
++ (pvr2fb_init, pvr2fb_setup): correct number of entries of
++ cable_type and video_output.
++ * drivers/char/dc_keyb.c: New file: implement kbd_translate().
++ * drivers/char/Makefile: Ditto.
++ * include/asm-sh/keyboard.h: Ditto.
++ * arch/sh/kernel/pci-dc.c (pci_free_consistent): reset
++ gapspci_dma_used in order to allocate PCI buffer again.
++
++2001-08-08 Greg Banks <gnb@alphalink.com.au>
++
++ * include/asm-sh/linux_logo.h: New logo.
++
++2001-08-08 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.8-pre6.
++ * Updated to 2.4.8-pre5.
++
++ * arch/sh/mm/cache-sh4.c (ptep_get_and_clear): Moved to ...
++ (check_cache_page): Removed.
++ (__flush_icache_page): Removed.
++ * include/asm-sh/pgtable.h (__flush_icache_page): Removed.
++
++ * include/asm-sh/pgalloc.h (ptep_get_and_clear): ... here.
++ (ptep_test_and_clear_young, ptep_test_and_clear_dirty,
++ ptep_set_wrprotect, ptep_mkdirty): Moved from pgtable.h.
++ (ptep_get_and_clear needs definition of mm.h).
++
++ * include/asm-sh/pgtable.h (PG_mapped): Renamed from
++ PG_mapped_with_alias.
++ (__flush_cache_page): Removed last argument, and add first arg.
++ * arch/sh/mm/cache-sh4.c (__flush_cache_page): Take u0 address
++ as first argument. Don't care about I-cache.
++ (flush_dcache_page): Follow the change.
++
++ * include/asm-sh/ide.h (ide_insw): Removed.
++ * drivers/cdrom/gdrom.c (gdrom_intr): Remove __flush_wback_region.
++
++ * arch/sh/mm/fault.c (update_mmu_cache): Flush the cache when first
++ mapped, even if it has no alias. (We needed this to for NFS).
++
++2001-08-07 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/net/8139too.c (rtl8139_hw_start): Added tp->rx_config = 0.
++
++2001-08-07 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/pgtable.h (PG_mapped_with_alias): New macro.
++ (PG_dcache_dirty: Deleted.
++ (ptep_get_and_clear, ptep_test_and_clear_young,
++ ptep_test_and_clear_dirty, ptep_set_wrprotect, ptep_mkdirty,
++ pte_same): Define here (was: included by <asm-generic/pgtable.h>).
++
++ * arch/sh/mm/cache-sh4.c (flush_dcache_page): New implementation.
++ Check if it's mapped or not.
++ (ptep_get_and_clear): New function (was: generic implementation).
++
++ * arch/sh/mm/fault.c (update_mmu_cache): Flush the cache when
++ it's mapped at first, and mark the page as it's mapped.
++ Bug fix: check the page is VALID or not.
++
++ * arch/sh/mm/cache-sh4.c (CACHE_ALIAS): Moved to ...
++ * include/asm-sh/pgtable.h (CACHE_ALIAS): ... here.
++
++ * arch/sh/kernel/setup.c (boot_cpu_data): Have initial value for
++ loops_per_jiffy.
++
++2001-08-06 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/clear_page.S: Use aligned address for write back.
++ * arch/sh/mm/__copy_user_page-sh4.S: Likewise.
++ * arch/sh/mm/copy_page.S: Likewise.
++
++ * arch/sh/mm/cache-sh4.c (CACHE_IC_NUM_WAYS, CACHE_OC_NUM_WAYS):
++ Removed.
++ (cache_wback_all): Removed and integrate to cache_init.
++
++ * arch/sh/mm/copy_page.S: Write back TO,
++ * arch/sh/mm/clear_page.S: Write back TO.
++
++ * arch/sh/mm/cache-sh3.c (cache_init): Read CCR at P2.
++ * arch/sh/mm/cache-sh4.c (cache_init): Likewise.
++ (__flush_cache_page): Fix bug. Call restore_flags.
++ (flush_cache_page): New implementation.
++ (clear_user_page, copy_user_page): Do it in assembler routines.
++
++2001-08-05 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/pgtable.h (PTE_PHYS_MASK): Defined.
++ (pte_page): Bug fix. Use PTE_PHYS_MASK.
++
++ * mm/vmscan.c (try_to_swap_out): Bug fix. Flush the page before we
++ clear the PTE.
++
++ * Updated to 2.4.8-pre4.
++
++2001-08-04 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache-sh4.c (__flush_wback_region): Fix bug of
++ expression of END.
++ (__flush_purge_region): Likewise.
++ (__flush_invalidate_region): Likewise.
++
++2001-08-03 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/cdrom/gdrom.c (gdrom_init): Restrict merging request.
++ (dont_merge_requests_fn, dont_bh_merge_fn): New functions.
++
++ * arch/sh/kernel/sys_sh.c (arch_get_unmapped_area): Always align
++ to 16KB.
++
++ * arch/sh/mm/cache-sh4.c (flush_cache_sigtramp): Protect from
++ interrupt.
++ (__flush_cache_page, __flush_icache_page): Likewise.
++ (check_cache_page): Likewise.
++
++2001-08-02 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/maple/maple.c (maple_send): Bug fix. Call
++ dma_cache_wback_inv. (was: __flush_wback_region).
++
++ * include/asm-sh/io.h (dma_cache_wback_inv, dma_cache_inv,
++ dma_cache_wback): Defined with new __flush_XXX_region functions.
++ (was: bogus cache_XXX_area functions, not implemented).
++
++ * drivers/cdrom/gdrom.c (gdrom_intr): Follow the change of
++ the last argument of __flush_wback_region.
++ * include/asm-sh/ide.h (ide_insw): Likewise.
++
++ * arch/sh/mm/cache-sh4.c (__flush_purge_region): New function.
++ (__flush_icache_page): New function.
++ (__flush_wback_region, __flush_invalidate_region): Last argument
++ is SIZE (was: END).
++
++ * include/asm-sh/pgtable.h (__flush_purge_region,
++ __flush_icache_page): Added.
++
++2001-07-31 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/system.h (switch_to): Revert changes of 07-30.
++ In schedule(), switch_to() is always called with interrupt enabled.
++
++ * drivers/cdrom/gdrom.c (DEVICE_NAME): Shorter name (when error).
++ (gdrom_do_command): Protect from interrupts.
++ (do_gdrom_request): Handle the case where a request is made up
++ from multple chunks.
++
++ * Updated to 2.4.8-pre3.
++
++ * drivers/cdrom/gdrom.c: New file.
++ * drivers/cdrom/Makefile, drivers/cdrom/Config.in, arch/sh/config.in:
++ Support SEGA Dreamcast GD-ROM Driver (CD-R).
++
++2001-07-30 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/pci-dc.c (pci_alloc_consistent): Format arg change
++ to stop warning.
++ * drivers/maple/maple.c: Likewise.
++
++ * arch/sh/kernel/pci-sh7751.c (pci_conf1_read_config_byte,
++ pci_conf1_read_config_word, pci_conf1_read_config_dword,
++ pci_conf1_write_config_byte, pci_conf1_write_config_word,
++ pci_conf1_write_config_dword): Use no underscore version
++ of save_and_cli and restore_flags.
++
++ * arch/sh/overdrive/led.c (mach_led): Likewise.
++
++ * include/asm-sh/system.h (switch_to): Alternative implementation
++ which maintain interrupt-disabled state.
++ (__save_flags, __save_and_cli): New implementations.
++ (__restore_flags): Debuuging implementation.
++ (really_restore_flags): New define.
++
++ * include/asm-sh/softirq.h (local_bh_enable): Add barrier and
++ remove __sti.
++
++ * arch/sh/kernel/setup_dc.c (disable_systemasic_irq,
++ enable_systemasic_irq): Protect critical region. Driver
++ can call disable_irq.
++
++ * arch/sh/kernel/setup_cqreek.c (setup_cqreek): Remove declaration
++ of disable_hlt.
++
++ * arch/sh/kernel/process.c (cpu_idle): Match __cli/__sti. Avoid
++ sleeping with interrupt disabled.
++
++2001-07-30 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * include/asm-sh/pgtable.h (__flush_wback_region): Defined for SH3.
++
++2001-07-29 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/char/sh-sci.c (put_char, put_string): Only for
++ CONFIG_SERIAL_CONSOLE.
++
++ * Updated to 2.4.8-pre2.
++
++2001-07-28 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/mm/__copy_user_page-sh4.S (__copy_user_page): Bug fix.
++ Do not clobber r10,r11.
++ * arch/sh/mm/copy_page.S (copy_page): Bug fix. Do not clobber r10,r11.
++ * arch/sh/mm/cache-sh4.c (clear_user_page, copy_user_page): Bug fix.
++ Call __flush_tlb_page with interrupt disabled.
++
++2001-07-28 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/Makefile (arch/sh/vmlinux.lds): Revert the change of
++ 2001-07-27. GCC complains (misunderstand) it.
++
++2001-07-27 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/vmlinux.lds.in (.data.cacheline_aligned): Align 16 for SH3.
++ Reported by Masahiro ABE <m-abe@aandd.co.jp>.
++ * arch/sh/vmlinux.lds.in: Rename from vmlinux.lds.S, since
++ it's not written in assembler.
++ * arch/sh/Makefile (arch/sh/vmlinux.lds): Follow the change.
++
++ * drivers/ide/ide.c (ide_wait_cmd): Revert the change to sync
++ mainline. IIRC, it was needed for SolutionEngine, but such
++ timing issue shoule be solved target specific way.
++
++ * scripts/Configure: Revert the change to sync mainline.
++
++ Follow the changes of 2.4.8-pre1.
++ * include/asm-sh/irq.h (irq_demux): Make them static inline.
++ * include/asm-sh/mmu_context.h (get_new_mmu_context, get_mmu_context,
++ init_new_context, destroy_context, set_asid, get_asid,
++ activate_context, switch_mm, enter_lazy_tlb): Likewise.
++ * include/asm-sh/io.h (isa_port2addr, ctrl_inb, ctrl_inl, ctrl_outb,
++ ctrl_outw, virt_to_phys, phys_to_virt): Likewise.
++ * include/asm-sh/processor.h (thread_saved_pc, grab_fpu,(release_fpu):
++ Likewise.
++ * include/asm-sh/uaccess.h (__strncpy_from_user, __clear_user,
++ __copy_user): Likewise.
++ * include/asm-sh/semaphore.h (sema_init): Likewise.
++ * include/asm-sh/pci.h (pci_dma_supported): Likewise.
++ * include/asm-sh/page.h (get_order): Likewise.
++ * include/asm-sh/checksum.h (csum_partial_copy_nocheck,
++ csum_partial_copy_from_user): Likewise.
++
++ * include/asm-sh/smplock.h: Remove bogus SMP lock implementation.
++
++ * Updated to 2.4.8-pre1.
++
++ * arch/sh/kernel/entry.S (ret_from_fork): Call schedule_tail.
++ by Stuart Menefy <stuart.menefy@st.com>.
++
++2001-07-26 Takashi YOSHII <yoshii-takashi@hitachi-ul.co.jp>
++
++ * include/asm-sh/irq.h, include/asm-sh/dma.h, arch/sh/kernel/dma.c,
++ arch/sh/kernel/Makefile, arch/sh/config.in,
++ Documentation/Configure.help: DMA support update.
++
++2001-07-25 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/setup_cqreek.c (mask_and_ack_cqreek): Move the
++ inw after the masking.
++ (setup_cqreek): Remove call of disable_hlt.
++
++ * arch/sh/mm/cache-sh4.c (flush_cache_sigtramp): Access from P2
++ area.
++
++2001-07-24 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache-sh4.c (__flush_wback_region): Rename from
++ __flush_dcache_region, as it's confusing.
++ (__flush_invalidate_region): Make it externally visible.
++ * include/asm-sh/pgtable.h: Follow the change.
++ * drivers/maple/maple.c (maple_send): Follow the change.
++
++2001-07-24 Masahiro ABE <m-abe@aandd.co.jp>
++
++ * arch/sh/kernel/setup.c (setup_arch): #ifdef mv_unknown to eliminate
++ warning.
++
++2001-07-24 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/segment.h: Removed.
++ * arch/sh/kernel/pci-sh7751.c: Remove inclusion of <asm/segment.h>.
++
++2001-07-23 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/time.c (do_timer_interrupt): Remove #if 0 for
++ sh_do_profile.
++
++2001-07-23 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/copy_page.S, arch/sh/mm/clear_page.S: Bug fix.
++ SH-3 doesn't have movca op-code.
++
++ * include/asm-sh/page.h (clear_page, copy_page): Declared.
++ * arch/sh/mm/clear_page.S, arch/sh/mm/copy_page.S: New files.
++ * arch/sh/mm/Makefile (obj-y): Added.
++
++ * include/asm-sh/page.h (__clear_user_page, __copy_user_page):
++ Declared.
++ * arch/sh/mm/cache-sh4.c: Use them.
++ * arch/sh/mm/__clear_user_page-sh4.S,
++ arch/sh/mm/__copy_user_page-sh4.S: New files.
++ * arch/sh/mm/Makefile: Added.
++
++2001-07-23 David Woodhouse <dwmw2@infradead.org>
++
++ * arch/sh/mm/Makefile (CONFIG_CPU_SH3, CONFIG_CPU_SH4): Conditionally
++ defined.
++ * arch/sh/mm/cache-sh3.c, arch/sh/mm/cache-sh4.c: New files.
++ * arch/sh/mm/cache.c: Removed.
++
++2001-07-23 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/io_adx.h: Copyright notice fix.
++
++ * Documentation/Configure.help (CONFIG_CPU_LITTLE_ENDIAN): Revert the
++ change to sync mainline.
++ * README (ON WHAT HARDWARE DOES IT RUN?): Likewise.
++
++ * Documentation/Configure.help (CONFIG_8139TOO_DREAMCAST): Added.
++ * drivers/net/Config.in (CONFIG_8139TOO_DREAMCAST): New config.
++ * drivers/net/8139too.c (CONFIG_8139TOO_DREAMCAST): New config.
++ (RX_BUF_LEN_IDX): Depends CONFIG_8139TOO_DREAMCAST.
++ (rtl8139_rx_config): Likewise.
++ (rtl8139_start_xmit): Use USE_NO_DMAMAP.
++
++ * arch/sh/config.in: Fix the indentation.
++
++2001-07-22 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.7.
++
++2001-07-20 Masahiro ABE <m-abe@aandd.co.jp>
++
++ * Documentation/Configure.help (CONFIG_CF_AREA5): Edit text.
++
++2001-07-19 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.7-pre8.
++
++ * arch/sh/kernel/process.c (cpu_idle): Remove not-needed __sti.
++ As it was asymmetric, may cause trouble.
++
++2001-07-18 Masahiro ABE <m-abe@aandd.co.jp>
++
++ * Documentation/Configure.help (CONFIG_CF_ENABLER): Support area 5 too.
++ (CONFIG_CF_AREA5): Added.
++ * arch/sh/config.in: Added selection of CompactFlash area.
++ * arch/sh/kernel/cf-enabler.c (allocate_cf_area): Added to support
++ directly connected CompactFlash for SH4.
++ (cf_init_default): call allocate_cf_area if SH4.
++
++ * Documentation/Configure.help (CONFIG_SH_GENERIC): Added ADX.
++ * arch/sh/config.in (CONFIG_SH_ADX): Added for ADX support.
++ (CONFIG_MEMORY_START): Added definition for ADX.
++ (CONFIG_CF_ENABLER): Added ADX.
++ * arch/sh/kernel/Makefile: Added ADX support.
++ * include/asm-sh/io.h: Added ADX support.
++ * include/asm-sh/machvec.h: Added ADX support.
++
++ * arch/sh/kernel/{io_adx.c,mach_adx.c,setup_adx.c}: New files.
++ * include/asm-sh/io_adx.h: New file.
++
++ * arch/sh/kernel/irq_maskreg.c: New file.
++ Add support for simple word-size IRQ mask register.
++ * include/asm-sh/irq.h : Likewise.
++
++2001-07-18 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/fault.c (__do_page_fault): Use pte_not_present.
++ * include/asm-sh/pgtable.h (pte_not_present): New inline function.
++
++2001-07-18 NIIBE Yutaka <gniibe@m17n.org>
++
++ Don't use pgd/pte memory pool.
++ * include/asm-sh/pgalloc.h (do_check_pgt_cache): Defined.
++ (pgd_quicklist, pte_quicklist, pgtable_cache_size): Null definition.
++ (pgd_alloc): Renamed from pgd_alloc_slow.
++ (pgd_free): Renamed from free_pgd_slow.
++ (get_pgd_fast, free_pgd_fast): Removed.
++ (pte_alloc_one_fast): Just return 0.
++ (pte_free_fast): Removed.
++ (pte_free): Defined as pte_free_slow.
++
++ * arch/sh/mm/init.c (do_check_pgt_cache): Removed.
++ (show_mem): Removed showing pgtable_cache_size.
++
++ * include/asm-sh/processor.h (pte_quick, pgtable_cache_sz): Removed.
++ (hard_math): Change the order.
++ * arch/sh/kernel/setup.c: Follow the change.
++
++ * include/asm-sh/pgtable-2level.h (pgd_clear): Do nothing.
++
++ * mm/memory.c (free_one_pgd): Revert change of 2001-07-16.
++ (As it's not accepted by Linus.)
++
++
++ * Updated to 2.4.7-pre7.
++
++ * arch/sh/mm/cache.c (__flush_cache_page): Don't disable interrupt.
++
++2001-07-17 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache.c (p3map_sem): New variable.
++ (p3_cache_init): Initialize p3map_sem.
++ (clear_user_page, copy_user_page): Use semaphore(s) to protect
++ critical section.
++ (flush_cache_all): New implementation.
++
++ * arch/sh/mm/fault.c (update_mmu_cache): Make the critical section
++ shorter.
++
++2001-07-17 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/mm/cache.c (clear_user_page, copy_user_page): Bug fix.
++ Disable interrupt until __flush_dcache_region() is done.
++
++2001-07-17 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/fault.c (__do_page_fault): Bug fix. Don't allow
++ PGD overrun.
++
++ * arch/sh/kernel/dma.c: Remove inclusion of <asm/smp.h>.
++ * arch/sh/kernel/setup.c, arch/sh/kernel/irq.c: Ditto.
++ * arch/sh/kernel/process.c: Include file clean up.
++
++ * arch/sh/kernel/process.c (machine_restart, machine_halt): New
++ implementations.
++
++2001-07-16 NIIBE Yutaka <gniibe@m17n.org>
++
++ * mm/memory.c (free_one_pgd): Bug fix. Do pgd_clear _after_
++ free_one_pmd.
++
++ * arch/sh/kernel/setup.c (boot_cpu_data): Bug fix. 0 for
++ pgtable_cache_sz.
++
++ * arch/sh/mm/cache.c (clear_user_page, copy_user_page): Clear PTE
++ after use.
++
++2001-07-16 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * include/asm-sh/pgalloc.h (__flush_tlb_page): Declared.
++ * arch/sh/mm/cache.c : Add inclusion <asm/pgalloc.h>,
++ <asm/mmu_context.h>
++ (clear_user_page, copy_user_page): Do __flush_tlb_page() before
++ update_mmu_cache().
++ * arch/sh/mm/fault.c (__flush_tlb_page): Make it global.
++
++2001-07-16 Takashi YOSHII <yoshii-takashi@hitachi-ul.co.jp>
++
++ * arch/sh/kernel/ptrace.c (ubc_set_tracing): Bug fix for SH7709A.
++
++ * include/asm-sh/ptrace.h (UBC_TYPE_SH7729, BBR_CPU, BBR_DMA,
++ BRCR_PCTE): Defined.
++ (BBR_WRITE): Change the value.
++
++2001-07-16 Masahiro Abe <m-abe@aandd.co.jp>
++
++ IRQ handling update.
++ * arch/sh/kernel/setup_bigsur.c (end_bigsur_irq): Don't enable IRQ
++ when it is disabled.
++ * arch/sh/kernel/setup_ec3104.c (end_ec3104_irq): Likewise.
++ * arch/sh/kernel/setup_hd64465.c (end_hd64465_irq): Likewise.
++ * arch/sh/kernel/setup_hd64461.c (end_hd64461_irq): Likewise.
++ * arch/sh/kernel/setup_dc.c (end_systemasic_irq): Likewise.
++ * arch/sh/kernel/irq_ipr.c (end_pint_irq): Likewise.
++
++2001-07-16 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/mmzone.h: Remove inclusion of bootmem.h.
++
++2001-07-12 NIIBE Yutaka <gniibe@m17n.org>
++
++ IRQ handling bug fix. Reported by Masahiro Abe <m-abe@aandd.co.jp>
++ * arch/sh/kernel/irq_intc2.c (end_intc2_irq): Don't enable IRQ
++ when it is disabled.
++ * arch/sh/kernel/irq_ipr.c (end_ipr_irq): Likewise.
++ * arch/sh/kernel/irq_imask.c (end_imask_irq): Likewise.
++
++ * arch/sh/kernel/irq.c (setup_irq): Clear desc->status.
++ (probe_irq_on): Removed unmatched spin_unlock_irq().
++
++2001-07-12 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache.c (copy_user_page, clear_user_page): Bug fix.
++ Call __flush_dcache_region so that the data goes to memory, to
++ maintain cache coherency between I and D.
++
++2001-07-11 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/config.in (CONFIG_DEBUG_KERNEL_WITH_GDB_STUB): Removed.
++
++ * arch/sh/kernel/entry.S (call_dae, debug_trap): Only for
++ CONFIG_SH_STANDARD_BIOS (was: also CONFIG_DEBUG_KERNEL_WITH_GDB_STUB).
++ * arch/sh/kernel/traps.c (gdb_vbr_vector, trap_init): Likewise.
++ * drivers/char/sh-sci.c: Likewise.
++
++ * Documentation/Configure.help (CONFIG_GDB_STUB_VBR): Removed.
++ (CONFIG_DEBUG_KERNEL_WITH_GDB_STUB): Removed.
++ (CONFIG_STNIC): Added.
++ (CONFIG_SH_RTC): Added.
++ (CONFIG_SH_GENERIC): Added.
++
++2001-07-11 Masahiro Abe <m-abe@aandd.co.jp>
++
++ * include/asm-sh/machvec.h: Bug fix. Move #endif.
++
++2001-07-11 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/hardirq.h (irq_cpustat_t): Added __ksoftirqd_task.
++ * include/asm-sh/atomic.h (smp_mb__before_atomic_dec): Defined.
++
++ * Updated to 2.4.7-pre6.
++ * Documentation/fb/pvr2fb.txt (Advantages): Typo fix.
++
++2001-07-11 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.7-pre5.
++
++ Follow the change of 2.4.7-pre5.
++ * include/asm-sh/softirq.h (raise_softirq): Removed.
++
++2001-07-10 NIIBE Yutaka <gniibe@m17n.org>
++
++ Updated to 2.4.6.
++
++ Follow the change of 2.4.6.
++ * arch/sh/vmlinux.lds.S (.rodata): Added .rodata.*.
++ * include/asm-sh/hitachi_se.h (PA_MRSHPC): Spell fix for comment.
++
++2001-07-10 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/init.c (paging_init): Use __MEMORY_SIZE_2ND.
++
++2001-07-08 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/config.in (CONFIG_DISCONTIGMEM): Bug fix. Added "then".
++ By ISHIKAWA Mutsumi <ishikawa@linux.or.jp>.
++
++ * include/asm-sh/page.h (phys_to_page): Bug fixed for paren.
++ By YAEGASHI Takeshi <t@keshi.org>.
++
++ Discontiguous memory support.
++ * arch/sh/config.in (CONFIG_DISCONTIGMEM): New config.
++ * arch/sh/kernel/setup.c (setup_arch): Setup NODE_DATA, and NODE(1).
++ * arch/sh/mm/init.c (discontig_page_data, discontig_node_bdata):
++ New variables.
++ (paging_init): Initialize NODE(1).
++ (mem_init): Initialize NODE(1).
++ * include/asm-sh/mmzone.h: New file.
++ * include/asm-sh/pgtable.h (pte_page): Use phys_to_page.
++ * include/asm-sh/page.h (__MEMORY_START_2ND, __MEMORY_SIZE_2ND):
++ Defined.
++ (VALID_PAGE, phys_to_page): #ifdef/#endif-out.
++
++2001-07-07 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/page.h (phys_to_page): New macro.
++ (virt_to_page): Use phys_to_page.
++ * include/asm-sh/pgtable.h (pte_page): Use phys_to_page.
++
++2001-07-07 YAEGASHI Takeshi <t@keshi.org>
++
++ HD64461 IRQ number fix for HP600.
++ 93: 10076 HD64461-IRQ ide0 # CF slot
++ 94: 15095 HD64461-IRQ NE2000 # PC-card slot
++
++ * include/asm-sh/hd64461.h (HD64461_IRQ_NUM): Added.
++ * include/asm-sh/ide.h (ide_default_irq_hp600): Fix irq number.
++ * arch/sh/kernel/mach_hp600.c (mv_hp620, mv_hp680, mv_hp690): Fix
++ mv_nr_irqs.
++
++2001-07-06 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache.c (flush_icache_page, flush_dcache_page,
++ flush_page_to_ram, check_cache_page): Use page_address.
++ * arch/sh/mm/fault.c (update_mmu_cache): Use page_address.
++ (and Bug fix.)
++ * include/asm-sh/pgtable.h (mk_pte): Use page_address.
++
++2001-07-04 Jeremy Siegel <jsiegel@mvista.com>
++
++ * arch/sh/lib/checksum.S: Bug fix. Update R1's value.
++
++2001-07-04 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * include/asm-sh/pgtable.h (__flush_dcache_region): Defined for SH-3.
++ * drivers/net/Config.in (CONFIG_CS89x0): Can be enabled even when PCI
++ is disabled.
++
++2001-07-03 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/setup.c: Bug fix. 0 for pte_quick.
++
++2001-07-02 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache.c (__flush_invalidate_region): New function.
++ (copy_user_page, clear_user_page): Bug fix. Use
++ __flush_invalidate_region.
++
++ * include/asm-sh/pgtable.h (PG_dcache_dirty): Defined.
++ * arch/sh/mm/cache.c (flush_dcache_page): Defer flushing the cache
++ if possible.
++ * arch/sh/mm/fault.c (update_mmu_cache): Handle the deferred
++ flushing.
++
++2001-07-01 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/net/stnic.c (stnic_probe): Set endian.
++ Reported by <yshimizu@ic-software.co.jp>.
++
++2001-06-30 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache.c (__flush_cache_page): Protect against
++ interrupt.
++ (flush_cache_all): Just clear the address array.
++ (detect_cpu_and_cache_system): Likewise.
++ (flush_cache_page): Bug fix. Tag is physical address.
++
++ * Updated to 2.4.6-pre8.
++
++ SH-4 cache handling improvement.
++ * arch/sh/mm/cache.c (flush_icache_page, flush_page_to_ram):
++ #if 0/#endfi out.
++ * include/asm-sh/pgtable.h (flush_page_to_ram, flush_icache_page):
++ Define as NULL.
++ * kernel/ptrace.c (access_one_page): Add flush_dcache_page.
++
++ * arch/sh/mm/cache.c (flush_cache_page): Remove bogus comment.
++ Change comment as we also need to let I-cache to flush.
++ (flush_dcache_page): Mention I-cache in comment.
++ (__flush_cache_page): New function. (Use 0 to invalidate.)
++ (flush_dcache_page): Use __flush_cache_page.
++
++ * arch/sh/mm/Makefile (obj-y): Added ioremap.o.
++ * arch/sh/mm/ioremap.c (remap_area_pages): Use pgd_offset_k.
++ (p3_ioremap): Renamed from __ioremap.
++ (p3_iounmap): Renamed from iounmap.
++ (remap_area_pages): Make it global.
++
++ * arch/sh/mm/fault.c (__do_page_fault): Use P3SEG and P4SEG
++ instead of VMALLOC_START and VMALLOC_END.
++ * include/asm-sh/pgtable.h (p3_cache_init): New function.
++ (VMALLOC_START): Change the value.
++ * arch/sh/mm/cache.c (p3_cache_init): New function.
++ (icache_purge_region): Removed.
++ (flush_icache_range): Just call flush_cache_all. It's efficient
++ because the range would be so large (Usually it's larger than
++ cache size itself). And it's OK, because it's rarely used.
++ (clear_user_page, copy_user_page): New implementations.
++
++ * arch/sh/mm/init.c (mem_init): Use __flush_dcache_region
++ (was: flush_page_to_ram. The obsolete interface).
++ (mem_init): Call p3_cache_init.
++
++ * arch/sh/mm/cache.c (icache_purge_region): Renamed from
++ icache_purge_range.
++ (__flush_dcache_region): Renamed (was: __flush_dcache_range).
++ (flush_icache_range): Follow the changes.
++ * include/asm/ide.h (ide_insw): Use __flush_dcache_region.
++ * include/asm-sh/pgtable.h: Ditto.
++
++ * drivers/maple/maple.c (maple_send): Use __flush_dcache_region
++ (was: flush_page_to_ram. The obsolete interface).
++ (maple_sendbuf_page): Removed.
++
++ * include/asm-sh/pgtable.h (HAVE_ARCH_UNMAPPED_AREA): Defined for
++ SH-4.
++ * arch/sh/kernel/sys_sh.c (arch_get_unmapped_area): New function.
++ * include/asm-sh/shmparam.h (SHMLBA): 16kB for SH-4.
++ * arch/sh/mm/fault.c (update_mmu_cache): Removed pte_shared
++ handling.
++ (__flush_tlb_phys): Removed.
++ * include/asm-sh/pgtable.h (pte_shared): Removed.
++
++2001-06-29 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/io_se.c (se_outb_p): Bug fix. Remove duplicated
++ `if' clause.
++
++2001-06-28 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/string.h (strlen): Declared.
++ (__HAVE_ARCH_STRLEN): Defined.
++ * arch/sh/lib/strlen.S: New file.
++ * arch/sh/lib/Makefile (obj-y): Added strlen.o.
++
++ * Updated to 2.4.6-pre6.
++
++ Implement cache flush on I/O completion.
++ * include/asm-sh/pgtable.h (__flush_dcache_range): Declared.
++ * arch/sh/mm/cache.c (__flush_dcache_range): Rename from
++ dcache_wback_range. And make it visible (not-static).
++ * include/asm-sh/ide.h (ide_insw): New macro to handle cache flush
++ for I/O.
++
++ * Revert the patch of 2001-06-26. It should be done by driver
++ layer not VM layer.
++
++2001-06-27 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/lib/checksum.S (csum_partial_copy_generic): Performance
++ tweak. Use @(<DISP>,RN) addressing mode. Consider pipeline
++ of SH-3. Perhaps we need different implementation for SH-4.
++
++2001-06-26 NIIBE Yutaka <gniibe@m17n.org>
++
++ New implementation of flush-ing the page on swap.
++
++ * include/linux/mm.h (PG_flush_after, PageFlushAfter,
++ SetPageFlushAfter, PageTestandClearFlushAfter): New bit.
++ * mm/page_io.c (rw_swap_page_base): Set flush-after bit.
++ * fs/buffer.c (end_buffer_io_async): Implement flush-ing
++ with PG_flush_after.
++
++ * mm/memory.c (do_swap_page): Remove flush-ing the page.
++
++2001-06-26 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/ide/ide-geometry.c: Revert change of 2001-03-08.
++ It's not needed as we have the header file now .
++
++ * include/linux/netdevice.h include/net/checksum.h,
++ net/core/datagram.c, net/core/iovec.c, net/core/scm.c,
++ net/core/skbuff.c, net/core/sock.c, net/socket.c: Revert changes to
++ sync standard kernel (was: Changes to support no CONFIG_NET).
++
++2001-06-25 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.6-pre5.
++
++2001-06-25 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/pgtable.h (_PAGE_FLAGS_HARDWARE_MASK): Drop SH-bit
++ on SH-3.
++
++2001-06-24 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/pgtable.h (__pmd_offset): Removed. It's only
++ valid for x86.
++
++ * include/asm-sh/string.h (strcpy, strncpy, strcmp, strncmp): Make
++ them static inline.
++
++ * include/asm-sh/processor.h (INIT_MMAP): Bug fix. Set vm_start
++ and vm_end to 0. (was: 0x80000000--0xa0000000).
++
++ * include/asm-sh/pgtable.h: Revert changes of 2001-06-20.
++ Atomic update is for SMP machine. We don't need it for SuperH.
++
++2001-06-23 NIIBE Yutaka <gniibe@m17n.org>
++
++ Enable use of pgd_quicklist and pte_quicklist (was: not used).
++ * include/asm-sh/pgalloc.h (pgd_free): Use free_pgd_fast (was: slow).
++ (pte_free): Use pte_free_fast (was: slow).
++ (pte_alloc_one_fast): Clear the first entry (was: assign ret[1]).
++ * include/asm-sh/pgtable-2level.h (pgd_clear): Zero clear for reuse.
++
++2001-06-21 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/irq.c (do_IRQ): Bug fix. Clear IRQ_INPROGRESS bit.
++
++ * include/asm-sh/pgtable.h: Include <asm/pgtable-2level.h> earlier.
++ * include/asm-sh/pgtable-2level.h: Add #ifndef/#endif for
++ __ASSEMBLY__.
++
++ * arch/sh/mm/init.c (paging_init): Fixed to PTRS_PER_PGD.
++ (was: USER_PTRS_PER_PGD*2)
++ (swapper_pg_dir): Use PTRS_PER_PGD (was: 1024 directly).
++
++ * include/asm-sh/pgtable.h (TWOLEVEL_PGDIR_SHIFT,
++ BOOT_USER_PGD_PTRS, BOOT_KERNEL_PGD_PTRS, USER_PGD_PTRS,
++ KERNEL_PGD_PTRS): Removed. (only valid for x86)
++
++ * Updated to 2.4.6-pre4.
++
++2001-06-20 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/pgtable.h (_PAGE_BIT_DIRTY, _PAGE_BIT_RW,
++ _PAGE_BIT_ACCESSED): Defined.
++ (ptep_test_and_clear_dirty, ptep_test_and_clear_young,
++ ptep_set_wrprotect, ptep_mkdirty, ptep_get_and_clear): Implement
++ atomic update of PTE.
++
++2001-06-19 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/irq_ipr.c (init_IRQ): Removed initialization
++ of INTC_IRRX, INTC_ICRX.
++
++ * include/asm-sh/softirq.h (local_bh_enable): Follow the change of
++ semantics of softirq (of IA-32).
++
++ * arch/sh/kernel/entry.S (ret_from_syscall): Don't call softirq.
++ (handle_softirq): Removed.
++ (ret_with_reschedule): Label removed.
++
++ * arch/sh/kernel/irq.c (do_IRQ): Follow the change of IA-32 version.
++ (irq_controller_lock): Removed.
++
++ * include/asm-sh/hardirq.h: Remove __softirq_active, __softirq_mask.
++ Add softirq_pending.
++
++
++ * Updated 2.4.6-pre3.
++
++2001-05-28 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * include/asm-sh/bitops.h (__change_bit,__test_and_set_bit,
++ __test_and_clear_bit,__test_and_change_bit): Added.
++
++2001-05-28 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/config.in (CONFIG_SH_SH2000): Added.
++ * arch/sh/kernel/Makefile: Likewise.
++ * include/asm-sh/io.h: Likewise.
++ * include/asm-sh/machvec.h: Likewise.
++ * arch/sh/kernel/{setup_sh2000.c,io_sh2000.c}: New file.
++ * include/asm-sh/io_sh2000.h: New file.
++
++ * arch/sh/kernel/sh_ksyms.c (strnlen): Exported.
++
++2001-05-28 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.5.
++ * arch/sh/kernel/rtc.c (set_rtc_time): Removed declaration
++ of the function abs.
++
++2001-05-24 Stuart Menefy <stuart.menefy@st.com>
++
++ * arch/sh/config.in: Change to ST40STB1 config, moved char/pcmcia to
++ char menu, and added joystick and media options
++
++2001-05-24 Stuart Menefy <stuart.menefy@st.com>
++
++ * arch/sh/kernel/{time,setup}.c include/asm-sh/processor.h: Added
++ support for for ST40STB1 memory clock
++ * arch/sh/overdrive/irq.c: Set up INTC to use encoded interrupt pins,
++ and set up non-Overdrive interrupts as imask type.
++ * include/asm-sh/pci.h: Move declaration of struct pci_dev so declared
++ before used
++ * arch/sh/kernel/io_se.c: Typo fix
++ * arch/sh/stboards/{led.c,harp.h}: Add LED_ON and LED_OFF macros
++
++2001-05-24 M. R. Brown <mrbrown@linuxdc.org>
++
++ LinuxDC drivers merge.
++
++ * Documentation/Configure.help: Added documentation for CONFIG_FB_PVR2
++ and CONFIG_FB_PVR2_DEBUG.
++ * Documentation/fb/00-INDEX: Added line for pvr2fb.txt.
++ * Documentation/fb/pvr2fb.txt: New file, document features of the pvr2
++ frame buffer.
++ * arch/sh/config.in: Conditionalized Maple driver options, set
++ CONFIG_SH_RTC to "n" when configuring for Dreamcast.
++ * arch/sh/kernel/mach_dc.c: Machine vector: Use NR_IRQS standard
++ (reflects new IRQ count), added systemasic_irq_demux.
++ * arch/sh/kernel/pci-dc.c: Include new asm/dc_sysasic.h. Removed
++ definition of GAPSPCI_INTC and updated GAPSPCI_IRQ to new IRQ
++ convention. (disable_gapspci_irq, enable_gapspci_irq,
++ mask_and_gapspci_irq, end_gapspci_irq, startup_gapspci_irq,
++ shutdown_gapspci_irq, gapspci_irq_type): Removed. (gapspci_init):
++ Removed assignment of gapspci_irq_type.
++ * arch/sh/kernel/setup_dc.c: New includes to reflect IRQ standard.
++ (disable_systemasic_irq, enable_systemasic_irq, ack_systemasic_irq,
++ end_systemasic_irq, startup_systemasic_irq, shutdown_systemasic_irq,
++ systemasic_int, systemasic_irq_demux): New routines.
++ (setup_dreamcast): Assign systemasic_int to respective irq_desc IRQs.
++ * drivers/video/Config.in: Added configuration options for
++ CONFIG_FB_PVR2, removed options for CONFIG_FB_DC.
++ * drivers/video/Makefile: Added dependency for CONFIG_FB_PVR2, removed
++ dependancy for CONFIG_FB_DC.
++ * drivers/video/dcfb.c: Removed file.
++ * drivers/video/fbmem.c: Added externs for pvr2fb routintes, removed
++ declaration of dcfb_init(). Added pvr2 to the list of framebuffers,
++ removed dcfb from that list.
++ * drivers/video/pvr2fb.c: New file, PowerVR 2 frame buffer support,
++ replaces generic DC fb support.
++ * include/asm-sh/dc_sysasic.h: New file, Definitions for Dreamcast
++ hardware events.
++ * include/asm-sh/irq.h: Added OFFCHIP_NR_IRQS def. for Dreamcast,
++ added declaration of systemasic_irq_demux().
++
++2001-05-24 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.5-pre5.
++
++ * arch/sh/kernel/hd64465_gpio.c, arch/sh/kernel/io_cat68701.c,
++ arch/sh/kernel/io_dc.c, arch/sh/kernel/io_ec3104.c,
++ arch/sh/kernel/irq_intc2.c, arch/sh/kernel/mach_dc.c,
++ arch/sh/kernel/setup_dc.c, arch/sh/kernel/setup_ec3104.c,
++ arch/sh/mm/cache.c, include/asm-sh/hd64465_gpio.h: Follow the
++ change of 2.4.5-pre5. Inclusion of config.h.
++
++2001-05-24 Stuart Menefy <stuart.menefy@st.com>
++
++ * arch/sh/kernel/pci_st40.c
++ arch/sh/overdrive/{Makefile,galileo.c,mach.c,pcidma.c}
++ arch/sh/stboards/{Makefile,mach.c,pcidma.c}: Changes for new style
++ of PCI set up
++
++ * arch/sh/kernel/entry.S include/asm-sh/irq.h: Updated the number of
++ interrupts for ST40STB1
++
++2001-05-22 M. R. Brown <mrbrown@linuxdc.org>
++
++ Preliminary Dreamcast Maple Bus driver restructuring.
++
++ * drivers/dreamcast/maple/Config.in, drivers/dreamcast/maple/Makefile
++ drivers/dreamcast/maple/maple.c, drivers/dreamcast/maple/maple.h,
++ drivers/dreamcast/maple/dckbd.c, drivers/dreamcast/maple/dcmouse.c,
++ drivers/dreamcast/maple/dcpad.c: Files moved to consistent kernel
++ directories and renamed.
++ * drivers/dreamcast/Config.in, drivers/dreamcast/Makefile: Removed.
++ * drivers/maple/Config.in, drivers/maple/Makefile,
++ drivers/maple/maple.c: New files, moved from drivers/dreamcast/maple.
++ * include/linux/maple.h: New file, was
++ drivers/dreamcast/maple/maple.h.
++ * drivers/char/maple_keyb.c: New file, was
++ drivers/dreamcast/maple/dckbd.c.
++ * drivers/char/maplemouse.c: New file, was
++ drivers/dreamcast/maple/dcmouse.c.
++ * drivers/char/Makefile: Added dependencies for CONFIG_MAPLE_KEYBOARD
++ and CONFIG_MAPLE_MOUSE
++ * drivers/char/joystick/maplecontrol.c: New file, was
++ drivers/dreamcast/maple/dcpad.c.
++ * drivers/char/joystick/Config.in: Added config options for
++ CONFIG_MAPLE_CONTROL.
++ * drivers/char/joystick/Makefile: Added dependency for
++ CONFIG_MAPLE_CONTROL.
++ * Makefile: Added DRIVERS dependency for CONFIG_MAPLE.
++ * drivers/Makefile: Added dependencies for CONFIG_MAPLE.
++ * arch/sh/Makefile: Removed Dreamcast driver dependencies.
++ * arch/sh/config.in: Check for CONFIG_SH_DREAMCAST for
++ CONFIG_MEMORY_START. Added config options for CONFIG_MAPLE_*, added
++ sources to drivers/maple/Config.in and
++ drivers/char/joystick/Config.in.
++
++2001-05-21 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.5-pre4.
++
++2001-05-17 YAEGASHI Takeshi <t@keshi.org>
++
++ * arch/sh/kernel/pci-dc.c: New file: Dreamcast PCI routines.
++ * arch/sh/kernel/setup_dc.c: Moved PCI code to pci-dc.c.
++ * arch/sh/kernel/mach_dc.c (mv_init_pci): Removed.
++ * arch/sh/kernel/Makefile: Added rules for pci-dc.o.
++ * include/asm-sh/pci.h (PCIBIOS_MIN_IO, PCIBIOS_MIN_MEM): Added
++ definitions for Dreamcast.
++ * drivers/net/8139too.c (rtl8139_hw_start): Keep RxConfig register's
++ cache(tp->rx_config) dirty.
++
++2001-05-16 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/pci-sh7751.c (pcibios_set_master, pci_check_direct,
++ pcibios_fixup_peer_bridges, pcibios_enable_device,
++ pcibios_set_master): Prepend KERN_INFO for printk.
++
++ * Updated to 2.4.5-pre2.
++
++2001-05-14 Dustin McIntire <dustin@sensoria.com>
++
++ * arch/sh/kernel/sh_ksyms.c: Move CONFIG_PCI above the
++ pci_alloc_consistent.
++ * arch/sh/kernel/pci-irq.c: Removed.
++
++ Big Sur support update.
++ * include/asm-sh/pci-sh7751.h (SH7751_PCICONF13): Change the value.
++ It was 0x40.
++ (PLATFORM_ASPEN, PLATFORM_BIGSUR): Removed.
++ * arch/sh/kernel/setup_bigsur.c: Calculation change of mask and bit.
++ * arch/sh/kernel/pci-bigsur.c: Turn the clocks and clear powerdown
++ IRQ earlier.
++ * arch/sh/kernel/Makefile: Remove pci-bigsur.o.
++
++2001-05-14 Jeremy Siegel <jsiegel@mvista.com>
++
++ * include/asm-sh/machvec.h: Bug fix. Don't overwrite the
++ definition of MACH_SE.
++
++2001-05-09 NIIBE Yutaka <gniibe@m17n.org>
++
++ Remove support of 7750 Overdrive.
++
++ * include/asm-sh/io_od.h: Removed.
++ * arch/sh/overdrive/io_od.h: Moved from include/asm-sh,
++ as a reference.
++
++ * include/asm-sh/pci.h: Removed the case of
++ defined(CONFIG_SH_7750_OVERDRIVE).
++ * include/asm-sh/io.h: Likewise.
++
++ * arch/sh/Makefile (SUBDIRS): Don't add arch/sh/overdrive.
++ (archclean): Don't go to overdrive subdirs, but stboards.
++
++ * arch/sh/config.in (CONFIG_SH_7750_OVERDRIVE): Deleted.
++
++2001-05-09 Ian da Silva <idasilva@mvista.com>
++
++ Solution Engine 7751 support.
++
++ * include/asm-sh/hitachi_se.h, include/asm-sh/io.h,
++ include/asm-sh/machvec.h, include/asm-sh/pci.h:
++ Add the case of CONFIG_SH_7751_SOLUTION_ENGINE.
++
++ * arch/sh/kernel/setup_se.c (init_se_IRQ): Handle the case of
++ CONFIG_SH_7751_SOLUTION_ENGINE differentry.
++
++ * arch/sh/kernel/pci-7751se.c: New file.
++
++ * arch/sh/kernel/io_se.c: Include <asm/pci.h> and <asm/pci-sh7751.h>.
++ (TOP_PCIC, PCIIOBR, PCIMBR, PCI_IO_AREA, PCI_MEM_AREA) New macros.
++ (port2adr): Fixed. Don't include 0x2000 as MRSHPC address.
++ (se_inb, se_inb_p, se_inw, se_inl, se_outb, se_outb_p, se_outw,
++ se_outl): Handle the case of PXSEG and CONFIG_PCI.
++ (se_readb, se_readw, se_readl, se_writeb, se_writew, se_writel):
++ Handle the case of CONFIG_PCI.
++
++ * arch/sh/kernel/Makefile: Define objects for
++ CONFIG_SH_7751_SOLUTION_ENGINE.
++
++ * arch/sh/config.in (CONFIG_SH_7751_SOLUTION_ENGINE): Added.
++
++2001-05-09 Dustin McIntire <dustin@sensoria.com>
++
++ SH7751 support and New target BIGSUR.
++
++ * include/asm-sh/bigsur.h, include/asm-sh/io_bigsur.h,
++ include/asm-sh/pci-sh7751.h, include/asm-sh/serial-bigsur.h: New
++ files.
++ * include/asm-sh/serial.h: Added inclusion of serial-bigsur.h.
++ * include/asm-sh/processor.h: Add comment for SH7751.
++ * include/asm-sh/pci.h (PCIBIOS_MIN_IO, PCIBIOS_MIN_MEM): Handle
++ cases of ST40STB1, SH7751 and BIGSUR.
++ (pcibios_set_master): Comment it out.
++ * include/asm-sh/machvec.h: Added mv_hw_bigsur bit.
++ (MACH_BIGSUR): Added.
++
++ * include/asm-sh/irq.h: Added CONFIG_CPU_SUBTYPE_SH7751 and
++ CONFIG_SH_BIGSUR.
++
++ * include/asm-sh/io.h: Added CONFIG_SH_BIGSUR.
++ * include/asm-sh/bugs.h (check_bugs): Print SH7750/SH7750. (was:
++ only SH7750).
++
++ * drivers/pcmcia/hd64465_ss.c (hs_set_io_map): Added last argument 0,
++ for the call of hd64465_port_map.
++
++ * drivers/net/smc9194.h (chip_ids): Added SMC91C100FD.
++ * drivers/net/smc9194.c (smc_probe): The semantics IRQ2==IRQ9 is
++ only valid in PC (__i386__).
++
++ * drivers/char/sh-sci.h (CONFIG_CPU_SUBTYPE_SH7751): Added.
++
++ * arch/sh/mm/cache.c (detect_cpu_and_cache_system): SH7751 is
++ CPU_SH7750.
++
++ * arch/sh/kernel/sh_ksyms.c (__lshrdi3, flush_cache_range,
++ flush_dcache_page): Added.
++
++ * arch/sh/kernel/led_bigsur.c, arch/sh/kernel/mach_bigsur.c,
++ arch/sh/kernel/pci-bigsur.c, arch/sh/kernel/pci-irq.c,
++ arch/sh/kernel/pci-sh7751.c, arch/sh/kernel/setup_bigsur.c:
++ New files.
++
++ * arch/sh/kernel/io_hd64465.c (hd64465_isa_port2addr): Renamed
++ from POT2ADDR.
++ (PORT2ADDR): Define as macro.
++
++ * include/asm-sh/io_bigsur.c: New file.
++ * arch/sh/kernel/entry.S (exception_handling_table): Added entries
++ for CONFIG_CPU_SUBTYPE_SH7751.
++
++ * arch/sh/kernel/pci-dma.c: New file. Copied from stboards/pcidma.c.
++ * arch/sh/kernel/pci-sh.c: Removed.
++
++ * arch/sh/kernel/Makefile (machine-specific-objs): Added for
++ CONFIG_SH_BIGSUR.
++ (obj-$(CONFIG_SH_BIGSUR)): Added.
++ (obj-$(CONFIG_CPU_SUBTYPE_SH7751)): Added.
++ (obj-$(CONFIG_SH_BIGSUR)): Added.
++
++ * arch/sh/config.in (CONFIG_SH_BIGSUR): New target.
++ (CONFIG_CPU_SUBTYPE_SH7751): New subtype.
++
++ * arch/sh/Makefile (CFLAGS for CONFIG_DEBUG_KERNEL_WITH_GDB_STUB):
++ Added as comment.
++
++2001-05-07 Masahiro Abe <m-abe@aandd.co.jp>
++
++ * include/asm-sh/processor.h (struct sh_fpu_hard_struct): Rename
++ xd_regs to xfp_regs, and change type from long long to long.
++ (struct sh_fpu_soft_struct): Likewise.
++ * include/asm-sh/user.h (struct user_fpu_struct): Likewise.
++
++2001-05-04 YAEGASHI Takeshi <t@keshi.org>
++
++ * drivers/dreamcast/maple/maple.h: Fixed typo.
++ * include/asm-sh/bitops.h (ffs, hweightN): Added definitions.
++ * drivers/char/sh-sci.c (sci_init_drivers): Added driver names used
++ with devfs.
++
++2001-04-30 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.4.
++
++2001-04-26 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.4-pre8.
++
++2001-04-26 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.4-pre7.
++
++2001-04-24 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * config.in: Added CONFIG_RTC.
++ * arch/sh/rtc.c: Moved some definitions to include/asm-sh/rtc.h.
++ * include/asm-sh/rtc.h: Likewise
++ * include/asm-sh/mc146818rtc.h (RTC_PORT, RTC_IRQ, CMOS_READ,
++ CMOS_WRITE, __CMOS_READ, __CMOS_WRITE): Defined.
++ * arch/sh/sh_ksyms.c (__movstr): EXPORT-ed.
++ (__ashrdi3, __ashldi3): EXPORT-ed even if SH-3.
++
++2001-04-23 NIIBE Yutaka <gniibe@m17n.org>
++
++ * lib/rwsem.c: Remove inclusion of linux/bitops.h.
++
++ * Updated to 2.4.4-pre6.
++
++2001-04-20 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/config.in (CONFIG_RWSEM_GENERIC): Removed.
++ * include/linux/rwsem.h (down_write): Conflict merged.
++ * include/asm-sh/semaphore.h: Only valid for __KERNEL__.
++
++ * Updated to 2.4.4-pre5.
++
++2001-04-20 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/config.in: define CONFIG_RWSEM_GENERIC.
++ * include/asm-sh/bitops.h (__set_bit, __clear_bit): defined.
++ * include/asm-sh/semaphore.h: Follow i386 implementation.
++ * include/linux/rwsem.h: small fix.
++ * lib/rwsem.c: Added include linux/bitops.h.
++
++2001-04-19 YAEGASHI Takeshi <t@keshi.org>
++
++ * drivers/dreamcast/maple/maple.h: Added copyright notice.
++
++ * arch/sh/kernel/setup_dc.c: Added prototype for gapspci_init().
++ (pci_alloc_consistent): Fixed printk format string.
++
++2001-04-18 YAEGASHI Takeshi <t@keshi.org>
++
++ * arch/sh/kernel/time.c, drivers/net/8139too.c: MACH_DREAMCAST
++ should be used to keep the generic kernel working.
++
++ * drivers/net/8139too.c (rtl8139_start_xmit): Force to use the
++ dedicated SRAM buffer for bus-mastering.
++
++ * include/asm-sh/mc146818rtc.h: New file: Added to satisfy the
++ include from drivers/char/rtc.c.
++
++2001-04-18 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.4-pre4.
++
++2001-04-14 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.4-pre3.
++
++2001-04-12 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.4-pre2.
++
++2001-04-09 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.4-pre1.
++
++2001-04-01 YAEGASHI Takeshi <t@keshi.org>
++
++ Added SEGA Dreamcast support with the code released from the FFII
++ (http://www.ffii.org/).
++
++ * arch/sh/config.in: Added Dreamcast Configuration.
++ * arch/sh/Makefile: Added build rules of Dreamcast drivers.
++ * arch/sh/kernel/Makefile: Added Dreamcast platform support.
++ * arch/sh/kernel/io_dc.c: New file: Likewise.
++ * arch/sh/kernel/mach_dc.c: New file: Likewise.
++ * arch/sh/setup_dc.c: New file: Likewise
++ * include/asm-sh/io_dc.h: New file: Likewise.
++ * arch/sh/kernel/time.c (time_init): Added Dreamcast RTC override.
++ * drivers/video/dcfb.c: New file: Dreamcast framebuffer driver.
++ * drivers/pci/pci.ids: Updated vendor/device ids for SEGA Broadband
++ Adapter.
++ * drivers/net/8139too.c(board_t, board_info, rtl8139_pci_tbl,
++ rtl8139_rx_config, RX_BUF_LEN_IDX): Added SEGA Broadband Adapter
++ support.
++ * drivers/dreamcast/Config.in: New file: Dreamcast driver support.
++ * drivers/dreamcast/Makefile: New file: Likewise.
++ * drivers/dreamcast/maple/Config.in: New file: MAPLE Bus driver
++ support.
++ * drivers/dreamcast/maple/Makefile: New file: Likewise.
++ * drivers/dreamcast/maple/maple.[ch]: New files: MAPLE Bus core driver.
++ * drivers/dreamcast/maple/dckbd.c: New file: Dreamcast Keyboard driver.
++ * drivers/dreamcast/maple/dcmouse.c: New file: Dreamcast Mouse driver.
++ * drivers/dreamcast/maple/dcpad.c: New file: Dreamcast Controller.
++ driver
++ * include/linux/input.h (BUS_MAPLE): Added new bus type.
++ * drivers/char/Makefile (KEYBD): Removed older Dreamcast keyboard
++ support.
++ * include/asm-sh/keyboard.h (dreamcast_kbd_init_hw): likewise.
++
++ * arsh/sh/kernel/sh_ksyms.c: Include asm/pgalloc.h for
++ flush_tlb_page prototype.
++
++2001-03-31 NIIBE Yutaka <gniibe@m17n.org>
++
++ Follow the change in 2.4.3.
++ * include/asm-sh/pgtable.h (__handle_bad_pmd,
++ __handle_bad_pmd_kernel): Removed.
++
++ * arch/sh/kernel/ptrace.c (sys_ptrace): Follow the change of x86
++ version.
++ * arch/sh/mm/extable.c (search_exception_table): Likewise.
++ * arch/sh/mm/init.c (do_check_pgt_cache): Likewise.
++ * arch/sh/mm/init.c (get_pte_slow, get_pte_kernel_slow,
++ __handle_bad_pmd_kernel, __handle_bad_pmd, get_bad_pte_table,
++ empty_bad_pte_table): Removed.
++ * include/asm-sh/pgtable-2level.h (pgd_clear): Be Function.
++ * include/asm-sh/pgalloc-2level.h: Removed.
++ * arch/sh/mm/ioremap.c (remap_area_pmd): Use pte_alloc with init_mm
++ (was pte_alloc_kernel).
++ (remap_area_pte): Add checks to BUG.
++ Check address!=0 for the condition of do-while.
++ (remap_area_pmd): Add check to BUG.
++ Use pte_alloc with init_mm (was pte_alloc_kernel).
++ Check address!=0 for the condition of do-while.
++ (remap_area_pages): Use pgd_offset (was pgd_offset_k).
++ Add check to BUG, spin_lock/unlock.
++ Use pmd_alloc of init_mm instead of pmd_alloc_kernel.
++ (__ioremap): Change the compare to 0x100000 to '<' (was: '<=').
++ Return error.
++
++ Updated to 2.4.3.
++ * arch/sh/mm/fault.c (do_page_fault): Use up_read/down_read
++ (was: up/down).
++ * arch/sh/kernel/sys_sh.c (do_mmap2): Use up_write/down_write
++ (was: up/down).
++ * arch/sh/kernel/sh_ksyms.c (flush_tlb_page): EXPORT-ed.
++
++2001-03-09 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * include/asm-sh/sigcontext.h (struct sigcontext): Make it
++ compatible with glibc-2.2.2.
++
++2001-03-08 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * drivers/ide/ide-geometry.c: Added '#ifdef __i386__'
++ for i386 specific include file.
++
++2001-03-04 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/entry.S (call_dpf): Cosmetic changes.
++ Use "tst r0, r0" instead of "tst #0xff, r0".
++ (ret_with_reschedule): Likewise.
++
++2001-03-04 Philipp Rumpf <prumpf@tux.org>
++
++ * arch/sh/kernel/process.c (kernel_thread): Remove bogus comment.
++ Bug fix. Use "tst r0, r0" instead of "tst #0xff, r0".
++
++2001-02-24 Bryan Rittmeyer <bryan@ixiacom.com>
++
++ * arch/sh/kernel/sh_ksyms.c (strncat): Added.
++
++2001-02-24 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/rtc.c (RTC_BIT_INVERTED): New macro.
++ (sh_rtc_gettimeofday): Use RTC_BIT_INVERTED.
++ (sh_rtc_settimeofday): Work around implemented.
++
++ Updated to 2.4.2.
++ * include/asm-sh/termios.h (N_IRDA): Incorporate changes of 2.4.2.
++ * include/asm-sh/socket.h, arch/sh/kernel/irq.c,
++ arch/sh/kernel/process.c, arch/sh/kernel/setup.c: Likewise.
++
++2001-02-14 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/setup_cqreek.c (mv_ioremap, mv_iounmap,
++ mv_rtc_gettimeofday, mv_rtc_settimeofday): Define.
++
++2001-02-07 Stuart Menefy <stuart.menefy@st.com>
++
++ Added support for ST40STB1
++ * arch/sh/kernel/pci_st40.[ch]: New files
++ * arch/sh/kernel/irq_intc2.c: New file
++ * arch/sh/kernel/Makefile: Added build of ST40 files
++ * arch/sh/kernel/irq_ipr.c: Added support for second SCIF
++ * arch/sh/kernel/time.c: Added support for FRQCR changes
++ * arch/sh/mm/cache.c: Added ST40 to list of chip types
++ * arch/sh/config.in: Added ST40 CPU and ST boards
++ * arch/sh/overdrive/Makefile: Renamed config option
++ * include/asm-sh/bugs.h: Added ST40STB1 to list of chips
++ * include/asm-sh/pci.h: Added DMA support
++ * include/asm-sh/processor.h: Added ST40STB1 to list of chips
++
++ Added support for ST40STB1 HARP and Overdrive platforms
++ * arch/sh/Makefile: Build in stboards directory if needed
++ * include/asm-sh/io.h: Added HARP and Overdrive IO
++ * arch/sh/stboards/{harp.h,irq.c,led.c,mach.c,pcidma.c,setup.c},
++ arch/sh/stboards/Makefile: New files
++
++ * arch/sh/kernel/io_hd64465.c, include/asm-sh/io_hd64465.h: Added
++ logical shift capability to address mapping code.
++
++ * arch/sh/kernel/setup_hd64465.c, include/asm-sh/serial.h: Fixed
++ support for 16550 serial port.
++
++ * arch/sh/kernel/rtc.c: Fix 1/128 second support.
++
++ * arch/sh/kernel/setup.c: Added some global variables needed for
++ frame buffer support.
++
++ * drivers/char/sh-sci.[ch]: Added ST40STB1 support, and claim
++ interrupt on open, allowing SCI(F) to be shared by drivers.
++
++ * drivers/net/tulip/tulip_core.c: Added SH specific defines
++
++ * drivers/pci/pci.ids: Added STE10/100 device ID
++
++ * include/asm-sh/irq.h: Added ST40STB1 defines, and reworked
++ defintion of NR_IRQS to make easier to manage
++
++ * include/asm-sh/hd64461.h, include/asm-sh/hd64465.h: Use new
++ irq.h defines for peripherial chip interrupts
++
++2001-02-02 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.1.
++ * arch/sh/kernel/traps.c: Include linux/config.h.
++
++2001-01-31 Philipp Rumpf <prumpf@tux.org>
++
++ * arch/sh/kernel/setup_ec3104.c (get_pending_interrupts):
++ New function.
++
++ * drivers/char/ec3104_keyb.c (ec3104_keyb_receive): Removed.
++ (e5_checksum, e5_wait_for_cts, e5_send_byte, e5_send_packet,
++ e5_receive): New functions.
++ (struct e5_struct): Renamed from ec3104_keyb_struct.
++
++ * drivers/video/Config.in (CONFIG_E1355_REG_BASE,
++ CONFIG_E1355_FB_BASE): New config variables.
++ * drivers/video/epson1355fb.c (e1355fb_init): Don't call
++ disable_hw_cursor from here.
++ (AERO_HACKS): Undefined.
++
++2001-01-30 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.1-pre12.
++
++2001-01-29 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.1-pre11.
++ * arch/sh/kernel/signal.c: Remove the decl. of sys_wait4.
++
++2001-01-27 Yutaro Ebihara <ebiharaml@si-linux.com>
++
++ * arch/sh/config.in (CONFIG_CF_ENABLER): Valid when
++ CONFIG_SH_CAT68701.
++
++2001-01-26 Yutaro Ebihara <ebiharaml@si-linux.com>
++
++ Add support for CAT68701 board computer.
++ * arch/sh/config.in (CONFIG_SH_CAT68701): Added.
++ * arch/sh/kernel/Makefile (obj-$(CONFIG_SH_CAT68701)): Added.
++ * arch/sh/kernel/io_cat68701.c: New file.
++ * arch/sh/kernel/mach_cat68701.c: New file.
++ * include/asm-sh/io.h (CONFIG_SH_CAT68701): Include
++ asm/io_cat68701.h.
++ * inlude/asm/io_cat68701.h: New file.
++ * include/asm-sh/irq.h (cat68701_irq_demux): New function.
++
++2001-01-24 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.1-pre10.
++
++2001-01-23 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/signal.c (setup_frame, setup_rt_frame):
++ Use flush_cache_sigtramp.
++
++ * arch/sh/mm/cache.c (flush_cache_sigtramp): Implemented.
++
++ * include/asm-sh/pgtable.h (_PAGE_SHARED): Always _PAGE_U0_SHARED.
++ (was conditionally _PAGE_HW_SHARED on SH-3). With _PAGE_HW_SHARED,
++ all processes share the page, while proper semantics is "some
++ processes share the page".
++ (flush_cache_sigtramp): New function.
++
++ * Updated to 2.4.1-pre9.
++
++ * arch/sh/kernel/sh_ksyms.c (__udivsi3, __sdivsi3): Added.
++
++2001-01-13 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.1-pre3.
++
++2001-01-10 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/sh_ksyms.c (__udivsi3_i4, __sdivsi3_i4): Removed.
++
++2001-01-10 Bryan Rittmeyer <bryan@ixiacom.com>
++
++ * arch/sh/kernel/entry.S: Fixed typo for SR and added "OFF_" for SP.
++
++2001-01-10 Denis Dowling <dpd@preston.net>
++
++ * arch/sh/kernel/entry.S: Change RX-->OFF_RX.
++
++2001-01-08 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/net/stnic.c (stnic_probe): Set the MAC address from BIOS.
++
++ * include/asm-sh/sh_bios.h (sh_bios_shutdown): New function.
++ * arch/sh/kernel/sh_bios.c (BIOS_CALL_ETH_NODE_ADDR): Added.
++ (sh_bios_get_node_addr): New function.
++
++2001-01-06 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.0.
++ * arch/sh/kernel/rtc.c: Remove the inclusion of <linux/config.h>.
++
++2001-01-04 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/process.c (machine_halt, machine_restart):
++ Call sh_bios_shutdown.
++ * include/asm-sh/sh_bios.h (sh_bios_shutdown): New function.
++ * arch/sh/kernel/sh_bios.c (sh_bios_shutdown): New function.
++ (BIOS_CALL_SHUTDOWN): Added.
++
++ * arch/sh/kernel/sh_bios.c (CONFIG_SH_STANDARD_BIOS): No conditional
++ compilation, since it's done in Makefile.
++ (linux/config.h): Not included.
++
++ * drivers/net/stnic.c (STNIC_DELAY): We need more delay for
++ SolutionEngine 7709A.
++
++ * arch/sh/lib/delay.c (__const_udelay): Fixed. Use DMULU.
++
++2001-01-03 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Updated to 2.4.0-prerelease.
++ * include/asm-sh/{bugs.h,delay.h}: Follow 2.4.0-prerelease.
++ * arch/sh/lib/delay.c: Ditto.
++
++2001-01-03 Mitch Davis <mdavis@pocketpenguins.com>
++
++ * arch/sh/config.in, arch/sh/kernel/entry.S,
++ arch/sh/kernel/traps.c: Get the setting of the VBR from
++ the previous value (set by bootloader) instead of explicitly
++ hard-coding it.
++ * arch/sh/config.in: Pull in the Linux Kernel Input (LKI)
++ device configuration.
++ * arch/sh/kernel/sh_ksyms.c: Export some symbols we need.
++ * include/asm-sh/segment.h: Some old header files expect this
++ file to exist.
++ * drivers/char/Makefile: Added an entry for DMIDA keyboard
++ support.
++ * kernel-official/drivers/input/keybdev.c: Added an entry
++ for SuperH LKI support.
++ * drivers/char/sh-sci.h: The SCI port on the DMIDA is used
++ to drive an SPI bus in synchronous mode. So it's not available
++ as a general-purpose async serial port. Disable it.
++
++2001-01-03 Mitch Davis <mdavis@pocketpenguins.com>
++
++ * include/asm-sh/hd64465_gpio.h,
++ arch/sh/kernel/hd64465_gpio.c,
++ arch/sh/kernel/Makefile: Added support for the 5
++ 8-bit GPIO ports on the HD64465.
++ * arch/sh/kernel/io_hd64465.c: Added some debugging DIPRINTKs.
++ * include/asm-sh/hd64465.h: Added register definitions
++ for the HD64465's onboard PS/2 mouse/keyboard and USB
++ controllers.
++
++Local Variables:
++mode: change-log
++left-margin: 8
++fill-column: 76
++version-control: never
++End:
+diff -ruN linux-2.6.17-vanilla/ChangeLog-2002 linux-2.6.17/ChangeLog-2002
+--- linux-2.6.17-vanilla/ChangeLog-2002 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/ChangeLog-2002 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1,1750 @@
++2002-12-21 Paul Mundt <lethal@linux-sh.org>
++
++ * Makefile: Fix-up TOPDIR so it again references /bin/pwd
++ instead of the non-existant CURDIR .. now we can build a
++ zImage again.
++
++ * arch/sh/kernel/setup.c (get_cpu_subtype): Added.
++ (show_cpuinfo): General cleanup/rewrite. Get rid of the ifdef mess.
++ * arch/sh/kernel/time.c: Add profiling definitions.
++
++ * arch/sh/mm/cache-sh4.c (flush_icache_range): Drop the usage of
++ __flush_wback_region() in favor of __flush_dcache_all() -- suboptimal,
++ but does the Right Thing(tm).
++
++ * drivers/net/Kconfig: Add 8139TOO_DREAMCAST. Seems this got
++ lost along the merges and caused pci_alloc_consistent() to fail.
++
++ * include/asm-sh/bugs.h (check_bugs): Lots of cleanup, do
++ the utsname update per-family, and leave the subtype notification
++ to get_cpu_subtype().
++
++2002-12-19 Paul Mundt <lethal@linux-sh.org>
++
++ * Makefile: Bump up the inline-limit to 5000.
++
++2002-12-16 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/boards/saturn/Makefile: Add smp.c.
++ * arch/sh/boards/saturn/smp.c: New file.
++ * include/asm-sh/saturn/smpc.h: New file.
++
++2002-12-15 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/vmlinux.lds.S: Add __per_cpu_{start,end}.
++
++ * arch/sh/kernel/smp.c: New file.
++ (smp_cpus_done, smp_send_reschedule, stop_this_cpu, smp_send_stop,
++ smp_call_function, __smp_call_function): Added.
++ * arch/sh/kernel/setup.c: Add platform_setup() and get_system_type()
++ references .. fixes compile-time warnings.
++
++ * include/asm-sh/bitops.h (find_first_bit, find_next_bit): Added.
++ * include/asm-sh/smp.h (cpu_online, cpu_possible, num_online_cpus):
++ Added.
++ * include/asm-sh/spinlock.h: Change rwlock/spinlock lock type to
++ long. Add spinlock/rwlock debugging.
++ (spin_lock_init): Fixed up invalid lock reference.
++ (spin_unlock_wait): Use spin_is_locked().
++ (_raw_spin_trylock): Added.
++ (rwlock_init, rwlock_is_locked): Added.
++ Add a SMP_MSG_RESCHEDULE definition.
++
++2002-12-14 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Kconfig: Add CONFIG_SMP and NR_CPUS definitions.
++
++ * arch/sh/kernel/Makefile: Add smp.c if CONFIG_SMP is set.
++ * arch/sh/kernel/irq.c (probe_irq_on): Get rid of synchronize_irq()
++ calls, since they weren't doing anything anyways .. use barrier()
++ for our delay instead.
++ * arch/sh/kernel/time.c: Clean up profiling definitions.
++
++ * include/asm-sh/processor.h: Track cpu_data for each processor.
++
++ * include/asm-sh/smp.h: Make it do something.
++ * include/asm-sh/spinlock.h: Ditto.
++ * include/asm-sh/system.h: Clean up some left-over cruft that we
++ don't have any use for anymore.
++
++2002-12-13 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/mm/init.c (enable_mmu, disable_mmu): Moved ..
++ * include/asm-sh/mmu_context.h: .. here. Make it a nop for non-SH3/4.
++
++2002-12-12 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/mm/init.c (paging_init): Largely rewritten to support
++ CONFIG_MMU being set or not while still taking discontig into
++ consideration. -- Allows SH-3/4 to boot with the MMU turned off.
++ (mem_init): Cleaned up remaining MAX_LOW_PFN/START_PFN references.
++ (enable_mmu): Added.
++ (disable_mmu): Added.
++ (pgd_alloc, pgd_free, pte_alloc_one_kernel, pte_alloc_one): Moved ..
++
++ * arch/sh/kernel/time.c (sh_do_profile): New function.
++
++ * include/asm-sh/pgalloc.h: .. here.
++ * include/asm-sh/page.h (MAP_NR): Re-added. This was removed about
++ 2 years ago .. but we actually have a real use for it now.
++ * include/asm-sh/hw-irq.h (sh_do_profile): Removed.
++
++2002-12-04 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Kconfig: Add CPU_SH2/CPU_SUBTYPE_SH7604. Don't set MMU if
++ CPU_SH2 is set. Default SH_WRITETHROUGH on for SH-2.
++ * arch/sh/Makefile: Add SH-2 CFLAGS/AFLAGS.
++ * arch/sh/vmlinux.lds.S: Fix SH-2 alignment.
++
++ * arch/sh/kernel/cpu/Makefile: Add sh2/
++ * arch/sh/kernel/cpu/sh2/Makefile: New file.
++
++ * arch/sh/kernel/setup.c (show_cpuinfo): Get rid of SH-3/4
++ distinction. Print everything out dynamically .. look at the dcache
++ flags for combined caches (in the case of SH-2 and SH-3).
++
++ * arch/sh/mm/Makefile: Add SH-2 cache file.
++ * arch/sh/mm/cache-sh3.c (detect_cpu_and_cache_system): Default cache
++ flags to CACHE_COMBINED.
++ * arch/sh/mm/cache-sh2.c: New file.
++ * arch/sh/mm/init.c (sh_cache_init): Use __get_oc_addr() to get
++ the OC address (this is CPU specific).
++
++ * include/asm-sh/bugs.h (check_bugs): Add a CPU_SH7604 case.
++ * include/asm-sh/cache.h: Add SH-2 definitions. Add a flags variable
++ to the cache_info struct. Also add a __get_oc_addr() fallback.
++ * include/asm-sh/processor.h: Add CPU_SH7604 definition.
++
++2002-12-01 Paul Mundt <lethal@linux-sh.org>
++
++ * TODO: More removals .. write-through caching, probing,
++ config.in/Makefile cleanup, etc.
++
++ * arch/sh/Kconfig: Clean up CPU_LITTLE_ENDIAN definition (which was
++ blatantly ripped off from MIPS, but neglected to change the MIPS
++ reference). Clean up SH_WDT definition, we're not just for SH-3/4
++ anymore.. And finally, added SH_WRITETHROUGH and SH_OCRAM definitions.
++
++ * arch/sh/kernel/setup.c (show_cpuinfo): Calculate I/D cache sizes
++ dynamically.
++ * arch/sh/kernel/sh_ksyms.c: dump_fpu() now takes a pt_regs arg.
++
++ * arch/sh/mm/cache-sh3.c: Moved out cache definitions to asm/cache.h
++ Nuked cache_wback_all() and sh_cache_init, reworked much of
++ detect_cpu_and_cache_system(), as well as various other cleanups.
++ * arch/sh/mm/cache-sh4.c: Folded detect_cpu() back into
++ detect_cpu_and_cache_system() and did more rework. Added a proper
++ flush_icache_range() and made flush_cache_sigtramp() wrap by
++ blowing out a line. Removed sh_cache_init().
++ * arch/sh/mm/init.c (sh_cache_init): Added.
++
++ * include/asm-sh/cache.h: Move SH-3/4 cache definitions here. Also
++ add __cacheline_aligned stuff and a generic cache_info structure
++ for I/D cache representation per-CPU.
++ * include/asm-sh/cacheflush.h: Comment on write-through.
++ * include/asm-sh/mman.h: Added MAP_POPULATE and MAP_NONBLOCK.
++ * include/asm-sh/mmu_context.h: Drag in asm/uaccess.h..
++ * include/asm-sh/processor.h: Add i/d-cache entries to sh_cpuinfo.
++
++2002-11-16 Paul Mundt <lethal@linux-sh.org>
++
++ * TODO: Blow another one off the list. (SH-4 run-time probing).
++
++ * arch/sh/kernel/time.c: Rip out the PVR defines ..
++ * include/asm-sh/processor.h: Move them here, instead. Also add
++ definitions for 7750S and 7750R.
++
++ * arch/sh/mm/cache-sh4.c: detect_cpu_and_cache_system() gutted.
++ Replaced by detect_cpu(), which does version/revision probing
++ at run-time instead of at preprocessing time. Kill off remaining
++ ifdef abuse in flush_cache_4096() .. also add sanity checks for
++ 7751R.
++
++2002-11-15 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/mm/cache-sh3.c, arch/sh/mm/cache-sh4.c: If the OC is in RAM
++ mode, we only have half the entries to flush.. so tear down
++ CACHE_OC_NUM_ENTRIES accordingly.
++
++2002-11-14 Paul Mundt <lethal@linux-sh.org>
++
++ * drivers/video/pvr2fb.c (pvr2fb_init): Move ID assignment down a bit,
++ so we don't inadvertently dereference NULL..
++
++2002-11-13 Paul Mundt <lethal@linux-sh.org>
++
++ * AGAINST-2.5.44: Really remove it.
++
++ * arch/sh/boards/se/7751/Makefile, arch/sh/boards/adx/Makefile,
++ arch/sh/boards/bigsur/Makefile, arch/sh/boards/cat68701/Makefile,
++ arch/sh/boards/cqreek/Makefile, arch/sh/boards/dmida/Makefile,
++ arch/sh/boards/ec3104/Makefile, arch/sh/boards/harp/Makefile,
++ arch/sh/boards/overdrive/Makefile, arch/sh/boards/sh2000/Makefile,
++ arch/sh/boards/unknown/Makefile, arch/sh/boards/hp6xx/hp620/Makefile,
++ arch/sh/boards/hp6xx/hp680/Makefile,
++ arch/sh/boards/hp6xx/hp690/Makefile: Kill off O_TARGET.
++
++ * arch/sh/cchips/hd6446x/hd64461/Makefile,
++ arch/sh/cchips/hd6446x/hd64465/Makefile: Here too.
++
++ * arch/sh/Kconfig: Support crypto. Add CONFIG_SWAP, CONFIG_MMU, and
++ CONFIG_VIPT definitions.
++
++ * mm/memory.c: Use CONFIG_VIVT for flush_cache_page() check. Could
++ probably use a CONFIG_ARM check, but screw it.
++
++2002-11-05 M. R. Brown <mrbrown@linux-sh.org>
++
++ Branch merge of Linux-SH HEAD (2.5.45)
++
++ * AGAINST-2.5.45: New file.
++ * AGAINST-2.5.44: Remove.
++
++ * arch/sh/Kconfig, drivers/cdrom/Kconfig, drivers/char/Kconfig,
++ drivers/input/joystick/Kconfig, drivers/input/keyboard/Kconfig,
++ drivers/net/Kconfig: Add files.
++ * arch/sh/Config.help, arch/sh/config.in, drivers/cdrom/Config.help,
++ drivers/cdrom/Config.in, drivers/char/Config.help,
++ drivers/input/joystick/Config.help, drivers/input/joystick/Config.in,
++ drivers/maple/Config.in, drivers/mtd/Config.help,
++ drivers/mtd/maps/Config.help, drivers/mtd/maps/Config.in,
++ drivers/net/Config.help, drivers/net/Config.in: Remove files.
++ * Makefile, arch/sh/kernel/cf-enabler.c, arch/sh/mm/cache-sh4.c,
++ arch/sh/mm/fault.c, drivers/block/rd.c, drivers/char/Makefile,
++ drivers/char/maple_keyb.c, drivers/char/shwdt.c,
++ drivers/net/8139too.c, drivers/pci/pci.ids, fs/mpage.c,
++ include/asm-sh/uaccess.h, init/do_mounts.c, kernel/timer.c: Modified
++ files.
++
++2002-11-05 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/irq.c (do_IRQ): Add kstat_cpu() hooks.
++
++ * arch/sh/kernel/ptrace.c, arch/sh/kernel/process.c,
++ include/asm-sh/process.h: Death to PTRACE_O_TRACESYSGOOD as well as
++ PTRACE_SETOPTIONS.
++
++ * include/asm-sh/processor.h (copy_segments, release_segments):
++ Removed.
++
++ Sync with 2.5.46 non-Kconfig updates.
++
++2002-11-04 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/cpufreq.c (sh_cpufreq_setstate): Do a bit of rework
++ here so we use the read/write routines provided by the watchdog.h.
++
++ * drivers/char/shwdt.c: WDT update. Merge in some bits from mainline,
++ as well as some additional cleanup. SH-2 support. Move all of the
++ read/write garbage out..
++
++ * include/asm-sh/watchdog.h: Add support for the SH-2. And dump the
++ read/write stuff here.. then inline it.
++
++ * arch/sh/boards/bigsur/irq.c, arch/sh/boards/cqreek/irq.c,
++ arch/sh/boards/dreamcast/irq.c, arch/sh/boards/harp/irq.c,
++ arch/sh/boards/overdrive/irq.c, arch/sh/boards/overdrive/led.c,
++ arch/sh/kernel/irq_intc2.c, arch/sh/kernel/irq_ipr.c,
++ arch/sh/kernel/irq_maskreg.c, arch/sh/kernel/pci-sh7751.c,
++ arch/sh/mm/cache-sh3.c, arch/sh/mm/cache-sh4.c,
++ arch/sh/mm/fault.c, drivers/cdrom/gdrom.c,
++ drivers/char/sh-sci.c, drivers/maple/maple.c,
++ drivers/pcmcia/hd64465_ss.c, include/asm-sh/atomic.h,
++ arch/sh/cchips/hd6446x/hd64461/setup.c,
++ arch/sh/cchips/hd6446x/hd64465/gpio.c,
++ arch/sh/cchips/hd6446x/hd64465/setup.c,
++ include/asm-sh/bitops.h:
++
++ Global save_and_cli()/restore_flags() death, make everyone use
++ local_irq_save()/local_irq_restore().
++
++ * include/asm-sh/system.h: Kill the rest of the save_and_cli badness
++ here.
++
++2002-11-02 M. R. Brown <mrbrown@linux-sh.org>
++
++ * arch/sh/kernel/cpufreq.c (sh_cpufreq_update_clocks): Update
++ loops_per_jiffy for the current CPU.
++ (sh_cpufreq_setstate): Add cpu parameter. Call
++ cpufreq_notify_transition() before and after the frequency changes.
++ (sh_cpufreq_setpolicy): Pass cpu to sh_cpufreq_setstate().
++ (sh_cpufreq_init): Oops, we need kHz, not Hz.
++
++ * drivers/char/sh-sci.c (sci_notifier): New function. Attempt to
++ update baud rate when our peripheral clock changes.
++ (sci_init_drivers): Add notifier.
++
++2002-11-02 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/time.c: Fix up some of the frequency table
++ declarations, move the divisor/values accessors into the same
++ macro.
++ * arch/sh/kernel/cpufreq.c (sh_cpufreq_setstate): Clean up some
++ watchdog definitions.
++ * drivers/char/shwdt.c: Move some of the watchdog definitions
++ out of the way.
++
++ * include/asm-sh/watchdog.h: New file.
++
++2002-11-01 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/cpufreq.c: New file.
++ * arch/sh/kernel/time.c: Countless hacks for cpufreq.
++
++ * include/asm-sh/freq.h: New file.
++
++
++2002-11-01 M. R. Brown <mrbrown@linux-sh.org>
++
++ * drivers/cdrom/Kconfig, drivers/char/Kconfig,
++ drivers/input/joystick/Kconfig, drivers/input/keyboard/Kconfig,
++ drivers/net/Kconfig: Add from stock 2.5.45.
++ * drivers/cdrom/Config.help, drivers/char/Config.help,
++ drivers/input/joystick/Config.help: Remove.
++
++ Linux 2.5.45.
++
++ * AGAINST-2.5.45: New file.
++ * AGAINST-2.5.44: Remove.
++
++ * arch/sh/Kconfig: New file.
++ * arch/sh/Config.help, drivers/cdrom/Config.help,
++ drivers/cdrom/Config.in, drivers/char/Config.help,
++ drivers/input/joystick/Config.help, drivers/input/joystick/Config.in,
++ drivers/maple/Config.in, drivers/mtd/maps/Config.help,
++ drivers/mtd/maps/Config.in, drivers/mtd/Config.help,
++ drivers/net/Config.help, drivers/net/Config.in, arch/sh/config.in:
++ Remove.
++
++ * Makefile, arch/sh/mm/fault.c, drivers/char/Makefile,
++ drivers/net/8139too.c, fs/mpage.c, init/do_mounts.c, kernel/timer.c:
++ Merge changes from Linux 2.5.45.
++
++
++2002-10-28 M. R. Brown <mrbrown@linux-sh.org>
++
++ Restructure PCI code / PCI auto implementation
++
++ * TODO: Update.
++
++ * arch/sh/config.in: Disable CONFIG_PCI_AUTO for the Dreamcast.
++
++ * arch/sh/boards/dreamcast/pci.c: Implement board_pci_channels.
++ (pcibios_fixup, pcibios_fixup_irqs): New routines.
++ (pcibios_init): Remove.
++ * arch/sh/boards/dreamcast/setup.c (platform_setup): Add call to
++ gapspci_init() if CONFIG_PCI is enabled.
++
++ * arch/sh/kernel/pci.c (pcibios_init): New routine.
++ * arch/sh/kernel/pci_auto.c (pciauto_setup_bars,
++ pciauto_prescan_setup_bridge, pciauto_postscan_setup_bridge,
++ pciauto_prescan_setup_cardbus_bridge,
++ pciauto_postscan_setup_cardbus_bridge, pciauto_bus_scan): Change
++ declaration to static.
++
++ * include/asm-sh/pci.h: Add struct pci_channel; add prototypes for
++ board-specific fixup routines; add prototype for
++ pciauto_assign_resources().
++
++ * arch/sh/kernel/pcibios.c: Move...
++ * arch/sh/kernel/pci.c: ...here.
++ * arch/sh/kernel/pci_auto.c: New file. Import
++ arch/mips/kernel/pci_auto.c from linux-mips.
++ * arch/sh/kernel/Makefile: Rename rule for pcibios.o; add rule for
++ pci_auto.o.
++
++2002-10-28 Paul Mundt <lethal@linux-sh.org>
++
++ * drivers/video/pvr2fb.c: Rather extensive rewrite for new API.
++
++ * arch/sh/boards/se/770x/Makefile: Remove O_TARGET.
++ * arch/sh/boards/se/770x/irq.c: Drag in hitachi_se.h for
++ definitions.
++
++ * drivers/char/sh-sci.c (sci_receive_chars): Fix handle_sysrq()
++ invokation.
++ * drivers/char/sysrq.c (send_sig_all): for_each_task renamed to
++ for_each_process.
++
++2002-10-27 M. R. Brown <mrbrown@linux-sh.org>
++
++ * arch/sh/vmlinux.lds.S: Major cleanups, more in-line with the i386
++ port.
++
++ * arch/sh/kernel/setup.c (setup_arch): Get rid of hack console init.
++ The full hack is scheduled to be removed at a later date.
++
++ * drivers/video/pvr2fb.c: Comment out unused structure definitions so
++ it builds.
++
++ * arch/sh/Makefile: Make boards build properly.
++
++ * arch/sh/boards/dreamcast/Makefile: 2.5-ify.
++ * arch/sh/boards/dreamcast/pci.c, arch/sh/boards/dreamcast/rtc.c,
++ arch/sh/boards/dreamcast/setup.c: Finish merging 2.5.44 changes from
++ HEAD.
++
++ * arch/sh/kernel/Makefile: Remove O_TARGET.
++ * arch/sh/kernel/time.c: Fix rtc_{get,set}_time() initializations.
++ (time_init): Make sure we call board_time_init() before calling any
++ routines that depend on it. Make sure we always get the cpu and bus
++ clock from the CPU.
++ * drivers/char/tty_io.c: Merge from 2.5.44.
++
++2002-10-24 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/Makefile: Kill off the SE7751 LED code, use
++ SE generic code instead.
++ * arch/sh/kernel/led_se.c: Bring in SE7751 definitions if
++ CONFIG_SH_7751_SOLUTION_ENGINE is set.
++ * arch/sh/kernel/mach_7751se.c: Change heartbeat_7751se references
++ to heartbeat_se.
++ * arch/sh/kernel/led_7751se.c: Removed.
++
++2002-10-23 Paul Mundt <lethal@linuxdc.org>
++
++ * arch/sh/config.in: Added CONFIG_CMDLINE_BOOL/CONFIG_CMDLINE.
++ Can now manually hard-code an intial kernel command line.
++
++ * arch/sh/kernel/setup.c (setup_arch): Append CONFIG_CMDLINE
++ to the kernel command line when CONFIG_CMDLINE_BOOL is set.
++ * arch/sh/kernel/rtc.c (sh_rtc_gettimeofday): Timespec pointer
++ changed name, reflect that in the rest of the code..
++
++ * include/asm-sh/ide.h (ide_init_default_hwifs): Fix the
++ ide_register_hw() call so it gets passed the correct number of
++ arguments.
++
++2002-10-22 Paul Mundt <lethal@linuxdc.org>
++
++ * include/asm-sh/bugs.h (check_bugs): Added a CPU_SH7751R check.
++
++2002-10-21 Paul Mundt <lethal@linuxdc.org>
++
++ * arch/sh/Makefile: Kill off LOADADDR cruft.
++
++ * arch/sh/boot/compressed/Makefile: Fixup ZLDFLAGS so we use
++ vmlinux.lds.s.
++
++ * arch/sh/kernel/entry.S: Rename sys_pread/pwrite to
++ sys_pread64/pwrite64.
++ * arch/sh/kernel/time.c: Define jiffies_64. Redefine TICK_SIZE to
++ use TICK_NSEC instead of tick_nsec.
++
++ * drivers/block/rd.c (rd_blkdev_pagecache_IO): Make sure we
++ flush_dcache_page() on the associated page from the BIO vector
++ instead of the buffer head.
++
++ * drivers/char/maple_keyb.c (dc_kbd_connect): Fix bustype
++ assignment and make it build again.
++
++ * drivers/input/keyboard/maple_keyb.c (dc_kbd_connect): Build fix.
++
++ * drivers/video/pv2fb.c (pvr2fb_set_var): Comment out offending
++ sections. Clean this up later and make things work again.
++
++ * fs/mpage.c: Add mm.h header.
++
++ * include/asm-sh/param.h: Define USER_HZ and redefine
++ CLOCKS_PER_SEC.
++ * include/asm-sh/pgalloc.h (pte_free_tlb): Renamed to
++ __pte_free_tlb. Likewise for pmd.
++ * include/asm-sh/system.h (irqs_disabled): Added.
++ * include/asm-sh/tlb.h (tlb_remove_tlb_entry): Renamed to
++ __tlb_remove_tlb_entry.
++ * include/asm-sh/kmap_types.h: New file -- generic skeletal
++ stuff required by AIO.
++
++ * kernel/time.c (do_adjtimex): Protect tick_nsec reference with
++ CONFIG_VARIABLE_CLOCK_TICK_RATE.
++ * kernel/timer.c (update_wall_time_one_tick): Use TICK_NSEC
++ instead of tick_nsec for systems with a non-static clock tick
++ rate.
++
++ Also protect the tick_nsec declaration with the
++ CONFIG_VARIABLE_CLOCK_TICK_RATE -- fixup all other tick_nsec
++ references with TICK_NSEC instead.
++
++2002-10-21 M. R. Brown <mrbrown@linuxdc.org>
++
++ * arch/sh/config.in: Massive cleanups in preparation of the
++ linux-2_5-restructure merge.
++
++ * arch/sh/kernel/head.S: Rename cache_init to sh_cache_init to
++ prevent conflict with sunrpc code (net/sunrpc/cache.c).
++ * arch/sh/kernel/mach_dc.c: Rename aica_rtc_* routines to sh_rtc_*.
++ Temporary stop-gap until restructure where RTC is cleaned up.
++ * arch/sh/kernel/pci-dc.c (pcibios_init): Call gapspci_init()
++ directly. Properly initialize PCI subsystem via subsys_initcall().
++ * arch/sh/kernel/rtc-aica.c: Rename aica_rtc* routines to sh_rtc_*.
++ Temporary stop-gap until restructure where RTC is cleaned up.
++ * arch/sh/kernel/setup.c (scif_sercon_putc, scif_sercon_flush,
++ scif_sercon_write, scif_sercon_device, scif_sercon_setup,
++ scif_sercon_init, scif_sercon_unregister): New routines. Implement a
++ hacked SH4 SCIF console until normal consoles are rewritten and
++ CONFIG_VT is handled properly.
++ (setup_arch): Inititalize SCIF serial console.
++ * arch/sh/kernel/setup_dc.c (setup_dreamcast): Remove call to
++ gapspci_init; minor cleanups.
++
++ * arch/sh/mm/cache-sh3.c: Rename cache_init to sh_cache_init to
++ prevent conflict with sunrpc code (net/sunrpc/cache.c).
++ * arch/sh/mm/cache-sh4.c: Rename cache_init to sh_cache_init to
++ prevent conflict with sunrpc code (net/sunrpc/cache.c).
++ * arch/sh/mm/init.c (paging_init): Initialize mem_map.
++ CONFIG_DISCONTIGMEM case is not implemented yet.
++
++ * drivers/pci/pci.ids: Remove duplicate entry.
++
++ * include/asm-sh/hw_irq.h (sh_do_profile): New function. Holdover
++ until restructure is in place.
++
++2002-10-19 M. R. Brown <mrbrown@linuxdc.org>
++
++ * arch/sh/kernel/init_task.c: Fix init_signals initialization.
++ * arch/sh/kernel/irq.c (handle_IRQ_event): Remove unused SMP crud; fix
++ irq_enter() and irq_exit() macros.
++ (disable_irq): Call synchronize_irq().
++ (synchronize_irq): New funtion; available if CONFIG_SMP is defined.
++ * arch/sh/kernel/pcibios.c (pcibios_align_resource,
++ pcibios_enable_device): Fix function declarations.
++ * arch/sh/kernel/rtc-aica.c (aica_rtc_gettimeofday): Convert to struct
++ timespec.
++ (aica_rtc_settimeofday): Now accepts time_t instead of
++ timeval/timespec.
++ * arch/sh/kernel/rtc.c (sh_rtc_gettimeofday): Convert to struct
++ timespec.
++ (sh_rtc_settimeofday): Now accepts time_t instead of timeval/timespec.
++ * arch/sh/kernel/sh_ksyms.c Commented out screen_info symbol until
++ it's replacement is determined; Export synchronize_irq().
++ * arch/sh/kernel/time.c: Merged from restructure.
++ (do_gettimeoffset): Convert to nanoseconds/update for timespec.
++ (do_settimeofday): Same here.
++ (sh_do_profile): Removed.
++ (do_timer_interrupt): More usec->nsec conversion.
++ (get_timer_frequency): Use nanoseconds instead of usecs. Not so sure
++ about this one.
++ (time_init): CONFIG_CPU_SUBTYPE_ST40STB1 hack gutted; KGDB is
++ initialized from here.
++
++ * include/asm-sh/hardirq.h: Converted to 2.5 series.
++ * include/asm-sh/machvec.h: mv_rtc_gettimeofday and
++ mv_rtc_settimeofday prototypes updated.
++ * include/asm-sh/rtc.h: Update prototypes.
++ * include/asm-sh/softirq.h: Converted to 2.5 series.
++ * include/asm-sh/system.h: Comment out macros now included in
++ kernel/sched.c by default (no need to override).
++
++
++ * arch/sh/kernel/process.c (sys_fork, sys_clone, sys_vfork): Add
++ missing user_tid parameter, set to NULL for all calls.
++ * arch/sh/kernel/signal.c (sys_sigsuspend, sys_rt_sigsuspend,
++ sys_sigreturn, sys_rt_sigreturn, handle_signal): Replace obsolete
++ field sigmask_lock with sig->siglock.
++
++ * include/asm-sh/system.h: Fix definition of save_and_cli() for UP.
++
++ * include/asm-sh/linkage.h, include/asm-sh/percpu.h,
++ include/asm-sh/rmap.h, include/asm-sh/topology.h: Add missing header
++ files from 2.5 series.
++
++ Linux 2.5.44
++
++ * AGAINST-2.5.44: New file.
++ * AGAINST-2.5.43: Removed.
++
++ * Makefile, arch/sh/lib/old-checksum.c, drivers/block/rd.c,
++ drivers/char/Makefile, drivers/char/Config.help, fs/nfs/inode.c,
++ include/asm-sh/checksum.h, include/asm-sh/system.h: Merge changes from
++ Linux 2.5.44.
++
++2002-10-18 M. R. Brown <mrbrown@linuxdc.org>
++
++ * fs/nfs/inode.c: Fix merge breakage.
++
++ Linux 2.5.43
++
++ * AGAINST-2.5.43: New file.
++ * AGAINST-2.5.42: Removed.
++
++ * Makefile, arch/sh/kernel/mach_7751se.c, arch/sh/kernel/mach_adx.c,
++ arch/sh/kernel/mach_bigsur.c, arch/sh/kernel/mach_cat68701.c,
++ arch/sh/kernel/mach_dc.c, arch/sh/kernel/mach_dmida.c,
++ arch/sh/kernel/mach_ec3104.c, arch/sh/kernel/mach_hp600.c,
++ arch/sh/kernel/mach_se.c, arch/sh/kernel/mach_unknown.c,
++ arch/sh/kernel/setup.c, arch/sh/kernel/setup_cqreek.c,
++ arch/sh/kernel/setup_dc.c, arch/sh/kernel/setup_ec3104.c,
++ arch/sh/kernel/setup_hd64465.c, arch/sh/kernel/setup_sh2000.c,
++ arch/sh/stboards/mach.c, drivers/block/rd.c, drivers/Makefile,
++ drivers/char/Makefile, drivers/char/Config.help,
++ drivers/mtd/maps/Config.in, drivers/mtd/maps/Config.help,
++ drivers/mtd/Config.help, fs/nfs/inode.c, mm/memory.c: Merge changes
++ from Linux 2.5.43.
++
++ Linux 2.5.42
++
++ * AGAINST-2.5.42: New file.
++ * AGAINST-2.5.41: Removed.
++
++ * Makefile, drivers/block/rd.c, drivers/char/Config.help,
++ fs/nfs/inode.c, include/linux/input.h: Merge changes from Linux
++ 2.5.42.
++
++ * Makefile: Fix merge breakage.
++
++ 5Linux 2.5.41
++
++ * AGAINST-2.5.41: New file.
++ * AGAINST-2.5.40: Removed.
++
++ * Makefile, drivers/block/rd.c, drivers/char/Makefile,
++ drivers/char/Config.help, drivers/char/sh-sci.c,
++ drivers/char/sh-sci.h, drivers/mtd/maps/Config.in,
++ drivers/mtd/maps/Config.help, drivers/net/Config.in,
++ drivers/pci/pci.ids, drivers/pcmcia/hd64465_ss.c, fs/nfs/inode.c,
++ include/asm-sh/unistd.h, init/do_mounts.c, mm/memory.c: Merge changes
++ from Linux 2.5.41.
++
++ Linux 2.5.40
++
++ * AGAINST-2.5.40: New file.
++ * AGAINST-2.5.39: Removed.
++
++ * Makefile, drivers/block/rd.c, drivers/net/8139too.c, mm/memory.c:
++ Merge changes from Linux 2.5.40.
++
++ Linux 2.5.39
++
++ * AGAINST-2.5.39: New file.
++ * AGAINST-2.5.38: Removed.
++
++ * Makefile, arch/sh/Makefile, arch/sh/kernel/Makefile,
++ arch/sh/mm/Makefile, arch/sh/stboards/Makefile, drivers/block/rd.c,
++ mm/memory.c: Merge changes from Linux 2.5.39.
++
++ Linux 2.5.38
++
++ * AGAINST-2.5.38: New file.
++ * AGAINST-2.5.37: Removed.
++
++ * Makefile, drivers/block/rd.c: Merge changes from Linux 2.5.38.
++
++ Linux 2.5.37
++
++ * AGAINST-2.5.37: New file.
++ * AGAINST-2.5.36: Removed.
++
++ * Makefile, drivers/block/rd.c, drivers/net/8139too.c,
++ drivers/net/Config.in, drivers/net/Config.help, fs/nfs/inode.c,
++ mm/memory.c: Merge changes from Linux 2.5.37.
++
++ Linux 2.5.36
++
++ * AGAINST-2.5.36: New file.
++ * AGAINST-2.5.35: Removed.
++
++ * Makefile, arch/sh/Makefile, drivers/char/Makefile, kernel/ptrace.c,
++ mm/memory.c: Merge changes from Linux 2.5.36.
++
++ * Makefile: Fix merge breakage.
++
++ Linux 2.5.35
++
++ * AGAINST-2.5.35: New file.
++ * AGAINST-2.5.34: Removed.
++
++ * Makefile, arch/sh/Makefile, drivers/char/Makefile,
++ drivers/char/Config.help, drivers/pci/pci.ids, fs/nfs/inode.c,
++ include/asm-sh/hdreg.h, include/asm-sh/pgtable.h: Merge changes from
++ Linux 2.5.35.
++
++ Linux 2.5.34
++
++ * AGAINST-2.5.34: New file.
++ * AGAINST-2.5.33: Removed.
++
++ * Makefile, arch/sh/mm/init.c, drivers/block/rd.c,
++ drivers/char/Makefile, drivers/net/8139too.c, init/do_mounts.c,
++ kernel/ptrace.c, mm/memory.c: Merge changes from Linux 2.5.34.
++
++ Linux 2.5.33
++
++ * AGAINST-2.5.33: New file.
++ * AGAINST-2.5.32: Removed.
++
++ * Makefile, arch/sh/kernel/irq_intc2.c, arch/sh/kernel/pci-dc.c,
++ arch/sh/kernel/pci-sh7751.c, arch/sh/kernel/pci_st40.c,
++ drivers/char/Makefile, drivers/char/Config.help,
++ drivers/net/8139too.c, drivers/net/Config.in, drivers/net/Config.help,
++ fs/nfs/inode.c, include/asm-sh/cache.h: Merge changes from Linux
++ 2.5.33.
++
++ * drivers/pci/pci.ids, drivers/char/Makefile: Fix merge breakage.
++
++ Linux 2.5.32
++
++ * AGAINST-2.5.32: New file.
++ * AGAINST-2.5.31: Removed.
++
++ * Makefile, arch/sh/Makefile, arch/sh/config.in,
++ drivers/char/Makefile, drivers/char/Config.help,
++ drivers/input/joystick/Config.help, drivers/input/joystick/Config.in,
++ drivers/mtd/maps/Config.in, drivers/pci/pci.ids,
++ drivers/video/epson1355fb.c, drivers/video/hitfb.c,
++ drivers/video/pvr2fb.c, include/asm-sh/keyboard.h,
++ include/asm-sh/smplock.h, include/linux/input.h, init/do_mounts.c,
++ kernel/ptrace.c, mm/memory.c: Merge changes from Linux 2.5.32.
++
++ Linux 2.5.31
++
++ * AGAINST-2.5.31: New file.
++ * AGAINST-2.5.30: Removed.
++
++ * Makefile, arch/sh/config.in, drivers/char/Makefile,
++ drivers/net/8139too.c, mm/memory.c: Merge changes from Linux 2.5.31.
++
++ * init/do_mounts.c, mm/memory.c: Fix merge breakage.
++
++ Linux 2.5.30
++
++ * AGAINST-2.5.30: New file.
++ * AGAINST-2.5.29: Removed.
++
++ * Makefile, arch/sh/kernel/Makefile, drivers/block/rd.c,
++ drivers/Makefile, drivers/char/Makefile, drivers/char/Config.help,
++ drivers/net/Config.in, fs/nfs/inode.c, include/asm-sh/processor.h,
++ include/asm-sh/socket.h, include/asm-sh/unistd.h,
++ include/linux/input.h, init/do_mounts.c, kernel/ptrace.c, mm/memory.c:
++ Merge changes from Linux 2.5.30.
++
++ Linux 2.5.29
++
++ * AGAINST-2.5.29: New file.
++ * AGAINST-2.5.28: Removed.
++
++ * Makefile, arch/sh/config.in, drivers/input/joystick/Config.help,
++ drivers/input/joystick/Config.in, drivers/input/joystick/Makefile,
++ fs/nfs/inode.c, include/linux/input.h, init/do_mounts.c: Merge changes
++ from Linux 2.5.29.
++
++ Linux 2.5.28
++
++ * AGAINST-2.5.28: New file.
++ * AGAINST-2.5.27: Removed.
++
++ * Makefile, arch/sh/kernel/irq.c, arch/sh/kernel/process.c,
++ drivers/block/rd.c, drivers/Makefile, drivers/char/Makefile,
++ drivers/net/8139too.c, include/asm-sh/system.h, kernel/ptrace.c,
++ mm/memory.c: Merge changes from Linux 2.5.28.
++
++ Linux 2.5.27
++
++ * AGAINST-2.5.27: New file.
++ * AGAINST-2.5.26: Removed.
++
++ * Makefile, include/asm-sh/ide.h, kernel/ptrace.c, mm/memory.c: Merge
++ changes from Linux 2.5.27.
++
++ Linux 2.5.26
++
++ * AGAINST-2.5.26: New file.
++ * AGAINST-2.5.25: Removed.
++
++ * Makefile, arch/sh/config.in, drivers/char/Makefile,
++ drivers/char/Config.help, drivers/input/joystick/Config.help,
++ drivers/input/joystick/Config.in, drivers/input/joystick/Makefile,
++ fs/nfs/inode.c, include/asm-sh/pgtable-2level.h,
++ include/linux/input.h: Merge changes from Linux 2.5.26.
++
++ * include/linux/input.h: Fix merge breakage.
++
++ Linux 2.5.25
++
++ * AGAINST-2.5.25: New file.
++ * AGAINST-2.5.24: Removed.
++
++ * Makefile, arch/sh/Makefile, arch/sh/boot/compressed/Makefile,
++ arch/sh/boot/Makefile, drivers/char/Makefile,
++ drivers/input/joystick/Config.help, drivers/input/joystick/Config.in,
++ drivers/input/joystick/Makefile, fs/nfs/inode.c,
++ include/linux/input.h, mm/memory.c: Merge changes from Linux 2.5.25.
++
++2002-08-28 Matt Boytim <matt@boytim.org>
++
++ * drivers/char/sh-sci.c (sci_receive_chars): Add dummy read
++ when copied==0 to clear interrupt.
++
++2002-06-26 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/Makefile (archclean): Remove invoking make under
++ subdirectory.
++ (LINKFLAGS): Add adding 'jiffies' definition.
++
++ * arch/sh/vmlinux.lds.S (jiffies): Removed.
++
++ * arch/sh/mm/ioremap.c: Include <linux/mm.h> and <asm/page.h>.
++
++ * arch/sh/mm/cache-sh4.c (copy_user_page, clear_user_page): Follow
++ new API.
++
++ * arch/sh/kernel/irq.c (show_interrupts): Use NR_CPUS (was:
++ smp_num_cpus).
++
++ * arch/sh/kernel/sh_ksyms.c: Don't include <asm/pgalloc.h>.
++
++ * include/asm-sh/signal.h: Declare struct pt_regs.
++
++ * include/asm-sh/pgtable.h (mk_pte): New definition using pfn_pte.
++
++ * include/asm-sh/pgalloc.h (pmd_free_tlb): Fixed to have a argument
++ tlb.
++ (ptep_get_and_clear): Fixed the argurment to pfn_to_page.
++
++ * include/asm-sh/pgtable-2level.h (pte_pfn): Fixed to access the
++ member pte (was: pte_low).
++
++ * include/asm-sh/page.h (VALID_PAGE): Removed.
++ (PFN_START, pfn_to_page, page_to_pfn, virt_to_page, pfn_valid,
++ virt_addr_valid): Defined.
++
++ * include/asm-sh/siginfo.h: Remove unmatched #endif.
++
++2002-06-26 NIIBE Yutaka <gniibe@m17n.org>
++
++ * AGAINST-2.5.24: New file.
++ * AGAINST-2.5.24: Removed.
++ * Makefile: Version 2.5.24.
++
++ * arch/sh/kernel/sys_sh.c, drivers/Makefile, drivers/char/Makefile,
++ drivers/mtd/maps/Config.in, drivers/net/8139too.c,
++ drivers/net/Config.in, drivers/pcmcia/hd64465_ss.c: Incorporate
++ changes in 2.5.23.
++
++2002-06-26 NIIBE Yutaka <gniibe@m17n.org>
++
++ * AGAINST-2.5.23: New file.
++ * AGAINST-2.5.22: Removed.
++ * Makefile: Version 2.5.23.
++
++ * arch/sh/Makefile, arch/sh/boot/Makefile, arch/sh/kernel/time.c,
++ drivers/block/rd.c: Incorporate changes in 2.5.23.
++
++2002-06-18 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/system.h (prepare_to_switch): Removed.
++ (prepare_arch_schedule, finish_arch_schedule, prepare_arch_switch,
++ finish_arch_switch): Added.
++ (switch_to): New API.
++
++ * AGAINST-2.5.22: New file.
++ * AGAINST-2.5.21: Removed.
++ * Makefile: Version 2.5.22.
++
++ * arch/sh/kernel/setup.c, drivers/Makefile, drivers/block/rd.c,
++ drivers/char/Makefile, drivers/pci/pci.ids, fs/nfs/inode.c,
++ init/do_mounts.c, mm/memory.c: Incorporate changes in 2.5.22.
++
++2002-06-18 NIIBE Yutaka <gniibe@m17n.org>
++
++ * AGAINST-2.5.21: New file.
++ * AGAINST-2.5.20: Removed.
++ * Makefile: Version 2.5.21.
++
++ * arch/sh/boot/Makefile, drivers/block/rd.c, drivers/char/Makefile,
++ fs/nfs/inode.c: Incorporate changes in 2.5.21.
++
++2002-06-18 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/page.h (clear_user_page, copy_user_page): New API.
++
++ * AGAINST-2.5.20: New file.
++ * AGAINST-2.5.19: Removed.
++ * Makefile: Version 2.5.20.
++
++ * drivers/cdrom/Config.help, drivers/cdrom/Config.in,
++ drivers/cdrom/Makefile, drivers/char/Config.help,
++ drivers/char/Makefile, drivers/net/Config.help, fs/nfs/inode.c,
++ include/asm-sh/pgtable.h, init/do_mounts.c, mm/memory.c: Incorporate
++ changes in 2.5.20.
++
++2002-06-18 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/pgtable-2level.h (pte_pfn, pfn_pte, pfn_pmd): Added.
++
++ * AGAINST-2.5.19: New file.
++ * AGAINST-2.5.18: Removed.
++ * Makefile: Version 2.5.19.
++
++ * arch/sh/kernel/Makefile, arch/sh/kernel/signal.c,
++ arch/sh/stboards/Makefile, drivers/Makefile, drivers/block/rd.c,
++ drivers/cdrom/Makefile, drivers/char/Makefile,
++ drivers/video/hitfb.c, include/asm-sh/errno.h, include/asm-sh/ide.h,
++ include/asm-sh/siginfo.h, init/do_mounts.c, mm/memory.c: Incorporate
++ changes in 2.5.19.
++
++2002-06-18 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/bitops.h (fls): Added.
++ * arch/sh/kernel/signal.c: Include <linux/suspend.h>.
++ (do_signal): Handle PF_FREEZE.
++
++ * AGAINST-2.5.18: New file.
++ * AGAINST-2.5.17: Removed.
++ * Makefile: Version 2.5.18.
++
++ * arch/sh/defconfig, arch/sh/kernel/Makefile, arch/sh/lib/Makefile,
++ arch/sh/mm/Makefile, arch/sh/mm/init.c, drivers/block/rd.c,
++ drivers/char/Makefile, drivers/char/shwdt.c,
++ drivers/input/joystick/Makefile, drivers/pci/pci.ids,
++ fs/nfs/inode.c, init/do_mounts.c, mm/memory.c: Incorporate changes
++ in 2.5.18.
++
++2002-05-24 Paul Mundt <lethal@chaoticdreams.org>
++
++ * arch/sh/Config.help, arch/sh/config.in, arch/sh/kernel/Makefile:
++ Add CONFIG_UBC_WAKEUP definitions.
++ * arch/sh/kernel/setup.c (setup_arch): Call ubc_wakeup() if
++ CONFIG_UBC_WAKEUP=y.
++ * arch/sh/kernel/ubc.S: New file.
++
++ * include/asm-sh/ptrace.h: Move UBC definitions out to a UBC
++ specific header.
++ * include/asm-sh/ubc.h: New file.
++
++2002-05-23 Paul Mundt <lethal@chaoticdreams.org>
++
++ * drivers/char/shwdt.c: SH-5 support. Various other cleanups.
++
++2002-05-23 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/tlb.h (tlb_start_vma, tlb_end_vma,
++ tlb_remove_tlb_entry, tlb_flush): To be implemented.
++
++ * AGAINST-2.5.17: New file.
++ * AGAINST-2.5.16: Removed.
++ * Makefile: Version 2.5.17.
++
++ * drivers/block/rd.c, fs/nfs/inode.c, include/asm-sh/ioctls.h,
++ mm/memory.c: Incorporate changes in 2.5.17.
++
++2002-05-23 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/pgalloc.h (pte_free_tlb, pmd_free_tlb): Added.
++
++ * AGAINST-2.5.16: New file.
++ * AGAINST-2.5.15: Removed.
++ * Makefile: Version 2.5.16.
++
++ * arch/sh/kernel/process.c, arch/sh/vmlinux.lds.S,
++ drivers/net/8139too.c, include/asm-sh/ide.h, include/linux/input.h,
++ mm/memory.c: Incorporate changes in 2.5.16.
++
++2002-05-23 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/signal.c (do_signal): Added SIGURG case.
++
++ * AGAINST-2.5.15: New file.
++ * AGAINST-2.5.14: Removed.
++ * Makefile: Version 2.5.15.
++
++ * arch/sh/kernel/pci_st40.c, arch/sh/kernel/pcibios.c,
++ drivers/Makefile, drivers/char/Makefile, include/asm-sh/ide.h,
++ kernel/ptrace.c: Incorporate changes in 2.5.15.
++
++2002-05-07 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/pgtable.h (mk_pte_phys): Removed.
++
++ * AGAINST-2.5.14: New file.
++ * AGAINST-2.5.13: Removed.
++ * Makefile: Version 2.5.14.
++
++ * arch/sh/mm/cache-sh4.c, arch/sh/mm/fault.c, arch/sh/mm/init.c,
++ arch/sh/mm/ioremap.c, drivers/pci/pci.ids, include/asm-sh/pgalloc.h,
++ init/do_mounts.c, mm/memory.c: Incorporate changes in 2.5.14.
++
++2002-05-06 NIIBE Yutaka <gniibe@m17n.org>
++
++ * AGAINST-2.5.13: New file.
++ * AGAINST-2.5.12: Removed.
++ * Makefile: Version 2.5.13.
++
++ * Makefile, drivers/block/rd.c, drivers/net/Config.in,
++ drivers/pci/pci.ids: Incorporate changes in 2.5.13.
++
++2002-05-01 NIIBE Yutaka <gniibe@m17n.org>
++
++ * AGAINST-2.5.12: New file.
++ * AGAINST-2.5.11: Removed.
++ * Makefile: Version 2.5.12.
++
++ * arch/sh/mm/init.c, drivers/block/rd.c, drivers/char/Makefile,
++ drivers/pci/pci.ids, fs/nfs/inode.c, mm/memory.c: Incorporate
++ changes in 2.5.12.
++
++2002-04-30 NIIBE Yutaka <gniibe@m17n.org>
++
++ Follow up to 2.5.11.
++ * arch/sh/mm/clear_page.S: Remove SYMBOL_NAME.
++ * arch/sh/kernel/head.S, arch/sh/kernel/entry.S,
++ arch/sh/lib/memmove.S: Likewise.
++
++ * AGAINST-2.5.11: New file.
++ * AGAINST-2.5.10: Removed.
++ * Makefile: Version 2.5.11.
++
++ * Documentation/cachetlb.txt: Incorporate changes in 2.5.11.
++ * arch/sh/defconfig, drivers/block/rd.c, drivers/char/Config.help,
++ drivers/char/Makefile, drivers/video/epson1355fb.c,
++ drivers/video/hitfb.c, drivers/video/pvr2fb.c,
++ include/asm-sh/ide.h, mm/memory.c: Likewise.
++
++2002-04-26 NIIBE Yutaka <gniibe@m17n.org>
++
++ * AGAINST-2.5.10: New file.
++ * AGAINST-2.5.9: Removed.
++ * Makefile: Version 2.5.10.
++ * drivers/pci/pci.ids: Incorporate changes in 2.5.10.
++
++2002-04-25 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/mm/cache-sh4.c (CACHE_ASSOC): Defined.
++ (flush_cache_4096_all): Moved to clear_page.S.
++ (flush_cache_4096): Rewritten. Use __flush_cache_4096.
++ (flush_dcache_page,__flush_cache_page): Don't protect from interrupt.
++ (flush_cache_all): Rewritten. Use __flush_dcache_all.
++ (flush_cache_range): Follow change of flush_cache_4096_all.
++ * arch/sh/mm/clear_page.S (__flush_cache_4096_all): Removed.
++ (flush_cache_4096_all): New implementation.
++ (__flush_cache_4096): Optimized. Use ASSOC bit.
++ (__flush_dcache_all): New function.
++ (__clear_user): Clean-up local label.
++
++ * copy_page.S (__copy_user): Clean-up local label.
++
++ * arch/sh/kernel/time.c (sh_do_profile): Add profile even if PC is in
++ P2 area.
++
++2002-04-23 NIIBE Yutaka <gniibe@m17n.org>
++
++ * AGAINST-2.5.9: New file.
++ * AGAINST-2.5.8: Removed.
++ * Makefile: Version 2.5.9.
++ * drivers/char/Makefile: Incorporate changes in 2.5.9.
++ * drivers/pci/pci.ids: Likewise.
++ * include/asm-sh/errno.h (E2BIG): Follow the change of i386 version.
++
++2002-04-17 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/mm/copy_page.S (__copy_user): New function.
++ * include/asm-sh/uaccess.h (__copy_user): Remove macro,
++ declared as external function.
++
++2002-04-15 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Makefile: Version 2.5.8.
++ * AGAINST-2.5.8: New file.
++ * AGAINST-2.5.8-pre3: Removed.
++
++ * drivers/block/rd.c: Incorporate changes in 2.5.8-pre3 -> final.
++
++2002-04-13 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/mm/clear_page.S (__clear_user): Bug fix.
++
++2002-04-12 NIIBE Yutaka <gniibe@m17n.org>
++
++ Follow up to 2.5.8-pre3.
++ * include/asm-sh/tlbflush.h (flush_tlb_kernel_range): New API.
++ * arch/sh/mm/fault.c (flush_tlb_kernel_range): New function.
++
++ * arch/sh/kernel/entry.S (sys_sched_setaffinity,
++ sys_sched_getaffinity): New syscall entries.
++ * include/asm-sh/unistd.h (__NR_sched_setaffinity,
++ __NR_sched_getaffinity): New macros.
++
++2002-04-11 NIIBE Yutaka <gniibe@m17n.org>
++
++ Follow up to 2.5.8-pre2.
++ * arch/sh/kernel/process.c: Include <linux/platform.h>.
++ (default_idle): New function.
++ (cpu_idle): Call default_idle.
++
++ * arch/sh/kernel/signal.c: Include <linux/binfmt.h>.
++
++ * include/asm-sh/pgalloc.h: Inline functions move to real functions.
++ * arch/sh/mm/init.c (pgd_alloc, pgd_free, pte_alloc_one_kernel,
++ pte_alloc_one): Moved to here.
++
++ * include/asm-sh/thread_info.h (PREEMPT_ACTIVE): Defined.
++
++ * include/asm-sh/cacheflush.h, include/asm-sh/tlbflush.h: New files.
++
++ * include/asm-sh/mmu_context.h: Include asm/tlbflush.h.
++
++ * arch/sh/kernel/signal.c: Include asm/cacheflush.h.
++ * arch/sh/mm/cache-sh3.c: Likewise.
++ * arch/sh/mm/cache-sh4.c: Likewise.
++ * arch/sh/mm/fault.c: Likewise.
++
++ * arch/sh/kernel/sh_ksyms.c: Include asm/tlbflush.h,
++ asm/cacheflush.h.
++ * arch/sh/mm/ioremap.c: Likewise.
++
++2002-04-10 NIIBE Yutaka <gniibe@m17n.org>
++
++ * Makefile: Version 2.5.8-pre3.
++ * AGAINST-2.5.8-pre3: New file.
++ * AGAINST-2.5.8-pre1: Removed.
++
++ * include/asm-sh/unistd.h: Incorporate changes in 2.5.8-pre2 -> pre3.
++ * drivers/block/rd.c: Likewise.
++
++ * mm/memory.c: Incorporate changes in 2.5.8-pre1 -> pre2.
++ * fs/nfs/inode.c: Incorporate changes in 2.5.8-pre1 -> pre2.
++
++2002-04-07 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/traps.c (show_task): Don't use __get_user,
++ it's kernel space. Assume 80-columns.
++
++2002-04-06 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/semaphore.c: Inlcude <linux/errno.h>.
++
++2002-04-05 NIIBE Yutaka <gniibe@m17n.org>
++
++ Bug fix for thread_info.
++ * arch/sh/kernel/ptrace.c (get_stack_long): Use task->thread_info.
++ (put_stack_long): Likewise.
++ (sys_ptrace): Likewise.
++
++2002-04-05 NIIBE Yutaka <gniibe@m17n.org>
++
++ * fs/nfs/inode.c: Added.
++ (nfs_find_actor): Return 0 when the type of file is not same.
++
++2002-04-05 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/input/joystick/Config.in: Updated to 2.5.8-pre1.
++ * drivers/input/joystick/Config.help: Ditto.
++ * drivers/input/joystick/Makefile: Ditto.
++ * drivers/net/Config.in: Ditto.
++ * arch/sh/kernel/pci-sh7751.c: Martin's e-mail change to ucw.cz.
++ (follow the change of arch/i386/*.)
++ * drivers/video/epson1355fb.c (e1355fb_init): Use NODEV Instead of -1.
++
++2002-04-04 NIIBE Yutaka <gniibe@m17n.org>
++
++ Update to 2.5.8-pre1.
++ * AGAINST-2.5.8-pre1: New file.
++ * AGAINST-2.5.7: Removed.
++ * Makefile: Version 2.5.8-pre1.
++ * Makefile, arch/sh/kernel/sh_ksyms.c, drivers/block/rd.c,
++ drivers/char/shwdt.c, drivers/net/Config.in, drivers/pci/pci.ids,
++ init/do_mounts.c: Include changes from mainline (2.5.8-pre1).
++ * arch/sh/kernel/sh_ksyms.c (simple_strtol, strtok): Removed.
++ * drivers/char/shwdt.c (nowayout): New module option (to be
++ configured at runtime by Matt Domsch).
++
++2002-04-03 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache-sh4.c (flush_cache_4096_all, flush_cache_4096):
++ Changed the compile time condition for ST40 and SH7751. OC can be
++ handled in P2, while IC must be handled at P1.
++
++ * arch/sh/mm/clear_page.S (__flush_cache_4096_all): Renamed
++ from __flush_cache_4096_nocheck.
++
++2002-03-29 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache-sh4.c (flush_cache_4096_nocheck): New function.
++ (flush_icache_all): New function.
++ (flush_cache_all): Use flush_icache_all. Don't need to protect
++ from interrupt as we don't flush dcache by writing CCR.
++ (flush_cache_range): Don't call __flush_cache_page, but
++ call flush_cache_4096_nocheck.
++
++ * arch/sh/mm/clear_page.S (__flush_cache_4096_nocheck): New function.
++
++2002-03-28 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/entry.S (work_notifysig): One cycle optimization.
++
++2002-03-28 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/process.c (cpu_idle): Bug fix. Don't exit loop
++ when hlt_counter != 0.
++
++ * include/asm-sh/uaccess.h (__access_ok): Added missing inline
++ qualifier.
++
++ * arch/sh/kernel/entry.S (OFF_TRA): Renamed from IS_SYSCALL.
++ (system_call, handle_exception): Set tra.
++
++ * arch/sh/kernel/signal.c (restore_sigcontext, handle_signal,
++ do_signal): Use tra.
++
++ * include/asm-sh/ptrace.h (tra): Renamed from is_syscall.
++
++2002-03-28 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/signal.c (save_sigcontext_fpu): Don't need
++ to protect from interrupt.
++ * arch/sh/kernel/process.c (dump_fpu, __switch_to, copy_thread):
++ Likewise.
++
++2002-03-28 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache-sh4.c (flush_dcache_page): Merged with
++ __flush_dcache_page.
++
++2002-03-28 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/clear_page.S (__flush_cache_4096): Only define for
++ SH7750.
++
++ * arch/sh/mm/cache-sh4.c (flush_cache_4096): Plain loop for SH7751
++ and ST40 (no need to go P2).
++
++2002-03-27 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/entry.S (IS_SYSCALL): Renamed from SYSCALL_NR.
++ (system_call, handle_exception): Set is_syscall.
++
++ * arch/sh/kernel/signal.c (restore_sigcontext, handle_signal,
++ do_signal): Use is_syscall.
++
++ * include/asm-sh/ptrace.h (is_syscall): Renamed from syscall_nr.
++
++ * arch/sh/kernel/signal.c (save_sigcontext_fpu): Use __put_user
++ (was: __copy_to_user).
++ (handle_signal, do_signal): Bug fix. Don't set register 0.
++
++ * include/asm-sh/hw_irq.h (sh_do_profile): Removed from here.
++ * arch/sh/kernel/time.c (sh_do_profile): But implemented here.
++
++2002-03-27 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/copy_page.S: File merged with __copy_user_page-sh4.S.
++ * arch/sh/mm/clear_page.S: File merged with __clear_user.S.
++ (__flush_cache_4096): New function.
++ * arch/sh/mm/Makefile: Remove __copy_user_page-sh4.S and
++ __clear_user.S.
++
++ * arch/sh/mm/cache-sh4.c (__flush_icache_page): Removed.
++ (flush_cache_4096): New function.
++
++2002-03-27 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache-sh4.c (__flush_cache_page): New function.
++ (flush_cache_range, flush_cache_page, flush_icache_user_range): Use
++ __flush_cache_page.
++
++2002-03-26 NIIBE Yutaka <gniibe@server1.m17n.org>
++
++ * arch/sh/mm/cache-sh4.c (flush_cache_mm): Don't check
++ mm->context, it's for TLB handling.
++ (flush_cache_range): Likewise.
++ (flush_cache_mm): Fix the comment. The alias issue is there
++ for write-through cache too.
++ (flush_cache_range): Don't handle in P2.
++
++2002-03-26 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache-sh4.c (flush_cache_range): Bug fix.
++ Handle the case where PMD is none or bad.
++ The argument to __flush_icache_page/__flush_dcache_page
++ is physical address (was: virtual address).
++
++2002-03-26 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/mmu_context.h (switch_mm): Remove setting/resetting
++ of mm->cpu_vm_mask. It's for SMP implementation.
++ (get_new_mmu_context): Removed.
++ (get_mmu_context): Merved with get_new_mmu_context.
++
++2002-03-25 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/lib/Makefile (obj-y): Removed old-checksum.o as
++ it seems nothing depends on that.
++
++ * arch/sh/kernel/sh_ksyms.c (csum_partial_copy):
++ Don't export old (possibly obsolete) function.
++
++2002-03-25 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/uaccess.h (__clear_user): Make it external
++ function. (Was: inline function).
++
++ * arch/sh/mm/Makefile: Added the entry for __clear_user.o.
++ * arch/sh/mm/__clear_user.S: File name change. As it's also used by
++ SH-3, renamed from __clear_user_page-sh4.S,
++ (__clear_user): New function.
++
++2002-03-24 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/system.h (mm_segment_t): Move the definition to...
++ * include/asm-sh/uaccess.h: ... here. And change it to have boolean
++ is_user_space.
++ (KERNEL_DS, USER_DS): New value domain: 0 or 1.
++ (get_fs): Simplified.
++ (set_fs): Optimized by asm.
++ (__get_user_check): New implementation.
++ (__get_user_1, __get_user_2, __get_user_4): New macros.
++ (strnlen_user): Use __access_ok function.
++ (strlen_user): Implemented as inline function.
++
++2002-03-23 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/uaccess.h (__range_ok): Removed.
++ (__access_ok, access_ok): New implementation.
++
++ * include/asm-sh/thread_info.h (TIF_USERSPACE): Change to 31,
++ so that expression can be simple (was: 18).
++
++2002-03-22 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/thread_info.h: Define cpu and preempt_count as
++ 16-bit to fit cache (for SH-3).
++ (INIT_THREAD_INFO): Initialize the member 'cpu'.
++
++ * include/asm-sh/system.h (switch_to): Use __dummy output argument
++ for r0.
++
++ * include/asm-sh/pgtable.h (pte_offset): Removed.
++ (pte_offset_map, pte_offset_map_nested): Define as pte_offset_kernel.
++
++ * include/asm-sh/pgalloc.h (pte_alloc_one): Bug fix for clear_page.
++
++ * arch/sh/mm/cache-sh4.c (flush_cache_range): Don't need to check
++ find_vma.
++
++ * arch/sh/mm/cache-sh4.c (flush_cache_range, flush_cache_page,
++ clear_user_page, copy_user_page): Use pte_offset_kernel.
++ * arch/sh/mm/fault.c (__do_page_fault): Likewise.
++
++ * arch/sh/kernel/signal.c (restore_sigcontext): Use tsk.
++
++ * arch/sh/kernel/setup.c (setup_arch): Bug fix for FPU
++ initialization.
++
++ * arch/sh/kernel/ptrace.c (sys_ptrace): Remove unused variable tsk.
++ (do_syscall_trace): Use tsk.
++
++ * arch/sh/kernel/process.c (alloc_task_struct, free_task_struct):
++ Removed.
++ (copy_thread): Bug fix for thread_info. Clear TIF_USEDFPU flag.
++ (copy_thread, dump_thread): Don't distingush init_task specially.
++ (switch_to): Bug fix, use next->thread_info.
++
++ * arch/sh/kernel/entry.S (work_resched, resume_userspace,
++ syscall_exit): Use r8 for current_thread_info.
++ (syscall_exit_work): Bug fix, load do_syscall_trace.
++ (system_call): Don't need to ext.u. Micro opt. for syscall_nr.
++ (syscall_trace_entry, syscall_badsys): Bug fix for error return
++ value.
++
++2002-03-22 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/mman.h (PROT_SEM): Added.
++
++ * arch/sh/kernel/signal.c (do_signal): Follow the name change of
++ p_ptr -> parent of the task.
++
++ * include/asm-sh/unistd.h (__NR_futex): Added.
++ * arch/sh/kernel/entry.S (sys_call_table): Added sys_futex.
++ (syscall_exit_work): Move up. (Near work_pending.)
++ (sys_nfsservctl): Define to sys_ni_syscall, when not NFSD.
++
++ * include/asm-sh/pgalloc.h (check_pgt_cache): New macro.
++
++2002-03-22 NIIBE Yutaka <gniibe@m17n.org>
++
++ Update to 2.5.7.
++ * AGAINST-2.5.7: New file.
++ * AGAINST-2.5.6: Removed.
++ * Makefile: Version 2.5.7.
++ * Makefile, arch/sh/Config.help, arch/sh/config.in,
++ drivers/Makefile, drivers/pci/pci.ids, kernel/ptrace.c, mm/memory.c:
++ Include changes from mainline (2.5.7).
++
++2002-03-22 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/pgalloc.h (ptep_get_and_clear): Follow the change of
++ type of member i_map_shared.
++ * include/asm-sh/unistd.h (__NR_tkill, __NR_sendfile64): Added.
++ * include/asm-sh/siginfo.h (SI_DETHREAD): Added.
++ * arch/sh/kernel/entry.S (sys_call_table): Added sys_sendfile64.
++
++2002-03-22 NIIBE Yutaka <gniibe@m17n.org>
++
++ Update to 2.5.6.
++ * AGAINST-2.5.6: New file.
++ * AGAINST-2.5.5: Removed.
++ * Makefile: Version 2.5.6.
++ * Makefile, drivers/Makefile, drivers/block/rd.c,
++ drivers/char/Config.help, drivers/char/Makefile,
++ drivers/net/8139too.c, drivers/net/Config.help,
++ drivers/net/Config.in, drivers/pci/pci.ids, init/do_mounts.c,
++ mm/memory.c: Include changes from mainline (2.5.6).
++
++2002-03-22 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/pgtable.h (pmd_page_kernel): Renamed from pmd_page.
++ (pmd_page): New macro for user page.
++ (pte_offset_kernel): New macro.
++ (pte_offset_map, pte_offset_map_nested, pte_unmap, pte_unmap_nested):
++ New macros.
++
++ * arch/sh/mm/ioremap.c (remap_area_pmd): Use pte_alloc_kernel
++ (was: pte_alloc).
++
++2002-03-22 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/process.c (cpu_idle): Don't call check_pgt_cache.
++
++ * include/asm-sh/pgalloc.h (pmd_populate_kernel): Renemed from
++ pmd_populate.
++ (pmd_populate): New function for U0 page.
++ (do_check_pgt_cache): Removed.
++ (pmd_free_slow, pmd_free_fast): Removed.
++ (pmd_alloc_one_fast): Removed.
++ (pte_free_slow): Renamed to pte_free. Macro removed.
++ (pte_alloc_one_fast): Removed.
++ (pte_alloc_one_kernel, pte_free_kernel): New function.
++ (pte_alloc_one): Call schedule_timeout and try again.
++
++2002-03-22 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/entry.S (ret_from_fork): Follow the change of
++ switch_to. Don't call schedule_tail (it's now SMP only function).
++ Move the label to syscall_exit.
++
++ * include/asm-sh/system.h (switch_to): Change the API (removing
++ last argument).
++
++ * include/asm-sh/page.h (VM_DATA_DEFAULT_FLAGS): Defined.
++
++ * include/asm-sh/bitops.h (sched_find_first_bit): 140-bit
++ implementation. It's moved to here...
++ * include/asm-sh/mmu_context.h: ... from here. (Removed).
++
++2002-03-22 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache-sh4.c (flush_icache_user_range): New function.
++ * include/asm-sh/pgtable.h (flush_icache_user_range): Declared.
++
++ * kernel/ptrace.c (access_process_vm): Remove flush_dcache_page
++ as we do flush_icache_user_range here. (No difference now.)
++
++2002-03-20 NIIBE Yutaka <gniibe@m17n.org>
++
++ Update to 2.5.5.
++ * AGAINST-2.5.5: New file.
++ * AGAINST-2.5.4: Removed.
++ * Documentation/cachetlb.txt: Include the change.
++ * Makefile: Version 2.5.5. Merged.
++ * arch/sh/config.in, drivers/Makefile: Sound driver move.
++ * arch/sh/kernel/signal.c: recalc_sigpending API change.
++ * drivers/net/8139too.c, drivers/net/Config.in: Update.
++ * drivers/pci/pci.ids: Update.
++ * include/asm-sh/pgtable.h: New API flush_icache_user_range,
++ Removed page_address API here (move to linux/mm.h).
++ * include/net/inet_ecn.h: Update.
++ * kernel/ptrace.c: Use new API flush_icache_user_range.
++ * mm/memory.c: Update.
++
++2002-03-09 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/mm/cache-sh4.c (flush_cache_range): New auto variable mm.
++
++ * arch/sh/kernel/process.c (get_wchan): Follow the API change of
++ thread_saved_pc.
++
++ * include/asm-sh/thread_info.h (cpu): Added the member, not
++ meaningful though (SuperH doesn't support SMP).
++
++ * include/asm-sh/semaphore.h: Include <linux/wait.h>.
++
++ * include/asm-sh/processor.h (thread_saved_pc): Make it a macro,
++ so that we don't need the implementation of struct task.
++ Fixed, thread is not a pointer.
++
++ * arch/sh/config.in: joystick driver is now under drivers/input.
++
++ * arch/sh/kernel/entry.S (flags, work, syscall_trace): Removed.
++ (k_current): Removed.
++ (work_pending): Use _TIF_NEED_RESCHED.
++ (work_resched): Use GET_THREAD_INFO and _TIF_WORK_MASK.
++ (work_notifysig): Use _TIF_SIGPENDING.
++ (resume_userspace): Use GET_THREAD_INFO and _TIF_WORK_MASK.
++ (system_call): Use GET_THREAD_INFO and _TIF_SYSCALL_TRACE.
++ (system_exit): Use GET_THREAD_INFO and _TIF_ALLWORK_MASK.
++ (system_trace_entry): Use _TIF_SYSCALL_TRACE.
++
++ * include/asm-sh/thread_info.h (_TIF_WORK_MASK, _TIF_ALLWORK_MASK):
++ Change the value to 8-bit.
++
++2002-03-05 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/fpu.c (save_fpu, ieee_fpe_handler,
++ do_fpu_state_restore): Use set_tsk_thread_flag and
++ clear_tsk_thread_flag.
++
++ * arch/sh/kernel/process.c (print_syscall): Removed.
++
++ * include/asm-sh/processor.h (thread_saved_pc): Follow the change
++ of API (argument type).
++ (THREAD_SIZE): Removed from here (will be in thread_info.h).
++ (alloc_task_struct, free_task_struct, get_task_struct, init_task,
++ init_stack): Removed.
++ (unlazy_fpu, clear_fpu): Use test_tsk_thread_flag and
++ clear_tsk_thread_flag.
++
++ * include/asm-sh/uaccess.h (KERN_ADDR_LIMIT, USER_ADDR_LIMIT): New
++ macros.
++ (KERNEL_DS, USER_DS): Use KERN_ADDR_LIMIT, USER_ADDR_LIMIT.
++ (get_fs, set_fs): New functions using thread flag.
++ (__addr_ok, __range_ok): Use get_fs().seg.
++
++ * include/asm-sh/thread_info.h: New file.
++
++2002-02-28 Paul Mundt <lethal@chaoticdreams.org>
++
++ * arch/sh/kernel/traps.c (dump_stack): Removed.
++ (show_task): Added.
++ (show_trace_task): Hand off actual stack pointer to show_task()
++ to do a real backtrace.
++
++2002-02-28 M. R. Brown <mrbrown@0xd6.org>
++
++ * Makefile: Added -sh to EXTRAVERSION.
++
++2002-02-27 Paul Mundt <lethal@chaoticdreams.org>
++
++ * arch/sh/mm/cache-sh4.c (__flush_icache_page): Added back in.
++ (flush_cache_range): Rewritten entirely.
++ (flush_cache_mm): Only flush caches on a valid mm context.
++
++2002-02-27 NIIBE Yutaka <gniibe@m17n.org>
++
++ Updated to 2.5.4.
++ * Makefile: Version 2.5.4
++ * AGAINST-2.5.4: New file.
++ * AGAINST-2.5.3: Removed.
++
++ * arch/sh/kernel/signal.c (setup_frame): Use current_thread_info.
++ (setup_rt_frame): Likewise.
++ * include/asm-sh/uaccess.h (get_fs,set_fs,__addr_ok,__range_ok):
++ Likewise.
++
++ * arch/sh/kernel/setup.c (setup_arch): Use set_thread_flag.
++ * arch/sh/kernel/fpu.c
++ (save_fpu,ieee_fpe_handler,do_fpu_state_restore): Likewise.
++
++ * arch/sh/kernel/ptrace.c (sys_ptrace): Use set_tsk_thread_flag and
++ clear_tsk_thread_flag.
++ (do_syscall_trace): Follow the change of i386.
++
++ * arch/sh/kernel/pci-dma.c (pci_alloc_consistent): Use virt_to_phys
++ instead of virt_to_bus.
++
++ * arch/sh/kernel/init_task.c (init_thread_union): New variable.
++
++ * arch/sh/kernel/entry.S (syscall_call): Rename from syscall_traced.
++
++2002-02-27 NIIBE Yutaka <gniibe@m17n.org>
++
++ * drivers/char/joystick -> drivers/input/joystick.
++ * include/linux/input.h: Updated to version 1.57.
++
++ * include/asm-sh/siginfo.h (SI_TKILL): Added.
++ * include/asm-sh/scatterlist.h (struct scatterlist): Remove member
++ address.
++ * include/asm-sh/pci.h (pci_map_sg, pci_dma_sync_sg): Follow struct
++ scatterlist interface change.
++
++ * drivers/net/8139too.c: Merged version 0.9.24.
++
++ * drivers/char/sh-sci.c (sci_ioctl TIOCGSERIAL): Set return code.
++
++ * arch/sh/vmlinux.lds.S (.text.lock): Removed.
++ * arch/sh/kernel/signal.c (do_signal): Use sig_exit.
++ * Makefile: Version 2.5.4. Merged.
++ * arch/sh/kernel/entry.S (sys_tkill): Added.
++ * drivers/char/Makefile: Merged (Removed joystick).
++ * drivers/Makefile (subdir-$(CONFIG_SERIO),
++ subdir-$(CONFIG_GAMEPORT)): Merged.
++
++2002-02-26 NIIBE Yutaka <gniibe@m17n.org>
++
++ Updated to 2.5.3.
++ * Makefile: Version 2.5.3
++ * AGAINST-2.5.3: New file.
++ * AGAINST-2.5.3-pre5: Removed.
++
++ * include/asm-sh/bitops.h (__ffs): Implemented.
++
++ * include/asm-sh/mmu_context.h (sched_find_first_bit): Implemented
++ (copied i386 implementation).
++ (sched_find_first_zero_bit): Removed.
++
++ * arch/sh/kernel/ptrace.c (sys_ptrace): Use ptrace_check_attach.
++ Replace PT_TRACESYS -> PT_SYSCALLTRACE.
++
++ * arch/sh/kernel/entry.S (sys_call_table): Added entries.
++ Remove COMPAT_OLD_SYSCALL_ABI things.
++ Follow up to new member "task_work" in task_struct.
++
++ * include/asm-sh/unistd.h (__NR_security, __NR_gettid,
++ __NR_setxattr, __NR_lsetxattr, __NR_fsetxattr, __NR_getxattr,
++ __NR_lgetxattr, __NR_fgetxattr, __NR_listxattr, __NR_llistxattr,
++ __NR_flistxattr, __NR_removexattr, __NR_lremovexattr,
++ __NR_fremovexattr): Added.
++
++2002-02-26 NIIBE Yutaka <gniibe@m17n.org>
++
++ Merge changes in 2.5.3-pre6.
++ * Makefile (Drivers-y): Added drivers/base/base.o.
++ * drivers/Makefile (subdir-y): Added "base".
++ * drivers/char/Config.help (CONFIG_WATCHDOG): Added.
++ * arch/sh/Config.help (CONFIG_PCI_GOBIOS, CONFIG_KCORE_ELF,
++ CONFIG_SH_GENERIC, CONFIG_SH_SOLUTION_ENGINE,
++ CONFIG_SH_7751_SOLUTION_ENGINE, CONFIG_SH_HP620, CONFIG_SH_HP680,
++ CONFIG_SH_HP690, CONFIG_SH_CQREEK, CONFIG_SH_DMIDA, CONFIG_SH_EC3104,
++ CONFIG_SH_DREAMCAST, CONFIG_SH_UNKNOWN): Added.
++
++2002-02-26 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/io_se.c (delay): More delay needed for
++ SolutionEngine SH7709A.
++
++2002-01-25 NIIBE Yutaka <gniibe@m17n.org>
++
++ * init/main.c: Removed as it's same (2.5.2-pre10).
++ * include/linux/highmen.h: Removed as it's same (2.5.1).
++
++2002-01-25 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/Config.help (CONFIG_CPU_SUBTYPE_SH7751,
++ CONFIG_CPU_SUBTYPE_ST40STB1) Added subtypes.
++ (CONFIG_SH_SH2000): Added a machine.
++ (CONFIG_SH_7751_SOLUTION_ENGINE,CONFIG_SH_CQREEK,CONFIG_SH_DMIDA,
++ CONFIG_SH_DREAMCAST,CONFIG_SH_EC3104,CONFIG_SH_GENERIC,
++ CONFIG_SH_HP620,CONFIG_SH_HP680,CONFIG_SH_HP690,
++ CONFIG_SH_OVERDRIVE,CONFIG_SH_SOLUTION_ENGINE,CONFIG_SH_UNKNOWN):
++ Added entries lost in transition to divided Config.help.
++
++ * drivers/net/Config.help (CONFIG_8139TOO_DREAMCAST): Added.
++
++2002-01-25 NIIBE Yutaka <gniibe@m17n.org>
++
++ Updated to 2.5.3-pre5.
++ * Documentation/Configure.help: Removed.
++ * arch/sh/Config.help: New file.
++ * drivers/cdrom/Config.help: New file.
++ * drivers/char/Config.help: New file.
++ * drivers/char/joystick/Config.help: New file.
++ * drivers/mtd/Config.help: New file.
++ * drivers/mtd/maps/Config.help: New file.
++ * drivers/net/Config.help: New file.
++ * drivers/net/8139too.c: Include changes from mainline (2.5.3-pre5).
++ * arch/sh/config.in: Include changes from mainline (2.5.3-pre5).
++ * Makefile: Version 2.5.3-pre5.
++
++ * AGAINST-2.5.3-pre5: New file.
++ * AGAINST-2.5.3-pre4: Removed.
++
++2002-01-24 NIIBE Yutaka <gniibe@m17n.org>
++
++ * arch/sh/kernel/process.c: Include <linux/a.out.h>.
++ * arch/sh/kernel/signal.c: <linux/tty.h>.
++ * include/asm-sh/mmu_context.h (sched_find_first_zero_bit): Follow
++ the change of i386 version in 2.5.3-pre4.
++
++2002-01-24 NIIBE Yutaka <gniibe@m17n.org>
++
++ Updated to 2.5.3-pre4.
++ * Documentation/Configure.help, Documentation/cachetlb.txt,
++ arch/sh/vmlinux.lds.S, arch/sh/kernel/init_task.c,
++ arch/sh/kernel/process.c, arch/sh/mm/cache-sh4.c,
++ arch/sh/mm/fault.c, arch/sh/vmlinux.lds.S, drivers/net/Config.in,
++ drivers/pcmcia/hd64465_ss.c, drivers/video/hitfb.c,
++ drivers/video/pvr2fb.c, include/asm-sh/ide.h, include/asm-sh/pci.h,
++ include/asm-sh/pgalloc.h, include/asm-sh/pgtable.h,
++ include/linux/highmem.h, init/main.c, mm/memory.c:
++ Include changes from mainline (2.5.3-pre4).
++
++ * AGAINST-2.5.3-pre4: New file.
++ * AGAINST-2.5.2: Removed.
++
++2002-01-24 NIIBE Yutaka <gniibe@m17n.org>
++
++ * kernel/ptrace.c (access_process_vm): Added flush_dcache_page
++ lost in 2.5.2 merge.
++
++2002-01-19 Paul Mundt <lethal@chaoticdreams.org>
++
++ * arch/sh/kernel/io_7751se.c: Typo. Rename CHECK_SH_7751_PCIIO to
++ CHECK_SH7751_PCIIO, so 7751se can build with CONFIG_PCI=n.
++
++ * include/net/inet_ecn.h: Addin #ifdef sanity that was lost in 2.4.14.
++ This allows us to build with CONFIG_INET=n.
++
++2002-01-20 NIIBE Yutaka <gniibe@m17n.org>
++
++ * include/asm-sh/pci.h (PCI_DMA_BUS_IS_PHYS): Added.
++
++2002-01-15 NIIBE Yutaka <gniibe@m17n.org>
++
++ Updated to 2.5.2.
++ * init/main.c (rest_init): Remove call of init_idle().
++ * drivers/net/8139too.c: Include <linux/crc32.h>, remove
++ ether_crc and ethernet_polynomial.
++ * arch/sh/config.in: source lib/Config.in.
++
++ * AGAINST-2.5.2: New file.
++ * AGAINST-2.5.1: Removed.
++
++2002-01-08 NIIBE Yutaka <gniibe@m17n.org>
++
++ Updated to 2.5.2-pre10.
++ * Makefile, Documentation/Configure.help, arch/sh/kernel/process.c,
++ arch/sh/kernel/setup.c, drivers/block/rd.c, drivers/char/sh-sci.c,
++ drivers/char/shwdt.c, init/do_mounts.c, init/main.c, kernel/ptrace.c,
++ mm/memory.c: Include changes from mainline (2.5.2-pre10).
++
++ * drivers/cdrom/gdrom.c (DEVICE_NR): MINOR -> minor.
++ (gdrom_init): MKDEV -> mk_kdev.
++ * arch/sh/mm/fault.c (do_page_fault): Use yield.
++
++ * include/asm-sh/mmu_context.h (sched_find_first_zero_bit):
++ Implemented. (Just copied from x86 implementation.)
++
++ * arch/sh/kernel/setup.c (sh_console_device): Returns /dev/null.
++
++ * arch/sh/kernel/irq.c: Include <linux/mm.h>.
++ * arch/sh/kernel/process.c: Include <linux/mm.h>.
++ (cpu_idle): Don't call init_idle here. Remove setting of ->nice.
++
++2002-01-05 NIIBE Yutaka <gniibe@m17n.org>
++
++ Updated to 2.5.1.
++ * Makefile, arch/sh/kernel/irq.c, drivers/block/rd.c,
++ drivers/net/8139too.c, include/linux/highmem.h, init/main.c,
++ mm/memory.c: Include changes from mainline (2.5.1).
++
++ * init/do_mounts.c: New file from mainline with changes for GD-ROM.
++
++ * AGAINST-2.5.1: New file.
++ * AGAINST-2.5.0: Removed.
++
++ * include/asm-sh/scatterlist.h: Followed x86 version.
++
++Local Variables:
++mode: change-log
++left-margin: 8
++fill-column: 76
++version-control: never
++End:
+diff -ruN linux-2.6.17-vanilla/ChangeLog-2003 linux-2.6.17/ChangeLog-2003
+--- linux-2.6.17-vanilla/ChangeLog-2003 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/ChangeLog-2003 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1,1409 @@
++2003-12-18 Paul Mundt <lethal@linux-sh.org>
++
++ * mm/mmap.c, Makefile: Merge 2.6.0.
++
++2003-11-28 Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * include/asm-sh/ptrace.h (struct pt_regs): Remove expevt field.
++ * arch/sh/kernel/ptrace.c (get_stack_long): Count EXPEVT slot and
++ DSP case.
++ (put_stack_long): Likewise.
++ * arch/sh/kernel/process.c (dump_task_regs): Likewise.
++ (copy_thread): Likewise.
++
++2003-11-28 Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * include/asm-sh/kgdb.h (kgdb_flush_icache_range): Define.
++ * arch/sh/kernel/kgdb_stub.c (get_step_address): Use it.
++ (do_single_step, undo_single_step, write_mem_msg): Likewise.
++ * include/asm-sh/processor.h (struct thread_struct): Add
++ ubc_pc field.
++ * arch/sh/kernel/process.c (ubc_usercnt): New variable.
++ (exit_thread): Clear ubc_pc if required.
++ (copy_thread): Initialize ubc_pc.
++ (ubc_set_tracing): New.
++ (__switch_to): Call ubc_set_tracing if needed.
++ (break_point_trap): Clear ubc_pc.
++ * arch/sh/kernel/ptrace.c (compute_next_pc): Remove.
++ (ubc_set_tracing): Likewise.
++ (sys_ptrace) [PTRACE_SINGLESTEP]: Only set ubc_pc here.
++
++2003-11-26 Paul Mundt <lethal@linux-sh.org>
++
++ * Makefile: Merge 2.6.0-test11.
++
++2003-11-25 Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * include/asm-sh/ptrace.h (struct pt_regs): Add expevt field.
++
++2003-11-23 Paul Mundt <lethal@linux-sh.org>
++
++ * Makefile, drivers/ide/Kconfig, drivers/ide/pci/alim15x3.c,
++ drivers/net/8139too.c, include/linux/pci_ids.h, mm/memory.c:
++ Merge 2.6.0-test10.
++
++2003-11-18 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/entry.S (tlb_miss_load, tlb_miss_store,
++ initial_page_write, tlb_protection_violation_load,
++ tlb_protection_violation_store, address_error_load,
++ address_error_store, system_call): Make these global, so we can
++ reference them externally for the exception handling table.
++ (none): Renamed to exception_none.
++ (error): Renamed to exception_error.
++ (exception_handling_table): Removed. Now defined per-processor
++ family.
++
++ * arch/sh/kernel/cpu/sh3/Makefile: Add ex.o rule.
++ * arch/sh/kernel/cpu/sh3/ex.S: SH-3 exception handling table.
++
++ * arch/sh/kernel/cpu/sh4/Makefile: Add ex.o rule.
++ * arch/sh/kernel/cpu/sh4/ex.S: SH-4 exception handling table.
++
++2003-11-17 PAul van Gool <pvangool@mimotech.com>
++
++ * arch/sh/configs/defconfig-se7751: Changed default config for
++ SolutionEngine 7751(R) boards so default Linux 2.6.0-test9 builds
++ run on those boards.
++
++2003-11-14 Richard Curnow <richard.curnow@superh.com>
++
++ * arch/sh/kernel/traps.c (trap_init): If there's no FPU (or it's
++ disabled) on the SH-4, treat the FPUDIS and SLOTFPUDIS exceptions
++ as reserved.
++
++2003-11-11 Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * include/asm-sh/cpu-sh2/sigcontext.h: New file.
++ * include/asm-sh/cpu-sh3/sigcontext.h: Likewise.
++ * include/asm-sh/cpu-sh4/sigcontext.h: Likewise.
++ * include/asm-sh/sigcontext.h: Remove the definition of
++ sigcontext struct and include cpu specific sigcontext.h.
++
++2003-11-10 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/cpu/sh4/sq.c (__sq_remap, sq_unmap): Build fixes
++ for MMUless.
++
++2003-10-31 Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * arch/sh/mm/init.c (paging_init): Clear the size of normal zone
++ if all pages are in dma zone.
++
++2003-10-29 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/entry.S (CLI): Added. Consolidate CLI.
++ (resume_kernel, preempt_stop): Added. CONFIG_PREEMPT works again.
++ (ret_from_exception): Move above ret_from_irq and call preempt_stop().
++
++ * TODO: Preemption works now, take it off the TODO list..
++
++2003-10-29 Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * include/asm-sh/ptrace.h (REG_FPREG0, REG_FPREG15, REG_XFREG0,
++ REG_FPSCR, REG_FPUL): Change so to match user.h struct.
++
++2003-10-25 Paul Mundt <lethal@linux-sh.org>
++
++ * drivers/char/keyboard.c, drivers/char/Makefile, Makefile,
++ drivers/char/tty_io.c, mm/memory.c, mm/mmap.c: Merge 2.6.0-test9.
++
++ * arch/sh/mm/Makefile: Don't build regular copy/clear_page.S when
++ we don't have an MMU.
++ * arch/sh/mm/pg-nommu.c: New file. clear_page()/copy_page() without
++ an MMU.
++
++ * include/asm-sh/page.h: Wrap clear_user_page()/copy_user_page()
++ to clear_page()/copy_page() when building for !CONFIG_MMU.
++
++2003-10-18 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Kconfig: Add CONFIG_MAPLE back in.
++
++ * drivers/maple/Makefile: Fix for 2.6.
++ * drivers/maple/maple.c (maple_freeq): Removed. This is only called
++ once, and kfree() does all of this for us already..
++ (kmapled_thread): Drop the BKL, fixup damonize() / tsk->comm for 2.6,
++ and finally, allow for SIGKILL from userspace.
++
++2003-10-18 Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * arch/sh/kernel/entry.S (sys_call_table): Reserve an entry.
++ * include/asm-sh/unistd.h (__NR_vserver): Define.
++ (NR_syscalls): Update.
++ * arch/sh/kernel/irq.c (disable_irq): Call synchronize_irq only
++ if the action is not NULL.
++ (enable_irq): Drop IRQ_INPROGRESS bit from status if depth is 1.
++ * arch/sh/kernel/traps.c (show_stack): Use kstack_end.
++
++2003-10-17 Paul Mundt <lethal@linux-sh.org>
++
++ * drivers/char/tty_io.c, drivers/net/8139too.c, Makefile:
++ Merge 2.6.0-test8.
++
++ * net/sunrpc/clnt.c: Deleted, merged into mainline..
++
++2003-10-14 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/entry.S, arch/sh/kernel/sh_ksyms.c,
++ arch/sh/kernel/cpu/sh4/sq.c: MMUless cleanups.
++
++ * include/asm-sh/flat.h: New file (needed for binfmt_flat).
++
++2003-10-13 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/boards/dreamcast/setup.c, arch/sh/kernel/irq.c,
++ arch/sh/kernel/process.c, arch/sh/kernel/setup.c,
++ arch/sh/kernel/signal.c, arch/sh/kernel/sys_sh.c,
++ drivers/char/sh-sci.c, include/asm-sh/ipc.h, include/asm-sh/irq.h,
++ include/asm-sh/uaccess.h, include/asm-sh/unistd.h: Random cleanup
++ of bugs encountered by sparse (mostly __user annotations).
++
++2003-10-12 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/entry.S (exception_handling_table): Label exception
++ codes, thoroughly. Add TMU3 and TMU4 vectors for 7751, and also add
++ 7760 vectors.
++
++ * drivers/char/sh-sci.[ch]: Add 7760 support.
++
++ * arch/sh/Kconfig, arch/sh/Makefile, arch/sh/tools/mach-types: Add
++ CONFIG_SH_7751_SYSTEMH rules.
++
++ * arch/sh/boards/systemh/Makefile, arch/sh/boards/systemh/io.c,
++ arch/sh/boards/systemh/irq.c, arch/sh/boards/systemh/setup.c,
++ include/asm-sh/systemh/7751systemh.h, include/asm-sh/systemh/io.h:
++ Add SystemH 7751R support (ported from MPC Data's 2.4.18 tree).
++
++ * arch/sh/configs/defconfig-systemh: Provide a rough defconfig.
++
++2003-10-10 Paul van Gool <pvangool@mimotech.com>
++
++ * arch/sh/boards/se/7751/pci.c: Replaced compile-time check
++ 'PCIBIOS_MIN_MEM != SH7751_PCI_MEMORY_BASE' with a runtime
++ check (BUG_ON()).
++
++2003-10-09 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/drivers/dma/dma-pvr2.c (pvr2_get_dma_residue): Added.
++ (pvr2_dma_interrupt): Set xfer_complete when the completion
++ interrupt fires.
++
++ * drivers/video/pvr2fb.c (pvr2fb_open, pvr2fb_release): Removed.
++ (pvr2fb_dc_init): Do request_dma() for pvr2 channel here instead.
++ (pvr2fb_dc_exit): Likewise for free_dma().
++
++ * arch/sh/kernel/time.c (sched_clock): Cloned from v850.
++
++ * net/sunrpc/clnt.c (call_verify): Compile fix. Make all users of
++ task->tk_pid use dprintk().
++
++ * Makefile, Documentation/cachetlb.txt, arch/sh/kernel/init_task.c,
++ arch/sh/kernel/irq.c, arch/sh/kernel/process.c, arch/sh/kernel/time.c,
++ arch/sh/kernel/traps.c, arch/sh/mm/init.c, arch/sh/mm/ioremap.c,
++ drivers/char/generic_serial.c, drivers/char/tty_io.c,
++ drivers/ide/Kconfig, drivers/serial/Kconfig, drivers/video/Kconfig,
++ fs/nfs/inode.c, include/asm-sh/cacheflush.h, include/asm-sh/mmzone.h,
++ include/asm-sh/pgtable.h, include/asm-sh/bigsur/serial.h,
++ include/asm-sh/ec3104/serial.h, include/linux/mm.h, mm/memory.c,
++ mm/mmap.c: Merge 2.6.0-test7.
++
++ * Makefile, arch/sh/Kconfig, arch/sh/kernel/setup.c,
++ drivers/char/Makefile, drivers/char/keyboard.c, drivers/char/sysrq.c,
++ drivers/char/tty_io.c, drivers/ide/Kconfig, drivers/serial/Kconfig,
++ drivers/serial/Makefile, drivers/video/Kconfig, include/asm-sh/mman.h,
++ include/asm-sh/posix_types.h, include/asm-sh/processor.h,
++ include/asm-sh/signal.h include/linux/input.h,
++ include/linux/miscdevice.h, include/linux/mm.h, mm/memory.c,
++ mm/mmap.c: Merge 2.6.0-test6.
++
++2003-10-08 Paul van Gool <pvangool@mimotech.com>
++
++ * arch/sh/boards/se/7751/pci.c: Since PCIBIOS_MIN_MEM is no
++ longer a hardcoded define, we can no longer use it with the
++ preprocessor.
++
++ * arch/sh/drivers/pci/pci-sh7751.c: Include linux/delay.h to get
++ definition of mdelay.
++
++2003-10-08 Paul Mundt <lethal@linux-sh.org>
++
++ * drivers/video/pvr2fb.c (pvr2fb_open, pvr2fb_release, pvr2fb_write):
++ Added zero-copy DMA when CONFIG_SH_DMA is set.
++ (pvr2fb_common_init): Map through the store queues when we have
++ CONFIG_SH_STORE_QUEUES set.
++
++2003-10-01 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++ Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * arch/sh/kernel/signal.c (OR_R0_R0): Define.
++ (struct sigframe): Extend retcode to hold 8 instructions.
++ (struct rt_sigframe): Likewise.
++ (setup_frame): Put 5 "or r0,r0" instructions to avoid an SH-4
++ core bug. Flush more cache line if needed.
++ (setup_rt_frame): Likewise.
++
++2003-09-30 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/drivers/dma/Kconfig: Add a couple of options, clean up
++ channel number selection for both on-chip and off-chip channels.
++
++ * arch/sh/drivers/dma/dma-sh.c: Relatively large batch of changes.
++ Dropped SAR/DAR/CHCR/DMATCR[] usage and went to a direct mapping of
++ the registers directly. We now support all 8 channels of the 7751R.
++
++ * arch/sh/drivers/dma/dma-sh.h: Define MAX_DMAC_CHANNELS (wrap to
++ CONFIG_NR_ONCHIP_DMA_CHANNELS).
++
++ * arch/sh/entry.S (interrupt_table): Add hooks for DMTE4-7 on the
++ 7751R.
++
++ * include/asm-sh/dma.h: Cleanup MAX_DMA_CHANNELS definition based
++ off of config options.
++
++ * include/asm-sh/irq.h: Add DMTE4-7 definitions.
++
++ * include/asm-sh/cpu-sh3/dma.h: Kill off old definitions. Define
++ SH_DMAC_BASE.
++ * include/asm-sh/cpu-sh4/dma.h: Same here.
++
++2003-09-23 Sean McGoogan <Sean.McGoogan@superh.com>
++
++ * arch/sh/kernel/entry.S: preserve EXPEVT across nested interrupts.
++
++ * arch/sh/kernel/cpu/sh4/fpu.c: Ensure that FPSCR.PR == FPSCR.SZ == 1
++ never occurs.
++
++2003-09-22 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/drivers/pci/pci-sh7751.c: Fixup pci-sh7751.h path.
++
++ * arch/sh/boards/snapgear/io.c: Same here.
++
++ * arch/sh/mm/cache-sh4.c (detect_cpu_and_cache_system): Add run-time
++ probing for the SH7760 and the SH4-202. Force EMODE on subtypes that
++ have it available.
++
++ * include/asm-sh/processor.h: Add CPU_SH7760 and CPU_SH4_202
++ definitions.
++
++2003-09-22 Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * arch/sh/kernel/signal.c (MOVW, TRAP16): Define.
++ (struct sigframe): Change retcode so to hold 3 words.
++ (struct rt_sigframe): Likewise. Remove pinfo and puc members.
++ (setup_frame): Use mov.w 1f,r3; trap #0x10; 1: .word N sequence
++ in trampoline.
++ (setup_rt_frame): Likewise. Don't set pinfo and puc of frame.
++
++2003-09-21 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Kconfig: Add a sane default for SH7751 PCLK value.
++
++ * arch/sh/boards/bigsur/Makefile: Remove pci.o
++ * arch/sh/boards/bigsur/pci.c: Ported for new SH7751 PCI changes, and
++ moved ..
++ * arch/sh/drivers/pci/ops-bigsur.c: here.
++
++ * arch/sh/boards/snapgear/Makefile, arch/sh/boards/snapgear/pci.c,
++ arch/sh/drivers/pci/ops-snapgear.c: Same changes as for BigSur.
++
++ * arch/sh/drivers/pci/Makefile: Add bigsur/snapgear ops.
++
++ * arch/sh/mm/init.c: Include linux/pagemap.h, shut up compiler.
++
++ * include/asm-sh/pci-sh7751.h: Added changes for new interface, and
++ moved ..
++ * arch/sh/drivers/pci/pci-sh7751.h: here.
++
++ * arch/sh/drivers/pci/pci-sh7751.c: Fixup pci_probe definition, we
++ don't deal with anything other then conf1 access, so drop the unused
++ flags.
++ (__area_sdram_check): Added. Responsible for BCR1/BCR2 validation
++ for a given area.
++ (sh7751_pcic_init): Added. Do general purpose initialization here.
++ window0/window1 values are passed in in the form of an address map
++ structure. Any boards doing this type of general initialization
++ should be using this code instead (so far BigSur and SnapGear boards,
++ though this will also include the SystemH 7751R).
++ (pcibios_setup): Get rid of conf1 and rom args, as they aren't used.
++
++ * include/asm-sh/pci.h: Get rid of hardcoded PCIBIOS_MIN_{IO,MEM}
++ definitions. Wrap these to their respective resources in
++ board_pci_channels instead.
++
++ * drivers/serial/sh-sci.c: Updates for new SH-SCI driver.
++
++2003-09-18 David McCullough <davidm@snapgear.com>
++
++ * arch/sh/boards/snapgear/pci/pci.c: fixup the memory and IO regions
++ to get PCI working.
++
++2003-09-17 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/drivers/pci/pci-sh7751.c (sh7751_pci_write): Fixup error
++ path where interrupts weren't getting reenabled.
++
++2003-09-16 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/drivers/dma/Makefile: Add dma-isa.o and dma-g2.o.
++ * arch/sh/drivers/dma/dma-isa.c: New file (provides wrapper for old
++ ISA DMA API to new DMA API).
++
++ * arch/sh/drivers/dma/dma-g2.c: New file (adds preliminary support
++ for G2 DMA -- currently being tested for SPU DMA, though there
++ are still some issues with the interrupt not firing correctly).
++
++ * include/asm-sh/dma.h (claim_dma_lock, release_dma_lock): Moved to
++ dma-isa.c.
++
++2003-09-08 Paul Mundt <lethal@linux-sh.org>
++
++ * Makefile, arch/sh/Kconfig, arch/sh/boards/dmida/mach.c,
++ arch/sh/boards/dreamcast/irq.c, arch/sh/boards/ec3104/irq.c,
++ arch/sh/boards/harp/mach.c, arch/sh/boards/hp6xx/hp620/mach.c,
++ arch/sh/boards/hp6xx/hp680/mach.c, arch/sh/boards/hp6xx/hp690/mach.c,
++ arch/sh/boards/overdrive/mach.c, arch/sh/boards/saturn/irq.c,
++ arch/sh/boards/unknown/mach.c, arch/sh/kernel/cpufreq.c,
++ drivers/Makefile, drivers/char/generic_serial.c,
++ drivers/char/tty_io.c, drivers/ide/Kconfig, drivers/video/Kconfig,
++ drivers/ide/pci/alim15x3.c, drivers/net/8139too.c,
++ drivers/pci/pci.ids, drivers/serial/Kconfig, drivers/serial/Makefile,
++ drivers/video/Makefile, drivers/video/fbmem.c, fs/nfs/inode.c,
++ include/asm-sh/semaphore.h, include/linux/miscdevice.h,
++ include/linux/mm.h, include/linux/pci_ids.h, mm/memory.c,
++ mm/mmap.c: Merge 2.6.0-test5.
++
++2003-09-06 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Kconfig: Reorder CPU family / subtype selection.
++
++2003-09-06 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/lib/div64-generic.c (__div64_32): Bug fix.
++
++2003-09-03 TAKANO Nobuyuki <n_takano@sas-tokyo.co.jp>
++ Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * drivers/char/sh-sci.c (sci_init_pins_scif): Mask correct
++ bits of SCPCR.
++ (sci_set_real_termios): Don't change TTY_HW_COOK_IN and
++ TTY_HW_COOK_OUT flags.
++ * drivers/char/sh-sci.h (O_OTHER, I_OTHER): Remove.
++
++2003-09-02 Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * arch/sh/kernel/signal.c (setup_frame): Set additional arguments
++ for the signal handler correctly.
++ (setup_rt_frame): Likewise.
++
++2003-09-01 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Kconfig: Add CONFIG_SH_DSP.
++
++ * arch/sh/kernel/entry.S: Save and restore DSP registers when
++ CONFIG_SH_DSP is set.
++ * arch/sh/kernel/head.S: Do initial callin to sh_cpu_init instead
++ of sh_cache_init.
++
++ * arch/sh/kernel/ptrace.c: Add PTRACE_SETDSPREGS/PTRACE_GETDSPREGS
++ cases to copyin/out dsp regs.
++
++ * arch/sh/kernel/setup.c (setup_arch): Remove UBC and FPU setup,
++ this is done at sh_cpu_init() time instead.
++
++ * arch/sh/kernel/traps.c (is_dsp_init): Added.
++ (do_reserved_inst, do_illegal_slot_inst): Check for DSP instruction
++ when CONFIG_SH_DSP is set.
++
++ * arch/sh/kernel/cpu/Makefile: Add init.o.
++ * arch/sh/kernel/cpu/init.c: New file. Do initial CPU init here.
++ Add DSP init code.
++
++ * arch/sh/mm/init.c (sh_cache_init): Moved to arch/sh/kernel/cpu/init.c
++
++ * include/asm-sh/processor.h: Add CPU_HAS_DSP flag.
++ * include/asm-sh/ptrace.h: Add DSP regs.
++
++ * arch/sh/kernel/irq.c (probe_irq_on): Convert the last remaining
++ synchronize_irq() to barrier().
++
++ * arch/sh/kernel/smp.c: Convert cpu_online_map and cpu_possible_map
++ to cpumask_t.
++ (__cpu_up): Use copy_process() instead of do_fork() to manually fork
++ idle task on cpu.
++ (start_secondary): Setup VBR properly for secondary cpu, and also
++ increment cpus_booted.
++ (stop_this_cpu): cpu_relax() in busy loop.
++
++ * include/asm-sh/spinlock.h: Add a RW_LOCK_BIAS definition, update
++ RW_LOCK_UNLOCKED to initialize the counter with the bias.
++ (rwlock_is_locked): Use atomic_read() to look at counter value.
++ (_raw_write_trylock): New function. Mostly cloned from x86_64.
++
++ * include/asm-sh/smp.h (cpu_online, cpu_possible): Use cpu_isset()
++ to work with new cpumask_t types for the maps.
++ (num_online_cpus): Removed.
++
++2003-08-31 Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * arch/sh/kernel/entry.S (sys_call_table): Add fadvise64_64 syscall.
++ * arch/sh/kernel/sys_sh.c (sys_fadvise64_64_wrapper): New.
++ * include/asm-sh/unistd.h: Add fadvise64_64 syscall.
++
++2003-08-27 Paul Mundt <lethal@linux-sh.org>
++
++ * drivers/net/Kconfig: Kill off CONFIG_8139TOO_DREAMCAST.
++ * drivers/net/8139too.c: Likewise. Get rid of SEGABBA references,
++ use RTL8139 instead. Also use USE_BUF16K for rx ring buffer size
++ selection.
++
++2003-08-25 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/drivers/dma/Makefile, arch/sh/drivers/dma/dma-api.c,
++ arch/sh/drivers/dma/Kconfig, arch/sh/drivers/dma/dma-pvr2.c,
++ arch/sh/drivers/dma/dma-sh.[ch]: Added new DMA subsystem with
++ drivers for the SH DMAC and the DC PVR2.
++
++ * arch/sh/kernel/cpu/Makefile: Remove dma.c.
++ * arch/sh/kernel/cpu/dma.c: Deleted.
++
++ * arch/sh/mm/Makefile: Add rule for pg-dma.c.
++ * arch/sh/mm/pg-dma.c: Added. This implemented optimized versions
++ of copy_page() and clear_page() using the SH DMAC (selectable with
++ CONFIG_DMA_PAGE_OPS).
++ * arch/sh/mm/clear_page.S (clear_page): Renamed to clear_page_slow.
++ * arch/sh/mm/copy_page.S (copy_page): Renamed to copy_page_slow.
++ * arch/sh/mm/init.c: Add copy_page/clear_page function pointers,
++ assign these to the _slow routines at startup, override them later
++ when something better (ie, DMA) comes along.
++
++ * include/asm-sh/dma.h: Rewritten entirely.
++ * include/asm-sh/page.h: Fixup copy/clear_page definitions.
++ * include/asm-sh/processor.h (cpu_relax): Get rid of the barrier()
++ wrapper, use sleep instead, this tends to be more friendly when
++ it comes to power consumption, and gives us something meaningful
++ to do in a busy loop.
++
++2003-08-23 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/pci/pci.c (pcibios_enable_device): Use pci_name() instead
++ of dev->dev.name/slot_name.
++ (pcibios_set_master): Likewise.
++
++ * arch/sh/vmlinux.lds.S: Moved ..
++ * arch/sh/kernel/vmlinux.lds.S: here.
++
++ * arch/sh/boot/compressed/Makefile: Fixup vmlinux.lds.s path.
++
++ * Makefile, arch/sh/kernel/Makefile, drivers/Makefile,
++ drivers/char/keyboard.c, drivers/ide/Kconfig,
++ drivers/ide/pci/alim15x3.c, drivers/mtd/maps/Kconfig,
++ drivers/net/8139too.c, drivers/net/Kconfig,
++ drivers/pcmcia/hd64465_ss.c, fs/nfs/inode.c,
++ include/linux/mm.h, include/linux/pci_ids.h,
++ kernel/timer.c, mm/memory.c: Merge 2.6.0-test4.
++
++2003-08-22 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/Kconfig: Rename BOOT_LINK_ADDR to BOOT_LINK_OFFSET.
++ * arch/sh/boot/compressed/Makefile: Likewise.
++
++2003-08-14 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/Kconfig: Add BOOT_LINK_ADDR. Add '0x' prefix to hex
++ parameters.
++ * arch/sh/Makefile: Remove bzImage target.
++ * arch/sh/boot/Makefile: Likewise.
++ * arch/sh/boot/compressed/Makefile: Likewise. Compute IMAGE_OFFSET
++ with BOOT_LINK_ADDR option.
++ * arch/sh/configs/defconfig-adx: Add '0x' prefix to hex parameters.
++ * arch/sh/configs/defconfig-cqreek: Likewise.
++ * arch/sh/configs/defconfig-dreamcast: Likewise.
++ * arch/sh/configs/defconfig-se7751: Likewise.
++
++2003-08-11 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/Makefile: Add bzImage support.
++ * arch/sh/boot/Makefile: Likewise.
++ * arch/sh/boot/compressed/Makefile: Likewise.
++ * arch/sh/boot/compressed/head.S: Likewise. Revived.
++
++2003-08-09 Paul Mundt <lethal@linux-sh.org>
++
++ * Makefile, arch/sh/defconfig, arch/sh/boards/dreamcast/pci.c,
++ arch/sh/boards/mpc1211/pci.c, arch/sh/boards/overdrive/galileo.c,
++ arch/sh/configs/defconfig-adx, arch/sh/configs/defconfig-cqreek,
++ arch/sh/mm/cache-sh2.c, arch/sh/mm/cache-sh3.c,
++ drivers/char/tty_io.c, drivers/char/watchdog/shwdt.c,
++ drivers/ide/Kconfig, drivers/ide/pci/alim15x3.c,
++ drivers/net/8139too.c, drivers/net/Kconfig, drivers/pci/pci.ids,
++ drivers/serial/Kconfig, include/asm-sh/processor.h,
++ include/linux/pci_ids.h, mm/memory.c: Merge 2.6.0-test3.
++
++2003-08-05 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Kconfig: Add CONFIG_PCI_AUTO_UPDATE_RESOURCES to
++ have the PCI auto code update BARs automatically. This is
++ the default for just about everyone, read the help text for
++ more information.
++
++ * arch/sh/kernel/pci.c (pcibios_init): Remove pcibios_fixup().
++ (pcibios_update_resource): Use pci_name() to access dev->slot_name.
++ (pcibios_enable_device): Same here.
++
++ * arch/sh/kernel/pci_auto.c (pciauto_setup_bars): Manually preserve
++ the existing BAR value when trying to figure out the BAR size. Only
++ change the BAR value when CONFIG_PCI_AUTO_UPDATE_RESOURCES is set.
++
++ * arch/sh/boards/dreamcast/pci.c: Rewritten.
++
++ * include/linux/pci_ids.h: Add PCI_DEVICE_ID_SEGA_BBA as well as
++ PCI_VENDOR_ID_SEGA.
++
++2003-08-04 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Makefile: Add arch/sh/pci/.
++
++ * arch/sh/kernel/cpu/sh4/pci-sh7751.c: Moved to arch/sh/pci/.
++ * arch/sh/kernel/cpu/sh4/pci-st40.[ch]: Same here.
++
++2003-08-02 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/cchips/hd6446x/hd6446{1,5}/io.c (hd6446{1,5}_insb,
++ hd6446{1,5}_insw, hd6446{1,5}_insl, hd6446{1,5}_outsb,
++ hd6446{1,5}_outsw, hd6446{1,5}_outsl): Deleted. Use the generic
++ functions.
++
++ * arch/sh/cchips/hd6446x/hd6446{1,5}/setup.c: Cleanup irq
++ return values for new API.
++
++ * include/asm-sh/hd6446{1,5}/io.h: Remove unused I/O functions.
++
++ * arch/sh/boards/snapgear/io.c (snapgear_insb, snapgear_insw,
++ snapgear_outsb, snapgear_outsw): Deleted. We can use the
++ generic functions here as well.
++
++ * include/asm-sh/snapgear/io.h: Remove unused I/O functions.
++
++ * arch/sh/boards/se/77{0x,51}/io.c (se_readb, se_readw, se_readl,
++ se_writeb, se_writew, se_writel): Deleted. We can use the
++ generic interface for this instead.
++
++ * arch/sh/boards/se/77{0x,51}/mach.c: Remove the aforementioned
++ I/O functions + c99 initializers.
++
++ * include/asm-sh/se{,7751}/io.h: Remove unused I/O functions.
++
++ * arch/sh/kernel/cpu/sh4/pci-sh7751.c
++ (sh7751_pci_read, sh7751_pci_write): Do general cleanup,
++ simplify read and write operations in general. Fixes a
++ bug with getting bogus data back on my 7751R board.
++
++2003-08-01 Paul van Gool <pvangool@mimotech.com>
++
++ * arch/sh/boards/se/7751/pci.c: Should allow for more than
++ 1 PCI device. Changed last devfn from 1 to 0xff.
++
++2003-07-31 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Makefile, arch/sh/boards/snapgear/Makefile,
++ arch/sh/boards/snapgear/io.c, arch/sh/boards/snapgear/pci.c
++ arch/sh/boards/snapgear/rtc.c, arch/sh/boards/snapgear/setup.c,
++ arch/sh/tools/mach-types, drivers/net/8139too.c,
++ include/asm-sh/irq.h, include/asm-sh/mc146818rtc.h,
++ include/asm-sh/pci.h, include/asm-sh/rtc.h,
++ include/asm-sh/snapgear/io.h: Add SecureEdge5410 support.
++
++ * arch/sh/kernel/cpu/sh4/pci-sh7751.c: Ported to new PCI Auto
++ API.
++
++2003-07-31 Paul van Gool <pvangool@mimotech.com>
++
++ * arch/sh/boards/se/7751/pci.c: Added empty pcibios_fixup
++ function. Added pci_channel definition for SE7751(R) board.
++
++2003-07-29 Paul Mundt <lethal@linux-sh.org>
++
++ * include/asm-sh/bigsur/io.h, include/asm-sh/mpc1211/io.h,
++ include/asm-sh/hd64465/io.h, include/asm-sh/overdrive/io.h,
++ include/asm-sh/hd64461/io.h, include/asm-sh/adx/io.h,
++ include/asm-sh/ec3104/io.h, include/asm-sh/cat68701/io.h,
++ include/asm-sh/dreamcast/io.h, include/asm-sh/se/io.h,
++ include/asm-sh/saturn/io.h, include/asm-sh/sh2000/io.h,
++ include/asm-sh/se7751/io.h: Kill off I/O definitions and
++ general __WANT_IO_DEF mess, we grab these implicitly through
++ the machvec now.
++
++ * include/asm-sh/io.h: Bit of a policy change, we now force
++ _everything_ through the machine vector. Each board already
++ provides its own definitions for what it wants, there's no
++ reason to have to repeat this in every board's io.h.
++
++ (__set_io_port_base): Added. We use this for setting a
++ common port base that can then be used by the generic
++ isa_port2addr implementation.
++
++ * arch/sh/kernel/setup.c (sh_mv_setup): Wrap the mv_io_base
++ assignment to use __set_io_port_base().
++
++ * arch/sh/boards/dreamcast/Makefile: Remove io.c
++ * arch/sh/boards/dreamcast/setup.c: Get rid of dreamcast
++ specific isa_port2addr implementation, we use the generic
++ one now.
++
++ (platform_setup): Init the port base with __set_io_port_base().
++
++ * arch/sh/boards/dreamcast/io.c: Deleted.
++
++ * include/asm-sh/dreamcast/io.h: Deleted.
++
++2003-07-28 Paul Mundt <lethal@linux-sh.org>
++
++ * drivers/char/watchdog/shwdt.c (sh_wdt_open): Get rid of
++ MOD_INC_USE_COUNT. Use __module_get() for module refcounting
++ instead.
++
++ * arch/sh/kernel/setup.c (setup_arch): Get rid of machvec
++ setup code.
++ (sh_mv_setup): Added. Move setup code here. Also walk the
++ sh_mv and manually load up generic routines for anything
++ that board-specific code hasn't filled in.
++
++ * arch/sh/boards/dreamcast/Makefile: Remove mach.c
++ * arch/sh/boards/dreamcast/mach.c: Deleted.
++ * arch/sh/boards/dreamcast/setup.c: Move mv definition here,
++ also clean it up for the new changes.
++
++ * arch/sh/boards/saturn/Makefile: Remove mach.c
++ * arch/sh/boards/saturn/mach.c: Deleted.
++ * arch/sh/boards/saturn/setup.c: Follow the dreamcast change
++ here as well.
++
++ * arch/sh/boards/mpc1211/Makefile: Remove mach.c
++ * arch/sh/boards/mpc1211/rtc.c (mpc1211_time_init): Added.
++ Wrap rtc definitions to rtc_{get,set}_time, and init them
++ properly.
++ * arch/sh/boards/mpc1211/setup.c: Add rtc timer init code,
++ and follow the other boards for mv changes.
++ * arch/sh/boards/mpc1211/mach.c: Deleted.
++
++ * arch/sh/boards/cqreek/Makefile, arch/sh/boards/cqreek/mach.c,
++ arch/sh/boards/cqreek/setup.c: Follow mv changes.
++
++ * arch/sh/boards/sh2000/Makefile, arch/sh/boards/sh2000/mach.c,
++ arch/sh/boards/sh2000/setup.c: Follow mv changes.
++
++ * arch/sh/boards/hp6xx/hp680/mach.c: Remove generic_ and
++ sh_rtc_xxx references, since this is handled for us now.
++ * arch/sh/boards/hp6xx/hp690/mach.c: Same here.
++
++ * arch/sh/boards/overdrive/mach.c: And here.
++
++ ... and the same for the rest of the boards, so we won't bother
++ listing them all here again. Look at linuxsh-cvs for this date
++ if you really care.
++
++ * include/asm-sh/machvec.h: Remove several unused functions.
++
++2003-07-28 Paul van Gool <pvangool@mimotech.com>
++
++ * arch/sh/configs/defconfig-se7751: Added new 2.6.0-test2
++ config settings:
++
++ CONFIG_IOSCHED_AS
++ CONFIG_IOSCHED_DEADLINE
++ CONFIG_LBD
++
++2003-07-27 Paul van Gool <pvangool@mimotech.com>
++
++ * include/asm-sh/pci-sh7751.h: Re-added in order to add
++ SH7751R_DEVICE_ID definition.
++
++ * arch/sh/kernel/cpu/sh4/pci-sh7751.c: Initialized mask
++ variable to prevent compiler from complaining.
++
++ Changed PCIDBG statement to use new variable name instead
++ of old Linux 2.4 one.
++
++ Changed PCI hardware check to also check for 7751R hardware
++ and not just 7751.
++
++2003-07-27 Paul Mundt <lethal@linux-sh.org>
++
++ * Makefile, arch/sh/Makefile, arch/sh/mm/init.c,
++ drivers/ide/Kconfig, drivers/net/8139too.c, drivers/net/Kconfig,
++ drivers/pci/pci.ids, drivers/serial/Kconfig,
++ drivers/serial/Makefile, drivers/video/Makefile, fs/nfs/inode.c,
++ include/linux/pci_ids.h, kernel/time.c: Merge 2.6.0-test2.
++
++ * arch/sh/kernel/cpu/sh4/pci-sh7751.c: Merge changes from
++ mainline with a few fixes.
++
++ (pcibios_allocate_resources): Deprecate pci_for_each_dev(),
++ use pci_find_device() instead.
++ (pcibios_assign_resources): Same here.
++
++ * arch/sh/kernel/setup.c: Use asm/sections.h.
++ * arch/sh/kernel/traps.c: Same here.
++
++ * arch/sh/configs/defconfig-dreamcast: Update defconfig.
++
++ * include/asm-sh/local.h: New file.
++ * include/asm-sh/sections.h: New file.
++
++2003-07-27 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/kernel/ptrace.c: Fix single step.
++
++2003-07-26 Paul van Gool <paul.vangool@rinconnetworks.com>
++
++ * arch/sh/Makefile: Fix for defconfig-% rules when there's no
++ prior .config.
++
++ * arch/sh/configs/defconfig-se7751: Add SE7751 defconfig.
++
++2003-07-25 Paul Mundt <lethal@linux-sh.org>
++
++ * Documentation/sh/new-machine.txt: Added documentation on how to
++ work with the new tree.
++
++2003-07-22 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Kconfig: Add KGDB options back in.
++
++ * arch/sh/configs/defconfig-dreamcast: Update DC defconfig.
++
++ * arch/sh/Makefile: Add support for building a defconfig out of
++ arch/sh/configs/. Also add a 'make help' text for SH. And finally,
++ also rename cpu- to cflags- to make the KGDB options look a bit
++ saner.
++
++ Builds for provided defconfigs can now be launched in the format
++ of: 'make defconfig-$(boardname)' followed by vmlinux/zImage/etc.
++
++2003-07-21 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/cpu/sh4/Makefile: Remove irq_intc2.o for generic
++ 7751 builds, leave this as ST40 specific for now.
++
++ * arch/sh/Kconfig: Get rid of CONFIG_PCI_BIOS cruft.
++
++ * arch/sh/kernel/cpu/sh4/pci-sh7751.c: Same here (forward port of
++ changes from David Woodhouse against 2.4 branch).
++
++ * arch/sh/Makefile: Link in arch/sh/lib/ before any of the other
++ libs-y directories.
++
++ * arch/sh/lib/Makefile: Add div64-generic.o
++ * arch/sh/lib/div64-generic.c: New file. Provide a compliant
++ __div64_32 interface that wraps to our __xdiv64_32.
++
++ * include/asm-sh/div64.h (do_div): Removed. Wrap to the generic
++ interface at asm-generic/div64.h instead.
++
++2003-07-19 Paul Mundt <lethal@linux-sh.org>
++
++ * drivers/video/pvr2fb.c: Rewrite. Use the hardware palette, and add
++ support for PCI-based PVR2 boards (such as the neon250 in my case).
++
++2003-07-19 Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * arch/sh/kernel/entry.S (sys_call_table): Add new syscalls.
++ * arch/sh/kernel/irq.c (do_IRQ): Use kstat_this_cpu.
++ * include/asm-sh/hardirq.h (irq_cpustat_t): Remove unused members.
++ * include/asm-sh/unistd.h: Add new syscalls.
++
++2003-07-17 Paul Mundt <lethal@linux-sh.org>
++
++ Merge with 2.5.74 ... 2.6.0-test1.
++
++2003-07-16 Paul Mundt <lethal@linux-sh.org>
++
++ * include/asm-sh/segment.h: Re-added (some headers unfortunately still
++ seem to require this..).
++ * include/asm-sh/cache.h: Fixup L1_CACHE_BYTES definition (use the shift
++ defined per-cpu family).
++ * include/asm-sh/cpu-sh2/cache.h: Remove L1_CACHE_BYTES definition, and
++ add a L1_CACHE_SHIFT definition instead.
++ * include/asm-sh/cpu-sh3/cache.h: Same here.
++ * include/asm-sh/cpu-sh4/cache.h: and here.
++
++2003-07-15 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/mm/cache-sh4.c: Add a cpu flag for p2 cache restriction
++ for users who need it (7750, 7750S/7750R?) and test that instead
++ of the subtype.
++
++ * include/asm-sh/processor.h: Define CPU_HAS_P2_FLUSH_BUG.
++
++2003-07-14 Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * arch/sh/kernel/entry.S (sys_call_table): Add new syscalls.
++ * arch/sh/kernel/irq.c (__report_bad_irq, report_bad_irq): New.
++ (noirqdebug_setup): Likewise.
++ (note_interrupt): Likewise.
++ (do_IRQ): Call note_interrupt if required.
++ * arch/sh/kernel/module.c (module_arch_cleanup): new.
++ * arch/sh/mm/fault.c (do_page_fault): Use in_atomic. Use
++ VM_FAULT_xxx symbolic constants. Use fixup_exception.
++ * arch/sh/mm/ioremap.c: Fix so to follow i386 changes.
++ * drivers/char/sh-sci.c (sci_hungup, sci_close): Add again.
++ (sci_real_drive): Add sci_hungup and sci_close.
++ (sci_rx_interrupt): Return IRQ_HANDLED.
++ (sci_tx_interrupt, sci_br_interrupt, sci_br_interrupt): Likewise.
++ (sci_init_drivers): Change return type of handlers.
++ * drivers/net/stnic.c (do_stnic_intr): Return the result of
++ ei_interrupt.
++ * include/asm-sh/hardirq.h: Remove commented out part.
++ * include/asm-sh/pgalloc.h (pte_alloc_one_kernel): Use
++ __GFP_REPEAT feature.
++ (pte_alloc_one): Likewise.
++ * include/asm-sh/unistd.h: Update for new syscalls.
++
++2003-07-14 Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * include/asm-sh/system.h (switch_to): Set LAST properly.
++
++2003-07-06 Dominik Brodowski <linux@brodo.de>
++ Paul Mundt <lethal@linux-sh.org>
++
++ * drivers/pcmcia/hd64465_ss.c: Update for new PCMCIA API.
++
++2003-06-29 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Kconfig, drivers/serial/Kconfig, drivers/serial/Makefile,
++ drivers/char/keyboard.c, fs/nfs/inode.c, include/linux/highmem.h,
++ include/linux/input.h, include/linux/pci_ids.h, kernel/timer.c,
++ Makefile: Merge 2.5.73.
++
++ * arch/sh/Kconfig, arch/sh/kernel/time.c, drivers/char/keyboard.c,
++ drivers/ide/Kconfig, include/linux/input.h, kernel/sysctl.c,
++ kernel/time.c, kernel/timer.c, Makefile: Merge 2.5.72.
++
++2003-06-15 Paul Mundt <lethal@linux-sh.org>
++
++ * Makefile, arch/sh/kernel/irq.c, arch/sh/lib/Makefile,
++ drivers/Makefile, drivers/char/Makefile,
++ drivers/char/generic_serial.c, drivers/char/sh-sci.c,
++ drivers/char/tty_io.c, drivers/ide/Kconfig, drivers/mtd/mtdcore.c,
++ drivers/mtd/mtdpart.c, drivers/mtd/chips/cfi_cmdset_0002.c,
++ drivers/mtd/chips/jedec_probe.c, drivers/mtd/maps/Kconfig,
++ drivers/mtd/maps/Makefile, drivers/mtd/maps/solutionengine.c,
++ drivers/net/8139too.c, drivers/net/Kconfig, drivers/pci/pci.ids,
++ drivers/serial/Kconfig, drivers/serial/Makefile,
++ drivers/video/Kconfig, drivers/video/Makefile, include/asm-sh/bug.h,
++ include/asm-sh/pci.h, include/linux/highmem.h,
++ include/linux/pci_ids.h, include/linux/mtd/partitions.h,
++ kernel/sys.c, kernel/sysctl.c, kernel/time.c, kernel/timer.c,
++ mm/memory.c: Merge 2.5.71.
++
++2003-06-13 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/cpu/dma.c: Fix up exports so modules can use dma
++ functions without resulting in undefined symbols.
++
++2003-06-01 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/irq.c (handle_IRQ_event): Check handler return value,
++ also report if no one cared about the interrupt.
++
++2003-05-27 Paul Mundt <lethal@linux-sh.org>
++
++ * Makefile, arch/sh/mm/init.c, drivers/Makefile,
++ drivers/char/keyboard.c, drivers/char/sh-sci.c,
++ drivers/char/sysrq.c, drivers/char/tty_io.c,
++ drivers/net/8139too.c, drivers/net/Kconfig,
++ drivers/pci/pci.ids, drivers/video/fbmem.c
++ fs/locks.c, fs/nfs/inode.c, include/linux/elf.h,
++ include/linux/input.h, include/linux/mm.h,
++ include/linux/pci_ids.h, kernel/sys.c, kernel/sysctl.c,
++ kernel/timer.c, mm/memory.c: Merge 2.5.70.
++
++ * include/asm-sh/elf.h: Move ELF relocation definitions here.
++
++ * arch/sh/kernel/process.c (kernel_thread): Use the new do_fork() API.
++ (sys_clone, sys_fork, sys_vfork) : Same here.
++
++ * arch/sh/kernel/cpu/dma.c (dma_err, dma_tei): Use new irq API.
++
++2003-05-24 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Kconfig: Add note for CONFIG_SH_WDT about HZ scaling.
++
++ * drivers/char/watchdog/shwdt.c: General updates.. add note about
++ HZ scaling here as well.
++
++ * drivers/serial/Kconfig: Add SCI definitions.
++ * drivers/serial/Makefile: Same here.
++
++ * drivers/serial/sh-sci.c, drivers/serial/sh-sci.h: Add rewrite
++ of SH-SCI driver for new serial API.
++
++ * include/asm-sh/param.h: Set HZ to 1000 when the WDT is enabled.
++
++ * include/asm-sh/watchdog.h: Move cpu-specific functions and
++ definitions out of the way.
++ * include/asm-sh/cpu-sh[234]/watchdog.h: .. and put them here.
++
++ * arch/sh/kernel/pci.c (pcibios_align_resource): Define this as a
++ weak symbol, so we can override it.
++
++ * arch/sh/boards/mpc1211/pci.c (pcibios_align_resource): Added.
++
++2003-05-19 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/setup.c (topology_init): Added.
++ (c_start, c_next): Add support for NR_CPUS > 1.
++
++ * arch/sh/kernel/cpu/sh4/pci-st40.c: Cleanup irq handler return type.
++
++ * arch/sh/cchips/hd6446x/hd64465/gpio.c: Various cleanups.. modules,
++ resource allocation, etc. Also fixup irq handler return type.
++
++ * drivers/video/pvr2fb.c: Further cleanups.
++
++ * include/asm-sh/machvec.h: Get rid of machvec machtype tracking,
++ do this dynamically through the new mach-type generation interface.
++
++ * arch/sh/boards: Get rid of all mv_hw_* references.
++
++ * arch/sh/Makefile: Add rule to build arch/sh/tools.
++
++ * arch/sh/tools/Makefile, arch/sh/tools/machgen.sh,
++ arch/sh/tools/mach-types: Added.
++
++ This completes the initial mach-type generation code. From now on,
++ definitions that previously were hardcoded in machvec.h will be
++ automatically generated as include/asm-sh/machtypes.h.
++
++2003-05-17 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/cpufreq.c (sh_cpufreq_setstate): Add rudimentary SMP
++ support, also verify that CPU is online.
++ (sh_cpufreq_cpu_init): Remove the policy->cpu != 0 check, look at
++ cpu_online() instead.
++
++2003-05-16 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/setup.c (scif_sercon_device): Remove.
++ * arch/sh/kernel/time.c (timer_interrupt): Use irqreturn_t for return
++ type.
++ * arch/sh/kernel/Makefile: Make SH cpufreq driver independant of
++ cpufreq core. Use CONFIG_SH_CPU_FREQ instead.
++ * arch/sh/kernel/cpufreq.c: Rewritten for new API.
++
++ * arch/sh/Kconfig: Add cpufreq definitions.
++
++ * include/asm-sh/thread_info.h: Drop redefinition of TI_PRE_COUNT.
++
++2003-05-16 Saito.K <ksaito@interface.co.jp>
++
++ * arch/sh/Kconfig: Add mpc1211 support.
++ * arch/sh/Makefile: Add mpc1211 support.
++ * arch/sh/vmlinux.lds.S: Add mpc1211 support.
++
++ * arch/sh/boards/mpc1211/Makefile: New file.
++ * arch/sh/boards/mpc1211/io.c: New file.
++ * arch/sh/boards/mpc1211/led.c: New file.
++ * arch/sh/boards/mpc1211/mach.c: New file.
++ * arch/sh/boards/mpc1211/pci.c: New file.
++ * arch/sh/boards/mpc1211/rtc.c: New file.
++ * arch/sh/boards/mpc1211/setup.c: New file.
++
++ * arch/sh/kernel/sh_ksyms.c (memscan, __copy_user, __udivdi3,
++ __flush_purge_region, __down_trylock): Add to exported symbols.
++
++ * drivers/char/keyboard.c: Add mpc1211 support.
++
++ * drivers/ide/Kconfig: Add mpc1211 support.
++ * drivers/ide/pci/alim15x3.c: Add mpc1211 support.
++
++ * drivers/mtd/chips/jedec_probe.c: Add Fujitsu MBM29F040C support.
++
++ * drivers/mtd/maps/Kconfig: Add mpc1211 support.
++ * drivers/mtd/maps/Makefile: Add mpc1211 support.
++ * drivers/mtd/maps/mpc1211.c: Add mpc1211 support.
++
++ * drivers/video/Kconfig: Add Chips 69000 display support.
++ * drivers/video/Makefile: Add Chips 69000 display support.
++ * drivers/video/asiliantfb.c: New file.
++ * drivers/video/fbmem.c: Add Chips 69000 display support.
++
++ * include/asm-sh/dma.h: Add mpc1211 support.
++ * include/asm-sh/floppy.h: New file.
++ * include/asm-sh/irq.h: Add mpc1211 support.
++ (irq_canonicalize): here as an inline function.
++ * include/asm-sh/keyboard.h: Add mpc1211 support.
++ * include/asm-sh/machvec.h: Add mpc1211 support.
++ * include/asm-sh/mc146818rtc.h: Add mpc1211 support.
++
++ * include/asm-sh/mpc1211/dma.h: New file.
++ * include/asm-sh/mpc1211/io.h: New file.
++ * include/asm-sh/mpc1211/keyboard.h: New file.
++ * include/asm-sh/mpc1211/m1543c.h: New file.
++ * include/asm-sh/mpc1211/mc146818rtc.h: New file.
++ * include/asm-sh/mpc1211/mpc1211.h: New file.
++ * include/asm-sh/mpc1211/pci.h: New file.
++
++ * include/asm-sh/pci.h: Add mpc1211 support.
++ (sg_dma_address): Fix typo.
++ * include/asm-sh/scatterlist.h: Copy from kernel.org.
++
++ * include/linux/pci_ids.h: Add Chips 69000 display support.
++
++2003-05-12 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/boards/Makefile: Removed.
++ * arch/sh/Makefile: Include top-level .config for rules that don't set
++ include_config in the top-level Makefile. (ie, make clean/mrproper).
++
++2003-05-12 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/boards/Makefile: New file.
++
++2003-05-10 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * include/asm-sh/cpu-sh4/cache.h (CCR_CACHE_EMODE): Defined.
++ * arch/sh/mm/cache-sh4.c (detect_cpu_and_cache_system): Check CCR_CACHE_EMODE setting.
++ (__flush_dcache_all_ex): New function.
++ (__flush_cache_4096_all_ex): New function.
++ (flush_cache_4096_all): Moved from clear_page.S, changed for 2-way cache.
++ (flush_icache_range): Do flush-cache-all.
++ (flush_cache_sigtramp): Don't use flush_icache_range for efficiency.
++ (flush_cache_all): Check cache ways and use relevant function.
++ (flush_dcache_page): Reverted to previous version (2.4.20).
++ (__flush_cache_page): Likewise.
++ (flush_cache_range): External function declaration moved to the top.
++ * arch/sh/mm/clear_page.S (__clear_user): Bug fix from 2.4 branch.
++ (flush_cache_4096_all): Renamed to __flush_cache_4096_all.
++ * arch/sh/mm/init.c (sh_cache_init): Don't change CCR_CACHE_EMODE bit of CCR.
++
++ * arch/sh/Makefile: Follow i386 changes.
++ * arch/sh/boot/compressed/Makefile: Likewise.
++ * arch/sh/boot/Makefile: Restored and follow i386 changes.
++ * arch/sh/boot/compressed/vmlinux.scr: New.
++ * arch/sh/.cvsignore: ignore vmlinux.lds.s
++ * arch/sh/boot/compressed/.cvsignore: Add sub-target files.
++
++ * include/asm-sh/bug.h: Restore and follow i386 changes.
++ * mm/memory.c: Follow 2.5.69.
++ * include/net/inet_ecn.h: Removed.
++ * include/asm-sh/ide.h (ide_init_default_hwifs): Bug fix from 2.4 branch.
++ * include/asm-sh/kmap_types.h: Follow i386 changes.
++
++2003-05-07 Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * arch/sh/lib/udivdi3.c: New file.
++ * arch/sh/lib/Makefile (obj-y): Add udivdi3.o.
++
++2003-05-07 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/cpu/sh4/pci-sh7751.c (pci_conf1_read): General
++ cleanup. Should now build and read values correctly.
++ * arch/sh/kernel/cpu/sh4/pci-st40.c (st40pci_read): Same here.
++
++ * arch/sh/mm/cache-sh4.c (flush_icache_range): Clear out valid
++ bit for each way in the icache.
++
++ * drivers/video/Makefile: Make pvr2fb use cfb files.
++ * drivers/video/pvr2fb.c: Updates.
++
++2003-05-07 Kaz Kojima <kkojima@rr.iij4u.or.jp>
++ Paul Mundt <lethal@linux-sh.org>
++
++ * Makefile (CFLAGS): Use -O1 to avoid miss compiling by gcc-3.2.
++ (core-y): Add usr/.
++
++ * arch/sh/Makefile (LDFLAGS_BLOB): Define.
++
++ * arch/sh/kernel/cpu/rtc.c (sh_rtc_gettimeofday): Don't make
++ overflow.
++ * arch/sh/kernel/entry.S: Add gUSA support. Call syscall_tail
++ only when returning from fork. Add new syscalls.
++ * arch/sh/kernel/io_7751se.c: Fix typo.
++ * arch/sh/kernel/io_se.c (delay): Wait more.
++ * arch/sh/kernel/irq.c: Follow i386 changes.
++ * arch/sh/kernel/module.c: Rewriting.
++ * arch/sh/kernel/process.c (kernel_thread_helper): New.
++ (kernel_thread): Use kernel_thread_helper. Return error value also.
++ (dump_task_regs, dump_task_fpu): New.
++ (copy_thread): Handle CLONE_SETTLS flag and initialize child tids.
++ (__switch_to): Return PREV pointer.
++ (sys_clone): Handle tid pointers.
++ * arch/sh/kernel/ptrace.c: Cleanup and follow i386 changes.
++ * arch/sh/kernel/signal.c (handle_signal): Add gUSA support.
++ (do_signal): Handle ERESTART_RESTARTBLOCK case.
++ * arch/sh/kernel/sys_sh.c (sys_ipc): Use sys_semtimedop and
++ handle SEMTIMEDOP.
++ * arch/sh/kernel/time.c (TICK_SIZE): Use tick_nsec.
++ (do_gettimeoffset): Lock critical region.
++ (do_gettimeofday): Follow i386 changes.
++ (time_init): Override tick_nsec here.
++
++ * arch/sh/lib/Makefile (obj-y): Add div64.o.
++ * arch/sh/lib/div64.S: New file.
++
++ * arch/sh/mm/cache-sh2.c (detect_cpu_and_cache_system): Use
++ SH_CACHE_* instead of CACHE_* because CACHE_VALID collides with
++ the one in NFS header file.
++ * arch/sh/mm/cache-sh3.c (detect_cpu_and_cache_system): Likewise.
++ (__flush_wback_region): Likewise.
++ (__flush_purge_region): Likewise.
++ * arch/sh/mm/cache-sh4.c (flush_cache_4096): Likewise.
++ * arch/sh/mm/init.c (sh_cache_init): Likewise.
++ * arch/sh/mm/extable.c (fixup_exception): New.
++ * arch/sh/mm/tlb-sh4.c (update_mmu_cache): Set write through
++ bit of PTEL if CONFIG_SH_WRITETHROUGH defined.
++
++ * drivers/net/stnic.c (ei_interrupet): Change return type.
++
++ * include/asm-sh/byteorder.h (___arch__swab64): New.
++ (__arch__swab64): Define.
++ * include/asm-sh/cache.h: Rename CACHE_* to SH_CACHE_*.
++ * include/asm-sh/delay.h (ndelay): Define.
++ * include/asm-sh/div64.h (do_div): Implement a real 64/32-bit
++ division.
++ * include/asm-sh/elf.h: Follow i386 change.
++ * include/asm-sh/hardirq.h: Likewise.
++ * include/asm-sh/ide.h: Include generic definitions.
++ * include/asm-sh/ipc.h (SEMTIMEDOP): Define.
++ * include/asm-sh/module.h (MODULE_PROC_FAMILY): Define.
++ * include/asm-sh/param.h: Follow i386 changes.
++ * include/asm-sh/pci.h (pci_map_sg): Fix dma_address in loop.
++ (pci_dma_sync_sg): Likewise.
++ * include/asm-sh/pgtable.h: Change _PAGE_FILE to 0x80 and drop this
++ bit from _PAGE_FLAGS_HARDWARE_MASK.
++ * include/asm-sh/processor.h: Follow i386 changes.
++ * include/asm-sh/ptrace.h: Remove PTRACE_OLDSETOPTIONS and
++ define PTRACE_O_TRACESYSGOOD.
++ * include/asm-sh/rwsem.h: Cut&copy from i386.
++ * include/asm-sh/semaphore.h: Follow i386 changes.
++ * include/asm-sh/thread_info.h: Follow i386 changes.
++ (struct thread_info): Make CPU and PREEMPT_COUNT 32-bit.
++ * include/asm-sh/tlb.h (tlb_start_vma): Call flush_cache_range.
++ (tlb_end_vma): Call flush_tlb_range.
++ * include/asm-sh/types.h: Follow i386 changes.
++ * include/asm-sh/uaccess.h: Remove fixup_exception.
++ * include/asm-sh/unistd.h: Define new system call numbers.
++
++ * include/linux/elf.h: Define SH relocation types.
++
++ * kernel/timer.c (tick_sec): Don't use static initializer.
++ (tick_nsec): Likewise.
++ (init_timers): Initialize tick_sec and tick_nsec here.
++
++2003-05-05 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/setup.c (sh_console_device): Removed.
++
++ * drivers/char/sh-sci.c: General tty cleanup, get rid of minor() and
++ mk_kdev() usage.
++
++ * drivers/video/hitfb.c (hitfb_init): fb_info.node cleanups, get rid
++ of NODEV and minor().
++ * drivers/video/pvr2fb.c (pvr2fb_interrupt): Use new irqreturn_t type.
++ (pvr2fb_init): get rid of NODEV and minor().
++
++ * include/asm-sh/pgalloc.h (pte_alloc_one_kernel): Use __GFP_REPEAT
++ for pte allocation.
++
++ Merge 2.5.69.
++
++2003-05-01 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/entry.S (ret_from_fork): Add back in. Invoke
++ schedule_tail(), since its not just for SMP anymore.
++ * arch/sh/kernel/traps.c (dump_stack): Added.
++ * arch/sh/kernel/module.c: New file.
++
++ * include/asm-sh/module.h: Rework for new module interface.
++
++2003-04-22 Paul Mundt <lethal@linux-sh.org>
++
++ Merge with 2.5.67 and 2.5.68.
++
++2003-04-18 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/mm/clear_page.S (__flush_cache_4096): Revert previous change
++ and modified for efficiency.
++
++2003-04-17 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/mm/clear_page.S (__flush_cache_4096): Don't change associated
++ data that is to be flushed.
++
++2003-04-01 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Kconfig: Move the CONFIG_MMU option further down and
++ add some rudimentary help text.
++
++ * arch/sh/vmlinux.lds.s: Add __param and __initramfs sections.
++
++ * arch/sh/kernel/entry.S: Deprecate sys_create_module,
++ sys_query_module, and sys_get_kernel_syms.
++
++ * arch/sh/mm/extable.c (search_extable): Added. Use the unified
++ extable handling code.
++ (search_one_table, search_exception_table): Removed.
++ * arch/sh/mm/fault.c (do_page_fault): Use the unified extable
++ search.
++ * arch/sh/kernel/traps.c (die_if_no_fixup): Same here.
++
++ * include/asm-sh/uaccess.h (search_exception_table): Removed.
++
++ * drivers/block/rd.c: Include linux/mm.h for page_address().
++
++2003-03-31 Paul Mundt <lethal@linux-sh.org>
++
++ * include/asm-sh/pgtable.h (pte_file, pte_to_pgoff,
++ pgoff_to_pte): Added. Also set PTE_FILE_MAX_BITS.
++
++ * drivers/char/watchdog/shwdt.c: Cleanup.
++
++ * drivers/video/pvr2fb.c: Further API fixes.
++
++ Merge with 2.5.62 ... 2.5.66.
++
++2003-03-30 Paul Mundt <lethal@linux-sh.org>
++
++ Merge with 2.5.47 ... 2.5.61.
++
++2003-03-29 Paul Mundt <lethal@linux-sh.org>
++
++ Merge with 2.5.46.
++
++2003-03-24 Daniel Jacobowitz <drow@false.org>
++ Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * arch/sh/kernel/ptrace.c (ubc_set_tracing): Break before executing
++ instruction.
++
++2003-03-24 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/kernel/entry.S: Call sys_pread_wrapper/sys_pwrite_wrapper
++ instead of sys_pread64/sys_pwrite64.
++ * arch/sh/kernel/sys_sh.c (sys_pread_wrapper,sys_pwrite_wrapper):
++ New function.
++
++ * arch/sh/mm/copy_page.S (__copy_user): Add missing exception handling
++ point.
++
++2003-01-28 Paul Mundt <lethal@linux-sh.org>
++
++ * Makefile, arch/sh/Kconfig, drivers/block/rd.c,
++ drivers/Makefile, drivers/char/Makefile,
++ drivers/char/tty_io.c, drivers/net/8139too.c,
++ drivers/net/Kconfig, drivers/video/epson1355fb.c,
++ drivers/video/hitfb.c, drivers/video/pvr2fb.c,
++ include/asm-sh/signal.h, init/do_mounts.c, kernel/ptrace.c,
++ kernel/timer.c, mm/memory.c: Merge 2.5.51.
++
++ * Makefile, drivers/Makefile, drivers/char/Makefile,
++ drivers/pci/pci.ids, include/asm-sh/processor.h,
++ init/do_mounts.c, kernel/ptrace.c, kernel/timer.c: Merge 2.5.50.
++
++ * Makefile, drivers/char/Makefile, drivers/char/Kconfig,
++ drivers/char/tty_io.c, drivers/pcmcia/hd64465_ss.c,
++ fs/nfs/inode.c, fs/mpage.c: Merge 2.5.49.
++
++ * drivers/char/shwdt.c: Move to watchdog/
++
++ * arch/sh/Kconfig, drivers/char/tty_io.c, init/do_mounts.c,
++ drivers/input/keyboard/Kconfig, fs/nfs/inode.c, fs/mpage.c,
++ include/asm-sh/stat.h, include/linux/input.h, kernel/time.c,
++ kernel/timer.c, Makefile: Merge 2.5.48.
++
++ * Makefile, arch/sh/Kconfig, arch/sh/kernel/pci-sh7751.c,
++ arch/sh/kernel/pci_st40.c, drivers/block/rd.c,
++ drivers/char/sh-sci.c, drivers/char/shwdt.c,
++ drivers/char/sysrq.c, drivers/char/tty_io.c,
++ drivers/net/Kconfig, drivers/pci/pci.ids, fs/nfs/inode.c,
++ fs/mpage.c, kernel/timer.c: Merge 2.5.47.
++
++ * Makefile, arch/sh/Kconfig, arch/sh/kernel/irq.c,
++ arch/sh/kernel/process.c, arch/sh/kernel/ptrace.c,
++ drivers/Makefile, drivers/block/rd.c, drivers/char/Makefile,
++ drivers/char/sysrq.c, drivers/net/Kconfig, init/do_mounts.c,
++ include/asm-sh/processor.h, include/asm-sh/ptrace.h,
++ kernel/ptrace.c, kernel/timer.c, mm/memory.c: Merge 2.5.46.
++
++2003-01-16 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Kconfig: Add CONFIG_DEBUG_SPINLOCK.
++
++ * arch/sh/kernel/traps.c (per_cpu_trap_init, gdb_vbr_init): Added.
++ (trap_init): Do some generic exception table setup, and wrap to
++ per_cpu_trap_init() to setup boot cpu.
++
++ * include/asm-sh/spinlock.h (_raw_spin_lock, _raw_spin_unlock,
++ _raw_read_lock, _raw_read_unlock, _raw_write_lock,
++ _raw_write_unlock): And preliminary spin/read/write locks.
++
++ Clean up CONFIG_DEBUG_SPINLOCK stuff.
++
++2003-01-15 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/vmlinux.lds.S: Don't use static values for cacheline or
++ page size. Use L1_CACHE_BYTES/PAGE_SIZE accordingly.
++
++2003-01-13 Paul Mundt <lethal@linux-sh.org>
++
++ * include/asm-sh/uaccess.h (__access_ok, set_fs, get_fs): Added for
++ CONFIG_MMU=n.
++
++2003-01-10 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/entry.S: Wrap sys_madvise and sys_readahead
++ to sys_ni_syscall if !CONFIG_MMU. Fixup exception handling
++ when we don't have an MMU (or if its disabled).
++
++2003-01-09 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Kconfig: Add CONFIG_BINFMT_FLAT.
++
++ * mm/Makefile, mm/filemap.c, mm/mmap.c, mm/nommu.c,
++ mm/page_alloc.c, mm/slab.c, mm/vmscan.c, kernel/fork.c,
++ kernel/sys.c, kernel/sysctl.c, fs/exec.c, fs/locks.c,
++ fs/mpage.c, fs/proc/array.c, fs/proc/base.c,
++ fs/proc/proc_misc.c, drivers/char/mem.c,
++ include/linux/blkdev.h, include/linux/mm.h,
++ include/linux/page-flags.h, include/linux/slab.h,
++ include/linux/swap.h: Merge uClinux 2.5.45-uc1-mm patch.
++
++ * fs/Makefile: Add binfmt_flat.
++ * fs/binfmt_flat.c: New file.
++
++ * include/linux/flat.h: New file.
++
++2003-01-05 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Makefile: Do a bit of cleaning, and lay the groundwork
++ for include/asm-sh/cpu/
++
++2003-01-01 Paul Mundt <lethal@linux-sh.org>
++
++ * ChangeLog-2002: New file, move the old one out of the way.
++
++ * arch/sh/boot/compressed/Makefile: Add top-level include dir
++ to CFLAGS/AFLAGS.
++
++ * arch/sh/kernel/process.c (sys_fork): Can't fork() properly
++ with no MMU (at least under uClinux), return -EINVAL instead.
++
++ * arch/sh/mm/Makefile: Build pg-sh4.c for all SH-4, not just
++ ones with an MMU.
++ * arch/sh/mm/tlb-nommu.c (update_mmu_cache): Added.
++
++ * include/asm-sh/bugs.h (check_bugs): Add a default rule for
++ CPU subtype.
++ * include/asm-sh/pgtable.h: Fixup page protection flags for
++ systems without an MMU .. wrap to __pgprot(0).
++ * include/asm-sh/processor.h (save_fpu): Make it work on
++ SH-4 again.
++
++ * include/asm-sh/addrspace.h: Move CPU specific definitions out of
++ the way.. reference asm/cpu/addrspace.h instead.
++ * include/asm-sh/cpu-sh3/addrspace.h,
++ include/asm-sh/cpu-sh4/addrspace.h: Added.
++
+diff -ruN linux-2.6.17-vanilla/ChangeLog-2004 linux-2.6.17/ChangeLog-2004
+--- linux-2.6.17-vanilla/ChangeLog-2004 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/ChangeLog-2004 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1,930 @@
++2004-12-03 Tom Rini <trini@kernel.crashing.org>
++
++ * arch/sh/configs/se7750_defconfig: Add defconfig for ms7750sse01
++ * include/asm-sh/system.h (__cmpxchg_u32, __cmpxchg, cmpxchg): Add
++ so that we provide a simple cmpxchg(). Borrowed from MIPS.
++
++2004-12-03 Saito.K <ksaito@interface.co.jp>
++
++ * include/asm-sh/irq.h: Add CTP/PCI-SH03 IDE.
++ * include/asm-sh/sh03/ide.h: New file.
++
++2004-10-25 Paul Mundt <paul.mundt@nokia.com>
++
++ * arch/sh/kernel/signal.c (handle_signal): Modify to take a
++ struct k_sigaction arg.
++ (do_signal): get_signal_to_deliver() now fills in the k_sigaction
++ struct, pass this into handle_signal().
++
++ * arch/sh/kernel/entry.S (sys_call_table): Update for 2.6.9 syscalls,
++ sys_waitid in particular.
++
++ * include/asm-sh/bitops.h (ext2_find_next_zero_bit): addr is specified
++ as a char *, which causes find_next_zero_bit() to complain. Cast it.
++
++ * include/asm-sh/pgtable.h (ptep_get_and_clear): Get rid of inline
++ bogosity causing compile death.
++
++ * include/asm-sh/system.h: Kill off linux/kernel.h include, as it's
++ both unecessary and causes a circular dependency.
++
++ * include/asm-sh/unistd.h: syscall updates.
++
++2004-10-24 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/kernel/signal.c (get_sigframe): Fix sigaltstack behavior.
++
++2004-10-15 Tom Rini <trini@kernel.crashing.org>
++
++ * arch/sh/ramdisk/Makefile: Fix for usage with O=
++
++2004-10-15 Tom Rini <trini@kernel.crashing.org>
++
++ * include/asm-sh/bitops.h (find_next_zero_bit): First parameter is
++ now a const unsigned long.
++ (sched_find_first_bit): Likewise.
++
++2004-10-14 Paul Mundt <paul.mundt@nokia.com>
++
++ * arch/sh/Kconfig: Cleanup PCLK values.
++
++ * arch/sh/configs/microdev_defconfig: Add microdev defconfig.
++
++ * arch/sh/boards/superh/microdev/setup.c (smc91x_setup): Added
++ smc91x platform device registration.
++
++ * arch/sh/kernel/early_printk.c (scif_sercon_init): Fixup SCBRR
++ calculations to use CONFIG_SH_PCLK_FREQ value.
++ * arch/sh/kernel/sh_ksyms.c (__div64_32, strcpy): Exported to
++ satisfy module builds.
++ (csum_ipv6_magic, clear_page): Likewise.
++
++ * include/asm-sh/bug.h: Make BUG() oops.
++ * include/asm-sh/checksum.h: Fix IPv6 compile.
++ * include/asm-sh/unistd.h (_exit): Removed.
++
++ * drivers/net/Kconfig: Enable smc91x for SuperH.
++ * drivers/net/smc91x.[ch]: Cleanup ISA support, add support for
++ SH4-202 MicroDev.
++
++2004-10-13 Masahiro Miyake <miya@lineo.co.jp>
++
++ * arch/sh/boards/snapgear/setup.c: Use asm/cpu/timer.h for TMU
++ definitions.
++
++ * arch/sh/kernel/time.c: Likewise.
++
++ * include/asm-sh/cpu-sh3/freq.h: Add FRQCR definition for SH7300.
++
++ * include/asm-sh/cpu-sh3/timer.h: New file, TMU definitions.
++ * include/asm-sh/cpu-sh4/timer.h: New file.
++
++2004-10-04 Saito.K <ksaito@interface.co.jp>
++
++ * arch/sh/Kconfig: Add CTP/PCI-SH03 support.
++ * arch/sh/Makefile: Add CTP/PCI-SH03 support.
++ * arch/sh/boards/sh03/Makefile: New file.
++ * arch/sh/boards/sh03/led.c: New file.
++ * arch/sh/boards/sh03/pci.c: New file.
++ * arch/sh/boards/sh03/rtc.c: New file.
++ * arch/sh/boards/sh03/setup.c: New file.
++ * arch/sh/config/sh03_defconfig: New file.
++ * arch/sh/drivers/pci/pci-sh7751.c: Add CTP/PCI-SH03 support.
++ * drivers/char/Kconfig: Add CTP/PCI-SH03 support.
++ * drivers/char/Makefile: Add CTP/PCI-SH03 support.
++ * drivers/char/sh03rtc.c: New file.
++ * include/asm-sh/sh03/io.h: New file.
++ * include/asm-sh/sh03/sh03.h: New file.
++
++2004-10-01 Paul Mundt <paul.mundt@nokia.com>
++
++ * arch/sh/drivers/pci/pci-sh7751.c (pcibios_fixup_irqs): Define as a
++ weak symbol so other boards can overload the fixups.
++
++2004-09-24 Tom Rini <trini@kernel.crashing.org>
++
++ * arch/sh/Makefile: Test for machdir-y not being empty before
++ adding to core-y.
++
++2004-09-24 Tom Rini <trini@kernel.crashing.org>
++
++ * drivers/net/8139too.c: Revert changes that moved asserts() around.
++
++2004-09-24 Tom Rini <trini@kernel.crashing.org>
++
++ * arch/sh/boards/se/7751/io.c: pci-sh7751.h has moved, update include.
++ * arch/sh/boards/se/7751/pci.c: pci-sh7751.h has moved, update include.
++
++2004-09-24 Tom Rini <trini@kernel.crashing.org>
++
++ * arch/sh/tools/Makefile: Switch from machgen.sh to gen-mach-types
++ * arch/sh/tools/machgen.sh: Remove
++ * arch/sh/tools/gen-mach-types: Add
++ * arch/sh/Makefile: Update the cpu and mach symlink rules to match
++ how ARM does it.
++ * This updates our symlink and machtypes.h stuff to match what
++ ARM does today which fixes O= building.
++
++2004-09-24 Tom Rini <trini@kernel.crashing.org>
++
++ * include/asm-sh: adc.h, addrspace.h, cache.h, cacheflush.h, dma.h,
++ freq.h, mmu_context.h, processor.h, rtc.h, shmparam.h, ubc.h,
++ watchdog.h: Protect all contents with #ifdef __KERNEL__
++ * include/asm-sh/user.h: remove <linux/types.h> and <asm/processor.h>
++ from the #include list.
++ * The net result is that glibc can now compile with these headers.
++
++2004-08-19 Alex Bennee <kernel-hacker@bennee.com>
++
++ * arch/sh/drivers/pci/pci-st40.c Updated PLL calculation
++ * arch/sh/drivers/pci/pci-st40.c Fixes to init
++ * arch/sh/drivers/pci/pci-st40.[ch] Updated RBAR
++
++2004-08-19 Alex Bennee <kernel-hacker@bennee.com>
++
++ * Forward porting of INTC2 IRQ Handling from 2.4
++ * added intc2 irq initialisation
++ * removed make_intc2_irq call from from pci
++ * updated intc2 irq functions
++ * updated st40 pci irq code
++ * fixed pcibios_init to return ok
++
++2004-08-19 Alex Bennee <kernel-hacker@bennee.com>
++
++ * moved map_harp_irq -> pcibios_map_platform_irq in harp/setup.c
++ * added subsys_initcall(pcibios_init) to ST40 PCI code.
++
++2004-08-03 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/cpu/sh4/probe.c (detect_cpu_and_cache_system): Add
++ CPU_HAS_PERF_COUNTER for SH7750/SH7750S.
++
++ * arch/sh/kernel/setup.c (cpu_flags): Add perfctr flag.
++
++ * arch/sh/oprofile/Makefile: Add op_model_sh7750 rule.
++ * arch/sh/oprofile/op_model_sh7750.c: New file, OProfile support for
++ SH7750/SH7750S performance counters.
++
++ * include/asm-sh/processor.h: Add CPU_HAS_PERF_COUNTER.
++
++2004-07-28 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/drivers/dma/dma-pvr2.c: Update for DMA API changes.
++ * arch/sh/drivers/dma/dma-g2.c: Likewise.
++
++2004-07-26 Paul Mundt <lethal@linux-sh.org>
++
++ More fixups by Hosokawa-san <hosokawa@ace-jp.com>
++
++ * arch/sh/drivers/pci/fixups-rts7751r2d.c (pci_fixup_pcic): Use
++ PCI_REG() for proper register offsets. Additional PCIC init.
++
++ * arch/sh/drivers/pci/ops-rts7751r2d.c (sh7751_pci_map): Fix window0
++ size, add dummy window1.
++
++ * arch/sh/drivers/pci/pci-sh7751.c (pci_fixup_ide_bases): Enable this
++ for RTS7751R2D/HS7751RVoIP.
++ (pcibios_fixups): Likewise.
++
++ * arch/sh/drivers/pci/pci.c (pcibios_enable_device): Add mask check.
++
++2004-07-07 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/mm/cache-sh[234].c (detect_cpu_and_cache_system): Moved ..
++ * arch/sh/kernel/cpu/sh[234]/probe.c: here.
++ * arch/sh/kernel/cpu/sh[234]/Makefile: Add probe.o rule.
++
++2004-07-05 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/time.c (time_init): RTS7751R2D and HS7751RVoIP don't
++ need special handling for the interval value..
++
++2004-06-28 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/asm-offsets.c: New file.
++ * arch/sh/kernel/entry.S: Include asm/asm-offsets.h.
++
++ * arch/sh/Makefile: Add asm-offsets rules.
++
++ * include/asm-sh/thread_info.h: Remove struct elem references, do
++ them dynamically at build time via asm-offsets instead.
++
++ * arch/sh/lib/memcpy-sh4.S: Merge Stuart's SH-4 optimized memcpy().
++ * arch/sh/lib/Makefile: Use memcpy-sh4 for CONFIG_CPU_SH4.
++
++2004-06-28 Hiroshi DOYU <Hiroshi_DOYU@montavista.co.jp>
++
++ * arch/sh/Kconfig, arch/sh/Makefile,arch/sh/kernel/process.c,
++ arch/sh/kernel/setup.c,arch/sh/kernel/signal.c,arch/sh/kernel/time.c,
++ arch/sh/kernel/cpu/sh4/Makefile,arch/sh/kernel/cpu/sh4/ex.S,
++ arch/sh/mm/cache-sh4.c, arch/sh/tools/mach-types, drivers/serial/sh-sci.c
++ drivers/serial/sh-sci.h, include/asm-sh/irq.h include/asm-sh/processor.h,
++ include/asm-sh/cpu-sh4/freq.h: Modified for sh73180cp01
++
++ * arch/sh/boards/se/73180/Makefile, arch/sh/configs/se73180_defconfig
++ arch/sh/boards/se/73180/io.c, arch/sh/boards/se/73180/irq.c,
++ arch/sh/boards/se/73180/led.c, arch/sh/boards/se/73180/setup.c,
++ include/asm-sh/se73180/io.h, include/asm-sh/se73180/se73180.h,
++ include/asm-sh/irq-sh73180.h: New files for sh73180cp01
++
++2004-06-26 Paul Mundt <lethal@linux-sh.org>
++
++ * sound/oss/voyagergx_sound.c (request_dma2): Use irqreturn_t for irq
++ callback.
++ (do_irq): Convert to irqreturn_t.
++ (init_voyagergx): s/\(INT_MASK\)/VOYAGER_\1/, likewise for INT_MASK_AC.
++
++ * arch/sh/drivers/dma/dma-api.c: Don't export unregister_dmac().
++
++ * arch/sh/boards/dreamcast/setup.c: Wrap dreamcast_consistent_alloc
++ and dreamcast_consistent_free into the machvec.
++
++ * arch/sh/boards/renesas/rts7751r2d/mach.c: consistent API wrappers
++ in the machvec are only built in if CONFIG_USB_OHCI_HCD is set,
++ check this in the machvec assignment so we don't get undefined symbols
++ at link time (Noted by Hosokawa-san <hosokawa@ace-jp.com>).
++
++ * arch/sh/cchips/voyagergx/consistent.c (voyagergx_consistent_alloc):
++ return NULL when we aren't capable of doing the allocation (this will
++ then wrap to consistent_alloc() in the generic path).
++ (voyagergx_consistent_free): return non-0 to have the generic path
++ wrap to consistent_free(), and get rid of its invocation here.
++
++ * arch/sh/drivers/pci/dma-dreamcast.c (__pci_alloc_consistent):
++ Renamed to dreamcast_consistent_alloc().
++ (__pci_free_consistent): Renamed to dreamcast_consistent_free().
++ Both cleaned up to work with new model.
++
++ * include/asm-sh/dma-mapping.h: Get rid of dreamcast-specific hacks,
++ these are now wrapped properly through the machvec.
++ (dma_alloc_coherent): Check return val of mv_consistent_alloc(),
++ wrap to consistent_alloc() if the former isn't interested in the
++ mapping.
++ (dma_free_coherent): Likewise, but for mv_consistent_free() and
++ consistent_free().
++
++ * include/asm-sh/machvec.h (mv_consistent_free): Change return-type
++ to int.
++
++ * arch/sh/kernel/cpu/irq_ipr.c: export make_ipr_irq to satisfy module
++ dependancies.
++ * arch/sh/mm/consistent.c: export consistent_alloc/consistent_free.
++ * sound/oss/voyagergx_8051.c: export init_8051/command_8051.
++
++ * arch/sh/configs/rts7751r2d_defconfig: Update RTS7751R2D defconfig.
++
++2004-06-25 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/time.c (sh_do_profile): Add oprofile hook.
++ Change to take pt_regs.
++ (do_timer_interrupt): Hand off regs to sh_do_profile()
++ instead of just PC value (profile_hook() expects this).
++
++2004-06-15 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Kconfig: Add CONFIG_CPU_SUBTYPE_SH7705.
++
++ * arch/sh/kernel/cpu/irq_ipr.c, arch/sh/kernel/cpu/sh3/ex.S,
++ arch/sh/kernel/entry.S, arch/sh/kernel/setup.c,
++ arch/sh/kernel/time.c: Add support for SH7705.
++
++ * include/asm-sh/irq.h, include/asm-sh/processor.h: Likewise.
++
++ * arch/sh/boards/systemh: Moved ..
++ * arch/sh/boards/renesas/systemh: here.
++
++ * arch/sh/Makefile: Update systemh path.
++ * arch/sh/boards/renesas/systemh/Makefile: Adjust pci.o path.
++
++2004-06-10 Hiroshi DOYU <Hiroshi_DOYU@montavista.co.jp>
++
++ * arch/sh/Kconfig, arch/sh/Makefile,
++ arch/sh/kernel/entry.S, arch/sh/kernel/setup.c,
++ arch/sh/kernel/time.c, arch/sh/kernel/cpu/irq_ipr.c,
++ arch/sh/kernel/cpu/sh3/ex.S, arch/sh/tools/mach-types,
++ drivers/serial/sh-sci.c, drivers/serial/sh-sci.h,
++ include/asm-sh/bugs.h, include/asm-sh/irq.h,
++ include/asm-sh/ubc.h: modified for sh7300cp01
++
++ * arch/sh/boards/se/7300/Makefile, arch/sh/boards/se/7300/io.c,
++ arch/sh/boards/se/7300/irq.c, arch/sh/boards/se/7300/led.c,
++ arch/sh/boards/se/7300/mach.c, arch/sh/boards/se/7300/setup.c,
++ arch/sh/configs/se7300_defconfig, include/asm-sh/se7300/io.h,
++ include/asm-sh/se7300/irq-sh7300.h, include/asm-sh/se7300/se7300.h:
++ New files for sh7300cp01
++
++2004-06-08 Paul Mundt <lethal@linux-sh.org>
++
++ * drivers/ide/Kconfig: Add CONFIG_IDE_SH.
++ * drivers/ide/Makefile: Add CONFIG_IDE_SH rule.
++ * drivers/ide/ide.c: Merge from mainline.
++ (probe_for_hwifs): Add ide_sh_init().
++ * drivers/ide/sh/ide-sh.c: New file, generic host driver for SuperH.
++
++ * include/asm-sh/ide.h: Update for new API.
++ * include/asm-sh/irq.h: Only load asm/mach/ide.h on platforms where
++ the irq definitions vary from the standard 14/15.
++
++2004-06-07 Hiroshi DOYU <Hiroshi_DOYU@montavista.co.jp>
++
++ * arch/sh/Kconfig: Added support for embedded ramdisk
++ * arch/sh/Makefile: Likewise
++ * arch/sh/kernel/setup.c (setup_arch): Likewise
++ * arch/sh/ramdisk/Makefile: New file. Likewise
++ * arch/sh/ramdisk/ld.script: New file. Likewise
++ * arch/sh/kernel/vmlinux.lds.S: Likewise
++
++2004-06-04 Andriy Skulysh <askulysh@image.kiev.ua>
++
++ * arch/sh/mm/cache-sh3.c (detect_cpu_and_cache_system): use
++ way_incr instead of way_shift.
++ * arch/sh/mm/cache-sh3.c (__flush_wback_region): Likewise.
++
++ * include/asm-sh/ide.h (ide_init_hwif_ports): Removed.
++ * include/asm-sh/hp6xx/ide.h: Fix typo.
++ * include/asm-sh/hp6xx/hp6xx.h: hp680 updates.
++ * include/asm-sh/cpu-sh3/dac.h: Likewise.
++ * arch/sh/kernel/sh_ksyms.c: Export consistent_sync.
++
++ * arch/sh/kernel/cpu/adc.c: New file. Added simple SH ADC support.
++ * include/asm-sh/adc.h: Likewise.
++ * arch/sh/Kconfig: Likewise.
++ * arch/sh/kernel/cpu/Makefile: Likewise.
++
++ * drivers/input/touchscreen/hp680_ts_input.c: New file. Added Jornada 680
++ touchscreen support.
++ * drivers/input/touchscreen/Makefile: Likewise.
++ * drivers/input/touchscreen/Kconfig: Likewise.
++
++2004-06-02 Alex Bennee <kernel-hacker@bennee.com>
++
++ * arch/sh/KConfig: Added ST subtypes from ST Tree (Dave McKay)
++ * arch/sh/KConfig: Added CONFIG_DEBUG_INFO from other arch's
++
++2004-06-02 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/setup.c (show_cpuflags): Fix off-by-1 index
++ for flag names.
++
++2004-05-28 Paul Mundt <lethal@linux-sh.org>
++
++ * include/asm-sh/pgalloc.h (ptep_test_and_clear_young): Removed.
++ (ptep_test_and_clear_dirty): Removed.
++ (ptep_set_wrprotect): Likewise.
++ (ptep_mkdirty): Likewise.
++ (ptep_get_and_clear): Removed for SH-3.
++
++ * include/asm-sh/pgtable.h (pte_same): Removed.
++
++ Use generic ptep_xxx() routines for everything other than the SH-4
++ version of ptep_get_and_clear().
++
++2004-05-25 Alex Bennee <kernel-hacker@bennee.com>
++
++ * arch/sh/kernel/time.c: Fixed clock detection for ST40
++
++2004-05-07 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/kernel/ptrace.c (sys_ptrace): Handle PTRACE_SETOPTIONS in
++ default case.
++
++2004-05-05 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/process.c (default_idle): Add hlt_counter check to
++ determine if we can use sleep or not. Use cpu_sleep() instead of
++ cpu_relax().
++ * include/asm-sh/processor.h (cpu_relax): Renamed to cpu_sleep().
++ Add dummy definition for cpu_relax().
++
++2004-05-02 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/kernel/traps.c (is_dsp_inst,trap_init): Don't use bit operation
++ macros for cpu_data->flags.
++ * arch/sh/kernel/cpu/init.c (dsp_init,sh_cpu_init): Likewise.
++ * arch/sh/mm/tlb-sh3.c (__flush_tlb_page): Likewise.
++ * arch/sh/mm/cache-sh3.c (detect_cpu_and_cache_system): Likewise.
++ * arch/sh/mm/cache-sh4.c (detect_cpu_and_cache_system): Likewise.
++ (flush_cache_4096): Likewise. Jump to P2 area when accessing I-cache
++ array.
++
++2004-04-30 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * include/asm-sh/checksum.h (csum_ipv6_magic): Remove #ifdef CONFIG_IPV6.
++
++ * arch/sh/boot/compressed/Makefile (CONFIG_MEMORY_START,
++ CONFIG_BOOT_LINK_OFFSET): Add '0x' prefix to dummy value.
++
++2004-04-28 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * drivers/serial/sh-sci.h: Fix typo.
++ * drivers/serial/sh-sci.c (sci_handle_breaks): Test SCIF_ORER definition
++ instead of sub cpu type.
++ (sci_er_interrupt): Fix compile error.
++
++ * arch/sh/boot/compressed/Makefile (CONFIG_MEMORY_START,
++ CONFIG_BOOT_LINK_OFFSET): Assign dummy values if these 2 variables are
++ not defined, in order to suppress error message.
++
++ * include/asm-sh/sigcontext.h: Do not include asm/cpu/sigcontext.h.
++ (struct sigcontext): Moved from asm-sh/cpu*/sigcontext.h.
++ * include/asm-sh/cpu-sh2/sigcontext.h,include/asm-sh/cpu-sh3/sigcontext.h,
++ include/asm-sh/cpu-sh4/sigcontext.h: Removed.
++
++2004-04-23 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/boot/compressed/misc.c: New file. Fix for gcc-3.4.
++
++2004-04-21 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * include/asm-sh/user.h: New file. Don't include linux/types.h.
++
++2004-04-15 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/mm/consistent.c: Export consistent_sync.
++
++ * arch/sh/kernel/time.c (time_init): Allow 1% mismatch for auto detected
++ clock frequency.
++
++ * include/asm-sh/serial.h: New file. Remove irq_canonicalize.
++
++ * arch/sh/Makefile: Target 'all' depends on zImage.
++
++2004-04-13 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * drivers/serial/sh-sci.h (SCI_CTRL_FLAGS_REIE): Defined.
++ * drivers/serial/sh-sci.c (sci_er_interrupt): Add handling scif overrun
++ error.
++ (sci_start_rx): Enable Rx error interrupt.
++ (sci_stop_rx): Disable Rx error interrupt.
++
++ * arch/sh/mm/cache-sh4.c (detect_cpu_and_cache_system): Don't force set
++ EMODE before flushing all D-cache. Refer CVR on SH4_501/SH4-202 only.
++ * arch/sh/kernel/cpu/init.c (cache_init): Flush only 1 way if EMODE is
++ not set. Writing 0 to address array is enough for flushing. Force EMODE
++ here (after flushing data cache).
++
++ * include/asm-sh/unistd.h: Include linux/linkage.h.
++
++ * drivers/char/rtc.c: New file. Fix ioctl return code when RTC_IRQ==0.
++
++2004-04-13 Yoshinori Sato <ysato@users.sourceforge.jp>
++
++ * drivers/serial/Kconfig: New file. Add SERIAL_SH_SCI dependency on
++ H8300.
++ * drivers/serial/sh-sci.h (CPU_SCI_FNS, sci_rxd_in): Fix compilation
++ error.
++ * drivers/serial/sh-sci.c (sci_init_pins_sci, serial_console_setup,
++ sci_transmit_chars, sci_receive_chars, sci_set_termios, sci_init):
++ Fix compilation error on H8300.
++
++2004-04-08 Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * include/asm-sh/pgtable.h (__pte_to_swp_entry): Take into account
++ _PAGE_WT bit.
++ (__swp_entry_to_pte, pte_to_pgoff, pgoff_to_pte): Likewise.
++
++2004-03-29 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/mm/consistent.c (consistent_alloc): Fix page freeing logic.
++
++2004-03-26 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/mm/init.c (set_pte_phys): Added.
++ (__set_fixmap): Added. Use set_pte_phys() to set fixmap translation.
++
++ * include/asm-sh/fixmap.h: New file.
++
++ * include/asm-sh/pgtable.h: Adjust VMALLOC_END to play nicely with
++ fixmap. Add PAGE_KERNEL_NOCACHE.
++
++2004-03-21 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Makefile: Remove defconfig- parsing, this is now done in a
++ generic fashion by the top-level Makefile.
++
++ Remove -Os on CONFIG_EMBEDDED, this is now done already by
++ CONFIG_CC_OPTIMIZE_FOR_SIZE.
++
++ * arch/sh/configs/defconfig-%: Renamed to %_defconfig.
++ * arch/sh/configs/dreamcast_defconfig: Update dreamcast defconfig.
++
++ * Documentation/sh/new-machine.txt: Update notes about defconfigs.
++
++ * arch/sh/Kconfig: Re-order the cpufreq options, move them into their
++ own menu in the same way i386 does.
++
++ * arch/sh/drivers/dma/Kconfig: Place DMA options inside their own menu.
++ * arch/sh/cchips/Kconfig: Likewise.
++
++ * drivers/video/pvr2fb.c (pvr2fb_setcolreg): Work still needs to be
++ done on the hardware palette, use the pseudo_palette as a fallback for
++ 16/32bpp modes for the time being (this could be worked around with
++ getcolreg(), but as that's gone now...).
++
++ * drivers/maple/Kconfig: Removed.
++
++ * drivers/input/mouse/maplemouse.c (dc_mouse_connect): init input dev,
++ cleanup compile warnings. Don't use MOD_INC_USE_COUNT.
++ (dc_mouse_disconnect): Don't use MOD_DEC_USE_COUNT.
++
++ * drivers/input/keyboard/maple_keyb.c (dc_kbd_connect): Same as for
++ maplemouse.
++ (dc_kbd_disconnect): Likewise.
++
++ * drivers/input/joystick/maplecontrol.c: Likewise.
++
++ * include/asm-sh/pgtable.h (pgprot_writecombine): Added.
++
++ * drivers/video/fbmem.c (fb_mmap): Add sh as a pgprot_writecombine()
++ user.
++
++2004-03-16 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Kconfig: Add HugeTLB page size selection.
++
++ * arch/sh/mm/Makefile: Add hugetlbpage.o
++ * arch/sh/mm/hugetlbpage.c: Cloned from sparc64.
++ * arch/sh/mm/tlb-sh4.c (update_mmu_cache): Use _PAGE_WT in the
++ CONFIG_SH_WRITETHROUGH case.
++
++ * fs/Kconfig: Add SuperH to the list of platforms that support
++ hugetlbfs.
++
++ * include/asm-sh/page.h: Add huge page support.
++ * include/asm-sh/pgtable.h: Make PAGE_FILE use _PAGE_WT to free
++ up _PAGE_SZ[0-1] bits and add huge page support that makes use
++ of these.
++
++2004-03-15 Andriy Skulysh <askulysh@image.kiev.ua>
++
++ * arch/sh/boards/hp6xx/hp680/mach.c,
++ arch/sh/boards/hp6xx/hp680/setup.c, arch/sh/cchips/hd6446x/hd64461/io.c,
++ arch/sh/cchips/hd6446x/hd64461/setup.c, arch/sh/kernel/cpu/irq_ipr.c,
++ arch/sh/kernel/sh_ksyms.c, drivers/ide/legacy/ide-cs.c,
++ drivers/input/keyboard/Kconfig, drivers/input/keyboard/Makefile,
++ drivers/input/keyboard/hp600_keyb.c, drivers/input/keyboard/scan_keyb.c,
++ drivers/input/keyboard/scan_keyb.h, drivers/pcmcia/Kconfig,
++ drivers/pcmcia/Makefile, drivers/pcmcia/hd64461_ss.c,
++ drivers/serial/sh-sci.c, drivers/video/hitfb.c,
++ include/asm-sh/cpu-sh3/dac.h, include/asm-sh/hd64461/hd64461.h,
++ include/asm-sh/hd64461/io.h, include/asm-sh/hp6xx/hp6xx.h,
++ include/asm-sh/irq.h, sound/oss/Kconfig, sound/oss/Makefile,
++ sound/oss/sh_dac_audio.c: hp680 updates.
++
++2004-03-13 Peter Garrone <pgarrone@linuxmail.org>
++
++ * arch/sh/kernel/traps.c (show_stack): Set stack pointer from
++ task structure so that sysrq dumps stack calltrace for each task
++ rather than N repeats of current task.
++
++2004-03-11 Yutaro Ebihara <ebiharaml@si-linux.com>
++ Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * arch/sh/kernel/sys_sh.c (arch_get_unmapped_area): #ifdef'ed
++ for HAVE_ARCH_UNMAPPED_AREA. Speedup searching.
++ * include/asm-sh/cpu-sh3/cacheflush.h (HAVE_ARCH_UNMAPPED_AREA):
++ Define.
++
++2004-03-11 Paul Mundt <lethal@linux-sh.org>
++
++ * include/asm-sh/dma-mapping.h (dma_set_mask): Cloned from MIPS.
++ (dma_sync_single_range): Added.
++
++ * arch/sh/boards/adx/Makefile, arch/sh/boards/bigsur/Makefile,
++ arch/sh/boards/cat68701/Makefile, arch/sh/boards/cqreek/Makefile,
++ arch/sh/boards/dmida/Makefile, arch/sh/boards/dreamcast/Makefile,
++ arch/sh/boards/ec3104/Makefile, arch/sh/boards/harp/Makefile,
++ arch/sh/boards/hp6xx/hp620/Makefile, arch/sh/boards/hp6xx/hp680/Makefile,
++ arch/sh/boards/hp6xx/hp690/Makefile, arch/sh/boards/mpc1211/Makefile,
++ arch/sh/boards/overdrive/Makefile, arch/sh/boards/saturn/Makefile,
++ arch/sh/boards/se/770x/Makefile, arch/sh/boards/se/7751/Makefile,
++ arch/sh/boards/sh2000/Makefile, arch/sh/boards/snapgear/Makefile,
++ arch/sh/boards/systemh/Makefile, arch/sh/boards/unknown/Makefile,
++ arch/sh/Kconfig, arch/sh/cchips/hd6446x/hd64461/Makefile,
++ arch/sh/cchips/hd6446x/hd64465/Makefile, arch/sh/kernel/sys_sh.c,
++ drivers/Makefile, drivers/cdrom/Makefile, drivers/char/sh-sci.c,
++ drivers/char/tty_io.c, drivers/ide/pci/alim15x3.c, drivers/ide/Kconfig,
++ drivers/pci/pci.ids, drivers/serial/Makefile, drivers/serial/Kconfig,
++ drivers/video/Makefile, drivers/video/Kconfig, drivers/video/fbmem.c,
++ drivers/Kconfig, include/asm-sh/cache.h, include/asm-sh/hardirq.h,
++ include/asm-sh/kmap_types.h, include/asm-sh/param.h,
++ include/asm-sh/unistd.h, include/linux/pci_ids.h, include/linux/mm.h,
++ include/linux/fb.h, include/linux/serial_core.h, Makefile,
++ mm/memory.c, mm/mmap.c, net/ipv4/ipconfig.c: Merge 2.6.4.
++
++ * arch/sh/drivers/pci/Kconfig: Remove CONFIG_PCI_DMA.
++ * arch/sh/drivers/pci/Makefile: Remove pci-dma.o
++ * arch/sh/drivers/pci/pci-dma.c: Deleted.
++ * arch/sh/drivers/pci/dma-dreamcast.c (pci_alloc_consistent):
++ Renamed to __pci_alloc_consistent().
++ (pci_free_consistent): Renamed to __pci_free_consistent().
++
++ * arch/sh/mm/Makefile: Add consistent.o
++ * arch/sh/mm/consistent.c: New file.
++
++ * include/asm-sh/dma-mapping.h: Implement DMA mapping support using
++ consistent_xxxx() interface.
++ * include/asm-sh/pci.h: Wrap PCI DMA routines to DMA mapping API.
++
++ * TODO: DMA mapping is done, knock it off the list..
++
++2004-02-28 Paul Mundt <lethal@linux-sh.org>
++
++ * drivers/Kconfig: Merged from mainline. Add maple.
++
++ * drivers/maple/Kconfig: New file.
++
++ * arch/sh/Kconfig: Get rid of the majority of drivers/ sources, use
++ the top-level drivers/Kconfig instead. Move maple definitions out
++ to their own Kconfig.
++
++ * drivers/serial/sh-sci.c (sci_receive_chars): Fixup break_flag
++ references to satisfy SH-3 build.
++
++2004-02-26 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/configs/defconfig-hp680: Update defconfig.
++
++ * arch/sh/cchips/Kconfig: Add CONFIG_HD6446X_SERIES option, make this
++ selectable by anyone instead of relying on individual boards to select.
++
++ * arch/sh/kernel/time.c: Fixup IFC/BFC/STC tables for SH-3.
++
++ * arch/sh/boards/hp6xx/hp680/setup.c: Include asm/io.h.
++
++ * drivers/video/hitfb.c (hitfb_set_par): Doesn't exist, don't reference
++ it in fb ops.
++
++ * include/asm-sh/dma-mapping.h (dma_alloc_coherent): Added dummy
++ code to satisfy new dmapool interface when CONFIG_PCI=n.
++ (dma_free_coherent): Likewise.
++
++2004-02-24 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/cpu/sh4/sq.c (sq_flush): Fix thinko, addr is input,
++ not output.
++ (sq_flush_range): Fix completion wait, read from P4SEG_STORE_QUE
++ instead of the base address of a given SQ mapping.
++ (__sq_alloc_map): Add 1 to map->size to fix an off by one issue
++ that induced an unhandled address translation fault.
++ (__sq_remap): Revamp locking to be saner for SMP and preempt.
++ Get rid of old page table setup code, setup a SQ VMA instead.
++ (sq_remap): Add sanity checks on phys addr. PAGE_ALIGN() size.
++ (sq_unmap): Get rid of old code that only worked for a single
++ translation, wrap to vfree() instead to undo the work done by
++ remap_area_pages() in __sq_remap().
++
++ * arch/sh/mm/ioremap.c (p3_iounmap): void function doesn't return.
++
++2004-02-22 Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * arch/sh/boards/se/770x/io.c (se_insb): Don't use casted object
++ as lvalue.
++ (se_insw, se_outsb, se_outsw): Likewise.
++ * arch/sh/kernel/io.c (memcpy_fromio, memcpy_toio): Likewise.
++ * arch/sh/kernel/module.c (COPY_UNALIGNED_WORD): Likewise.
++
++2004-02-22 Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * arch/sh/boards/se/770x/irq.c: Include the correct machine
++ specific header file.
++ * arch/sh/kernel/cf-enabler.c: Likewise.
++ * drivers/net/stnic.c: Likewise.
++
++2004-02-21 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/entry.S (sys_call_table): Kill off .rept usage for
++ padding. Use sys_ni_syscall directly for NR_syscalls.
++
++2004-02-20 Yoshinori Sato <ysato@users.sourceforge.jp>
++
++ * drivers/char/sh-sci.c (sci_request_irq): Don't reference
++ sci_br_interrupt on SCI_ONLY systems.
++
++2004-02-20 Yutaro Ebihara <ebiharaml@si-linux.com>
++
++ * arch/sh/mm/init.c (mem_init): Set max_mapnr and num_physpages
++ correctly.
++
++2004-02-19 Paul Mundt <lethal@linux-sh.org>
++
++ * drivers/char/watchdog/shwdt.c (sh_wdt_init): Fix build error.
++ * drivers/serial/sh-sci.h: Move PORT_SCI/SCIF/IRDA definitions ..
++
++ * include/linux/serial_core.h: .. here.
++
++ * include/asm-sh/pci.h (pci_map_page, pci_unmap_page): Added.
++
++ * arch/sh/drivers/pci/Kconfig: Set CONFIG_SH_PCIDMA_NONCOHERENT by
++ default.
++ * arch/sh/mm/extable.c (search_extable): Deleted. We use the generic
++ one instead.
++
++ * drivers/serial/sh-sci.[ch]: Add h8 support.
++
++2004-02-19 Peter Garrone <pgarrone@linuxmail.org>
++
++ * drivers/serial/sh-sci.c, drivers/serial/sh-sci.h: Fix rx interrupt
++ and sysrq handling.
++
++2004-02-19 Paul Mundt <lethal@linux-sh.org>
++ Richard Curnow <richard.curnow@superh.com>
++
++ * arch/sh/mm/cache-sh4.c (detect_cpu_and_cache_system): Add effective
++ CCN CVR probing so that the way_shift/entry_mask/sets are probed
++ from CVR.ICS/CVR.OCS at run-time on anything that isn't a direct-mapped
++ cache.
++
++ * include/asm-sh/processor.h: Define CCN_CVR.
++
++2004-02-19 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/mm/cache-sh4.c (flush_cache_range): Fix pte-table boundary
++ check logic.
++ (detect_cpu_and_cache_system): Don't set CPU_HAS_P2_FLUSH_BUG for
++ SH7750R.
++
++2004-02-18 Paul Mundt <lethal@linux-sh.org>
++
++ * Makefile, arch/sh/Kconfig, drivers/char/Makefile,
++ drivers/char/keyboard.c, drivers/char/tty_io.c,
++ drivers/char/watchdog/shwdt.c, drivers/ide/Kconfig,
++ drivers/ide/pci/alim15x3.c, drivers/net/8139too.c,
++ drivers/net/stnic.c, drivers/pci/pci.ids, drivers/video/Kconfig,
++ drivers/video/Makefile, drivers/video/fbmem.c, fs/nfs/inode.c,
++ include/asm-sh/io.h, include/asm-sh/pci.h, include/linux/fb.h,
++ include/linux/input.h, include/linux/mm.h, include/linux/pci_ids.h,
++ mm/memory.c: Merge 2.6.3.
++
++2004-02-10 Yoshinori Sato <ysato@users.sourceforge.jp>
++
++ * drivers/char/sh-sci.c, drivers/char/sh-sci.h: Add H8/300 support.
++
++2004-02-06 Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * arch/sh/kernel/process.c (copy_thread): Don't clear TIF_USEDFPU
++ here.
++
++ * include/asm-sh/signal.h: Hide kernel stuff from userland.
++
++2004-02-04 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Kconfig, drivers/char/keyboard.c, drivers/char/Makefile,
++ drivers/char/sysrq.c, drivers/char/tty_io.c,
++ drivers/char/watchdog/shwdt.c, drivers/ide/Kconfig,
++ drivers/input/keyboard/maple_keyb.c, drivers/net/8139too.c,
++ drivers/pci/pci.ids, drivers/serial/Kconfig, drivers/video/Makefile,
++ drivers/video/Kconfig, drivers/video/fbmem.c, fs/nfs/inode.c,
++ include/asm-sh/byteorder.h, include/asm-sh/floppy.h,
++ include/asm-sh/pgtable.h, include/asm-sh/smp.h,
++ include/asm-sh/spinlock.h, include/linux/miscdevice.h,
++ include/linux/input.h, include/linux/pci_ids.h, include/linux/mm.h,
++ Makefile, mm/memory.c, mm/mmap.c, mm/msync.c: Merge 2.6.2.
++
++2004-02-01 Andriy Skulysh <askulysh@image.kiev.ua>
++
++ * drivers/video/hitfb.c (hitfb_set_base, hitfb_accel_wait,
++ hitfb_accel_start, hitfb_accel_set_dest, hitfb_accel_solidfill,
++ hitfb_accel_bitblt, hitfb_fillrect, hitfb_copyarea,
++ hitfb_pan_display, hitfb_blank): Add hitfb acceleration.
++
++ * arch/sh/boards/hp6xx/hp680/setup.c: Added.
++
++ * arch/sh/cchips/hd6446x/hd64461/io.c (hd64461_insb,
++ hd64461_insw, hd64461_insl, hd64461_outsb, hd64461_outsw,
++ hd64461_outsl): Added.
++
++ * arch/sh/configs/defconfig-hp680: Added.
++
++ * include/asm-sh/hd64461/hd64461.h: Add definitions.
++ * include/asm-sh/hd64461/io.h: Add io definitions.
++
++2004-02-01 Paul Mundt <lethal@linux-sh.org>
++
++ * drivers/video/pvr2fb.c (pvr2fb_check_var): Fix typo in pixclock
++ verification. Clean up FB_SYNC_BROADCAST mess being set even with
++ VO_VGA. And finally, don't clobber the margins when being invoked
++ through __fb_try_mode().
++ (pvr2fb_common_init): Use fb_memset() instead of memset_io().
++ We always have 256 cmap entries, alloc accordingly.
++
++ * drivers/video/hitfb.c (hitfb_init): Move color bitfield setting ..
++ (hitfb_check_var): here.
++
++ Also get rid of hd64461_xxx() IO routine usage, use fb_readX/writeX()
++ instead, use the generic routines outright, and take care of the
++ port2mem issues in the board setup code.
++
++ * drivers/video/Makefile: Yank cfbcopyarea.o from the hitfb objs,
++ we don't use it anymore.
++
++ * arch/sh/boards/hp6xx/hp680/setup.c (platform_setup): Setup the
++ io port base, use generic io routines.
++
++2004-01-18 Paul Mundt <lethal@linux-sh.org>
++
++ * include/linux/fb.h: Merged from stock 2.6.1. Add sh to the list of
++ platforms to wrap fb_xxx to __raw_xxx.
++
++2004-01-12 Kaz Kojima <kkojima@rr.iij4u.or.jp>
++
++ * arch/sh/kernel/signal.c (handle_signal): Disable interrupts
++ in gUSA handling when enabling preemption.
++ * arch/sh/kernel/process.c (__switch_to): Do gUSA handling
++ when enabling preemption.
++ * arch/sh/kernel/entry.S: Jump to resume_userspace if it's
++ return to user space also in preemption case. Don't use short
++ branches with far labels to avoid the assembler warnings.
++ Correct the condition for exception path.
++
++2004-01-12 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/kernel/cpu/sh4/fpu.c (save_fpu): Clear PF_USEDFPU before
++ saving fpu to avoid fpscr corruption while preemption.
++ * arch/sh/kernel/process.c (copy_thread): Remove setting SR_FD
++ already done in unlazy_fpu.
++
++2004-01-12 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/kernel/entry.S (restore_all): Don't inherit current FD-bit,
++ resotore saved FD-bit instead.
++ (handle_exception): Set FD-bit when entering kernel.
++ * arch/sh/kernel/cpu/sh4/fpu.c (save_fpu): Add 2nd argument 'regs'.
++ Reset FD-bit while fpu proccesing. Add 'regs' parameter for
++ release_fpu.
++ (restore_fpu): Reset FD-bit while fpu proccesing.
++ (fpu_init): Likewise.
++ (do_fpu_error): Add 'regs' parameter for save_fpu.
++ (do_fpu_state_restore): Add 'regs' parameter for grab_fpu.
++ * arch/sh/kernel/process.c (flush_thread): Add 'regs' parameter for
++ clear_fpu.
++ (dump_fpu): Add 'regs' parameter for unlazy_fpu.
++ (copy_thread): Likewise.
++ (__switch_to): Likewise.
++ * arch/sh/kernel/signal.c (save_sigcontext_fpu): Add 'regs' argument.
++ Add 'regs' parameter for unlazy_fpu.
++ (restore_sigcontext): Add 'regs' parameter for clear_fpu.
++ (setup_sigcontext): Add 'regs' parameter for save_sigcontext_fpu.
++ * arch/sh/kernel/cpu/init.c (sh_cpu_init): Use disable_fpu instead
++ of release_fpu.
++ * include/asm-sh/processor.h: Include asm/ptrace.h for struct pt_regs.
++ (start_thread): Set FD bit.
++ (enable_fpu): New function.
++ (disable_fpu): New function.
++ (release_fpu): Set FD-bit of saved SR instead of current SR.
++ (grub_fpu): Clear FD-bit of saved SR instead of current SR.
++ (unlazy_fpu): Add 'regs' argument. Pass 'regs' to save_fpu.
++ (clear_fpu): Add 'regs' argument. Pass 'regs' to release_fpu.
++ * include/asm-sh/ptrace.h: Don't include asm/processor.h
++
++2004-01-12 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/kernel/cpu/rtc.c (sh_rtc_gettimeofday): Don't call
++ schedule_timeout. Re-read RTC registers if MSB of R64CNT was changed
++ while reading them on SH-4 which has unreliable CF bit. Reduce
++ interrupt disabled area.
++
++2004-01-12 Masaki Saitoh <masaki-saitoh@aandd.co.jp>
++
++ * arch/sh/kernel/cpu/rtc.c (sh_rtc_gettimeofday): Protect RTC
++ from interrupt.
++ (sh_rtc_settimeofday): Likewise.
++ * arch/sh/kernel/irq.c (do_IRQ): Prevent any preemption while
++ the handler called.
++
++2004-01-12 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/mm/fault.c (update_mmu_cache): Protect __flush_tlb_page
++ from interrupt.
++
++2004-01-09 Paul Mundt <lethal@linux-sh.org>
++
++ * Makefile, arch/sh/Kconfig, arch/sh/kernel/irq.c,
++ drivers/char/keyboard.c, drivers/ide/Kconfig,
++ drivers/mtd/chips/jedec_probe.c, drivers/net/8139too.c,
++ drivers/pci/pci.ids, include/linux/input.h, include/linux/mm.h,
++ include/linux/pci_ids.h, mm/memory.c, mm/mmap.c: Merge 2.6.1.
++
++2004-01-08 Paul Mundt <lethal@linux-sh.org>
++
++ * drivers/video/Kconfig: Drop CONFIG_FB_PVR2_DEBUG, we use the
++ standard pr_debug() facility these days.
++ * drivers/video/pvr2fb.c (pvr2fb_write): Cleanup return semantics.
++ We manually need to page_cache_release() each pinned page, regardless
++ of whether we get everything we asked for or not.
++
++2004-01-07 Paul Mundt <lethal@linux-sh.org>
++
++ * drivers/video/pvr2fb.c (pvr2fb_write): If we get a contiguous
++ region from get_user_pages(), do the write in one giant transfer.
++ Kill the flush_dcache_page(), this is already done in generic code.
++ (pvr2fb_init): Fix allocation typo, make sure we allocate the
++ proper size.. this was inadvertently trampling the cmap.
++ (pvr2fb_common_init): Actually allocate the cmap by way of
++ fb_alloc_cmap().
++
++2004-01-04 Paul Mundt <lethal@linux-sh.org>
++
++ * scripts/treelink.sh, scripts/treeunlink.sh: Add arch and BK dirs
++ to the prune list.
++
+diff -ruN linux-2.6.17-vanilla/ChangeLog-2005 linux-2.6.17/ChangeLog-2005
+--- linux-2.6.17-vanilla/ChangeLog-2005 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/ChangeLog-2005 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1,162 @@
++2005-10-31 Andriy Skulysh <askulysh@image.kiev.ua>
++
++ Hitfb update.
++
++ * drivers/video/hitfb.c: Fix pannig and bitblt.
++ (hitfb_sync): New function.
++ (hitfb_check_var): New function.
++ (hitfb_set_par): New function.
++ * drivers/video/backlight/hp680_bl.c: Use platform device id -1.
++
++2005-08-22 Andriy Skulysh <askulysh@image.kiev.ua>
++
++ Add SH3 DMA support.
++
++ * include/asm-sh/cpu-sh3/dma-sh.h: New file.
++ * include/asm-sh/cpu-sh4/dma-sh.h: New file.
++ * arch/sh/drivers/dma/dma-sh.c: Add SH3 DMA.
++ * arch/sh/drivers/dma/dma-sh.h: Likewise.
++ * include/asm-sh/cpu-sh3/dma.h: Likewise.
++ * include/asm-sh/dma.h: Likewise.
++
++2005-08-15 Andriy Skulysh <askulysh@image.kiev.ua>
++
++ Fix bug in hd64461 pcmcia module.
++
++ * drivers/pcmcia/hd64461_ss.c: Better init procedure.
++ * arch/sh/boards/hp6xx/setup.c: Disable hd64461 pcmcia and DAC at boot.
++
++2005-07-25 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
++
++ * arch/sh/lib/memset.S (memset): Correct 2nd argument handling.
++
++2005-06-15 Andriy Skulysh <askulysh@image.kiev.ua>
++
++ Add linux backlight support for HP Jornada 680.
++
++ * drivers/video/hitfb.c: Remove jornada's backlight stuff.
++ * drivers/video/backlight/Makefile: New file.
++ * drivers/video/backlight/Kconfig: New file.
++ * drivers/video/backlight/hp680_bl.c: New file.
++
++2005-06-10 Andriy Skulysh <askulysh@image.kiev.ua>
++
++ Add sh7709 clock support.
++
++ * arch/sh/kernel/cpu/clock.c: Propagate bus clock.
++ * arch/sh/kernel/cpu/sh3/clock-sh7709.c: New file.
++ * arch/sh/kernel/cpu/sh3/Makefile: Add clock-sh7709.o.
++ * sound/oss/sh_dac_audio.c: Update to clock framework.
++
++2005-06-10 Andriy Skulysh <askulysh@image.kiev.ua>
++
++ Fix hp6xx changes. Split HP600 keyboard routine for 620 and 680/690.
++
++ * include/asm-sh/irq.h: Fix hp6xx changes.
++ * drivers/input/touchscreen/Kconfig: Likewise.
++ * drivers/video/hitfb.c: HP690 seems to have only 512 Kb video memory.
++ * drivers/input/keyboard/hp620_keyb.c: New file.
++ * drivers/input/keyboard/hp680_keyb.c: New file.
++ * drivers/input/keyboard/hp600_keyb.c: Removed file.
++ * drivers/input/keyboard/Makefile: Split update.
++ * drivers/input/keyboard/Kconfig: Split update.
++
++2005-05-21 Paul Mundt <lethal@linux-sh.org>
++
++ Patches from Hosokawa-san <hosokawa@ace-jp.com>:
++
++ * drivers/char/Makefile: Add rtc9701_rtc rule that was dropped.
++ * drivers/char/rtc9701_rtc.c: Update rtc_lock definition.
++ (rtc9701_rtc_interrupt): Modify for irqreturn_t type.
++
++2005-03-26 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/Kconfig: Make TMU selectable (CONFIG_SH_TMU).
++ Drop CONFIG_SH_PCLK_CALC, we make this the default if we
++ have an RTC and no set PCLK value.
++
++ * arch/sh/boards/overdrive/Makefile: Drop time.o
++ * arch/sh/boards/overdrive/time.c: Deleted.
++ * arch/sh/boards/overdrive/setup.c (platform_setup): Drop
++ od_time_init usage, rely on the clock framework instead.
++
++ * arch/sh/kernel/Makefile: Add timers/
++ * arch/sh/kernel/time.c: Rip out clock and TMU code.
++ * arch/sh/kernel/setup.c: Remove clock reporting, use the generic
++ show_clocks() provided by the clock framework instead.
++
++ * arch/sh/kernel/timers/timer.c: New file, common bits for timer
++ framework.
++ * arch/sh/kernel/timers/timer-tmu.c: Move TMU system timer code
++ here, hook into common timer framework.
++
++ * arch/sh/kernel/cpu/Makefile: Add clock.o
++ * arch/sh/kernel/cpu/clock.c: New file, adding clock framework.
++
++ * arch/sh/kernel/cpu/sh3/Makefile: Add clock support.
++ * arch/sh/kernel/cpu/sh3/clock-sh3.c,
++ arch/sh/kernel/cpu/sh3/clock-sh7300.c,
++ arch/sh/kernel/cpu/sh3/clock-sh7705.c: SH-3 clock support.
++
++ * arch/sh/kernel/cpu/sh4/Makefile: Add clock support.
++ * arch/sh/kernel/cpu/sh4/clock-sh4-202.c,
++ arch/sh/kernel/cpu/sh4/clock-sh4.c,
++ arch/sh/kernel/cpu/sh4/clock-sh73180.c: SH-4 clock support.
++
++ * drivers/serial/sh-sci.c: Update for clock framework.
++ * drivers/serial/sh-sci.h: Likewise.
++
++ * include/asm-sh/clock.h: New file for clock framework.
++ * include/asm-sh/timer.h: New file for timer framework.
++
++ * include/asm-sh/freq.h: Remove unused cruft.
++ * include/asm-sh/processor.h: Remove clocks from struct sh_cpuinfo.
++
++ * include/asm-sh/timex.h: Update CLOCK_TICK_RATE to match HZ.
++
++2005-03-10 Andriy Skulysh <askulysh@image.kiev.ua>
++
++ * drivers/pcmcia/hd64461_ss.c (hd64461_init_soket): Update
++ for 2.6.11.
++
++2005-03-06 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/mm/cache-sh4.c (flush_cache_range): page align the
++ end address, this was causing an unaligned fault in some cases.
++
++ Also check the size of the range, of the range >= 64 pages,
++ just purge the entire dcache instead of manually walking the
++ page tables and checking for aliases. This gives a noticeable
++ performance win, as per sh64.
++
++2005-03-02 Paul Mundt <lethal@linux-sh.org>
++
++ Merge 2.6.11.
++
++ * TODO: Get rid of the in-kernel TODO list, we will use the wiki
++ instead.
++
++ * arch/sh/configs/*_defconfig: Update for 2.6.11.
++
++2005-02-02 Kristoffer Ericson <kristoffer@jlime.com>
++
++ * arch/sh/boards/hp6xx/hp620/Makefile: Add setup.o rule.
++ * arch/sh/boards/hp6xx/hp620/setup.c: New file adding hp620 setup
++ code (cloned from hp680 with some minor modification).
++
++2005-02-01 Kristoffer Ericson <kristoffer@jlime.com>
++
++ * drivers/pcmcia/hd64461_ss.c (hd64461_set_mem_map): Fix build problem
++ with start address.
++
++2005-01-31 Paul Mundt <lethal@linux-sh.org>
++
++ * arch/sh/kernel/cpufreq.c (sh_cpufreq_setstate): Update for cpumask
++ changes.
++
++2005-01-31 Paul Mundt <lethal@linux-sh.org>
++ Christoph Hellwig <hch@lst.de>
++
++ * arch/sh/Kconfig, arch/sh/kernel/irq.c, include/asm-sh/hardirq.h:
++ Patch from Christoph Hellwig implementing generic hardirq support.
++ Initial testing done by Tom Rini on SE7750.
+diff -ruN linux-2.6.17-vanilla/Documentation/CVS/Entries linux-2.6.17/Documentation/CVS/Entries
+--- linux-2.6.17-vanilla/Documentation/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/Documentation/CVS/Entries 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++D/sh////
+diff -ruN linux-2.6.17-vanilla/Documentation/CVS/Repository linux-2.6.17/Documentation/CVS/Repository
+--- linux-2.6.17-vanilla/Documentation/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/Documentation/CVS/Repository 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++linux/Documentation
+diff -ruN linux-2.6.17-vanilla/Documentation/CVS/Root linux-2.6.17/Documentation/CVS/Root
+--- linux-2.6.17-vanilla/Documentation/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/Documentation/CVS/Root 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/Documentation/sh/CVS/Entries linux-2.6.17/Documentation/sh/CVS/Entries
+--- linux-2.6.17-vanilla/Documentation/sh/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/Documentation/sh/CVS/Entries 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1,4 @@
++/kgdb.txt/1.2/Fri Nov 1 17:19:12 2002//
++/new-machine.txt/1.6/Sun Jan 15 17:32:05 2006//
++/register-banks.txt/1.1/Sat Jan 7 20:22:21 2006//
++D
+diff -ruN linux-2.6.17-vanilla/Documentation/sh/CVS/Repository linux-2.6.17/Documentation/sh/CVS/Repository
+--- linux-2.6.17-vanilla/Documentation/sh/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/Documentation/sh/CVS/Repository 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++linux/Documentation/sh
+diff -ruN linux-2.6.17-vanilla/Documentation/sh/CVS/Root linux-2.6.17/Documentation/sh/CVS/Root
+--- linux-2.6.17-vanilla/Documentation/sh/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/Documentation/sh/CVS/Root 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/Documentation/sh/new-machine.txt linux-2.6.17/Documentation/sh/new-machine.txt
+--- linux-2.6.17-vanilla/Documentation/sh/new-machine.txt 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/Documentation/sh/new-machine.txt 2006-07-12 16:54:19.000000000 +0000
+@@ -41,11 +41,6 @@
+ |
+ .. more boards here ...
+
+-It should also be noted that each board is required to have some certain
+-headers. At the time of this writing, io.h is the only thing that needs
+-to be provided for each board, and can generally just reference generic
+-functions (with the exception of isa_port2addr).
+-
+ Next, for companion chips:
+ .
+ `-- arch
+@@ -104,12 +99,13 @@
+ Both the Solution Engine and the hp6xx boards are an example of this.
+
+ After you have setup your new arch/sh/boards/ directory, remember that you
+-also must add a directory in include/asm-sh for headers localized to this
+-board. In order to interoperate seamlessly with the build system, it's best
+-to have this directory the same as the arch/sh/boards/ directory name,
+-though if your board is again part of a family, the build system has ways
+-of dealing with this, and you can feel free to name the directory after
+-the family member itself.
++should also add a directory in include/asm-sh for headers localized to this
++board (if there are going to be more than one). In order to interoperate
++seamlessly with the build system, it's best to have this directory the same
++as the arch/sh/boards/ directory name, though if your board is again part of
++a family, the build system has ways of dealing with this (via incdir-y
++overloading), and you can feel free to name the directory after the family
++member itself.
+
+ There are a few things that each board is required to have, both in the
+ arch/sh/boards and the include/asm-sh/ heirarchy. In order to better
+@@ -122,6 +118,7 @@
+ * arch/sh/boards/vapor/setup.c - Setup code for imaginary board
+ */
+ #include <linux/init.h>
++#include <asm/rtc.h> /* for board_time_init() */
+
+ const char *get_system_type(void)
+ {
+@@ -152,79 +149,57 @@
+ }
+
+ Our new imaginary board will also have to tie into the machvec in order for it
+-to be of any use. Currently the machvec is slowly on its way out, but is still
+-required for the time being. As such, let us take a look at what needs to be
+-done for the machvec assignment.
++to be of any use.
+
+ machvec functions fall into a number of categories:
+
+ - I/O functions to IO memory (inb etc) and PCI/main memory (readb etc).
+- - I/O remapping functions (ioremap etc)
+- - some initialisation functions
+- - a 'heartbeat' function
+- - some miscellaneous flags
+-
+-The tree can be built in two ways:
+- - as a fully generic build. All drivers are linked in, and all functions
+- go through the machvec
+- - as a machine specific build. In this case only the required drivers
+- will be linked in, and some macros may be redefined to not go through
+- the machvec where performance is important (in particular IO functions).
+-
+-There are three ways in which IO can be performed:
+- - none at all. This is really only useful for the 'unknown' machine type,
+- which us designed to run on a machine about which we know nothing, and
+- so all all IO instructions do nothing.
+- - fully custom. In this case all IO functions go to a machine specific
+- set of functions which can do what they like
+- - a generic set of functions. These will cope with most situations,
+- and rely on a single function, mv_port2addr, which is called through the
+- machine vector, and converts an IO address into a memory address, which
+- can be read from/written to directly.
+-
+-Thus adding a new machine involves the following steps (I will assume I am
+-adding a machine called vapor):
++ - I/O mapping functions (ioport_map, ioport_unmap, etc).
++ - a 'heartbeat' function.
++ - PCI and IRQ initialization routines.
++ - Consistent allocators (for boards that need special allocators,
++ particularly for allocating out of some board-specific SRAM for DMA
++ handles).
++
++There are machvec functions added and removed over time, so always be sure to
++consult include/asm-sh/machvec.h for the current state of the machvec.
++
++The kernel will automatically wrap in generic routines for undefined function
++pointers in the machvec at boot time, as machvec functions are referenced
++unconditionally throughout most of the tree. Some boards have incredibly
++sparse machvecs (such as the dreamcast and sh03), whereas others must define
++virtually everything (rts7751r2d).
++
++Adding a new machine is relatively trivial (using vapor as an example):
++
++If the board-specific definitions are quite minimalistic, as is the case for
++the vast majority of boards, simply having a single board-specific header is
++sufficient.
+
+- - add a new file include/asm-sh/vapor/io.h which contains prototypes for
++ - add a new file include/asm-sh/vapor.h which contains prototypes for
+ any machine specific IO functions prefixed with the machine name, for
+ example vapor_inb. These will be needed when filling out the machine
+ vector.
+
+- This is the minimum that is required, however there are ample
+- opportunities to optimise this. In particular, by making the prototypes
+- inline function definitions, it is possible to inline the function when
+- building machine specific versions. Note that the machine vector
+- functions will still be needed, so that a module built for a generic
+- setup can be loaded.
+-
+- - add a new file arch/sh/boards/vapor/mach.c. This contains the definition
+- of the machine vector. When building the machine specific version, this
+- will be the real machine vector (via an alias), while in the generic
+- version is used to initialise the machine vector, and then freed, by
+- making it initdata. This should be defined as:
+-
+- struct sh_machine_vector mv_vapor __initmv = {
+- .mv_name = "vapor",
+- }
+- ALIAS_MV(vapor)
+-
+- - finally add a file arch/sh/boards/vapor/io.c, which contains
+- definitions of the machine specific io functions.
+-
+-A note about initialisation functions. Three initialisation functions are
+-provided in the machine vector:
+- - mv_arch_init - called very early on from setup_arch
+- - mv_init_irq - called from init_IRQ, after the generic SH interrupt
+- initialisation
+- - mv_init_pci - currently not used
+-
+-Any other remaining functions which need to be called at start up can be
+-added to the list using the __initcalls macro (or module_init if the code
+-can be built as a module). Many generic drivers probe to see if the device
+-they are targeting is present, however this may not always be appropriate,
+-so a flag can be added to the machine vector which will be set on those
+-machines which have the hardware in question, reducing the probe to a
+-single conditional.
++ Note that these prototypes are generated automatically by setting
++ __IO_PREFIX to something sensible. A typical example would be:
++
++ #define __IO_PREFIX vapor
++ #include <asm/io_generic.h>
++
++ somewhere in the board-specific header. Any boards being ported that still
++ have a legacy io.h should remove it entirely and switch to the new model.
++
++ - Add machine vector definitions to the board's setup.c. At a bare minimum,
++ this must be defined as something like:
++
++ struct sh_machine_vector mv_vapor __initmv = {
++ .mv_name = "vapor",
++ };
++ ALIAS_MV(vapor)
++
++ - finally add a file arch/sh/boards/vapor/io.c, which contains definitions of
++ the machine specific io functions (if there are enough to warrant it).
+
+ 3. Hooking into the Build System
+ ================================
+@@ -303,4 +278,3 @@
+ oldconfig (prompting you for any new options since the time of creation),
+ and start you on your way to having a functional kernel for your new
+ board.
+-
+diff -ruN linux-2.6.17-vanilla/Documentation/sh/register-banks.txt linux-2.6.17/Documentation/sh/register-banks.txt
+--- linux-2.6.17-vanilla/Documentation/sh/register-banks.txt 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/Documentation/sh/register-banks.txt 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1,33 @@
++ Notes on register bank usage in the kernel
++ ==========================================
++
++Introduction
++------------
++
++The SH-3 and SH-4 CPU families traditionally include a single partial register
++bank (selected by SR.RB, only r0 ... r7 are banked), whereas other families
++may have more full-featured banking or simply no such capabilities at all.
++
++SR.RB banking
++-------------
++
++In the case of this type of banking, banked registers are mapped directly to
++r0 ... r7 if SR.RB is set to the bank we are interested in, otherwise ldc/stc
++can still be used to reference the banked registers (as r0_bank ... r7_bank)
++when in the context of another bank. The developer must keep the SR.RB value
++in mind when writing code that utilizes these banked registers, for obvious
++reasons. Userspace is also not able to poke at the bank1 values, so these can
++be used rather effectively as scratch registers by the kernel.
++
++Presently the kernel uses several of these registers.
++
++ - r0_bank, r1_bank (referenced as k0 and k1, used for scratch
++ registers when doing exception handling).
++ - r2_bank (used to track the EXPEVT/INTEVT code)
++ - Used by do_IRQ() and friends for doing irq mapping based off
++ of the interrupt exception vector jump table offset
++ - r6_bank (global interrupt mask)
++ - The SR.IMASK interrupt handler makes use of this to set the
++ interrupt priority level (used by local_irq_enable())
++ - r7_bank (current)
++
+diff -ruN linux-2.6.17-vanilla/Makefile linux-2.6.17/Makefile
+--- linux-2.6.17-vanilla/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/Makefile 2006-07-12 16:54:19.000000000 +0000
+@@ -172,7 +172,7 @@
+ # Default value for CROSS_COMPILE is not to prefix executables
+ # Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
+
+-ARCH ?= $(SUBARCH)
++ARCH ?= sh
+ CROSS_COMPILE ?=
+
+ # Architecture as present in compile.h
+diff -ruN linux-2.6.17-vanilla/arch/CVS/Entries linux-2.6.17/arch/CVS/Entries
+--- linux-2.6.17-vanilla/arch/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/CVS/Entries 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++D/sh////
+diff -ruN linux-2.6.17-vanilla/arch/CVS/Repository linux-2.6.17/arch/CVS/Repository
+--- linux-2.6.17-vanilla/arch/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/CVS/Repository 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch
+diff -ruN linux-2.6.17-vanilla/arch/CVS/Root linux-2.6.17/arch/CVS/Root
+--- linux-2.6.17-vanilla/arch/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/CVS/Root 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/CVS/Entries linux-2.6.17/arch/sh/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/CVS/Entries 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1,14 @@
++/Kconfig.debug/1.4/Mon Jan 30 16:05:57 2006/-ko/
++D/boards////
++D/boot////
++D/cchips////
++D/configs////
++D/drivers////
++D/kernel////
++D/lib////
++D/mm////
++D/oprofile////
++D/tools////
++/Kconfig/1.100/Wed Jul 12 16:51:50 2006/-ko/
++/Makefile/1.65/Wed Jul 12 16:51:50 2006/-ko/
++D/math-emu////
+diff -ruN linux-2.6.17-vanilla/arch/sh/CVS/Repository linux-2.6.17/arch/sh/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/CVS/Repository 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh
+diff -ruN linux-2.6.17-vanilla/arch/sh/CVS/Root linux-2.6.17/arch/sh/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/CVS/Root 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/Kconfig linux-2.6.17/arch/sh/Kconfig
+--- linux-2.6.17-vanilla/arch/sh/Kconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/Kconfig 2006-07-12 16:54:19.000000000 +0000
+@@ -255,7 +255,7 @@
+ value on any of the known systems will only lead to disaster.
+
+ config MEMORY_SIZE
+- hex "Physical memory size"
++ hex "Physical memory size"
+ default "0x00400000"
+ help
+ This sets the default memory size assumed by your SH kernel. It can
+@@ -335,10 +335,19 @@
+ default y
+ help
+ Selecting this option will enable support for SH processors that
+- have FPU units (ie, SH77xx).
++ have FPU units (ie, SH77xx).
+
+ This option must be set in order to enable the FPU.
+
++config SH_FPU_EMU
++ bool "FPU emulation support"
++ depends on !SH_FPU && EXPERIMENTAL
++ default n
++ help
++ Selecting this option will enable support for software FPU emulation.
++ Most SH-3 users will want to say Y here, whereas most SH-4 users will
++ want to say N.
++
+ config SH_DSP
+ bool "DSP support"
+ depends on !CPU_SH4
+@@ -400,9 +409,11 @@
+
+ endmenu
+
+-#source "arch/sh/boards/renesas/hs7751rvoip/Kconfig"
++source "arch/sh/boards/renesas/hs7751rvoip/Kconfig"
++
++source "arch/sh/boards/renesas/rts7751r2d/Kconfig"
+
+-#source "arch/sh/boards/renesas/rts7751r2d/Kconfig"
++source "arch/sh/boards/renesas/r7780rp/Kconfig"
+
+ config SH_PCLK_FREQ
+ int "Peripheral clock frequency (in Hz)"
+@@ -454,7 +465,7 @@
+
+ config ISA_DMA_API
+ bool
+- depends on SH_MPC1211
++ depends on MPC1211
+ default y
+
+ menu "Kernel features"
+@@ -636,6 +647,16 @@
+
+ endmenu
+
++menu "Power management options (EXPERIMENTAL)"
++depends on EXPERIMENTAL
++
++source kernel/power/Kconfig
++
++config APM
++ bool "Advanced Power Management Emulation"
++ depends on PM
++endmenu
++
+ source "net/Kconfig"
+
+ source "drivers/Kconfig"
+diff -ruN linux-2.6.17-vanilla/arch/sh/Kconfig.debug linux-2.6.17/arch/sh/Kconfig.debug
+--- linux-2.6.17-vanilla/arch/sh/Kconfig.debug 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/Kconfig.debug 2006-07-12 16:54:21.000000000 +0000
+@@ -32,6 +32,7 @@
+
+ config KGDB
+ bool "Include KGDB kernel debugger"
++ select FRAME_POINTER
+ help
+ Include in-kernel hooks for kgdb, the Linux kernel source level
+ debugger. See <http://kgdb.sourceforge.net/> for more information.
+@@ -112,13 +113,4 @@
+
+ endmenu
+
+-config FRAME_POINTER
+- bool "Compile the kernel with frame pointers"
+- default y if KGDB
+- help
+- If you say Y here the resulting kernel image will be slightly larger
+- and slower, but it will give very useful debugging information.
+- If you don't debug the kernel, you can say N, but we may not be able
+- to solve problems without frame pointers.
+-
+ endmenu
+diff -ruN linux-2.6.17-vanilla/arch/sh/Makefile linux-2.6.17/arch/sh/Makefile
+--- linux-2.6.17-vanilla/arch/sh/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/Makefile 2006-07-12 16:54:19.000000000 +0000
+@@ -79,6 +79,7 @@
+ LIBGCC := $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
+
+ core-y += arch/sh/kernel/ arch/sh/mm/
++core-$(CONFIG_SH_FPU_EMU) += arch/sh/math-emu/
+
+ # Boards
+ machdir-$(CONFIG_SH_SOLUTION_ENGINE) := se/770x
+@@ -104,16 +105,14 @@
+ machdir-$(CONFIG_SH_RTS7751R2D) := renesas/rts7751r2d
+ machdir-$(CONFIG_SH_7751_SYSTEMH) := renesas/systemh
+ machdir-$(CONFIG_SH_EDOSK7705) := renesas/edosk7705
++machdir-$(CONFIG_SH_R7780RP) := renesas/r7780rp
+ machdir-$(CONFIG_SH_SH4202_MICRODEV) := superh/microdev
++machdir-$(CONFIG_SH_LANDISK) := landisk
++machdir-$(CONFIG_SH_TITAN) := titan
+ machdir-$(CONFIG_SH_UNKNOWN) := unknown
+
+ incdir-y := $(notdir $(machdir-y))
+-
+-incdir-$(CONFIG_SH_SOLUTION_ENGINE) := se
+-incdir-$(CONFIG_SH_7751_SOLUTION_ENGINE) := se7751
+-incdir-$(CONFIG_SH_7300_SOLUTION_ENGINE) := se7300
+-incdir-$(CONFIG_SH_73180_SOLUTION_ENGINE) := se73180
+-incdir-$(CONFIG_SH_HP600) := hp6xx
++incdir-$(CONFIG_SH_HP6XX) := hp6xx
+
+ ifneq ($(machdir-y),)
+ core-y += arch/sh/boards/$(machdir-y)/
+@@ -137,17 +136,14 @@
+
+ CPPFLAGS_vmlinux.lds := -traditional
+
+-ifneq ($(KBUILD_SRC),)
+ incdir-prefix := $(srctree)/include/asm-sh/
+-else
+-incdir-prefix :=
+-endif
+
+ # Update machine arch and proc symlinks if something which affects
+ # them changed. We use .arch and .mach to indicate when they were
+ # updated last, otherwise make uses the target directory mtime.
+
+-include/asm-sh/.cpu: $(wildcard include/config/cpu/*.h) include/config/MARKER
++include/asm-sh/.cpu: $(wildcard include/config/cpu/*.h) \
++ include/config/MARKER FORCE
+ @echo ' SYMLINK include/asm-sh/cpu -> include/asm-sh/$(cpuincdir-y)'
+ $(Q)if [ ! -d include/asm-sh ]; then mkdir -p include/asm-sh; fi
+ $(Q)ln -fsn $(incdir-prefix)$(cpuincdir-y) include/asm-sh/cpu
+@@ -157,7 +153,8 @@
+ # don't, just reference the parent directory so the semantics are
+ # kept roughly the same.
+
+-include/asm-sh/.mach: $(wildcard include/config/sh/*.h) include/config/MARKER
++include/asm-sh/.mach: $(wildcard include/config/sh/*.h) \
++ include/config/MARKER FORCE
+ @echo -n ' SYMLINK include/asm-sh/mach -> '
+ $(Q)if [ ! -d include/asm-sh ]; then mkdir -p include/asm-sh; fi
+ $(Q)if [ -d $(incdir-prefix)$(incdir-y) ]; then \
+@@ -170,7 +167,7 @@
+ fi
+ @touch $@
+
+-archprepare: maketools include/asm-sh/.cpu include/asm-sh/.mach
++archprepare: include/asm-sh/.cpu include/asm-sh/.mach maketools
+
+ PHONY += maketools FORCE
+ maketools: include/linux/version.h FORCE
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/CVS/Entries linux-2.6.17/arch/sh/boards/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/CVS/Entries 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1,21 @@
++D/adx////
++D/bigsur////
++D/cat68701////
++D/cqreek////
++D/dmida////
++D/dreamcast////
++D/ec3104////
++D/harp////
++D/hp6xx////
++D/landisk////
++D/mpc1211////
++D/overdrive////
++D/renesas////
++D/saturn////
++D/se////
++D/sh03////
++D/sh2000////
++D/snapgear////
++D/superh////
++D/titan////
++D/unknown////
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/CVS/Repository linux-2.6.17/arch/sh/boards/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/CVS/Repository 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/CVS/Root linux-2.6.17/arch/sh/boards/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/CVS/Root 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/adx/CVS/Entries linux-2.6.17/arch/sh/boards/adx/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/adx/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/adx/CVS/Entries 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1,5 @@
++/Makefile/1.5/Thu Mar 11 18:08:01 2004//
++/irq.c/1.2/Fri Nov 1 17:19:14 2002//
++/irq_maskreg.c/1.3/Fri Oct 28 13:12:47 2005/-ko/
++/setup.c/1.4/Mon Aug 4 01:38:06 2003//
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/adx/CVS/Repository linux-2.6.17/arch/sh/boards/adx/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/adx/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/adx/CVS/Repository 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/adx
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/adx/CVS/Root linux-2.6.17/arch/sh/boards/adx/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/adx/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/adx/CVS/Root 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/bigsur/CVS/Entries linux-2.6.17/arch/sh/boards/bigsur/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/bigsur/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/bigsur/CVS/Entries 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1,6 @@
++/Makefile/1.6/Thu Mar 11 18:08:02 2004//
++/io.c/1.4/Tue Mar 8 06:46:55 2005//
++/irq.c/1.5/Fri Oct 28 13:12:47 2005//
++/led.c/1.2/Fri Nov 1 17:19:14 2002//
++/setup.c/1.5/Mon Dec 27 23:14:24 2004//
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/bigsur/CVS/Repository linux-2.6.17/arch/sh/boards/bigsur/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/bigsur/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/bigsur/CVS/Repository 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/bigsur
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/bigsur/CVS/Root linux-2.6.17/arch/sh/boards/bigsur/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/bigsur/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/bigsur/CVS/Root 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/cat68701/CVS/Entries linux-2.6.17/arch/sh/boards/cat68701/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/cat68701/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/cat68701/CVS/Entries 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1,4 @@
++/Makefile/1.5/Thu Mar 11 18:08:02 2004//
++/irq.c/1.2/Fri Nov 1 17:19:15 2002//
++/setup.c/1.3/Mon Aug 4 01:44:39 2003//
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/cat68701/CVS/Repository linux-2.6.17/arch/sh/boards/cat68701/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/cat68701/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/cat68701/CVS/Repository 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/cat68701
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/cat68701/CVS/Root linux-2.6.17/arch/sh/boards/cat68701/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/cat68701/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/cat68701/CVS/Root 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/cqreek/CVS/Entries linux-2.6.17/arch/sh/boards/cqreek/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/cqreek/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/cqreek/CVS/Entries 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1,4 @@
++/Makefile/1.6/Thu Mar 11 18:08:02 2004//
++/irq.c/1.4/Fri Oct 28 13:12:47 2005/-ko/
++/setup.c/1.5/Mon Aug 4 01:51:58 2003//
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/cqreek/CVS/Repository linux-2.6.17/arch/sh/boards/cqreek/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/cqreek/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/cqreek/CVS/Repository 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/cqreek
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/cqreek/CVS/Root linux-2.6.17/arch/sh/boards/cqreek/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/cqreek/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/cqreek/CVS/Root 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/cqreek/irq.c linux-2.6.17/arch/sh/boards/cqreek/irq.c
+--- linux-2.6.17-vanilla/arch/sh/boards/cqreek/irq.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/cqreek/irq.c 2006-07-12 16:54:19.000000000 +0000
+@@ -1,4 +1,4 @@
+-/* $Id: irq.c,v 1.1.2.4 2002/11/04 20:33:56 lethal Exp $
++/* $Id: irq.c,v 1.3 2003/05/04 19:29:46 lethal Exp $
+ *
+ * arch/sh/boards/cqreek/irq.c
+ *
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/dmida/CVS/Entries linux-2.6.17/arch/sh/boards/dmida/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/dmida/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/dmida/CVS/Entries 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1,3 @@
++/Makefile/1.4/Thu Mar 11 18:08:02 2004//
++/mach.c/1.5/Tue Sep 9 00:14:07 2003//
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/dmida/CVS/Repository linux-2.6.17/arch/sh/boards/dmida/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/dmida/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/dmida/CVS/Repository 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/dmida
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/dmida/CVS/Root linux-2.6.17/arch/sh/boards/dmida/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/dmida/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/dmida/CVS/Root 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/dreamcast/CVS/Entries linux-2.6.17/arch/sh/boards/dreamcast/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/dreamcast/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/dreamcast/CVS/Entries 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1,5 @@
++/Makefile/1.7/Thu Mar 11 18:08:02 2004//
++/irq.c/1.5/Fri Aug 26 20:12:14 2005//
++/setup.c/1.8/Wed Jan 4 13:24:06 2006//
++/rtc.c/1.6/Sat Jul 8 20:16:03 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/dreamcast/CVS/Repository linux-2.6.17/arch/sh/boards/dreamcast/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/dreamcast/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/dreamcast/CVS/Repository 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/dreamcast
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/dreamcast/CVS/Root linux-2.6.17/arch/sh/boards/dreamcast/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/dreamcast/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/dreamcast/CVS/Root 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/dreamcast/irq.c linux-2.6.17/arch/sh/boards/dreamcast/irq.c
+--- linux-2.6.17-vanilla/arch/sh/boards/dreamcast/irq.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/dreamcast/irq.c 2006-07-12 16:54:19.000000000 +0000
+@@ -26,10 +26,10 @@
+ event.
+
+ There are three 32-bit ESRs located at 0xa05f8900 - 0xa05f6908. Event
+- types can be found in include/asm-sh/dc_sysasic.h. There are three groups
+- of EMRs that parallel the ESRs. Each EMR group corresponds to an IRQ, so
+- 0xa05f6910 - 0xa05f6918 triggers IRQ 13, 0xa05f6920 - 0xa05f6928 triggers
+- IRQ 11, and 0xa05f6930 - 0xa05f6938 triggers IRQ 9.
++ types can be found in include/asm-sh/dreamcast/sysasic.h. There are three
++ groups of EMRs that parallel the ESRs. Each EMR group corresponds to an
++ IRQ, so 0xa05f6910 - 0xa05f6918 triggers IRQ 13, 0xa05f6920 - 0xa05f6928
++ triggers IRQ 11, and 0xa05f6930 - 0xa05f6938 triggers IRQ 9.
+
+ In the kernel, these events are mapped to virtual IRQs so that drivers can
+ respond to them as they would a normal interrupt. In order to keep this
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/dreamcast/rtc.c linux-2.6.17/arch/sh/boards/dreamcast/rtc.c
+--- linux-2.6.17-vanilla/arch/sh/boards/dreamcast/rtc.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/dreamcast/rtc.c 2006-07-12 16:54:19.000000000 +0000
+@@ -1,4 +1,5 @@
+-/* arch/sh/kernel/rtc-aica.c
++/*
++ * arch/sh/boards/dreamcast/rtc.c
+ *
+ * Dreamcast AICA RTC routines.
+ *
+@@ -10,15 +11,12 @@
+ */
+
+ #include <linux/time.h>
+-
++#include <asm/rtc.h>
+ #include <asm/io.h>
+
+-extern void (*rtc_get_time)(struct timespec *);
+-extern int (*rtc_set_time)(const time_t);
+-
+ /* The AICA RTC has an Epoch of 1/1/1950, so we must subtract 20 years (in
+- seconds to get the standard Unix Epoch when getting the time, and add 20
+- years when setting the time. */
++ seconds) to get the standard Unix Epoch when getting the time, and add
++ 20 years when setting the time. */
+ #define TWENTY_YEARS ((20 * 365LU + 5) * 86400)
+
+ /* The AICA RTC is represented by a 32-bit seconds counter stored in 2 16-bit
+@@ -32,7 +30,8 @@
+ *
+ * Grabs the current RTC seconds counter and adjusts it to the Unix Epoch.
+ */
+-void aica_rtc_gettimeofday(struct timespec *ts) {
++void aica_rtc_gettimeofday(struct timespec *ts)
++{
+ unsigned long val1, val2;
+
+ do {
+@@ -55,7 +54,8 @@
+ *
+ * Adjusts the given @tv to the AICA Epoch and sets the RTC seconds counter.
+ */
+-int aica_rtc_settimeofday(const time_t secs) {
++int aica_rtc_settimeofday(const time_t secs)
++{
+ unsigned long val1, val2;
+ unsigned long adj = secs + TWENTY_YEARS;
+
+@@ -75,7 +75,7 @@
+
+ void aica_time_init(void)
+ {
+- rtc_get_time = aica_rtc_gettimeofday;
+- rtc_set_time = aica_rtc_settimeofday;
++ rtc_sh_get_time = aica_rtc_gettimeofday;
++ rtc_sh_set_time = aica_rtc_settimeofday;
+ }
+
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/dreamcast/setup.c linux-2.6.17/arch/sh/boards/dreamcast/setup.c
+--- linux-2.6.17-vanilla/arch/sh/boards/dreamcast/setup.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/dreamcast/setup.c 2006-07-12 16:54:19.000000000 +0000
+@@ -25,18 +25,16 @@
+
+ #include <asm/io.h>
+ #include <asm/irq.h>
++#include <asm/rtc.h>
+ #include <asm/machvec.h>
+-#include <asm/machvec_init.h>
+ #include <asm/mach/sysasic.h>
+
+ extern struct hw_interrupt_type systemasic_int;
+-/* XXX: Move this into it's proper header. */
+-extern void (*board_time_init)(void);
+ extern void aica_time_init(void);
+ extern int gapspci_init(void);
+ extern int systemasic_irq_demux(int);
+
+-void *dreamcast_consistent_alloc(struct device *, size_t, dma_addr_t *, int);
++void *dreamcast_consistent_alloc(struct device *, size_t, dma_addr_t *, gfp_t);
+ int dreamcast_consistent_free(struct device *, size_t, void *, dma_addr_t);
+
+ const char *get_system_type(void)
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/ec3104/CVS/Entries linux-2.6.17/arch/sh/boards/ec3104/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/ec3104/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/ec3104/CVS/Entries 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1,5 @@
++/Makefile/1.5/Thu Mar 11 18:08:02 2004//
++/io.c/1.2/Fri Nov 1 17:19:17 2002//
++/irq.c/1.3/Tue Sep 9 00:14:07 2003//
++/setup.c/1.3/Tue Jul 29 03:11:49 2003//
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/ec3104/CVS/Repository linux-2.6.17/arch/sh/boards/ec3104/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/ec3104/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/ec3104/CVS/Repository 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/ec3104
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/ec3104/CVS/Root linux-2.6.17/arch/sh/boards/ec3104/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/ec3104/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/ec3104/CVS/Root 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/harp/CVS/Entries linux-2.6.17/arch/sh/boards/harp/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/harp/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/harp/CVS/Entries 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1,7 @@
++/Makefile/1.4/Thu Mar 11 18:08:02 2004//
++/irq.c/1.4/Fri Oct 28 13:12:47 2005//
++/led.c/1.2/Fri Nov 1 17:19:17 2002//
++/mach.c/1.4/Tue Sep 9 00:14:07 2003//
++/pcidma.c/1.2/Fri Nov 1 17:19:17 2002//
++/setup.c/1.3/Thu Aug 19 12:24:27 2004//
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/harp/CVS/Repository linux-2.6.17/arch/sh/boards/harp/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/harp/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/harp/CVS/Repository 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/harp
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/harp/CVS/Root linux-2.6.17/arch/sh/boards/harp/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/harp/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/harp/CVS/Root 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/hp6xx/CVS/Entries linux-2.6.17/arch/sh/boards/hp6xx/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/hp6xx/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/hp6xx/CVS/Entries 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1,7 @@
++/Makefile/1.2/Sun Jan 29 17:46:23 2006/-ko/
++/hp6xx_apm.c/1.2/Mon Jan 30 15:57:17 2006//
++/mach.c/1.4/Wed Jan 4 14:53:18 2006/-ko/
++/pm.c/1.2/Mon Jan 30 15:57:17 2006//
++/pm_wakeup.S/1.2/Mon Jan 30 15:57:17 2006//
++/setup.c/1.4/Sun Jan 29 22:13:39 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/hp6xx/CVS/Repository linux-2.6.17/arch/sh/boards/hp6xx/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/hp6xx/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/hp6xx/CVS/Repository 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/hp6xx
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/hp6xx/CVS/Root linux-2.6.17/arch/sh/boards/hp6xx/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/hp6xx/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/hp6xx/CVS/Root 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/hp6xx/Makefile linux-2.6.17/arch/sh/boards/hp6xx/Makefile
+--- linux-2.6.17-vanilla/arch/sh/boards/hp6xx/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/hp6xx/Makefile 2006-07-12 16:54:19.000000000 +0000
+@@ -2,5 +2,8 @@
+ # Makefile for the HP6xx specific parts of the kernel
+ #
+
+-obj-y := mach.o setup.o
++obj-y := mach.o setup.o
++obj-$(CONFIG_PM) += pm.o pm_wakeup.o
++obj-$(CONFIG_APM) += hp6xx_apm.o
++
+
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/hp6xx/hp6xx_apm.c linux-2.6.17/arch/sh/boards/hp6xx/hp6xx_apm.c
+--- linux-2.6.17-vanilla/arch/sh/boards/hp6xx/hp6xx_apm.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/hp6xx/hp6xx_apm.c 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1,123 @@
++/*
++ * bios-less APM driver for hp680
++ *
++ * Copyright 2005 (c) Andriy Skulysh <askulysh@gmail.com>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License.
++ */
++#include <linux/config.h>
++#include <linux/module.h>
++#include <linux/apm_bios.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/interrupt.h>
++#include <asm/io.h>
++#include <asm/apm.h>
++#include <asm/adc.h>
++#include <asm/hp6xx/hp6xx.h>
++
++#define SH7709_PGDR 0xa400012c
++
++#define APM_CRITICAL 10
++#define APM_LOW 30
++
++#define HP680_BATTERY_MAX 896
++#define HP680_BATTERY_MIN 628
++#define HP680_BATTERY_AC_ON 900
++
++#define MODNAME "hp6x0_apm"
++
++static int hp6x0_apm_get_info(char *buf, char **start, off_t fpos, int length)
++{
++ u8 pgdr;
++ char *p;
++ int battery_status;
++ int battery_flag;
++ int ac_line_status;
++ int time_units = APM_BATTERY_LIFE_UNKNOWN;
++
++ int battery = adc_single(ADC_CHANNEL_BATTERY);
++ int backup = adc_single(ADC_CHANNEL_BACKUP);
++ int charging = adc_single(ADC_CHANNEL_CHARGE);
++ int percentage;
++
++ percentage = 100 * (battery - HP680_BATTERY_MIN) /
++ (HP680_BATTERY_MAX - HP680_BATTERY_MIN);
++
++ ac_line_status = (battery > HP680_BATTERY_AC_ON) ?
++ APM_AC_ONLINE : APM_AC_OFFLINE;
++
++ p = buf;
++
++ pgdr = ctrl_inb(SH7709_PGDR);
++ if (pgdr & PGDR_MAIN_BATTERY_OUT) {
++ battery_status = APM_BATTERY_STATUS_NOT_PRESENT;
++ battery_flag = 0x80;
++ percentage = -1;
++ } else if (charging < 8 ) {
++ battery_status = APM_BATTERY_STATUS_CHARGING;
++ battery_flag = 0x08;
++ ac_line_status = 0xff;
++ } else if (percentage <= APM_CRITICAL) {
++ battery_status = APM_BATTERY_STATUS_CRITICAL;
++ battery_flag = 0x04;
++ } else if (percentage <= APM_LOW) {
++ battery_status = APM_BATTERY_STATUS_LOW;
++ battery_flag = 0x02;
++ } else {
++ battery_status = APM_BATTERY_STATUS_HIGH;
++ battery_flag = 0x01;
++ }
++
++ p += sprintf(p, "1.0 1.2 0x%02x 0x%02x 0x%02x 0x%02x %d%% %d %s\n",
++ APM_32_BIT_SUPPORT,
++ ac_line_status,
++ battery_status,
++ battery_flag,
++ percentage,
++ time_units,
++ "min");
++ p += sprintf(p, "bat=%d backup=%d charge=%d\n",
++ battery, backup, charging);
++
++ return p - buf;
++}
++
++static irqreturn_t hp6x0_apm_interrupt(int irq, void *dev, struct pt_regs *regs)
++{
++ if (!apm_suspended)
++ apm_queue_event(APM_USER_SUSPEND);
++
++ return IRQ_HANDLED;
++}
++
++static int __init hp6x0_apm_init(void)
++{
++ int ret;
++
++ ret = request_irq(HP680_BTN_IRQ, hp6x0_apm_interrupt,
++ SA_INTERRUPT, MODNAME, 0);
++ if (unlikely(ret < 0)) {
++ printk(KERN_ERR MODNAME ": IRQ %d request failed\n",
++ HP680_BTN_IRQ);
++ return ret;
++ }
++
++ apm_get_info = hp6x0_apm_get_info;
++
++ return ret;
++}
++
++static void __exit hp6x0_apm_exit(void)
++{
++ free_irq(HP680_BTN_IRQ, 0);
++ apm_get_info = 0;
++}
++
++module_init(hp6x0_apm_init);
++module_exit(hp6x0_apm_exit);
++
++MODULE_AUTHOR("Adriy Skulysh");
++MODULE_DESCRIPTION("hp6xx Advanced Power Management");
++MODULE_LICENSE("GPL");
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/hp6xx/pm.c linux-2.6.17/arch/sh/boards/hp6xx/pm.c
+--- linux-2.6.17-vanilla/arch/sh/boards/hp6xx/pm.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/hp6xx/pm.c 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1,88 @@
++/*
++ * hp6x0 Power Management Routines
++ *
++ * Copyright (c) 2006 Andriy Skulysh <askulsyh@gmail.com>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License.
++ */
++#include <linux/config.h>
++#include <linux/init.h>
++#include <linux/suspend.h>
++#include <linux/errno.h>
++#include <linux/time.h>
++#include <asm/io.h>
++#include <asm/hd64461.h>
++#include <asm/hp6xx/hp6xx.h>
++#include <asm/cpu/dac.h>
++#include <asm/pm.h>
++
++#define STBCR 0xffffff82
++#define STBCR2 0xffffff88
++
++static int hp6x0_pm_enter(suspend_state_t state)
++{
++ u8 stbcr, stbcr2;
++#ifdef CONFIG_HD64461_ENABLER
++ u8 scr;
++ u16 hd64461_stbcr;
++#endif
++
++ if (state != PM_SUSPEND_MEM)
++ return -EINVAL;
++
++#ifdef CONFIG_HD64461_ENABLER
++ outb(0, HD64461_PCC1CSCIER);
++
++ scr = inb(HD64461_PCC1SCR);
++ scr |= HD64461_PCCSCR_VCC1;
++ outb(scr, HD64461_PCC1SCR);
++
++ hd64461_stbcr = inw(HD64461_STBCR);
++ hd64461_stbcr |= HD64461_STBCR_SPC1ST;
++ outw(hd64461_stbcr, HD64461_STBCR);
++#endif
++
++ ctrl_outb(0x1f, DACR);
++
++ stbcr = ctrl_inb(STBCR);
++ ctrl_outb(0x01, STBCR);
++
++ stbcr2 = ctrl_inb(STBCR2);
++ ctrl_outb(0x7f , STBCR2);
++
++ outw(0xf07f, HD64461_SCPUCR);
++
++ pm_enter();
++
++ outw(0, HD64461_SCPUCR);
++ ctrl_outb(stbcr, STBCR);
++ ctrl_outb(stbcr2, STBCR2);
++
++#ifdef CONFIG_HD64461_ENABLER
++ hd64461_stbcr = inw(HD64461_STBCR);
++ hd64461_stbcr &= ~HD64461_STBCR_SPC1ST;
++ outw(hd64461_stbcr, HD64461_STBCR);
++
++ outb(0x4c, HD64461_PCC1CSCIER);
++ outb(0x00, HD64461_PCC1CSCR);
++#endif
++
++ return 0;
++}
++
++/*
++ * Set to PM_DISK_FIRMWARE so we can quickly veto suspend-to-disk.
++ */
++static struct pm_ops hp6x0_pm_ops = {
++ .pm_disk_mode = PM_DISK_FIRMWARE,
++ .enter = hp6x0_pm_enter,
++};
++
++static int __init hp6x0_pm_init(void)
++{
++ pm_set_ops(&hp6x0_pm_ops);
++ return 0;
++}
++
++late_initcall(hp6x0_pm_init);
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/hp6xx/pm_wakeup.S linux-2.6.17/arch/sh/boards/hp6xx/pm_wakeup.S
+--- linux-2.6.17-vanilla/arch/sh/boards/hp6xx/pm_wakeup.S 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/hp6xx/pm_wakeup.S 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1,58 @@
++/*
++ * Copyright (c) 2006 Andriy Skulysh <askulsyh@gmail.com>
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ *
++ */
++
++#include <linux/linkage.h>
++#include <asm/cpu/mmu_context.h>
++
++#define k0 r0
++#define k1 r1
++#define k2 r2
++#define k3 r3
++#define k4 r4
++
++/*
++ * Kernel mode register usage:
++ * k0 scratch
++ * k1 scratch
++ * k2 scratch (Exception code)
++ * k3 scratch (Return address)
++ * k4 scratch
++ * k5 reserved
++ * k6 Global Interrupt Mask (0--15 << 4)
++ * k7 CURRENT_THREAD_INFO (pointer to current thread info)
++ */
++
++ENTRY(wakeup_start)
++! clear STBY bit
++ mov #-126, k2
++ and #127, k0
++ mov.b k0, @k2
++! enable refresh
++ mov.l 5f, k1
++ mov.w 6f, k0
++ mov.w k0, @k1
++! jump to handler
++ mov.l 2f, k2
++ mov.l 3f, k3
++ mov.l @k2, k2
++
++ mov.l 4f, k1
++ jmp @k1
++ nop
++
++ .align 2
++1: .long EXPEVT
++2: .long INTEVT
++3: .long ret_from_irq
++4: .long handle_exception
++5: .long 0xffffff68
++6: .word 0x0524
++
++ENTRY(wakeup_end)
++ nop
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/hp6xx/setup.c linux-2.6.17/arch/sh/boards/hp6xx/setup.c
+--- linux-2.6.17-vanilla/arch/sh/boards/hp6xx/setup.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/hp6xx/setup.c 2006-07-12 16:54:19.000000000 +0000
+@@ -16,6 +16,9 @@
+ #include <asm/hp6xx/hp6xx.h>
+ #include <asm/cpu/dac.h>
+
++#define SCPCR 0xa4000116
++#define SCPDR 0xa4000136
++
+ const char *get_system_type(void)
+ {
+ return "HP6xx";
+@@ -25,6 +28,7 @@
+ {
+ u8 v8;
+ u16 v;
++
+ v = inw(HD64461_STBCR);
+ v |= HD64461_STBCR_SURTST | HD64461_STBCR_SIRST |
+ HD64461_STBCR_STM1ST | HD64461_STBCR_STM0ST |
+@@ -51,5 +55,15 @@
+ v8 &= ~DACR_DAE;
+ ctrl_outb(v8,DACR);
+
++ v8 = ctrl_inb(SCPDR);
++ v8 |= SCPDR_TS_SCAN_X | SCPDR_TS_SCAN_Y;
++ v8 &= ~SCPDR_TS_SCAN_ENABLE;
++ ctrl_outb(v8, SCPDR);
++
++ v = ctrl_inw(SCPCR);
++ v &= ~SCPCR_TS_MASK;
++ v |= SCPCR_TS_ENABLE;
++ ctrl_outw(v, SCPCR);
++
+ return 0;
+ }
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/landisk/CVS/Entries linux-2.6.17/arch/sh/boards/landisk/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/landisk/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/landisk/CVS/Entries 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,7 @@
++/Makefile/1.2/Wed Feb 8 21:55:09 2006/-ko/
++/io.c/1.4/Sun Feb 5 21:55:28 2006/-ko/
++/irq.c/1.2/Sat Nov 12 13:02:45 2005/-ko/
++/landisk_pwb.c/1.2/Sat Nov 12 13:02:45 2005/-ko/
++/setup.c/1.3/Tue Jan 3 22:51:46 2006/-ko/
++/rtc.c/1.3/Sat Jul 8 20:16:03 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/landisk/CVS/Repository linux-2.6.17/arch/sh/boards/landisk/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/landisk/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/landisk/CVS/Repository 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/landisk
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/landisk/CVS/Root linux-2.6.17/arch/sh/boards/landisk/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/landisk/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/landisk/CVS/Root 2006-07-12 16:54:19.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/landisk/Makefile linux-2.6.17/arch/sh/boards/landisk/Makefile
+--- linux-2.6.17-vanilla/arch/sh/boards/landisk/Makefile 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/landisk/Makefile 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,5 @@
++#
++# Makefile for I-O DATA DEVICE, INC. "LANDISK Series"
++#
++
++obj-y := setup.o io.o irq.o rtc.o landisk_pwb.o
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/landisk/io.c linux-2.6.17/arch/sh/boards/landisk/io.c
+--- linux-2.6.17-vanilla/arch/sh/boards/landisk/io.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/landisk/io.c 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,250 @@
++/*
++ * arch/sh/boards/landisk/io.c
++ *
++ * Copyright (C) 2001 Ian da Silva, Jeremy Siegel
++ * Based largely on io_se.c.
++ *
++ * I/O routine for I-O Data Device, Inc. LANDISK.
++ *
++ * Initial version only to support LAN access; some
++ * placeholder code from io_landisk.c left in with the
++ * expectation of later SuperIO and PCMCIA access.
++ */
++/*
++ * modifed by kogiidena
++ * 2005.03.03
++ */
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/pci.h>
++#include <asm/landisk/iodata_landisk.h>
++#include <asm/addrspace.h>
++#include <asm/io.h>
++
++extern void *area5_io_base; /* Area 5 I/O Base address */
++extern void *area6_io_base; /* Area 6 I/O Base address */
++
++static inline unsigned long port2adr(unsigned int port)
++{
++ if ((0x1f0 <= port && port < 0x1f8) || port == 0x3f6)
++ if (port == 0x3f6)
++ return ((unsigned long)area5_io_base + 0x2c);
++ else
++ return ((unsigned long)area5_io_base + PA_PIDE_OFFSET +
++ ((port - 0x1f0) << 1));
++ else if ((0x170 <= port && port < 0x178) || port == 0x376)
++ if (port == 0x376)
++ return ((unsigned long)area6_io_base + 0x2c);
++ else
++ return ((unsigned long)area6_io_base + PA_SIDE_OFFSET +
++ ((port - 0x170) << 1));
++ else
++ maybebadio((unsigned long)port);
++
++ return port;
++}
++
++/*
++ * General outline: remap really low stuff [eventually] to SuperIO,
++ * stuff in PCI IO space (at or above window at pci.h:PCIBIOS_MIN_IO)
++ * is mapped through the PCI IO window. Stuff with high bits (PXSEG)
++ * should be way beyond the window, and is used w/o translation for
++ * compatibility.
++ */
++u8 landisk_inb(unsigned long port)
++{
++ if (PXSEG(port))
++ return ctrl_inb(port);
++ else if (is_pci_ioaddr(port))
++ return ctrl_inb(pci_ioaddr(port));
++
++ return ctrl_inw(port2adr(port)) & 0xff;
++}
++
++u8 landisk_inb_p(unsigned long port)
++{
++ u8 v;
++
++ if (PXSEG(port))
++ v = ctrl_inb(port);
++ else if (is_pci_ioaddr(port))
++ v = ctrl_inb(pci_ioaddr(port));
++ else
++ v = ctrl_inw(port2adr(port)) & 0xff;
++
++ ctrl_delay();
++
++ return v;
++}
++
++u16 landisk_inw(unsigned long port)
++{
++ if (PXSEG(port))
++ return ctrl_inw(port);
++ else if (is_pci_ioaddr(port))
++ return ctrl_inw(pci_ioaddr(port));
++ else
++ maybebadio(port);
++
++ return 0;
++}
++
++u32 landisk_inl(unsigned long port)
++{
++ if (PXSEG(port))
++ return ctrl_inl(port);
++ else if (is_pci_ioaddr(port))
++ return ctrl_inl(pci_ioaddr(port));
++ else
++ maybebadio(port);
++
++ return 0;
++}
++
++void landisk_outb(u8 value, unsigned long port)
++{
++ if (PXSEG(port))
++ ctrl_outb(value, port);
++ else if (is_pci_ioaddr(port))
++ ctrl_outb(value, pci_ioaddr(port));
++ else
++ ctrl_outw(value, port2adr(port));
++}
++
++void landisk_outb_p(u8 value, unsigned long port)
++{
++ if (PXSEG(port))
++ ctrl_outb(value, port);
++ else if (is_pci_ioaddr(port))
++ ctrl_outb(value, pci_ioaddr(port));
++ else
++ ctrl_outw(value, port2adr(port));
++ ctrl_delay();
++}
++
++void landisk_outw(u16 value, unsigned long port)
++{
++ if (PXSEG(port))
++ ctrl_outw(value, port);
++ else if (is_pci_ioaddr(port))
++ ctrl_outw(value, pci_ioaddr(port));
++ else
++ maybebadio(port);
++}
++
++void landisk_outl(u32 value, unsigned long port)
++{
++ if (PXSEG(port))
++ ctrl_outl(value, port);
++ else if (is_pci_ioaddr(port))
++ ctrl_outl(value, pci_ioaddr(port));
++ else
++ maybebadio(port);
++}
++
++void landisk_insb(unsigned long port, void *dst, unsigned long count)
++{
++ volatile u16 *p;
++ u8 *buf = dst;
++
++ if (PXSEG(port)) {
++ while (count--)
++ *buf++ = *(volatile u8 *)port;
++ } else if (is_pci_ioaddr(port)) {
++ volatile u8 *bp = (volatile u8 *)pci_ioaddr(port);
++
++ while (count--)
++ *buf++ = *bp;
++ } else {
++ p = (volatile u16 *)port2adr(port);
++ while (count--)
++ *buf++ = *p & 0xff;
++ }
++}
++
++void landisk_insw(unsigned long port, void *dst, unsigned long count)
++{
++ volatile u16 *p;
++ u16 *buf = dst;
++
++ if (PXSEG(port))
++ p = (volatile u16 *)port;
++ else if (is_pci_ioaddr(port))
++ p = (volatile u16 *)pci_ioaddr(port);
++ else
++ p = (volatile u16 *)port2adr(port);
++ while (count--)
++ *buf++ = *p;
++}
++
++void landisk_insl(unsigned long port, void *dst, unsigned long count)
++{
++ u32 *buf = dst;
++
++ if (is_pci_ioaddr(port)) {
++ volatile u32 *p = (volatile u32 *)pci_ioaddr(port);
++
++ while (count--)
++ *buf++ = *p;
++ } else
++ maybebadio(port);
++}
++
++void landisk_outsb(unsigned long port, const void *src, unsigned long count)
++{
++ volatile u16 *p;
++ const u8 *buf = src;
++
++ if (PXSEG(port))
++ while (count--)
++ ctrl_outb(*buf++, port);
++ else if (is_pci_ioaddr(port)) {
++ volatile u8 *bp = (volatile u8 *)pci_ioaddr(port);
++
++ while (count--)
++ *bp = *buf++;
++ } else {
++ p = (volatile u16 *)port2adr(port);
++ while (count--)
++ *p = *buf++;
++ }
++}
++
++void landisk_outsw(unsigned long port, const void *src, unsigned long count)
++{
++ volatile u16 *p;
++ const u16 *buf = src;
++
++ if (PXSEG(port))
++ p = (volatile u16 *)port;
++ else if (is_pci_ioaddr(port))
++ p = (volatile u16 *)pci_ioaddr(port);
++ else
++ p = (volatile u16 *)port2adr(port);
++
++ while (count--)
++ *p = *buf++;
++}
++
++void landisk_outsl(unsigned long port, const void *src, unsigned long count)
++{
++ const u32 *buf = src;
++
++ if (is_pci_ioaddr(port)) {
++ volatile u32 *p = (volatile u32 *)pci_ioaddr(port);
++
++ while (count--)
++ *p = *buf++;
++ } else
++ maybebadio(port);
++}
++
++void __iomem *landisk_ioport_map(unsigned long port, unsigned int size)
++{
++ if (PXSEG(port))
++ return (void __iomem *)port;
++ else if (is_pci_ioaddr(port))
++ return (void __iomem *)pci_ioaddr(port);
++
++ return (void __iomem *)port2adr(port);
++}
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/landisk/irq.c linux-2.6.17/arch/sh/boards/landisk/irq.c
+--- linux-2.6.17-vanilla/arch/sh/boards/landisk/irq.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/landisk/irq.c 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,105 @@
++/*
++ * arch/sh/boards/landisk/irq.c
++ *
++ * Copyright (C) 2001 Ian da Silva, Jeremy Siegel
++ * Based largely on io_se.c.
++ *
++ * I/O routine for I-O Data Device, Inc. LANDISK.
++ *
++ * Initial version only to support LAN access; some
++ * placeholder code from io_landisk.c left in with the
++ * expectation of later SuperIO and PCMCIA access.
++ */
++/*
++ * modified by kogiidena
++ * 2005.03.03
++ */
++
++#include <linux/config.h>
++#include <linux/init.h>
++#include <linux/irq.h>
++#include <asm/io.h>
++#include <asm/irq.h>
++#include <asm/landisk/iodata_landisk.h>
++
++static void enable_landisk_irq(unsigned int irq);
++static void disable_landisk_irq(unsigned int irq);
++
++/* shutdown is same as "disable" */
++#define shutdown_landisk_irq disable_landisk_irq
++
++static void ack_landisk_irq(unsigned int irq);
++static void end_landisk_irq(unsigned int irq);
++
++static unsigned int startup_landisk_irq(unsigned int irq)
++{
++ enable_landisk_irq(irq);
++ return 0; /* never anything pending */
++}
++
++static void disable_landisk_irq(unsigned int irq)
++{
++ unsigned long flags;
++ unsigned char val;
++ unsigned char mask = 0xff ^ (0x01 << (irq - 5));
++
++ /* Set the priority in IPR to 0 */
++ local_irq_save(flags);
++ val = ctrl_inb(PA_IMASK);
++ val &= mask;
++ ctrl_outb(val, PA_IMASK);
++ local_irq_restore(flags);
++}
++
++static void enable_landisk_irq(unsigned int irq)
++{
++ unsigned long flags;
++ unsigned char val;
++ unsigned char value = (0x01 << (irq - 5));
++
++ /* Set priority in IPR back to original value */
++ local_irq_save(flags);
++ val = ctrl_inb(PA_IMASK);
++ val |= value;
++ ctrl_outb(val, PA_IMASK);
++ local_irq_restore(flags);
++}
++
++static void ack_landisk_irq(unsigned int irq)
++{
++ disable_landisk_irq(irq);
++}
++
++static void end_landisk_irq(unsigned int irq)
++{
++ if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
++ enable_landisk_irq(irq);
++}
++
++static struct hw_interrupt_type landisk_irq_type = {
++ .typename = "LANDISK IRQ",
++ .startup = startup_landisk_irq,
++ .shutdown = shutdown_landisk_irq,
++ .enable = enable_landisk_irq,
++ .disable = disable_landisk_irq,
++ .ack = ack_landisk_irq,
++ .end = end_landisk_irq
++};
++
++static void make_landisk_irq(unsigned int irq)
++{
++ disable_irq_nosync(irq);
++ irq_desc[irq].handler = &landisk_irq_type;
++ disable_landisk_irq(irq);
++}
++
++/*
++ * Initialize IRQ setting
++ */
++void __init init_landisk_IRQ(void)
++{
++ int i;
++
++ for (i = 5; i < 14; i++)
++ make_landisk_irq(i);
++}
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/landisk/landisk_pwb.c linux-2.6.17/arch/sh/boards/landisk/landisk_pwb.c
+--- linux-2.6.17-vanilla/arch/sh/boards/landisk/landisk_pwb.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/landisk/landisk_pwb.c 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,348 @@
++/*
++ * arch/sh/boards/landisk/landisk_pwb.c -- driver for the Power control switch.
++ *
++ * This driver will also support the I-O DATA Device, Inc. LANDISK Board.
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ *
++ * Copylight (C) 2002 Atom Create Engineering Co., Ltd.
++ *
++ * LED control drive function added by kogiidena
++ */
++
++#include <linux/config.h>
++#include <linux/module.h>
++#include <linux/errno.h>
++#include <linux/signal.h>
++#include <linux/major.h>
++#include <linux/poll.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++#include <linux/sched.h>
++#include <linux/timer.h>
++#include <linux/interrupt.h>
++
++#include <asm/system.h>
++#include <asm/io.h>
++#include <asm/irq.h>
++#include <asm/uaccess.h>
++#include <asm/landisk/iodata_landisk.h>
++
++#define SHUTDOWN_BTN_MINOR 1 /* Shutdown button device minor no. */
++#define LED_MINOR 21 /* LED minor no. */
++#define BTN_MINOR 22 /* BUTTON minor no. */
++#define GIO_MINOR 40 /* GIO minor no. */
++
++static int openCnt;
++static int openCntLED;
++static int openCntGio;
++static int openCntBtn;
++static int landisk_btn;
++static int landisk_btnctrlpid;
++/*
++ * Functions prototypes
++ */
++
++static int gio_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
++ unsigned long arg);
++
++static int swdrv_open(struct inode *inode, struct file *filp)
++{
++ int minor;
++
++ minor = MINOR(inode->i_rdev);
++ filp->private_data = (void *)minor;
++
++ if (minor == SHUTDOWN_BTN_MINOR) {
++ if (openCnt > 0) {
++ return -EALREADY;
++ } else {
++ openCnt++;
++ return 0;
++ }
++ } else if (minor == LED_MINOR) {
++ if (openCntLED > 0) {
++ return -EALREADY;
++ } else {
++ openCntLED++;
++ return 0;
++ }
++ } else if (minor == BTN_MINOR) {
++ if (openCntBtn > 0) {
++ return -EALREADY;
++ } else {
++ openCntBtn++;
++ return 0;
++ }
++ } else if (minor == GIO_MINOR) {
++ if (openCntGio > 0) {
++ return -EALREADY;
++ } else {
++ openCntGio++;
++ return 0;
++ }
++ }
++ return -ENOENT;
++
++}
++
++static int swdrv_close(struct inode *inode, struct file *filp)
++{
++ int minor;
++
++ minor = MINOR(inode->i_rdev);
++ if (minor == SHUTDOWN_BTN_MINOR) {
++ openCnt--;
++ } else if (minor == LED_MINOR) {
++ openCntLED--;
++ } else if (minor == BTN_MINOR) {
++ openCntBtn--;
++ } else if (minor == GIO_MINOR) {
++ openCntGio--;
++ }
++ return 0;
++}
++
++static int swdrv_read(struct file *filp, char *buff, size_t count,
++ loff_t * ppos)
++{
++ int minor;
++ minor = (int)(filp->private_data);
++
++ if (!access_ok(VERIFY_WRITE, (void *)buff, count))
++ return -EFAULT;
++
++ if (minor == SHUTDOWN_BTN_MINOR) {
++ if (landisk_btn & 0x10) {
++ put_user(1, buff);
++ return 1;
++ } else {
++ return 0;
++ }
++ }
++ return 0;
++}
++
++static int swdrv_write(struct file *filp, const char *buff, size_t count,
++ loff_t * ppos)
++{
++ int minor;
++ minor = (int)(filp->private_data);
++
++ if (minor == SHUTDOWN_BTN_MINOR) {
++ return count;
++ }
++ return count;
++}
++
++static irqreturn_t sw_interrupt(int irq, void *dev_id, struct pt_regs *regs)
++{
++ landisk_btn = (0x0ff & (~ctrl_inb(PA_STATUS)));
++ disable_irq(IRQ_BUTTON);
++ disable_irq(IRQ_POWER);
++ ctrl_outb(0x00, PA_PWRINT_CLR);
++
++ if (landisk_btnctrlpid != 0) {
++ kill_proc(landisk_btnctrlpid, SIGUSR1, 1);
++ landisk_btnctrlpid = 0;
++ }
++
++ return IRQ_HANDLED;
++}
++
++static struct file_operations swdrv_fops = {
++ .read = swdrv_read, /* read */
++ .write = swdrv_write, /* write */
++ .open = swdrv_open, /* open */
++ .release = swdrv_close, /* release */
++ .ioctl = gio_ioctl, /* ioctl */
++
++};
++
++static char banner[] __initdata =
++ KERN_INFO "LANDISK and USL-5P Button, LED and GIO driver initialized\n";
++
++int __init swdrv_init(void)
++{
++ int error;
++
++ printk("%s", banner);
++
++ openCnt = 0;
++ openCntLED = 0;
++ openCntBtn = 0;
++ openCntGio = 0;
++ landisk_btn = 0;
++ landisk_btnctrlpid = 0;
++
++ if ((error = register_chrdev(SHUTDOWN_BTN_MAJOR, "swdrv", &swdrv_fops))) {
++ printk(KERN_ERR
++ "Button, LED and GIO driver:Couldn't register driver, error=%d\n",
++ error);
++ return 1;
++ }
++
++ if (request_irq(IRQ_POWER, sw_interrupt, 0, "SHUTDOWNSWITCH", NULL)) {
++ printk(KERN_ERR "Unable to get IRQ 11.\n");
++ return 1;
++ }
++ if (request_irq(IRQ_BUTTON, sw_interrupt, 0, "USL-5P BUTTON", NULL)) {
++ printk(KERN_ERR "Unable to get IRQ 12.\n");
++ return 1;
++ }
++ ctrl_outb(0x00, PA_PWRINT_CLR);
++
++ return 0;
++}
++
++module_init(swdrv_init);
++
++/*
++ * gio driver
++ *
++ */
++
++#include <asm/landisk/gio.h>
++
++static int gio_ioctl(struct inode *inode, struct file *filp,
++ unsigned int cmd, unsigned long arg)
++{
++ int minor;
++ unsigned int data, mask;
++ static unsigned int addr = 0;
++
++ minor = (int)(filp->private_data);
++
++ /* access control */
++ if (minor == GIO_MINOR) {
++ ;
++ } else if (minor == LED_MINOR) {
++ if (((cmd & 0x0ff) >= 9) && ((cmd & 0x0ff) < 20)) {
++ ;
++ } else {
++ return -EINVAL;
++ }
++ } else if (minor == BTN_MINOR) {
++ if (((cmd & 0x0ff) >= 20) && ((cmd & 0x0ff) < 30)) {
++ ;
++ } else {
++ return -EINVAL;
++ }
++ } else {
++ return -EINVAL;
++ }
++
++ if (cmd & 0x01) { /* write */
++ if (copy_from_user(&data, (int *)arg, sizeof(int))) {
++ return -EFAULT;
++ }
++ }
++
++ switch (cmd) {
++ case GIODRV_IOCSGIOSETADDR: /* addres set */
++ addr = data;
++ break;
++
++ case GIODRV_IOCSGIODATA1: /* write byte */
++ ctrl_outb((unsigned char)(0x0ff & data), addr);
++ break;
++
++ case GIODRV_IOCSGIODATA2: /* write word */
++ if (addr & 0x01) {
++ return -EFAULT;
++ }
++ ctrl_outw((unsigned short int)(0x0ffff & data), addr);
++ break;
++
++ case GIODRV_IOCSGIODATA4: /* write long */
++ if (addr & 0x03) {
++ return -EFAULT;
++ }
++ ctrl_outl(data, addr);
++ break;
++
++ case GIODRV_IOCGGIODATA1: /* read byte */
++ data = ctrl_inb(addr);
++ break;
++
++ case GIODRV_IOCGGIODATA2: /* read word */
++ if (addr & 0x01) {
++ return -EFAULT;
++ }
++ data = ctrl_inw(addr);
++ break;
++
++ case GIODRV_IOCGGIODATA4: /* read long */
++ if (addr & 0x03) {
++ return -EFAULT;
++ }
++ data = ctrl_inl(addr);
++ break;
++ case GIODRV_IOCSGIO_LED: /* write */
++ mask = ((data & 0x00ffffff) << 8)
++ | ((data & 0x0000ffff) << 16)
++ | ((data & 0x000000ff) << 24);
++ landisk_ledparam = data & (~mask);
++ if (landisk_arch == 0) { /* arch == landisk */
++ landisk_ledparam &= 0x03030303;
++ mask = (~(landisk_ledparam >> 22)) & 0x000c;
++ landisk_ledparam |= mask;
++ } else { /* arch == usl-5p */
++ mask = (landisk_ledparam >> 24) & 0x0001;
++ landisk_ledparam |= mask;
++ landisk_ledparam &= 0x007f7f7f;
++ }
++ landisk_ledparam |= 0x80;
++ break;
++ case GIODRV_IOCGGIO_LED: /* read */
++ data = landisk_ledparam;
++ if (landisk_arch == 0) { /* arch == landisk */
++ data &= 0x03030303;
++ } else { /* arch == usl-5p */
++ ;
++ }
++ data &= (~0x080);
++ break;
++ case GIODRV_IOCSGIO_BUZZER: /* write */
++ landisk_buzzerparam = data;
++ landisk_ledparam |= 0x80;
++ break;
++ case GIODRV_IOCGGIO_LANDISK: /* read */
++ data = landisk_arch & 0x01;
++ break;
++ case GIODRV_IOCGGIO_BTN: /* read */
++ data = (0x0ff & ctrl_inb(PA_PWRINT_CLR));
++ data <<= 8;
++ data |= (0x0ff & ctrl_inb(PA_IMASK));
++ data <<= 8;
++ data |= (0x0ff & landisk_btn);
++ data <<= 8;
++ data |= (0x0ff & (~ctrl_inb(PA_STATUS)));
++ break;
++ case GIODRV_IOCSGIO_BTNPID: /* write */
++ landisk_btnctrlpid = data;
++ landisk_btn = 0;
++ if (irq_desc[IRQ_BUTTON].depth) {
++ enable_irq(IRQ_BUTTON);
++ }
++ if (irq_desc[IRQ_POWER].depth) {
++ enable_irq(IRQ_POWER);
++ }
++ break;
++ case GIODRV_IOCGGIO_BTNPID: /* read */
++ data = landisk_btnctrlpid;
++ break;
++ default:
++ return -EFAULT;
++ break;
++ }
++
++ if ((cmd & 0x01) == 0) { /* read */
++ if (copy_to_user((int *)arg, &data, sizeof(int))) {
++ return -EFAULT;
++ }
++ }
++ return 0;
++}
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/landisk/rtc.c linux-2.6.17/arch/sh/boards/landisk/rtc.c
+--- linux-2.6.17-vanilla/arch/sh/boards/landisk/rtc.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/landisk/rtc.c 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,93 @@
++/*
++ * arch/sh/boards/landisk/rtc.c -- RTC support
++ *
++ * Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org>
++ * Copyright (C) 1999 Tetsuya Okada & Niibe Yutaka
++ */
++/*
++ * modifed by kogiidena
++ * 2005.09.16
++ */
++
++#include <linux/config.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/sched.h>
++#include <linux/time.h>
++#include <linux/delay.h>
++#include <linux/spinlock.h>
++#include <linux/bcd.h>
++#include <asm/rtc.h>
++
++extern spinlock_t rtc_lock;
++
++extern void
++rs5c313_set_cmos_time(unsigned int BCD_yr, unsigned int BCD_mon,
++ unsigned int BCD_day, unsigned int BCD_hr,
++ unsigned int BCD_min, unsigned int BCD_sec);
++
++extern unsigned long
++rs5c313_get_cmos_time(unsigned int *BCD_yr, unsigned int *BCD_mon,
++ unsigned int *BCD_day, unsigned int *BCD_hr,
++ unsigned int *BCD_min, unsigned int *BCD_sec);
++
++void landisk_rtc_gettimeofday(struct timespec *tv)
++{
++ unsigned int BCD_yr, BCD_mon, BCD_day, BCD_hr, BCD_min, BCD_sec;
++ unsigned long flags;
++
++ spin_lock_irqsave(&rtc_lock, flags);
++ tv->tv_sec = rs5c313_get_cmos_time
++ (&BCD_yr, &BCD_mon, &BCD_day, &BCD_hr, &BCD_min, &BCD_sec);
++ tv->tv_nsec = 0;
++ spin_unlock_irqrestore(&rtc_lock, flags);
++}
++
++int landisk_rtc_settimeofday(const time_t secs)
++{
++ int retval = 0;
++ int real_seconds, real_minutes, cmos_minutes;
++ unsigned long flags;
++ unsigned long nowtime = secs;
++ unsigned int BCD_yr, BCD_mon, BCD_day, BCD_hr, BCD_min, BCD_sec;
++
++ spin_lock_irqsave(&rtc_lock, flags);
++
++ rs5c313_get_cmos_time
++ (&BCD_yr, &BCD_mon, &BCD_day, &BCD_hr, &BCD_min, &BCD_sec);
++ cmos_minutes = BCD_min;
++ BCD_TO_BIN(cmos_minutes);
++
++ /*
++ * since we're only adjusting minutes and seconds,
++ * don't interfere with hour overflow. This avoids
++ * messing with unknown time zones but requires your
++ * RTC not to be off by more than 15 minutes
++ */
++ real_seconds = nowtime % 60;
++ real_minutes = nowtime / 60;
++ if (((abs(real_minutes - cmos_minutes) + 15) / 30) & 1)
++ real_minutes += 30; /* correct for half hour time zone */
++ real_minutes %= 60;
++
++ if (abs(real_minutes - cmos_minutes) < 30) {
++ BIN_TO_BCD(real_seconds);
++ BIN_TO_BCD(real_minutes);
++ rs5c313_set_cmos_time(BCD_yr, BCD_mon, BCD_day, BCD_hr,
++ real_minutes, real_seconds);
++ } else {
++ printk(KERN_WARNING
++ "set_rtc_time: can't update from %d to %d\n",
++ cmos_minutes, real_minutes);
++ retval = -1;
++ }
++
++ spin_unlock_irqrestore(&rtc_lock, flags);
++ return retval;
++}
++
++void landisk_time_init(void)
++{
++ rtc_sh_get_time = landisk_rtc_gettimeofday;
++ rtc_sh_set_time = landisk_rtc_settimeofday;
++}
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/landisk/setup.c linux-2.6.17/arch/sh/boards/landisk/setup.c
+--- linux-2.6.17-vanilla/arch/sh/boards/landisk/setup.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/landisk/setup.c 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,179 @@
++/*
++ * arch/sh/boards/landisk/setup.c
++ *
++ * Copyright (C) 2000 Kazumoto Kojima
++ * Copyright (C) 2002 Paul Mundt
++ *
++ * I-O DATA Device, Inc. LANDISK Support.
++ *
++ * Modified for LANDISK by
++ * Atom Create Engineering Co., Ltd. 2002.
++ *
++ * modifed by kogiidena
++ * 2005.09.16
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ */
++#include <linux/config.h>
++#include <linux/init.h>
++#include <linux/pm.h>
++#include <linux/mm.h>
++#include <asm/machvec.h>
++#include <asm/rtc.h>
++#include <asm/landisk/iodata_landisk.h>
++#include <asm/io.h>
++
++void landisk_time_init(void);
++void init_landisk_IRQ(void);
++
++int landisk_ledparam;
++int landisk_buzzerparam;
++int landisk_arch;
++
++/* cycle the led's in the clasic knightrider/sun pattern */
++static void heartbeat_landisk(void)
++{
++ static unsigned int cnt = 0, blink = 0x00, period = 25;
++ volatile u8 *p = (volatile u8 *)PA_LED;
++ char data;
++
++ if ((landisk_ledparam & 0x080) == 0)
++ return;
++
++ cnt += 1;
++
++ if (cnt < period)
++ return;
++
++ cnt = 0;
++ blink++;
++
++ data = (blink & 0x01) ? (landisk_ledparam >> 16) : 0;
++ data |= (blink & 0x02) ? (landisk_ledparam >> 8) : 0;
++ data |= landisk_ledparam;
++
++ /* buzzer */
++ if (landisk_buzzerparam & 0x1) {
++ data |= 0x80;
++ } else {
++ data &= 0x7f;
++ }
++ *p = data;
++
++ if (((landisk_ledparam & 0x007f7f00) == 0) &&
++ (landisk_buzzerparam == 0))
++ landisk_ledparam &= (~0x0080);
++
++ landisk_buzzerparam >>= 1;
++}
++
++/*
++ * The Machine Vector
++ */
++struct sh_machine_vector mv_landisk __initmv = {
++ .mv_nr_irqs = 72,
++ .mv_inb = landisk_inb,
++ .mv_inw = landisk_inw,
++ .mv_inl = landisk_inl,
++ .mv_outb = landisk_outb,
++ .mv_outw = landisk_outw,
++ .mv_outl = landisk_outl,
++ .mv_inb_p = landisk_inb_p,
++ .mv_inw_p = landisk_inw,
++ .mv_inl_p = landisk_inl,
++ .mv_outb_p = landisk_outb_p,
++ .mv_outw_p = landisk_outw,
++ .mv_outl_p = landisk_outl,
++ .mv_insb = landisk_insb,
++ .mv_insw = landisk_insw,
++ .mv_insl = landisk_insl,
++ .mv_outsb = landisk_outsb,
++ .mv_outsw = landisk_outsw,
++ .mv_outsl = landisk_outsl,
++ .mv_ioport_map = landisk_ioport_map,
++ .mv_init_irq = init_landisk_IRQ,
++#ifdef CONFIG_HEARTBEAT
++ .mv_heartbeat = heartbeat_landisk,
++#endif
++};
++ALIAS_MV(landisk)
++
++const char *get_system_type(void)
++{
++ return "LANDISK";
++}
++
++static void landisk_power_off(void)
++{
++ ctrl_outb(0x01, PA_SHUTDOWN);
++}
++
++static void check_usl5p(void)
++{
++ volatile u8 *p = (volatile u8 *)PA_LED;
++ u8 tmp1, tmp2;
++
++ tmp1 = *p;
++ *p = 0x40;
++ tmp2 = *p;
++ *p = tmp1;
++
++ landisk_arch = (tmp2 == 0x40);
++ if (landisk_arch == 1) {
++ /* arch == usl-5p */
++ landisk_ledparam = 0x00000380;
++ landisk_ledparam |= (tmp1 & 0x07c);
++ } else {
++ /* arch == landisk */
++ landisk_ledparam = 0x02000180;
++ landisk_ledparam |= 0x04;
++ }
++}
++
++void __init platform_setup(void)
++{
++ landisk_buzzerparam = 0;
++ check_usl5p();
++
++ printk(KERN_INFO "I-O DATA DEVICE, INC. \"LANDISK Series\" support.\n");
++ board_time_init = landisk_time_init;
++ pm_power_off = landisk_power_off;
++}
++
++void *area5_io_base;
++void *area6_io_base;
++
++static int __init landisk_cf_init(void)
++{
++ pgprot_t prot;
++ unsigned long paddrbase, psize;
++
++ /* open I/O area window */
++ paddrbase = virt_to_phys((void *)PA_AREA5_IO);
++ psize = PAGE_SIZE;
++ prot = PAGE_KERNEL_PCC(1, _PAGE_PCC_IO16);
++ area5_io_base = p3_ioremap(paddrbase, psize, prot.pgprot);
++ if (!area5_io_base) {
++ printk("allocate_cf_area : can't open CF I/O window!\n");
++ return -ENOMEM;
++ }
++
++ paddrbase = virt_to_phys((void *)PA_AREA6_IO);
++ psize = PAGE_SIZE;
++ prot = PAGE_KERNEL_PCC(0, _PAGE_PCC_IO16);
++ area6_io_base = p3_ioremap(paddrbase, psize, prot.pgprot);
++ if (!area6_io_base) {
++ printk("allocate_cf_area : can't open HDD I/O window!\n");
++ return -ENOMEM;
++ }
++
++ printk(KERN_INFO "Allocate Area5/6 success.\n");
++
++ /* XXX : do we need attribute and common-memory area also? */
++
++ return 0;
++}
++
++__initcall(landisk_cf_init);
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/mpc1211/CVS/Entries linux-2.6.17/arch/sh/boards/mpc1211/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/mpc1211/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/mpc1211/CVS/Entries 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,6 @@
++/Makefile/1.4/Thu Mar 11 18:08:02 2004/-ko/
++/led.c/1.1/Fri May 16 17:18:15 2003/-ko/
++/pci.c/1.6/Mon Oct 25 10:41:01 2004/-ko/
++/setup.c/1.4/Sun Feb 5 21:55:28 2006/-ko/
++/rtc.c/1.4/Sat Jul 8 20:16:04 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/mpc1211/CVS/Repository linux-2.6.17/arch/sh/boards/mpc1211/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/mpc1211/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/mpc1211/CVS/Repository 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/mpc1211
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/mpc1211/CVS/Root linux-2.6.17/arch/sh/boards/mpc1211/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/mpc1211/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/mpc1211/CVS/Root 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/mpc1211/rtc.c linux-2.6.17/arch/sh/boards/mpc1211/rtc.c
+--- linux-2.6.17-vanilla/arch/sh/boards/mpc1211/rtc.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/mpc1211/rtc.c 2006-07-12 16:54:20.000000000 +0000
+@@ -130,7 +130,7 @@
+
+ void mpc1211_time_init(void)
+ {
+- rtc_get_time = mpc1211_rtc_gettimeofday;
+- rtc_set_time = mpc1211_rtc_settimeofday;
++ rtc_sh_get_time = mpc1211_rtc_gettimeofday;
++ rtc_sh_set_time = mpc1211_rtc_settimeofday;
+ }
+
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/mpc1211/setup.c linux-2.6.17/arch/sh/boards/mpc1211/setup.c
+--- linux-2.6.17-vanilla/arch/sh/boards/mpc1211/setup.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/mpc1211/setup.c 2006-07-12 16:54:20.000000000 +0000
+@@ -256,23 +256,12 @@
+ }
+ }
+
+-/*
+- Initialize the board
+-*/
+-
+-
+-static void delay (void)
+-{
+- volatile unsigned short tmp;
+- tmp = *(volatile unsigned short *) 0xa0000000;
+-}
+-
+-static void delay1000 (void)
++static void delay1000(void)
+ {
+ int i;
+
+ for (i=0; i<1000; i++)
+- delay ();
++ ctrl_delay();
+ }
+
+ static int put_smb_blk(unsigned char *p, int address, int command, int no)
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/overdrive/CVS/Entries linux-2.6.17/arch/sh/boards/overdrive/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/overdrive/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/overdrive/CVS/Entries 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,11 @@
++/Makefile/1.5/Sat Mar 26 20:25:35 2005//
++/fpga.c/1.2/Fri Nov 1 17:19:19 2002//
++/galileo.c/1.4/Mon Oct 25 10:41:01 2004//
++/io.c/1.2/Fri Nov 1 17:19:19 2002//
++/irq.c/1.4/Fri Oct 28 13:12:48 2005//
++/led.c/1.3/Sun May 4 19:29:47 2003//
++/mach.c/1.4/Tue Sep 9 00:14:07 2003//
++/overdrive.ttf/1.2/Fri Nov 1 17:19:19 2002//
++/pcidma.c/1.3/Mon Dec 27 23:14:24 2004//
++/setup.c/1.3/Sat Mar 26 20:25:35 2005//
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/overdrive/CVS/Repository linux-2.6.17/arch/sh/boards/overdrive/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/overdrive/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/overdrive/CVS/Repository 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/overdrive
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/overdrive/CVS/Root linux-2.6.17/arch/sh/boards/overdrive/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/overdrive/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/overdrive/CVS/Root 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/overdrive/overdrive.ttf linux-2.6.17/arch/sh/boards/overdrive/overdrive.ttf
+--- linux-2.6.17-vanilla/arch/sh/boards/overdrive/overdrive.ttf 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/overdrive/overdrive.ttf 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,770 @@
++255,255, 98,255, 51, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
++160, 9, 52,129, 38,208, 4,154, 64, 19, 0, 89, 96, 10,100,129,137,134, 85, 6,154, 0, 25,104, 2, 77,160, 76,148, 1, 0, 0, 0, 0, 0, 6,202, 0, 25, 0, 89,100,170, 9, 52,129, 38, 80, 6,154, 68, 19,112, 2, 96, 10, 76,149,129, 50, 64, 6,200, 0,188,254,
++ 0, 21,160, 2, 84,128, 10, 80, 1, 42,128, 10, 80, 1, 42, 64, 7,180,128, 10, 80, 1, 42, 64, 5,168, 0, 61,160, 2, 0, 0, 0, 0, 0, 9, 80, 1, 46,128, 10,120, 1, 21,160, 2, 84,128, 10,208, 3, 42, 64, 5, 80, 1, 42,160, 2, 84,128, 11,112, 1,204,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,128, 0, 16, 0, 0, 8, 0, 0, 0, 0,204,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0,124,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 12, 0,128, 2, 0, 0, 2, 0, 0, 0, 64,101,160, 0, 0, 0, 0, 0, 0, 0, 80, 0, 2, 0, 0, 74, 9, 0, 0, 0, 0,128, 66, 0, 2, 0, 0, 0, 0, 1, 32,160, 0, 4,160, 0, 16, 0, 72,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 8, 0, 0, 1, 0, 32, 2, 0, 0, 0, 1, 0, 0, 0, 12,128, 4, 0, 0, 0, 0, 0, 0, 80, 0, 8, 1, 0, 32, 0, 0, 0, 0, 0, 0, 2,130, 0, 0, 0, 0, 0,130, 8,128, 16,144, 0, 2, 0, 1,160,254,
++160, 9, 54, 0, 0, 16, 0, 18, 16, 0, 72, 68, 0, 32, 0, 0, 0, 0,208, 0, 0, 64, 34,104, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 80, 24, 26, 64, 33, 1, 0, 1, 32,144, 36,192, 66, 4, 0, 26, 64, 3, 8, 0, 1,160, 16, 0,128, 66, 18, 0, 2, 0,240,252,
++ 0, 1, 48, 0, 0, 0, 0, 8, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0,192, 0, 0, 0, 1, 2, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 24, 0, 2, 0, 0, 0, 0, 0, 16, 0, 4, 0, 0, 24, 0, 3, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 16,204,253,
++128, 1, 60, 0, 0,240, 0, 22, 0, 0, 88, 0, 0,224, 1, 0, 0, 0,240, 0, 0,192, 2, 96, 16, 7, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 30,192, 1, 0, 0, 12, 96, 0, 44,128, 3, 0, 0, 30,192, 3, 0, 0, 12,224, 0, 0,128, 3,240, 0, 0, 4, 72,252,
++128, 5, 54, 0, 0,208, 0, 10, 0, 0, 40, 0, 0,160, 1, 0, 0, 0,208, 0, 0, 64, 1, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0,128,132, 26, 64, 2, 0, 0, 64, 33, 40, 20,128, 4, 0, 0, 26, 64, 3, 0,130, 76, 33, 1, 0,128, 64,209, 0, 0, 0,200,252,
++128, 5, 0, 10, 0, 0, 2, 16, 0, 0, 64, 0, 0, 0, 4, 0, 0, 0, 0,128, 0, 0, 2, 0, 18, 4, 0, 0, 0, 0, 0, 0, 0, 0, 64, 8,128, 0, 1, 0, 0, 44,128,132, 32, 0, 2, 0, 0,128, 0, 0, 0, 4, 0,130, 0, 0, 0, 64,193, 34, 0, 1,188,255,
++224, 65, 8, 0, 0, 32, 64, 12, 0, 0, 56, 0, 0, 64,128, 0, 0, 0, 48, 0, 0,128, 1,120, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0,176, 64, 6,136, 2, 0, 0, 15, 68, 1, 24, 0, 5, 0, 0, 6,144,128, 24, 32, 15, 64, 1, 0, 0, 1,224, 0, 6, 8, 0,253,
++128, 1, 1, 0, 0, 0, 32, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 96, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 1, 0, 0, 12, 2, 64, 32, 0, 2, 0, 0, 0, 64, 0, 96, 64, 12,128, 0, 0, 0, 0, 0, 0, 0, 16,112,252,
++128, 5, 0, 0, 0, 0, 0, 8, 0, 0, 40, 0, 0, 0, 8, 2, 0, 0, 16, 0, 0, 0, 1, 96, 10, 9, 0, 0, 0, 0, 0, 0, 0, 0,128, 4, 2, 64, 2, 0, 0, 76, 0, 5, 16,128, 4, 0, 0, 2, 64, 0, 0, 2, 76, 36, 1, 0, 0, 20, 2, 36,136, 0, 20,254,
++ 32, 16, 53, 0, 0, 16, 0, 18, 1, 0, 40, 33, 0, 32, 0, 0,128, 6,208, 0, 0, 64, 0, 0, 0, 5, 8, 0, 4, 0, 0, 0, 0, 0, 16, 0, 26, 0, 0,104, 0, 0, 32,144, 4,128, 0, 1, 0, 18, 80, 0,104, 0, 0, 0, 0, 4,128, 66,210, 0, 2, 0,200,255,
++ 0, 0, 48, 0, 0, 0, 0, 8, 16, 0, 64, 0, 0, 0, 0, 0, 0, 6,192, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,120,252,
++ 0, 0, 60, 0, 0,192, 0, 22, 0, 0, 56, 0, 0,224, 1, 0,128, 7,240, 0, 0,192, 0, 0, 0, 7, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0,120, 0, 0, 96, 0, 48, 0, 6, 4, 0, 22,192, 3,120, 0, 0, 0, 0, 0,128, 3,240, 0, 0, 4,172,254,
++ 8, 0, 54, 0, 0,192, 0, 10, 0, 0, 72, 0, 0,160, 1, 0,128, 6,208, 0, 0, 64, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 0, 0,132, 26, 0, 0,104, 0, 0, 32, 40, 48, 5, 16, 0, 0, 10, 64, 3,104, 0, 0, 0, 0,128,144, 32, 17, 32, 0,128, 92,255,
++ 0, 8, 48, 0, 0,192, 2, 16, 0, 0, 32, 0, 0, 0, 4, 0, 0, 16, 0, 0, 0, 0, 19, 0, 0, 4, 0, 0, 48, 2, 0, 0, 0, 0, 0, 4, 0, 16, 0, 0, 20, 0,128, 4, 48, 18, 18, 2, 0, 16, 0, 3, 0, 32, 0, 0, 0, 0, 10, 64, 1, 34, 0,129, 1,252,
++ 96, 64, 56, 0, 0,240, 64, 12, 0, 0, 80, 0, 0, 64,128, 0, 0, 1, 52,128, 0,128,131, 0, 0, 10, 0, 0, 12, 8, 0, 0, 0, 0, 48, 64, 6, 0, 0, 24, 0, 0, 64, 65, 12,128, 5, 0, 0, 14,128,131, 24, 0, 0, 0, 0, 60, 0, 1,224, 0, 6, 8,100,254,
++ 4, 0, 52, 0, 0,192, 0, 16, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 3, 0, 0, 4, 0, 0, 48, 0, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 64, 48, 0, 2, 0, 0, 16, 64, 0, 0, 0, 0, 0, 0, 0, 32, 0,192, 0, 0, 16, 13,255,
++ 0, 73, 52, 0, 0,192, 34, 8, 0, 0, 64, 0, 0, 0, 72, 0, 0, 0, 16, 0, 0, 64, 3, 0, 0, 9, 0, 0,176, 8, 0, 0, 0, 0, 0, 64, 2, 0, 0, 8, 0, 0, 0, 5,176, 8, 38, 2, 0, 8, 64,128, 8, 0, 0, 0, 0, 0, 1, 20, 2, 36,144, 0,116,254,
++160, 1, 6, 0, 0, 16, 0, 26, 0, 0, 40, 64, 0, 32, 0, 0,128, 0, 16, 0, 0, 64, 35, 1, 0, 73, 4, 0, 52, 0, 0, 0, 0, 0, 16, 0, 26, 0, 0,104, 0, 0, 32,144, 4,128, 66, 2, 0, 2, 64,163, 8, 0, 0, 0, 0, 4,128, 66,210, 0, 18, 3,236,255,
++ 0, 1, 0, 0, 0,192, 0, 24, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 4, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 96, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 36,255,
++128, 1, 48, 8, 0,240, 32, 30, 0, 0, 56, 0, 0,224, 1, 0, 0, 6,192, 0, 0, 0, 3, 0, 0, 11, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0,120, 0, 0, 96, 0, 48,128, 3, 0, 0, 24, 0, 3, 1, 0, 0, 0, 0, 0,128, 3,192, 32, 16, 0,220,255,
++132, 41, 0, 0, 0,208, 4, 26, 0, 0, 72, 0, 0,160, 1, 0, 0, 6, 0, 20, 0, 0,163, 0, 0, 5, 0, 0, 52, 0, 0, 0, 0, 0, 0,132, 26, 0, 0,104, 0, 0, 32, 40, 48,137, 4, 0, 0, 0, 8, 35, 0,130, 0, 0, 0,128,144, 0,193, 8, 24, 32,121,253,
++ 4, 4, 0, 34, 0, 0, 2, 24, 0, 0, 32, 0, 0, 0, 4, 0, 0, 22,192, 32, 0, 0, 16, 1, 0, 8, 0, 0, 48, 0, 0, 0, 0, 0, 0, 8, 0, 8, 0, 0, 2, 0,128, 8,176, 0, 2, 0, 0, 88, 4, 3, 0, 8, 0, 0, 0, 0, 10, 64,193, 40, 88, 0, 76,254,
++ 96,128, 12, 0, 0, 32, 64, 28, 0, 0, 80, 0, 0, 64,128, 0,128, 7,242, 0, 0,192, 3, 0, 0, 7, 0, 0, 56, 0, 0, 0, 0, 0, 48, 64, 6, 0, 0, 24, 16, 0, 64, 65, 12, 32, 5, 0, 0, 30,192,131, 24, 0, 0, 0, 0, 12, 0, 1,240, 0, 14, 16,212,254,
++136, 65, 0, 0, 0, 0, 0, 24, 0, 0, 32, 0, 0, 0, 0, 0, 0, 6,192, 0, 0, 0, 3, 0, 0, 8, 0, 0, 48, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 64, 48, 0, 2, 0, 0, 24, 0, 3, 96, 0, 0, 0, 0, 48, 32, 0,192, 0, 24,128, 48,253,
++128, 9, 0, 9, 0, 0, 34, 24, 0, 0, 64, 0, 0, 0, 64, 0, 0, 70,193, 32, 0, 0,131, 0, 0, 4, 0, 0, 52, 0, 0, 0, 0, 0,192, 4, 0, 0, 0, 8, 0, 0, 0, 5, 48,144, 4, 0, 0, 88, 8,131, 0, 32, 0, 0, 0, 0, 1, 20,194, 40, 24, 5,208,252,
++ 32, 8, 4, 0, 0, 16, 0, 82, 8, 0, 8,132, 0, 32,132, 0,128, 0,208, 0, 0, 64, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0,208, 0, 26, 0, 0, 40, 17, 0, 32,144, 4,137, 16, 17, 0, 26, 64,163, 8, 0, 0, 0, 0, 0,128, 66, 18, 0, 82, 0,172,255,
++ 0,128, 0, 0, 0,192, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,128, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8,112,253,
++ 0, 64, 0, 0, 0, 48, 32, 22, 0, 0, 32, 0, 0,128, 0, 0,128, 7,240, 0, 0,192, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0,192, 64, 30, 0, 0, 56, 16, 0, 96, 0, 12, 8, 6, 48, 0, 24, 4, 3, 96, 0, 0, 0, 0, 0,128, 3,241, 0, 0, 16,232,253,
++ 8, 0, 0, 0, 0, 16, 4, 10, 0, 0, 64, 17, 0,128, 65, 0,128, 6,209, 0, 0, 64, 0, 0, 0, 44, 2, 0, 0, 0, 0, 0, 0, 0,192, 4, 26, 0, 0, 8, 0, 0, 32, 40, 4, 0, 16, 17, 0,152, 0, 64, 0, 18, 0, 0, 0, 0,128, 16,208,136,128,128, 48,253,
++ 0, 8, 49, 33, 0, 0, 2, 16, 0, 0, 0, 1, 0, 0, 4, 0, 0, 16, 0, 66, 0, 0, 11, 0, 0, 32, 4, 0, 48, 1, 0, 0, 0, 0,128, 4, 0, 1, 0, 0, 4, 0,128, 0,144, 8, 18,194,130, 88, 8,136, 96, 16, 0, 0, 0, 0, 0, 64, 1, 68, 80,144, 93,254,
++ 96, 0, 60, 0, 0, 32, 64, 12, 0, 0,120, 64, 0, 96,128, 0, 0, 1, 50, 0, 0,128, 3, 2, 0, 15, 0, 0, 60, 16, 0, 0, 0, 0,240, 64, 6, 8, 0, 16, 64, 0, 64, 65, 40,128, 5,224, 0, 30,192, 2,120, 0, 0, 0, 0, 0, 0, 1,224, 0, 22, 0, 80,255,
++132, 65, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0,128, 65, 0, 0, 0, 0, 0, 0, 64, 3, 0, 0, 12, 2, 0, 0, 16, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 2,208, 0, 24, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0,192, 0, 16, 0,113,252,
++ 0, 17, 0, 9, 0, 0, 34, 8, 0, 0, 96, 10, 0,128, 5, 0,128, 64, 1, 0, 0, 64, 3, 0, 0,140, 0, 0, 0, 1, 0, 0, 0, 0,192,130, 0, 0, 0, 64, 2, 0, 0, 5, 36, 66, 38,210, 0,152, 8, 35, 96, 16, 0, 0, 0, 0, 0, 20, 2, 40, 16, 16,120,252,
++160, 49, 4, 0, 0,208, 0,146, 96,160, 72, 4,137, 32, 0, 0,128, 0,208, 0, 0, 64, 0,104, 0, 1, 0, 0, 52, 0, 0, 0, 0, 0,208, 0, 26, 0, 0, 40, 17, 0, 32,144, 52,128, 64, 81, 4, 2, 64, 3,104, 0, 0, 32, 17, 0,128, 0, 16, 8, 2, 0, 40,254,
++128, 1, 0, 0, 0, 0, 0, 8, 0, 0, 32, 64, 4, 4,128, 0, 0, 0,192, 0, 0, 0,128, 96, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0,192,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 0, 0, 3, 96, 0, 0,128, 0, 1, 0, 0, 0, 32, 0, 0,248,253,
++128, 0, 0, 0, 0, 0, 64, 22, 0,131, 88, 0, 11,128, 0, 0, 0, 0,241, 0, 0, 0, 1,120, 0, 12, 0, 0, 60, 0, 0, 0, 0, 0,192, 64, 24, 0, 0, 56, 0, 0, 96, 0, 0, 0, 6, 0, 0, 24,192, 3,120, 0, 0, 96, 1, 0,128, 1,241, 0, 0, 4,208,252,
++ 4, 9, 1, 0, 0, 0, 0, 10, 0, 16, 40, 0, 5,128, 73, 0, 0, 38,208, 0, 0, 0, 19,108, 0, 76, 2, 0, 52, 0, 0, 0, 0, 0,128, 4, 64, 16, 0, 8, 20, 0, 32, 40, 0, 9, 32, 1, 68, 0, 96, 3,104, 0, 0,160, 0, 0,128, 6,208, 36, 0,128,192,252,
++ 12, 64, 0, 33, 0,192, 64, 16, 0, 9, 65, 0, 8, 0, 4, 0, 0, 22, 0, 8, 0, 0, 16, 1, 33,128, 4, 0, 0, 64, 0, 0, 0, 0,192, 2,128, 0, 0, 0, 4, 0,128, 64,128, 32, 18, 66, 4, 88, 0, 3, 0, 68, 0, 0, 1, 0, 0, 38, 1, 34, 0,129, 65,255,
++224, 1, 12, 0, 0,240, 0, 12,192, 2, 48, 0, 7, 96,128, 0,128, 7, 50,128, 0,192, 0, 24, 0, 15, 0, 0, 12, 0, 0, 0, 0, 0,240,128, 30, 4, 0, 16, 64, 0, 64, 1, 12,128, 5,240, 32, 30,132, 3, 24, 0, 0,224, 0, 0, 0, 7,160, 0, 30, 8, 84,253,
++ 8, 0, 48, 0, 0,192, 32, 16, 0, 1, 66, 0, 8,128, 1, 0, 0, 6, 0, 0, 0, 0,128, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0,192,128, 24, 0, 0, 0, 16, 0, 0, 64, 0, 0, 2, 0, 0, 24, 0, 3, 0, 0, 0, 0, 1, 0,128, 6,193, 32, 0, 16, 17,254,
++ 0, 17, 50, 9, 0,192, 4, 8, 0, 35, 32, 0, 4,128, 81, 0, 0, 70, 1, 0, 0, 0, 0, 8, 0, 76, 16, 0, 0, 0, 0, 0, 0, 0,192, 4, 24, 32, 0, 64, 2, 0, 0, 5, 0, 33, 38,194, 20,152, 4, 3, 0, 0, 0,128, 0, 0,128, 38, 64, 8,128, 0, 88,254,
++ 32, 0, 4, 0, 0, 16, 0, 18, 1, 0, 8, 0, 69,168, 1, 0,128, 6, 16, 0, 0, 64, 98, 72, 64, 41, 8, 0, 4, 0, 0, 0, 0, 0, 16, 0, 2, 64, 34, 9, 0, 0,160,144, 20,128, 68, 18, 0, 26, 64, 0,104, 0, 0, 32, 0, 4,128, 66, 18, 4, 26, 0, 46,255,
++ 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 16, 0,128, 1, 0, 0, 0, 0, 0, 0, 0, 1, 32, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0,128, 24, 16,192,254,
++ 96, 0, 48, 0, 0, 0, 0, 22, 0, 0, 96, 32, 4,128, 1, 1, 0, 6,192, 0, 0,192, 2, 88, 0, 11, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 24,200, 2, 96, 0, 0,224, 64, 12,136, 5, 48, 0, 24, 4, 0, 96, 0, 0,128, 1, 0,128, 3, 0, 32, 24, 4,184,254,
++ 40, 0, 48, 0, 0,192, 40, 10, 0, 0, 0, 4, 64, 1, 16, 0, 0, 6, 4, 20, 0, 64, 1, 40, 0, 5, 0, 0, 0, 32, 0, 0, 0, 0, 0,132, 24, 65, 1, 96, 0, 0, 32, 16, 4,128, 2, 16, 0, 0, 0, 0, 96,130, 0,128, 73,128,160, 64, 2, 0, 24,128,173,252,
++128, 81, 48, 0, 0, 0, 2, 16, 0, 0, 32, 1, 32,132, 5, 0, 0, 64,192, 40, 0, 0, 2, 64, 0, 8, 0, 0, 48, 8, 0, 0, 0, 0, 0, 4, 0, 1, 2, 0, 1, 0, 0, 68,128, 32, 4,192, 24, 0, 1, 0, 96, 64, 0, 0, 0,128, 32, 64, 1, 2, 24,144, 8,254,
++192, 1, 60, 8, 0, 48, 64, 12, 0, 0, 88, 32, 11,224,129, 0,128, 1,241, 0, 0,128, 1, 56, 0, 6, 0, 0, 60, 0, 0, 0, 0, 0, 48, 64, 30,196, 1, 24, 32, 0, 64, 0, 8,128, 3,224, 0, 30,208,128, 24, 0, 0,224,129, 12, 0, 1, 48, 64, 22, 0,213,252,
++132, 1, 48, 8, 0,192, 0, 16, 0, 0, 32, 64, 12,130, 1, 0, 0, 6,192, 0, 0, 0, 2, 64, 0, 8, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 24, 4, 2, 0, 0, 0, 0, 0, 0, 0, 4,192, 0, 24, 0, 3, 96, 64, 0,128, 65, 0, 0, 0, 0, 0, 24, 8,247,255,
++128, 1, 48, 0, 0,192, 32, 8, 0, 0, 96, 4,140,128, 69, 0, 0, 70,194, 36, 0, 0, 1, 32, 0, 5, 0, 0, 48, 8, 0, 0, 0, 0,192, 64, 24, 1, 1, 0, 10, 0, 0, 41, 4, 33, 2,192, 0,152, 2,131, 96, 4, 0,128, 9, 48, 32, 20,130, 40, 88, 0,112,253,
++ 48, 0, 4, 0, 0, 16, 0, 18, 66, 66, 8, 12, 1,160, 17, 4,128, 64, 82, 2, 1, 64, 19, 8, 0, 1, 32, 0, 4, 0, 0, 0, 0, 0, 80, 24, 26, 64, 0, 40, 8, 0,160, 1, 4,128, 68,212, 0, 2, 81, 3,104, 0, 0,160, 1, 4,128, 66,210, 4, 66, 0, 42,254,
++ 0, 0, 0, 0, 0, 0, 0, 8, 0, 1, 0, 0, 0, 0, 65, 0, 0, 0,128, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 8, 88,255,
++128, 1, 12, 0, 0,240, 0, 22,192, 2, 32, 0, 12,130, 1, 48, 0, 6,192, 0, 0, 0,129, 96, 64, 12,128,129, 48, 16, 0, 0, 0, 0, 64, 0, 24, 0, 3, 24, 16, 0, 96, 64, 60,128, 5,192, 0, 8,192,131, 96, 0, 0,128, 65, 0,128, 3,241, 32, 0, 0,212,252,
++140, 1, 4, 0, 0,208, 0, 10, 64, 1, 64, 16, 64,128, 73, 48, 0, 0,196, 72, 0, 0, 10, 96, 1, 76,136, 17, 0, 0, 0, 0, 0, 0,128,132, 64, 8,147, 8, 2, 0, 32, 16, 52,128, 2, 0, 66, 16, 68, 0, 96,130, 0, 0, 4,128,160, 32, 16, 0, 64,144,101,252,
++ 4, 4, 48, 0, 0, 0, 2, 16, 0, 2, 0, 1, 44, 2, 4, 0, 17,130, 64, 4, 0, 0, 32, 0, 0, 0, 0, 64,176, 8, 0, 0, 0, 0, 64, 4, 64, 0, 0, 0, 0, 0,128, 81, 0, 1, 4, 0, 34, 64, 8, 0, 0, 8, 0, 0, 4,129, 32, 64, 1, 2, 64,144, 80,255,
++ 96,128, 56, 8, 0, 32, 64, 12,192, 1,120, 64, 15, 96,128, 12,128, 5,240, 32, 0,192,131,120, 32, 15,228, 1, 60, 0, 0, 0, 0, 0,176, 64, 30,196, 3, 17, 64, 0,192, 1, 8,144, 3,240, 0, 30,128,131,120, 0, 0,224, 1, 60, 0, 1,224, 64, 6, 0, 29,255,
++ 12, 0, 48, 0, 0, 0, 0, 16, 0, 2, 32, 0, 12, 0, 0, 0, 0, 2,192, 0, 0, 0, 0, 96, 16, 12,128,129, 48, 0, 0, 0, 0, 0, 0, 0, 24, 0,131, 0, 0, 0,160, 65, 0, 0, 4,192, 0, 8, 64, 3, 96, 64, 0,128,129, 0, 0, 0, 64, 0, 0, 0,167,255,
++ 0, 40, 48, 0, 0, 0, 40, 8, 0, 1, 96, 10, 76, 4, 68, 0, 4, 22,193,136, 0, 0,162, 96, 2,140,130, 9,176, 16, 0, 0, 0, 0,128, 64, 24, 32, 19, 0, 32, 0,160, 5, 4, 9, 2,192,128,152, 72,128, 96, 4, 0,128, 1, 0, 32, 20, 66, 40, 8, 16,208,254,
++ 32, 0, 4, 0, 0,208, 0,146, 72, 65, 8, 0,133, 32, 0, 0,128, 0, 80, 8, 2, 64, 0, 8, 0,137,160, 1, 4, 0, 0, 0, 0, 0,208, 0, 2, 64, 0, 8, 0, 13, 32,144, 4,137,132, 16, 0, 90, 64, 0, 8, 0, 13, 32, 4, 4,128, 66,210, 0, 26, 0,140,255,
++ 0, 0, 0, 0, 0,192, 0, 8, 0, 2, 0, 0, 8, 4, 0, 0, 0, 6,128, 64, 0, 0, 0, 0, 0, 4,136, 1, 0, 0, 0, 0, 0, 0,192,128, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 2, 0, 0, 16, 16, 0, 0, 0, 12, 0,128, 0, 0, 0, 0, 0, 24, 0,240,254,
++128, 1, 48, 0, 0,240, 0, 22,192, 1, 96, 0, 7,224, 1, 0,128, 1,192, 0, 6,192, 0, 96, 16, 11,224, 1, 48, 16, 0, 0, 0, 0,192, 64, 24, 8,131,120, 0, 15, 96, 0, 12,136, 5,192, 64, 24, 8, 0, 96, 32, 15,128, 64, 48,136, 3,192, 0, 24, 0, 92,254,
++136, 1, 0, 10, 0,208, 0, 10, 64, 2, 96, 34, 9,160, 1, 0,128, 0,193, 72, 2, 64, 0, 96, 1, 5,160, 1, 48, 2, 0, 0, 0, 0,192, 4, 24, 1, 11,104, 0, 13, 32, 40, 4,128, 2,192, 0, 24, 0, 0, 96, 0, 13, 0, 17,128,128, 16,193, 36, 24, 0, 17,253,
++ 0, 4, 48, 8, 0, 0, 2, 16, 0, 1, 0, 36, 4, 0, 4, 0, 0, 16, 64, 36, 88, 0, 35, 0, 1, 8, 0, 8, 0, 9, 0, 0, 0, 0, 64, 4, 0, 0, 8, 1, 32, 32,132,128, 16, 2, 4, 0, 4, 24, 33,136, 0, 18, 32, 0,132, 0, 32, 64,193, 2, 24, 3,152,255,
++ 96,128, 12, 0, 0, 32,128, 12,128, 2,120, 0, 10, 64,128, 0, 0, 1,242, 0, 28,136,131,120, 32, 6, 96, 0, 61, 0, 0, 0, 0, 0,240, 64, 30,196, 3, 16, 0, 3, 64, 1, 40,160, 3,240, 32, 30,192, 0,120, 0, 3,232, 1, 12, 0, 1,240, 32, 30, 0,248,255,
++ 4, 64, 48, 0, 0, 0, 0, 16, 0, 1, 96, 0, 4, 0, 0, 0, 0, 0,192, 0, 24, 64, 3, 96, 32, 8, 0, 0, 48, 0, 0, 0, 0, 0,192, 0, 24, 4, 3, 0, 0, 0, 0, 64, 0, 0, 4,192, 32, 24, 0,131, 96, 0, 0,128, 0, 0, 0, 0,192, 0, 0,128, 24,255,
++ 0, 4, 48, 8, 0, 16, 0, 8, 64, 2, 96, 20, 9, 0, 68, 0,128, 64,193,136, 24, 64, 3, 96, 2, 5, 0, 0, 48, 17, 0, 0, 0, 0,192,130, 24, 0, 11, 1, 10, 0, 0, 5, 36, 66, 2,192, 0, 24, 8, 35, 96, 68, 0,128, 41,128, 16, 20,194, 32, 0, 32, 52,253,
++ 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0,144, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 50,252,
++ 32, 0, 0,144, 0, 0, 0, 2, 0, 0, 0, 0, 0, 32, 0, 4,128, 0, 0, 0, 2, 64, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 1, 32, 0, 1, 0, 0, 0, 64, 0, 0, 0, 0, 0, 1, 0, 0, 4,128, 0, 18, 0, 2, 0,180,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 1, 64, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0,128, 0, 16, 0, 0,128, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,216,255,
++ 36, 0,128,136, 0, 16, 20, 2, 64, 64, 8, 68, 1, 33, 0, 4,128, 32, 18, 8, 2, 0, 8, 8, 4,129, 32, 0, 4, 5, 0, 0, 0, 0, 16, 0, 66, 64, 64, 8, 1, 1, 0, 16, 4,129,128, 0, 0, 2, 2, 0, 8, 8, 1, 32, 32, 4, 0, 0, 16, 0, 2,128, 89,252,
++ 4,128, 0, 6, 0, 0, 24,128, 16, 0, 1, 32, 0, 4, 48, 0, 0,192, 0, 0, 0, 3, 16, 2, 0,128, 1, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 12, 0, 0, 48, 0, 6, 0, 2, 0, 0, 0, 8, 0, 0, 0, 0,128, 0, 0,192, 0, 4, 0,128, 64,253,
++ 32, 0, 0,128, 0, 16, 0, 0, 0, 0, 0, 0, 0, 32, 0, 4, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 64,128, 0, 0, 0, 0, 0, 4, 0, 0, 0, 64, 2, 0,193,252,
++ 8,128, 0, 0, 0, 0, 64, 0, 16, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 8, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 64, 0, 0,128, 0, 16, 0, 4, 64, 0, 16, 0, 2, 64, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0,111,252,
++ 0, 4, 0,133, 0, 0, 2, 0, 0, 16, 1, 36,128, 8, 8, 4, 0, 64, 16,130, 64, 0, 8, 8, 68,128, 40, 4,129, 32, 0, 0, 0, 0, 16, 0, 2, 2, 32, 0, 0, 1, 1, 16,128, 0, 64, 0, 4, 2, 1, 32, 8, 1, 1, 1, 16, 4, 0, 0, 0, 8, 3, 0, 72,252,
++ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,252,
++ 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,254,
++ 0, 32, 0, 0, 0, 0, 0, 64, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 16, 0, 0, 0, 0, 8,220,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 32, 0, 0, 0, 0, 16, 0, 28,254,
++ 0, 0, 0, 0, 0, 0, 0, 32, 0, 1, 0, 0, 20, 0, 0, 0, 0, 0,128, 0, 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 8, 0, 0, 0, 64, 0,128, 0, 0, 0, 0, 0, 0, 0, 0,108,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0,128, 0, 80, 0, 0, 0, 0, 0, 0, 64, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 32,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,180,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 8, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 32, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 16,148,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 64, 0,240,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 64, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 4, 0, 0, 0, 0, 2,182,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,255,
++ 0, 0, 0, 0, 4, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,132, 0, 0, 0, 0, 1, 0, 16, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0,128, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0,140,255,
++ 0, 0, 0, 0, 2, 0, 32, 0, 4, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 64, 0, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 32, 32, 0, 0, 0, 0, 8, 2, 0, 0, 0, 4,124,255,
++ 0, 0, 0,136, 1, 0,128, 4, 16, 6, 0, 0, 0, 0, 0, 4, 0, 1,130, 2, 0,144, 0, 2, 32, 2, 8, 0, 0, 0, 0, 0, 0, 0, 80, 64, 2, 16, 0, 16, 0, 64,193,168, 0, 0,180, 0, 0, 0, 0, 0, 74, 65, 0, 0, 64,168,160, 0, 64, 0,128, 18, 60,255,
++ 0, 0, 0, 1,210,128, 0, 8, 4, 2, 0, 0, 0, 2, 64, 0, 0,132, 64, 0, 0, 0, 0, 0, 12, 8,128, 0, 16, 0, 0, 0, 0, 0, 0, 32,208, 0,160,144, 16,152,165, 32, 52,136,130,128, 0, 10, 64, 17, 16, 0, 0, 0, 3, 96, 9,128, 1, 90, 0, 0,180,253,
++ 0, 0, 0,128, 0, 0, 0, 8, 4, 0, 0, 0, 0, 8, 0, 1, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 1, 32, 0, 0, 0, 0, 0, 0, 32, 0, 0,128, 0, 64, 0, 0, 1, 16, 8, 4, 0, 0, 16, 0, 2, 0, 0, 0, 0, 0, 0, 8, 0, 1, 0, 0, 0,156,252,
++ 0, 0, 0, 0, 0,129, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 4, 8, 64, 32, 0, 0,129, 0, 0, 0, 0, 0, 0, 0,128, 0, 16, 0, 0, 2, 32, 0, 0,112,255,
++ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 64, 90,253,
++ 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 8, 0, 68, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 4,128, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,254,
++ 0, 0, 0, 0, 0, 0, 32, 0, 32, 0, 0, 64, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 24, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0,112,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0,192,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 0, 20, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0,180,254,
++128, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 8, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,124,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 32, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 2, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0,152,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20,253,
++ 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,252,
++ 64, 0, 4, 0, 0, 16, 0, 0,128, 0, 16, 0, 2, 32, 0, 4,128, 0, 64, 0, 2,128, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0,128, 0, 8, 0, 0, 32, 0, 4, 4, 1, 0, 0, 0, 72, 0, 0, 0, 0, 64, 0, 0,128, 0, 0, 0, 0, 0, 96,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 16, 0, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 4, 80,255,
++ 0, 0, 64, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 32,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,252,
++ 0, 4, 5, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 0, 0, 0,228,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0,128,252,
++ 8, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,236,252,
++ 2, 0, 0, 0, 4, 64, 0, 8, 4, 0, 32, 16, 0, 0, 64, 16, 0, 2, 1, 32, 0, 0,128, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,129, 16, 0, 4, 0, 0, 0, 8,128, 0, 0, 4, 0,129, 32, 0, 0, 0, 0, 0, 8, 2, 0, 0, 8,192,108,254,
++ 64, 0, 0, 0, 1, 1, 0, 0, 0,128, 0, 0, 4,128, 0, 4, 0, 0, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 4, 0, 0, 0, 4, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 32, 0, 0,128, 0, 0, 8, 0, 0, 0, 0, 64,219,253,
++ 32, 64, 0,128, 1, 36, 0, 4, 8, 0, 18, 32,129, 35,128,108, 6, 1, 3, 64, 0, 16, 0, 1, 0, 1, 0, 5, 8, 0, 0, 0, 0, 0, 0, 20, 2,148, 0, 17, 0, 3, 0, 0, 0, 16, 0, 6, 20, 4,128, 0, 57, 0, 0, 32, 0, 0, 48, 1, 0, 32, 4, 0,160,253,
++128, 8, 48, 8, 96,129, 0, 8, 68, 0, 32, 0, 66,128, 0, 0, 0,197, 0, 4, 24, 0, 1, 0, 12, 4, 0, 5, 16, 34, 0, 0, 0, 0,128, 72,194, 3,119, 32, 0, 32,194, 65, 24, 45,206, 64, 4, 52, 0,129, 0, 24, 0, 0, 0, 16, 1,128, 0, 92, 80, 0, 48,254,
++128, 0, 16, 8, 0, 1, 0, 8, 4, 0, 32, 0, 0,128, 0, 0, 0, 0, 0, 0, 8, 0, 1, 0, 0, 4, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 16, 0, 0,129, 64, 16, 8, 1, 64, 0, 0, 0,129, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0,136,255,
++ 0, 0, 8, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 8, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 0, 0, 32, 0, 0, 4,129, 0, 0, 0, 64, 0, 0, 4, 2, 1, 0, 8, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 1, 32, 8, 0,180,255,
++ 16, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,134,253,
++ 2, 0,128, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 8,128, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 64, 48,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 32, 0, 64, 0, 0, 0, 0, 0, 0, 0, 4, 0, 16, 1, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,180,252,
++ 2,160, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 16,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 56,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0,152,253,
++ 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 32, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,253,
++ 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 8, 0,136, 0, 0, 0, 0, 0, 0, 0, 18, 2, 0, 32, 0, 1, 0, 0, 0, 0, 0, 16, 16, 2, 0, 0, 8, 8, 1, 0, 0, 0, 0, 4, 0, 32, 0, 0, 88,254,
++ 32, 1, 0, 0, 0,128, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 16, 0, 0, 0, 0, 4, 0, 0, 0, 0,113,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 16, 0, 32, 0, 0, 0, 0, 0, 0, 0, 64,182,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 64, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 16, 0, 0, 0,228,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0,116,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 48, 0, 0, 0,132,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 8, 0, 16, 0, 0, 0, 48,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 16, 0,192, 8, 0, 0, 64,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0,224, 32, 0, 0, 4,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0,192, 0, 0, 0,208,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 18, 0,192, 0, 0, 0,196,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 18, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 66, 2, 0, 10,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,128, 6, 0, 20,254,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 4, 2,128,225,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 24,130, 28,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 32, 28, 0,129,253,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 0, 24, 0, 63,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 36, 24, 0, 12,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,148, 64, 0,208, 8, 0, 0,248,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0,192, 64, 0, 0,176,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 64, 0, 0,188,255,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0,109,252,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0,192, 68, 0, 0, 80,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 48, 0, 0, 0, 4,252,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0,128, 0, 0,128,152,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 20, 0, 0, 8,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 34, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,164, 64, 0,208, 0, 10, 9, 96,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0,192, 0, 16, 0,228,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0,192, 0, 14, 0, 68,253,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0,192, 36, 18, 0, 89,253,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0,192, 68, 8, 0,220,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0,240, 0, 20, 0,112,252,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0,192, 64, 8,128, 16,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 16, 0, 40,254,
++ 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 16, 0, 0, 0, 94,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 0, 0, 32, 0, 0, 12,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0,192, 64, 0, 0,204,255,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0,192, 2, 0,128,101,254,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0,128, 0,128,100,253,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 48, 0, 0, 0,229,255,
++ 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 64, 64, 0, 0,139,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 28,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 16, 36, 0, 0,208,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 16, 0, 0, 0, 0, 0, 44,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0,192, 0, 0, 0,168,254,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0,192, 64, 0, 0, 41,253,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0,192, 68, 0, 0,144,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0,176, 0, 0, 0, 0,253,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0,192, 0, 0,128,220,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0,192, 20, 0, 0,128,254,
++ 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 5, 4, 0, 0, 16, 0, 2, 0,246,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128, 0, 0, 0, 0, 0, 0, 0,180,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 96, 1, 48, 16, 0, 48, 0, 6, 0,144,252,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0, 48, 1, 0, 16, 0, 2,128, 93,254,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,192, 8, 24,130,156,255,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0,224, 0, 60, 32, 0,224, 32, 28, 0, 68,255,
++ 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 48, 8, 0,192, 0, 24,128,109,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 48, 1, 0,192, 0, 24, 0,236,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 38, 0, 0, 0, 0, 0, 0, 0, 0, 32, 80, 4, 9, 0,208, 16, 74, 8, 20,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 44,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0,128, 1, 48, 8, 0,128, 0, 14, 0,216,252,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 0, 0, 0, 0,144,128, 0, 0, 0, 36, 18, 0, 85,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,128,132,144, 16, 0, 0, 68, 8, 0, 40,252,
++ 0, 0, 0, 0, 0, 0, 0, 0,192, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0, 0, 0, 0, 0, 0, 0, 96, 1, 44, 0, 0,240, 0, 20, 0,252,255,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0,128, 0, 16, 0, 0, 0, 64, 8,128,224,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0,128,129, 48, 18, 0, 0, 2, 16, 0,172,255,
++ 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,255,
++ 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4, 0, 0, 0, 0, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 0,128, 0, 16, 0, 2, 0,116,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 44, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4, 0, 0, 0, 0, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,132, 0, 16, 0, 2,128,105,253,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 2, 64,128, 72,252,
++ 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4, 0, 0, 0, 0, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4, 0, 0, 18, 0, 2, 64, 0, 8, 0, 1, 0, 0, 0,144, 0, 0, 64, 0, 8, 12,253,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 32, 0, 0, 0, 0,128, 85,255,
++ 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4, 0, 0, 0, 0, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4, 0, 32, 24, 0, 2, 64, 0, 8, 0, 1, 32, 16, 0,130, 0, 0, 4,129, 32,104,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 32, 0, 0, 0, 2, 0, 0, 28,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 16, 0, 0, 0, 0, 0, 0,188,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,120,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,255,
++ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,129, 0, 16,202,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 88,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8,228,255,
++ 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8,176,254,
++ 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 74, 66, 1, 64, 16,228,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 88,254,
++ 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 52,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0,120,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 88,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0,124,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0,148,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 4, 0, 0, 0, 0, 0, 24,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 60,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,180,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 13,255,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,188,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0,176, 0, 16, 0, 40,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 36,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 22,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 8,254,
++ 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0,128, 1, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,192, 2, 0, 2, 0, 0, 16, 0, 0, 0, 0, 0, 0,160, 0,128, 4, 0, 36,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0,192, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 64, 16, 0, 0, 0, 64, 0, 0,128, 0,128, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0, 0, 0,100, 66, 48, 8, 5,100,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 64, 32, 8, 4,224,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 16, 0, 0, 88,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 88,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44,255,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 64, 0, 2, 0,201,254,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,188,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 76,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 64, 2, 1, 0, 0, 0, 0, 0, 0, 0,208, 16, 0, 0, 0, 0, 0, 0,160, 33, 0, 0, 0, 0, 0, 0, 0,208,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0,224, 1, 0, 0, 0, 0, 0, 0, 0, 16,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0,192, 34, 0, 0, 0, 0, 0, 0, 32, 72, 0, 0, 0, 0, 0, 0, 0, 60,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0,128, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 92,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,196,129, 0, 0, 0, 0, 0, 0, 0, 0,240, 32, 0, 0, 0, 0, 0, 0,192, 65, 0, 0, 0, 0, 0, 0, 0,200,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0,128, 64, 0, 0, 0, 0, 0, 0, 0,148,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 11, 1, 0, 0, 0, 0, 0, 0, 0,192, 32, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 28,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0,208, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,148,254,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 24,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0,192, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,129,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20,196, 0, 2, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,252,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,209,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,138, 4, 35, 0, 0, 0, 0, 0, 0, 0, 0, 64,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,188,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,128, 0, 0, 0, 0, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,255,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 4, 32, 0, 0, 0, 0, 0, 0, 0, 0,128, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,165,252,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,196, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,253,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0,128, 0, 0, 0, 0, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 80,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,252,
++ 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0,108,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 1, 0, 0, 0, 0, 0, 0, 0,208,255,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 1, 0, 0, 0, 0, 0, 0, 0,109,252,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0,128, 9, 0, 0, 0, 0, 0, 0, 0,208,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0,192, 65, 0, 0, 0, 0, 0, 0, 0,104,252,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,112,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 8, 18, 0, 0, 0, 0, 0, 0, 0, 0,192, 4, 1, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 20,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 64, 3, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0,222,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30,192,131, 0, 0, 0, 0, 0, 0, 0, 0,128,128, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,144,252,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 64, 32, 0, 0, 0, 0, 0, 0, 0, 0, 64, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 33,252,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0,136, 0, 0, 0, 0, 0, 0, 0, 0, 64, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,208,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,128, 3, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 96,128, 0, 0, 0, 0, 0, 0, 0, 53,254,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0,129, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0,128,130, 0, 0, 0, 0, 0, 0,128, 81, 0, 0, 0, 0, 0, 0, 0,152,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0,108,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,192, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0,128, 65, 0, 0, 0, 0, 0, 0, 0,188,253,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 64, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,237,253,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 16,139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,228,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,128, 3, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0,224,129, 0, 0, 0, 0, 0, 0, 0, 4,255,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 52,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 8, 16, 1, 0, 0, 0, 0, 0, 0, 0,192,128, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 44,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 64, 18, 1, 0, 0, 0, 0, 0, 0, 0, 16, 16, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0,206,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 4, 3, 0, 0, 0, 0, 0, 0, 0, 0,192, 32, 0, 0, 0, 0, 0, 0,224, 1, 0, 0, 0, 0, 0, 0, 0, 52,255,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 11, 1, 0, 0, 0, 0, 0, 0, 0, 64, 8, 0, 0, 0, 0, 0, 0,160, 41, 0, 0, 0, 0, 0, 0,128,209,255,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0,128,152,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,192, 2, 2, 0, 0, 0, 0, 0, 0, 0, 48, 32, 0, 0, 0, 0, 0, 0,192, 65, 0, 0, 0, 0, 0, 0, 0,249,252,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,128, 65, 0, 0, 0, 0, 0, 0, 0,175,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 8,147, 0, 0, 0, 0, 0, 0, 0, 0,192, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 32, 32, 0, 0, 0, 0, 0, 0, 0, 68,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30,192, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,252,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 64, 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0,101,252,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 4,136, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,152,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,128, 3, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 96, 64, 0, 0, 0, 0, 0, 0, 0, 84,255,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0,128,120,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 8, 16, 0, 0, 0, 0, 0, 0, 0, 0,192, 16, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 44,255,
++ 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,252,
++ 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 0, 20,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52,254,
++ 44, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2,128, 92,252,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0,128,181,254,
++ 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4, 0, 0, 0, 0, 0, 16, 0, 0, 16, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 0, 0, 4,128, 0, 16, 0, 2, 0,100,252,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249,255,
++ 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4, 0, 0, 0, 0, 0, 16, 0, 64, 0, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 0,132, 4,128, 0, 16, 0, 2, 0,124,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,104,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,180,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 2, 0, 0, 0, 0, 0, 0, 0, 28,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,184,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 60,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,188,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 1, 1, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,188,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 56,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,172,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 4, 1, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 64,252,254,
++ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 1, 4,140, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0,176, 0, 0, 0, 0, 0, 0, 0, 68,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 8, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 9, 0, 0, 16, 20, 0, 64, 0, 8, 0, 0, 0, 0, 0, 8,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 8, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 4, 0, 64, 0, 4, 0, 0, 0, 0, 0,116,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 88,254,
++ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 88,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,252,255,
++ 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,105,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 32, 0, 0,128, 34, 2, 0, 26, 0, 0, 0, 0, 0, 32, 8,148, 16, 0, 0, 0, 0, 16, 0, 26, 64, 96,104, 0,129, 36, 4, 20, 64, 0,144, 2, 0, 64, 16, 72, 68, 0, 0, 0, 0,128, 6, 80, 16, 0, 0,240,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 64, 32, 0, 0, 64, 64, 0, 0,128, 32, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,184,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,128, 3, 0, 0, 24, 0, 0, 0, 0, 0,128, 0, 48, 0, 0, 0, 0, 0,192, 32, 0, 0, 2, 2, 0, 0,128, 65, 28, 0, 0,176, 0, 0, 0,131, 88, 0, 0, 0, 0, 0, 0, 0,112, 0, 0, 0,204,252,
++ 0, 0, 0, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 0, 80, 0,128, 4, 0, 0, 24, 16, 0, 0, 0, 0, 0, 80, 0, 64, 0, 0, 0, 0,192, 8, 88, 8, 0, 96, 32, 32, 8, 16, 36, 0, 0, 80, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 22,146, 0, 0, 0,216,255,
++ 0, 0, 0, 0, 0, 0, 0, 24, 9, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 88, 0, 0, 0, 0, 0, 0,136, 16, 4, 0, 0, 0, 0,192, 4, 24, 1, 16, 97, 36, 0,130, 0, 18, 0, 0,128, 0, 0, 0, 1, 68, 0, 0, 0, 0, 0, 0, 38, 66, 0, 0, 0,236,253,
++ 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 96, 0, 1, 0, 5, 0, 0, 6, 16, 0, 0, 0, 0, 96, 0, 44, 0, 0, 0, 0, 0,240, 32, 30,196, 0,120, 0, 3, 96, 1, 40, 0, 0,112, 0, 0,192, 2, 56, 0, 0, 0, 0, 0,128, 7,160, 0, 0, 0,216,252,
++ 0, 0, 0, 0, 0, 0, 0, 24, 8, 0, 0, 0, 0,128, 0, 0, 0, 2, 0, 0, 24, 0, 0, 0, 0, 0, 0, 64, 48, 0, 0, 0, 0, 0,192, 64, 24, 8, 0, 96, 0, 8,130, 0, 16, 0, 0,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 6, 64, 0, 0, 0,160,253,
++ 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0,128, 65, 0, 0, 4, 0, 0,152, 16, 0, 0, 0, 0,128, 17,176, 64, 0, 0, 0, 0,192, 8, 24, 1, 35, 97,128, 44,128,145, 36, 0, 0, 64, 0, 0, 0, 35, 33, 0, 0, 0, 0, 0, 0, 6,145, 0, 0, 0,236,252,
++ 0, 0, 0, 0, 0, 0, 0,154, 8, 0, 8, 0, 0,160, 4, 0,128, 6, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 4, 6, 0, 0, 0, 0,208, 0, 10, 17, 0,104, 4, 0, 0, 0, 36, 64, 0,144, 64, 0, 64, 0, 8, 0, 0, 0, 0, 0,128, 66, 8, 0, 0, 0,178,254,
++ 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 0, 16, 0, 0, 96, 32, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0,208,253,
++ 0, 0, 0, 0, 0, 0, 0, 24, 8, 0, 0, 0, 0,128,129, 0, 0, 6, 4, 0, 24, 0, 0, 0, 0, 0, 0, 0, 32, 8, 0, 0, 0, 0,192, 32, 14, 0, 0, 96, 16, 0, 0, 0, 44, 0, 0,176, 0, 0, 0,131, 96, 32, 0, 0, 0, 0,128, 3, 0, 0, 0, 0,232,252,
++ 8, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 8, 0, 0, 70, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 8, 18, 0, 0, 96, 2, 0, 0, 0, 20, 0, 0, 80, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0,128, 4, 0, 0, 0,128,205,253,
++ 0, 0, 0, 0, 0, 0, 0,136, 32, 0, 96, 2, 0,128, 32, 0, 0, 6, 1, 0,136, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,192, 4, 8, 0, 0, 32, 36, 0, 0, 0, 32, 0, 0,128, 0, 0, 0, 16, 32,128, 0, 0, 0, 0, 0, 2, 0, 0, 0,128, 40,255,
++ 0, 0, 0, 0, 0, 0, 0, 14, 0, 0,120, 32, 0, 96, 1, 0,128, 1, 0, 0, 22, 4, 0, 0, 0, 0, 0, 0, 12, 32, 0, 0, 0, 0,240, 32, 20, 0, 0,120, 0, 0, 0, 0, 28, 0, 0,112, 0, 0,192, 3, 89, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 13,252,
++ 4, 0, 0, 0, 0, 0, 0, 24, 8, 0, 96, 0, 0,128,129, 0, 0, 6, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 64, 8, 0, 0, 64, 0, 0, 0, 0, 32, 0, 0,128, 0, 0, 0,131, 32, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 75,254,
++ 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 96, 0, 0,128, 1, 0, 0, 22, 1, 0,152, 32, 0, 0, 0, 0, 0, 0, 48, 10, 0, 0, 0, 0,192, 8, 16, 0, 0, 96,128, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 11, 96, 36, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0,192,253,
++ 16, 0, 0, 0, 0, 0, 0,138, 0, 0, 0, 0, 0, 32, 48, 0,128, 66, 0, 0, 26, 1, 0, 0, 0, 0, 32, 8,148, 0, 0, 0, 0, 0,208, 0, 2, 0, 0, 72, 4, 0, 32, 17, 4, 0, 0,208, 0, 0, 0, 0, 72, 8,137,160, 0, 1,128, 22, 0, 0, 0, 0,104,252,
++ 0, 0, 0, 0, 0, 0, 0, 16, 4, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 24, 16, 0, 0, 0, 0, 0, 0, 1, 16, 0, 0, 0, 0,192, 0, 24, 0, 0, 32, 64, 0,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 4, 8, 1, 0, 0, 6, 2, 0, 0, 0,240,254,
++ 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0,128, 0, 1,128, 3, 0, 0, 24, 0, 0, 0, 0, 0, 0, 65, 48, 0, 0, 0, 0, 0, 0, 32, 24, 8, 0, 96, 0, 0, 96, 1, 48, 0, 0,192, 0, 0, 0, 0, 88, 0, 11,224, 0, 0, 0, 6, 0, 0, 0, 0, 0,255,
++ 12, 0, 0, 0, 0, 0, 0, 24, 17, 0, 0, 0, 0, 0, 8, 0,128, 4, 0, 0,152, 16, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0,192, 8, 88, 0, 0, 96, 16, 0,160, 0, 48, 9, 0, 0, 40, 0, 0, 0, 40, 0, 5, 32, 1, 0, 0, 6, 1, 0, 0, 0, 65,253,
++ 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 72, 16, 0, 0, 0, 0, 0,136, 16, 16, 0, 0, 0, 0,192, 4, 24, 5, 0, 0, 32, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 64, 0, 8,128, 0, 0, 0, 38, 0, 0, 0, 0,252,253,
++ 0, 0, 0, 0, 0, 0, 0, 22, 8, 0, 0, 0, 0, 96,128, 0, 0, 5, 0, 0, 30, 0, 0, 0, 0, 0, 96, 0, 44, 0, 0, 0, 0, 0,240, 32, 30, 0, 0, 56, 0, 0,224, 0, 60, 16, 0,240, 0, 0, 0, 0, 56, 0, 7, 64, 1, 0,128, 7, 1, 0, 0, 0, 24,253,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 48, 32, 0, 0, 0, 0,192, 64, 24, 0, 0, 0, 0, 0, 0, 1, 48, 0, 0,192, 0, 0, 0, 0, 64, 0, 8,128, 0, 0, 0, 2, 2, 0, 0,128,124,254,
++ 0, 0, 0, 0, 0, 0, 0,152, 16, 0, 0, 0, 0,128, 73, 0, 0, 4, 0, 0, 88, 16, 0, 0, 0, 0,128, 5, 50, 1, 0, 0, 0, 0,192, 8,152, 4, 0, 96, 34, 0,128, 0, 48, 10, 0,192, 68, 0, 0, 0, 32, 0, 4, 0, 1, 0, 0, 66, 0, 0, 0, 0, 92,252,
++ 0, 0, 0, 0, 0, 0, 0,154, 8, 0, 0, 0, 0,160,133, 0,128, 38, 4, 0, 2, 0, 0, 0, 0, 0, 32, 4, 5, 18, 0, 0, 0, 0, 16, 0, 90, 0, 0,104, 4, 33, 36, 17, 52, 0, 0, 16, 0, 0, 64, 2, 40, 4, 41, 32, 1, 1,128, 34, 4, 0, 0, 0, 24,253,
++ 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0,128, 1, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 8, 0, 96, 32, 0,128, 0, 1, 0, 0, 0, 0, 0, 0, 1, 65, 64, 4,132, 0, 0, 0, 4, 0, 0, 0, 0, 64,254,
++ 0, 0, 0, 0, 0, 0, 0, 24, 8, 0, 0, 0, 0, 0, 1, 0, 0, 6, 0, 0, 0, 8, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,192, 0, 24, 8, 0, 96, 16, 12, 96, 1, 48, 16, 0,192, 32, 0,192, 2, 56, 0, 11, 96, 1, 0,128, 3, 0, 0, 0, 0,156,255,
++ 8, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0,129, 0, 0, 20, 1, 0, 64, 0, 0, 0, 0, 0, 0, 32, 0, 66, 0, 0, 0, 0,192, 0, 24, 1, 0, 96, 2,136,176, 0, 0, 0, 0,192, 2, 0, 64, 1, 72, 0, 5,160, 0, 0,128, 4, 0, 0, 0,128, 73,252,
++ 0, 0, 0, 0, 0, 0, 0,152, 32, 0, 0, 0, 0,128, 9, 0, 0, 6, 1, 0, 0, 8, 0, 0, 0, 0, 0, 0,128, 8, 0, 0, 0, 0,192, 16, 8, 5, 0, 96, 36, 4, 4, 1,128, 64, 0, 0, 4, 0, 0, 2, 32, 0, 8, 0, 1, 0, 0, 2, 0, 0, 0,128,100,255,
++ 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0,224, 1, 1,128, 7, 0, 0, 6, 0, 0, 0, 0, 0, 96, 0, 13, 0, 0, 0, 0, 0,240, 0, 14, 0, 0, 88, 0, 15,224, 0, 60, 0, 0,240, 64, 0,192, 1, 80, 0, 7,224, 0, 0, 0, 5, 0, 0, 0, 0,128,254,
++ 4, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0,128, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 8, 0, 0, 0, 0, 0, 0, 24, 0, 0, 96, 0, 4, 8, 1, 48, 0, 0,192, 32, 0, 0, 2, 32, 0, 8, 0, 1, 0, 0, 2, 0, 0, 0,128,181,255,
++ 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0,128,133, 0, 0, 38, 1, 0, 24, 9, 0, 0, 0, 0,128, 17, 48, 2, 0, 0, 0, 0, 0, 64, 24, 4, 0, 32,128, 76,128, 0, 48, 8, 0,192, 8, 0, 0, 1, 72, 0, 4,160, 0, 0, 0, 4, 0, 0, 0, 0, 44,253,
++ 0, 0, 0, 0, 0, 0, 0,154, 8, 0, 0, 0, 0, 32, 5, 0,128, 64, 0, 0, 2, 17, 0, 0, 0, 0, 32,144,164, 16, 0, 0, 0, 0, 80, 64, 90, 0, 0, 40, 4,133,164, 16, 36, 33, 0,208, 0, 0, 64, 34, 41, 8, 13, 32, 5, 0,128, 22, 16, 0, 0, 0,220,253,
++ 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0,128, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0,128, 0, 24, 8, 0, 96, 32, 0, 0,129, 16, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0,128,128, 0, 0, 6, 2, 0, 0, 0,228,255,
++ 0, 0, 0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0,128,129, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 64, 48, 0, 0, 0, 0, 0,112, 0, 16, 8, 0, 64, 16, 12,224, 0, 44, 0, 0,192, 64, 0,192, 2, 56, 0, 12,100, 1, 0, 0, 6,192,128, 0, 0,240,252,
++ 8, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0,128, 9, 0, 0, 32, 1, 0,136, 4, 0, 0, 0, 0, 0, 4, 48, 64, 0, 0, 0, 0,144, 0, 16, 1, 0, 96, 2, 32, 36, 1, 20, 0, 0, 0, 0, 0, 64, 1, 72, 0, 0,160, 0, 0, 0, 6, 1, 2, 0,128,177,252,
++ 0, 0, 0, 0, 0, 0, 0,152, 32, 0, 0, 0, 0, 0, 32, 0, 0, 22, 0, 0, 64, 16, 0, 0, 0, 0, 0, 9, 0, 4, 0, 0, 0, 0, 64, 0, 24, 5, 0, 96, 36,132,136, 0, 32, 0, 0, 0, 2, 1, 0, 2, 32, 0, 0, 16, 1, 0, 0, 34,192, 40, 0,128,156,252,
++ 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0,224, 0, 0,128, 7, 2, 0, 6, 0, 0, 0, 0, 0,224,129, 28, 0, 0, 0, 0, 0,160, 0, 30, 0, 0,120, 0, 11, 64, 1, 28, 0, 0,240, 0, 0,192, 1, 80, 0, 15,224, 0, 0,128, 3,241, 0, 0, 0, 80,253,
++ 4, 0, 0, 0, 0, 0, 0, 24, 8, 0, 0, 0, 0, 0,128, 0, 0, 2, 0, 0, 24, 0, 0, 0, 0, 0,128, 1, 0, 0, 0, 0, 0, 0, 64, 0, 24, 0, 0, 96, 0, 12,128, 0, 32, 0, 0,192, 0, 0, 0, 2, 32, 0, 12, 0, 1, 0, 0, 6,194, 0, 0,128,121,254,
++ 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0,128, 1, 0, 0, 6, 2, 0, 24, 33, 0, 0, 0, 0,128, 9,178, 64, 0, 0, 0, 0,144, 0, 24, 4, 0, 96,128, 44, 40, 1, 16, 0, 0,192, 32, 0, 0, 1, 72, 0, 44,162, 0, 0, 0, 70,192, 72, 0, 0, 40,255,
++ 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0,160,133, 0,128, 38, 4, 0, 26, 1, 0, 0, 0, 0,160, 1,164, 0, 0, 0, 0, 0,208, 24, 90, 0, 0, 40, 4, 41, 36, 0, 52, 0, 0, 80, 64, 0, 64, 16, 8, 20, 13, 32, 72, 36,160, 6,144, 16, 0, 0,134,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0,128, 1, 0, 0, 6, 0, 0, 24, 16, 0, 0, 0, 0, 0, 0, 16, 16, 0, 0, 0, 0, 64, 0, 24, 8, 0, 0, 64, 4, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 2, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0,132,254,
++ 0, 0, 0, 0, 0, 0, 0, 24, 8, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 24, 0, 0, 0, 0, 0, 0,128, 48, 0, 0, 0, 0, 0,192, 32, 24, 8, 0, 96, 0, 12,128, 65, 48, 16, 0,112, 0, 0, 0,129, 96, 0, 12,132, 65, 44, 0, 6,176, 0, 0, 0,132,255,
++ 8, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0,128,129, 0, 0, 22, 1, 0,152, 16, 0, 0, 0, 0,128, 5, 48, 65, 0, 0, 0, 0,192, 8, 24, 1, 0, 0, 16, 76, 16, 8, 0, 0, 0,144, 0, 0, 0, 34, 0, 20, 0, 0, 0, 20, 0, 32, 84, 0, 0,128,149,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 9, 0, 0, 6, 1, 0, 88, 16, 0, 0, 0, 0,128, 5, 0, 16, 0, 0, 0, 0,192, 4, 24, 5, 0, 32, 32, 0,129, 81,128, 64, 0, 64, 0, 0, 0, 0, 36,128, 0,144, 0, 34, 0, 32,128, 0, 0,128,168,255,
++ 0, 0, 0, 0, 0, 0, 0, 22, 16, 0, 0, 0, 0,224, 1, 1,128, 7, 0, 0, 22, 0, 0, 0, 0, 0,224,129, 28, 0, 0, 0, 0, 0,240, 32, 30, 0, 0, 88, 0, 7,224, 1, 60, 0, 0,160, 0, 0,192, 3, 88, 0, 15, 96, 1, 28,128, 7,114, 0, 0, 0,252,253,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 6, 0, 0, 24, 0, 0, 0, 0, 0,128, 1, 0, 32, 0, 0, 0, 0,192, 64, 8, 0, 0, 96, 0, 0,128, 1, 48, 8, 0, 64, 0, 0, 0, 1, 32, 0, 12,128, 0, 32, 0, 6,128, 0, 0,128, 17,254,
++ 0, 0, 0, 0, 0, 0, 0, 24, 33, 0, 0, 0, 0,128,132, 0, 0, 34, 1, 0, 72, 16, 0, 0, 0, 0,128,137, 48, 1, 0, 0, 0, 0,192, 8, 8, 4, 0, 96, 34,140,144,145, 48, 2, 0,144, 0, 0, 0, 83, 96, 36,140,130,145, 20, 0, 70, 65, 0, 0, 0,204,253,
++ 16, 0, 0, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 32, 0, 0,128, 34, 4, 0, 10, 1, 0, 8, 0, 0,160, 5, 5, 18, 0, 0, 0, 0,144, 64, 10, 1, 0,104, 0, 65,162, 8, 20, 33, 0,208, 0, 2, 67, 1, 72, 4, 37,160, 4, 20,160, 0,208, 0, 2, 3, 36,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 24, 16, 0, 0, 0, 0,128, 1, 0, 0, 0, 0, 0, 0, 64, 0, 16, 16, 0, 96, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 2, 33, 64, 8, 4,129, 32, 0, 6, 0, 0, 0, 0, 68,252,
++ 0, 0, 0, 0, 0, 0, 0, 8, 16, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 16, 0, 0, 0, 0, 0,128, 0, 1, 0, 0, 0, 0, 0,176, 0, 14, 0, 0, 96, 16, 0,128, 0, 28, 0, 0,192, 64, 8,200, 1, 88, 0, 7,224, 0, 28, 0, 6,192, 32, 16, 8,220,252,
++ 12, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 80, 0, 0, 22, 1, 0,152, 16, 0, 0, 0, 0, 0, 1, 0, 66, 0, 0, 0, 0, 80, 0, 18, 0, 0, 0, 2,128, 2, 40, 36, 0, 0, 0, 0, 0, 64, 2, 40, 0, 9, 32, 1, 36, 0, 6, 4, 4, 0,129,233,255,
++ 4, 0, 0, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 0, 4, 1, 0, 6, 1, 0, 88, 16, 0, 96, 1, 0, 0, 16,128, 0, 0, 0, 0, 0,128, 0, 8, 0, 0, 96, 0, 64, 4, 0, 18, 0, 0, 0, 2, 65, 0, 1, 64, 0, 4,128, 0, 16, 0, 38, 0, 64, 0,128, 16,255,
++ 0, 0, 0, 0, 0, 0, 0, 30, 8, 0, 0, 0, 0, 96, 0, 0,128, 3, 0, 0, 30, 0, 0,120, 64, 0,224,129, 12, 8, 0, 0, 0, 0,112, 0, 20, 0, 0,120, 16, 3, 96, 1, 40, 0, 0,240, 0, 6,144, 2, 56, 0, 10, 64, 1, 40,128, 7,241, 0, 6, 16, 64,253,
++ 12, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 65, 0, 0, 6, 0, 0, 24, 0, 0, 96, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0,128, 0, 8, 0, 0, 96, 32, 0,128, 1, 16, 0, 0,192, 0, 0, 8, 1, 64, 0, 4,128, 0, 16, 0, 6,192, 0, 0,136,113,254,
++ 0, 0, 0, 0, 0, 0, 0,144, 16, 0, 0, 0, 0,128, 17, 0, 0, 38, 1, 0, 88, 16, 0, 96, 0, 0, 0, 9, 49, 9, 0, 0, 0, 0, 64, 0, 16, 0, 0, 96, 2, 72,132, 81, 36, 0, 0,192, 36, 88, 64, 2, 32, 0, 9, 0, 1, 32, 0, 38,193, 68, 24, 0,120,255,
++ 0, 0, 0, 0, 0, 0, 0, 10, 1, 0, 0, 0, 0,160,133, 0,128, 2, 4, 0, 26, 0, 0, 0, 0, 0,160, 16, 53, 33, 0, 0, 0, 0, 16, 40, 26, 0, 0, 40, 1, 41,160, 16, 4,128, 18, 20, 0, 0, 64, 33, 9, 1, 13, 32, 8,132,136, 22, 16, 0, 0, 0,252,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0,128, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 32, 4, 4, 1, 1, 0, 4, 0, 0, 0, 0, 2, 0, 16, 0, 0, 64, 0, 0, 6, 2, 32, 0, 0,136,252,
++ 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0,128, 1, 0,128, 3, 0, 0, 24, 0, 0, 0, 0, 0,128,129, 16, 16, 0, 0, 0, 0,192, 32, 24, 0, 0, 56, 0, 12,232, 0, 48,136, 3,192,128, 0,192, 1, 96, 16, 12,130, 1, 48, 8, 4, 64, 32, 0, 0,228,255,
++ 12, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0,128,129, 0,128, 4, 0, 0,152, 32, 0, 0, 0, 0, 0, 8, 32, 2, 0, 0, 0, 0, 0, 8, 0, 8, 0, 72, 0, 76, 32, 1, 48,128, 4, 0, 2, 0, 64, 2, 0, 4, 32, 0, 68, 0, 0, 4,129, 2, 0, 0, 93,255,
++ 4, 0, 0, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0,128, 8, 0, 0, 2, 0, 0, 24, 16, 0, 0, 0, 0,128, 32, 0, 1, 0, 0, 0, 0, 64, 0,129, 0, 0, 32, 0, 0,132, 0, 0, 1, 2,192, 2, 0, 0, 1, 32,128, 64,128, 0, 18, 64, 38, 0, 0, 1, 0, 24,254,
++ 0, 0, 0, 0, 0, 0, 0, 22, 8, 0, 0, 0, 0,224, 0, 1, 0, 5, 0, 0, 30, 0, 0, 0, 0, 0, 96, 1, 60, 32, 0, 0, 0, 0,176, 0, 30, 8, 0, 80, 0, 7, 64, 1, 60, 16, 5,240, 32, 0,128, 2, 88, 0, 15,100, 1, 44,128, 7,241, 0, 0, 0, 36,253,
++ 12, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 0, 24, 0, 0, 0, 0, 0,128, 1, 0, 0, 0, 0, 0, 0, 64, 0, 24, 4, 0, 32, 0, 0,136, 0, 48, 8, 2,192, 64, 0, 0, 1, 32, 0, 12,130, 0, 16, 0, 6, 66, 0, 0,128, 8,255,
++ 0, 0, 0, 0, 0, 0, 0,152, 16, 0, 0, 0, 0,128,133, 0, 0, 4, 0, 0, 24, 5, 0, 0, 0, 0,128,129, 32, 16, 0, 0, 0, 0,192, 72, 24, 0, 0, 64, 0, 12, 32, 1,176, 0, 4,192, 8, 0, 64, 2, 96, 36, 12,128,145, 48, 18, 70,192, 64, 0, 0, 52,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30,252,
++ 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 64, 0, 8, 0, 1, 0, 0, 0,128, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 2, 0, 12,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 1, 32, 0, 0, 0, 0, 0, 76,254,
++ 44, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4, 0, 0, 0, 0, 0, 16, 2, 2, 64, 0, 8, 0, 1, 32, 32, 4,132, 0, 16, 2, 2, 64, 64, 8, 8, 1, 33, 16, 4,130, 0, 16, 16, 2,128,209,253,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 8, 0, 0, 1, 0, 0,128, 0, 16, 0, 2, 24, 0, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 0,128,176,255,
++ 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4, 0, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4, 0, 0, 0, 0, 0, 0, 64, 0, 64, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 1, 32, 0, 8, 0, 1, 16, 0, 4, 64, 2, 0, 88,253,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,128, 0, 0, 0, 2, 64, 0, 8, 0, 0, 0, 0, 0,128, 0, 0,227,254,
++ 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4, 0,128, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4, 0, 0, 0, 0, 0, 0, 8, 0, 66, 0, 0, 8, 1, 0, 16, 0, 32,128, 0, 8, 2, 0, 32, 0, 4,128, 0, 32, 0, 4,128, 0, 8, 2, 0,116,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 2, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,148,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 16, 0, 0, 0, 0, 0, 0, 1, 32, 0, 0,128, 0, 0, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4, 0, 1, 0, 0,152,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 44,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,128,116,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 1, 0, 0, 2, 64, 0, 8, 4, 1, 32, 0, 0,128, 0, 0,184,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,188,254,
++ 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 8, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,252,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 32, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 92,253,
++ 0, 0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 32, 8, 4, 0, 32, 0, 0, 2, 0, 0, 8, 1, 2, 0, 0, 0, 0, 0, 0, 0,128, 32, 8, 0, 2, 0, 32, 0, 0,232,252,
++ 0, 0, 0, 0, 0, 0,128, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 2, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,192, 2, 16, 80, 8, 0, 0, 72,128, 16,160, 0, 4, 0, 0, 0, 80, 16, 10, 0, 32, 0, 5,128, 0, 0,128, 0, 8,248,253,
++ 0, 0, 0, 0, 0, 64, 0, 8, 0, 0, 0, 16, 0, 1, 32, 0, 18, 2,128, 0, 0, 0, 16, 0, 0, 0, 0,145, 84, 18, 0, 0, 0, 0, 0, 0,152, 4, 6, 64, 0, 0, 0, 0, 48, 0, 0,128, 0, 16, 0, 38, 1, 2, 0, 2, 64, 16, 0,130, 4, 16, 0, 0, 76,254,
++ 0, 0, 0, 0, 0,128, 0, 8, 0, 0, 0, 16, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 33, 0, 4, 0, 0, 0, 0, 92,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 1, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 1, 64, 0, 0, 0, 0, 32, 0, 0,128, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 0, 16, 0, 0,220,252,
++ 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 32, 8, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 44,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 56,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 44,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 56,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 64, 4, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 14,253,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 16, 0, 0, 64, 0, 8, 0, 1, 32, 0, 4, 0, 0, 16, 0, 0,164,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0, 0, 0,180,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 16,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 0, 0, 0, 0, 64, 2, 8, 0, 1, 16, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0,156,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 16, 0, 32, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,180,252,
++ 8, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0,128, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,252,
++ 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 16, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 16, 4, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 64, 0, 0, 2, 64, 32, 0, 0,145, 1, 0, 0, 70,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,252,
++ 0, 0, 0, 0, 0, 0, 16, 0, 4, 0, 8, 0, 0, 0, 0, 8, 16, 2, 1, 0, 8, 2, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 2, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 64, 0, 8,128, 0, 17, 0, 0, 1, 16, 0, 0,134,253,
++ 76, 0, 0, 0, 1, 0, 0, 8, 2, 0, 0, 0, 0,132, 0, 0, 16, 0,128, 0, 0, 0, 64, 0, 0, 0,128, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 32, 16, 0, 0, 64, 8, 0, 1, 0, 0, 0, 0, 1, 0, 16, 4, 2, 0, 0, 0,130, 0, 0, 0, 64, 38,253,
++ 32, 0, 0,128, 0, 0, 64, 2, 24, 0, 16, 0, 0, 40, 0, 8, 48, 1, 18, 0, 4, 8, 0, 18, 0, 0, 32, 0, 4, 0, 0, 0, 0, 0, 32, 0, 8, 24, 0, 8, 64, 40, 0, 0, 13,128, 0, 32, 0, 8, 64, 0, 16, 64, 3, 72,128, 8,128, 0,134, 66, 0, 0, 68,253,
++ 0, 0, 32, 0, 0,128, 0, 8, 2, 1, 0, 0, 4, 0, 33, 0,128, 0, 1, 0, 20, 4, 5, 0, 0,128,130, 0, 0, 0, 0, 0, 0, 0,192, 32, 72, 2, 0, 16, 8,136,132, 1, 36,136, 4, 32, 32, 8, 0, 2, 80, 32,134,200, 0, 24, 0, 4, 68, 18, 44, 0, 12,254,
++ 0, 0, 0, 0, 0, 0, 0, 8,128, 0, 0, 0, 8, 0, 0, 0, 0, 0, 1, 0, 0, 4, 1, 0, 0, 0,130, 0, 0, 0, 0, 0, 0, 0, 32, 32, 8, 0, 0, 0, 0, 0, 64, 0, 0, 16, 0, 0, 32, 16, 0, 0, 0, 0, 2, 64, 0, 8, 0, 0, 32, 0, 4, 0,132,254,
++ 0, 0, 8, 0, 0, 32, 0, 0, 4, 0, 0, 0, 0,128, 64, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 4, 0, 0, 16, 2,128, 0, 32, 0, 2, 0, 0, 0, 0, 1, 16, 0, 0, 0, 0, 0, 0, 2, 0, 16, 0, 0,112,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,188,254,
++ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 28,254,
++ 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0,196,255,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,236,255,
++ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0,192,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,244,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,253,
++ 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 8, 0, 0, 0, 64, 0, 0, 0, 8, 0, 0, 32, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 2, 0, 0, 0,213,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 2, 0, 0, 8, 32, 0, 32, 0, 4,128, 0, 64, 0, 0, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 18, 0, 0, 0,104,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,254,
++ 32, 0, 4,128, 16, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 73, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,212,253,
++ 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124,254,
++ 0, 0, 12, 0, 0, 2, 0, 0, 0, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 11, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,252,
++ 0, 0, 4, 0, 64, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 5, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,252,
++128, 17,176, 0, 32, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,152, 0, 0, 0, 0, 8,128, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,108,253,
++224,129, 56,136, 1, 0, 0, 0, 0, 0, 16, 32, 0, 0, 0, 0, 0, 0, 0, 0, 30, 8, 0, 0, 0, 6,192,129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,252,
++128, 1, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 8, 0, 0, 0, 8,160, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,188,255,
++128, 1, 48, 0, 68, 2, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0,152, 0, 0, 0, 0, 4,160, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,108,252,
++ 0, 0,180,160, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,130, 8, 0, 0, 0, 9, 40, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,255,
++ 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,128, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,
++ 0, 0, 48,128, 1, 0, 0, 0, 0, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 96, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,253,
++ 8, 0, 48,162, 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2, 0, 0, 0, 5,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,193,253,
++ 0, 0,128, 0, 70, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 8, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,200,252,
++ 0, 0, 12, 16, 7, 0, 0, 0, 0, 0, 16, 32, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 6,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,254,
++ 4, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 8, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 81,253,
++ 0, 0, 0, 10, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 80, 8, 0, 0, 0, 4,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,253,
++ 16, 0, 4,128, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 13, 32,145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,254,
++ 0, 0, 48, 0, 6, 0, 0, 0, 0, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 96, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,254,
++ 12, 0, 48, 0, 6, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 8, 0, 0, 0, 13,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33,253,
++ 4, 0,128, 0, 70, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 64, 8, 0, 0, 0, 12, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,252,
++ 0, 0, 12,144, 7, 0, 0, 0, 0, 0, 16, 32, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 14,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,254,
++ 24, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 12, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,156,252,
++ 0, 0, 0, 10, 6, 1, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0,152, 0, 0, 0, 0, 12,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,253,
++ 0, 0, 4,128, 0, 0, 0, 0, 0, 0, 8, 66, 0, 0, 0, 0, 0, 0, 0, 0, 26, 2, 0, 0, 0, 41, 40, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 4,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,254,
++ 0, 0, 60, 0, 6, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 11, 96, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,255,
++ 8, 0, 52, 0, 0, 1, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 0, 0, 0, 72, 8, 0, 0, 0, 5,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 17,255,
++ 0, 0,128, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 80, 8, 0, 0, 0, 8, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 48,252,
++ 0, 0, 8,144, 1, 0, 0, 0, 0, 0, 24, 32, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 6,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,253,
++ 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215,252,
++ 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 4,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,254,
++ 16, 0, 52,128, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 1, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,252,
++ 0, 0, 48, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,148,254,
++ 0, 0, 0, 0, 2, 4, 0, 0, 0, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,254,
++ 12, 0, 0, 0, 22, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 4,254,
++ 4, 0,176, 0, 16, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 64, 8, 0, 0, 0, 32,128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,113,253,
++ 0, 0, 60,144, 1, 2, 0, 0, 0, 0, 16, 32, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 3,196, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,
++ 12, 0, 48, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193,253,
++ 0, 0, 48, 9, 22, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0,161, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,255,
++ 0, 0, 20,130, 64, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 2, 0, 0, 0, 9,160, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0,168,252,
++ 0, 0, 32, 32, 0, 4, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 4,132, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 20,255,
++ 0, 0, 48, 32, 2, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,160,253,
++ 8, 0, 48, 0, 70, 4, 0, 0, 0, 0, 96, 16, 0, 0, 0, 0, 0, 0, 0, 0, 80, 8, 0, 0, 0, 5, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26,128, 24,252,
++ 0, 0,128, 0, 16, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 88, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,132,237,255,
++ 0, 0, 44,136, 1, 2, 0, 0, 0, 0, 24, 32, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 6,224, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 52,252,
++ 4, 0, 0, 8, 6, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 8, 0, 0, 0, 8, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,157,254,
++ 0, 0, 48, 2, 22, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0,152, 0, 0, 0, 0, 4, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,140,253,
++ 16, 0, 52,146, 6, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0,128, 0, 0, 0, 2, 66, 0, 8, 0, 41,164, 16, 52, 0, 0, 0, 0, 0, 0, 0, 0, 64, 3, 0, 0, 0,160, 1, 0, 0, 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 18,254,
++ 0, 0, 48, 0, 6, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 4, 0, 64, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0,144,253,
++ 0, 0, 48,128, 7, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11,128, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0,192, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0,228,253,
++ 12, 0, 48,136, 6, 0, 0, 0, 0, 0, 96, 18, 0, 0, 0, 0, 0, 0, 0, 0, 80, 8, 0, 0, 0, 5,128,133, 52, 0, 0, 0, 0, 0, 0, 0, 0, 64, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0,128, 5,253,
++ 4, 0, 16, 9, 64, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 22, 2, 0, 72, 8, 3, 97, 66, 8,128, 9, 1, 10, 0, 0, 0, 0, 0, 0, 0, 0,160, 0, 0, 0,128,133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 10, 0, 0, 0, 0,128,124,254,
++ 0, 0, 60, 0, 1, 1, 0, 0, 0, 0, 24, 32, 0, 0, 0, 0,128, 7, 0, 0, 6,192, 3,120, 0, 6, 96, 1, 12, 0, 0, 0, 0, 0, 0, 0, 0,192, 0, 0, 0, 0,224, 1, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0,240,253,
++ 12, 0, 48, 16, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 6, 0, 0, 24, 8, 3, 96, 0, 8,128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,117,254,
++ 0, 0, 48, 1, 0, 0, 0, 0, 0, 0, 96, 20, 0, 0, 0, 0, 0, 6, 0, 0,152, 0, 3, 96, 0, 4, 0, 73, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,172,255,
++ 16, 0, 4,128, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 52, 0, 0,208, 16,130, 16, 0, 0, 0,137, 36, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 64, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 52, 0, 0, 0, 0, 26, 0, 84,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 24, 0, 0, 0, 0, 4, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 48, 0, 0, 0, 0, 24, 0, 44,254,
++ 0, 0, 60, 0, 0, 0, 0, 0, 0, 0,120, 0, 0, 0, 0, 0, 32, 0,192, 0, 24, 0, 0, 0, 0, 11, 96, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0,192, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 0, 0, 0, 0, 60, 0, 0, 0, 0, 30, 0, 72,254,
++ 12, 0, 52, 0, 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 0,176, 0, 0, 64, 66,152, 2, 0, 0, 0, 5, 32, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 64, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 52, 0, 0, 0, 0, 26, 0, 29,252,
++ 4, 0,128, 0, 32, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 48, 1, 0,128, 66, 16, 8, 0, 0, 0, 8,128, 73, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 8, 0, 0, 0, 0, 4, 48,255,
++ 0, 0, 8,144, 1, 2, 0, 0, 0, 0, 16, 32, 0, 0, 0, 60, 16, 0,240, 0, 6, 0, 0, 0, 0, 6,192, 1, 12, 0, 0, 0, 0, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 12, 0, 0, 0, 0, 6, 0, 44,252,
++ 12, 0, 0, 0, 6, 1, 0, 0, 0, 0, 0, 16, 0, 0, 0, 48, 0, 0, 0, 64, 16, 0, 0, 0, 0, 8,160, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 32,252,
++ 0, 0, 0, 9, 6, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 48, 16, 0, 0, 4, 72, 8, 0, 0, 0, 4,160, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0,224,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,150,252,
++ 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 0, 0, 0, 0, 0, 0, 16, 0, 2, 0, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 0, 0, 1, 32, 0, 0,128, 0, 16, 0, 0, 0, 56,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 8, 0, 0, 0, 0, 4,228,255,
++ 40, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 0,136, 4, 1, 0, 0, 0, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0,130,128, 13,254,
++ 0, 0, 0, 6,192, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 2,132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 80,254,
++ 32, 0, 4, 0, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 2, 0, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 0, 0, 1, 32, 0, 0,128, 0, 16, 0, 0, 0,128,253,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 75,252,
++ 32, 0, 0, 17, 16, 24, 0, 2, 64, 0, 0, 1, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 0, 16, 0, 6, 4, 0, 0, 0, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 33, 1, 32, 0,132,144, 0, 16, 0,130, 0,140,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,180,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 64, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,255,
++ 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,180,255,
++ 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 4, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 60,252,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,188,254,
++ 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,188,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52,254,
++ 0, 0, 0, 0, 21, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0,136, 2,129, 0, 0, 40, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 8, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,255,
++ 0, 1, 80,128, 2, 16, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 24, 32, 0, 4,130, 0, 16, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,128, 0, 16, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,252,
++ 0, 0, 16, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 4, 2, 1, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,253,
++ 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0,128, 0, 16, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,254,
++ 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 36,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 44,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 4,136, 0, 1, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,108,254,
++ 0, 0, 32, 0, 12, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,252,
++ 12, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 8, 0, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,128, 0, 0, 0, 0, 1, 0, 0, 4,130, 64, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,253,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 29,254,
++ 0, 0, 8, 0, 21, 0, 0, 0, 3, 0, 8, 64, 0, 4, 0, 0, 0, 0, 2, 0,128,130, 80, 0, 0, 2, 68,128, 24, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,255,
++ 0, 0, 16, 8, 1, 1, 0, 0, 0, 0, 96, 8, 0, 0, 0, 8,128, 10,128,136, 2, 0,112, 0, 20,140, 66, 65, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 1, 0, 0, 32, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 32, 0, 0, 0, 0, 16, 0, 0, 0, 24, 0, 0,172,254,
++ 0, 0, 16, 8,128, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 16, 2, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 32, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 52,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 16, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0,128, 0, 0, 4,128, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0,196,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,255,
++ 8, 0, 0, 0, 4, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0,165,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,180,254,
++ 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,210,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 4,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44,255,
++ 0, 0, 8, 0, 2, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,124,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 26, 0, 0, 40, 1, 0, 0, 0, 52, 2, 0, 16, 64, 0, 64, 0, 0, 0, 0, 0, 0, 4,128, 0, 0, 0, 0, 0,216,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 8, 0,128, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 32, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 3, 2, 0, 0, 0, 0, 48,144, 7, 0, 0, 0, 0,132,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 4, 0, 64, 16, 0, 0, 0, 4, 9, 0, 0, 66, 0, 0, 19, 0, 0, 0, 0, 0, 48,129, 22, 2, 0, 0, 0, 76,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 4,128, 0, 0, 32, 18, 0, 0, 0, 0, 1, 0,192, 8, 0, 0, 3, 4, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0,140,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 64, 30, 4, 0, 88, 0, 0, 0, 0, 56, 8, 0,240, 32, 0,192, 3, 0, 0, 0, 0, 0, 60, 32, 7, 1, 0, 0, 0,100,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 0, 24, 4, 0, 32, 16, 0, 0, 0, 16, 0, 0,192,128, 0, 0, 3, 0, 0, 0, 0, 0, 48, 0, 6, 0, 0, 0, 0,136,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 0, 0, 1, 0, 32, 2, 0, 0, 0,144, 8, 0,192, 8, 0, 0, 35, 4, 0, 0, 0, 0, 48, 34, 32, 1, 0, 0, 0,220,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 40, 4, 0, 0, 0, 4, 0, 0,208, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 34,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 0, 0,128, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 16, 0, 0, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 0, 0, 0, 0,100,254,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 2, 0, 0, 0, 0, 0, 0,192, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 6, 0, 0, 0,128, 41,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 0, 0, 32, 64, 0, 0, 0, 0, 9, 0,192, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0,128, 36,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 4, 0, 80, 0, 0, 0, 0, 12, 0, 0,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 1, 0, 0, 0, 56,254,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 32, 16, 0, 0, 0, 48, 8, 0,192, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 77,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 32, 1, 0, 0, 0, 48, 0, 0,192, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 2, 0, 0, 0, 16,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 8, 0, 40, 1, 0, 0, 0, 52, 10, 0, 16, 0, 0, 64, 3, 0, 0, 0, 0, 0, 0,128, 22, 0, 0, 0, 0, 32,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,120,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 56, 0, 0, 0, 0, 60, 0, 0,192, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,128, 7, 0, 0, 0, 0, 88,252,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 4, 0, 72, 16, 0, 0, 0,132, 8, 0,192, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,128, 16, 1, 0, 0, 0,169,254,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 4, 0, 32, 2, 0, 0, 0, 0, 9, 0,192, 66, 0, 0, 11, 4, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0,152,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 80, 16, 0, 0, 0, 56, 0, 0,240, 0, 0,192, 3, 0, 0, 0, 0, 0, 0, 0, 7, 1, 0, 0, 0, 68,253,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 32, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,128,164,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 5, 0, 32, 2, 0, 0, 0, 16, 10, 0, 0, 68, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 34, 1, 0, 0, 0,140,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 8, 0, 0, 0, 0, 4, 2, 0,208, 0, 0, 64, 0, 4, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 70,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0,192, 64, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 8, 0, 0, 0, 0, 0, 0, 60, 0, 0,192, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 96,252,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154, 0, 0, 0, 0, 0, 0, 0, 52, 4, 0, 64, 8, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0,128,173,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 4, 0, 0, 17, 0, 0, 0, 16, 9, 0,192, 66, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0,128,160,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 24, 0, 0, 0, 0, 56, 0, 0,240, 0, 0,192, 3, 1, 0, 0, 0, 0, 0,128, 7, 2, 0, 0, 0, 33,253,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 96, 64, 0, 0, 0, 32, 0, 0, 64, 32, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 96, 2, 0, 0, 0, 0, 10, 0,192, 2, 0, 0,138, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,218,253,
++ 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 8, 0, 0, 0, 0, 4, 0, 0, 16, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 16, 0, 0, 0, 0, 88,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,108,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,252,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 1, 0, 0, 0,109,255,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 4, 0, 0, 33, 0, 0, 0, 48, 9, 0,128, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0,252,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 24, 0, 0, 0, 0, 56, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 1, 2, 0, 0, 0,132,252,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 96, 16, 0, 0, 0, 0, 8, 0,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 40,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 96, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 52,254,
++ 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 8, 0, 0, 0, 0, 4, 0, 0,208, 0, 0, 64, 3, 0, 0, 0, 0, 0, 0,128, 18, 0, 0, 0, 0, 96,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0, 0, 0, 88,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 0, 0, 0, 0, 0, 0, 0,192, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,196,255,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 4, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, 8, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 36, 1, 0, 0, 0,189,254,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 96, 17, 0, 0, 0, 0, 16, 0, 0, 66, 0, 0, 11, 1, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0,112,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 4, 0,112, 0, 0, 0, 0, 12, 0, 0,240, 0, 0,192, 3, 0, 0, 0, 0, 0, 0,128, 5, 2, 0, 0, 0, 52,255,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 64, 0, 0, 0, 48, 8, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,128,140,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 1, 0, 0, 2, 0, 0, 0, 48, 1, 0, 0, 68, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0,252,253,
++ 16, 0, 0, 0, 0,208, 0, 0, 0, 0, 0, 0, 0,160, 1, 0, 0, 0, 0, 0, 0, 64, 3,104, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 26, 1, 0, 40, 4, 0,160, 1, 4, 0, 0, 16, 8, 0, 64, 2, 4, 0, 0, 0, 0, 0,128, 6, 0, 0, 2, 0,210,252,
++ 0, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0,128, 1, 0, 0, 0, 0, 0, 0, 0, 3, 96, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 64, 16, 0,128, 1, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,212,255,
++ 0, 0, 0, 0, 0,240, 0, 0, 0, 0, 0, 0, 0,224, 1, 0, 0, 0, 0, 0, 0,192, 3,120, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 16, 0,224, 1, 48, 0, 0, 48, 0, 0, 0,130, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 24, 8,164,254,
++ 12, 0, 0, 0, 0,208, 0, 0, 0, 0, 0, 0, 0,160, 1, 0, 0, 0, 0, 0, 0, 64, 3,104, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0,128, 4, 0, 64, 2, 0,160, 1, 48, 0, 0, 16, 66, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 32, 1, 0,152,128, 33,254,
++ 4, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0,160, 0, 20, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 88, 0, 0, 32, 33, 0,128, 1, 48, 6, 0, 0, 8, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0,130,144,255,
++ 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0,192, 0, 24, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 30, 8, 0, 88, 0, 0,192, 1, 60, 0, 0,160, 64, 0,192, 3, 0, 0, 0, 0, 0, 0,128, 7, 2, 0, 30, 0, 65,253,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 32, 16, 0,128, 1, 48, 0, 0,192, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 24, 16, 53,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 16, 0, 32, 1, 0,160, 1, 48, 32, 0,192, 36, 0, 0, 11, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 24, 0, 70,255,
++ 32, 0, 0, 0, 0,208, 0, 0, 0, 0, 0, 0, 0,160, 1, 0, 0, 0, 0, 0, 0, 64, 3,104, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 2, 72, 0,104, 0, 0,160, 1, 52, 0, 0,144, 2, 0, 64, 0, 4, 0, 0, 0, 0, 0,128, 16, 0, 0, 0, 0,132,255,
++ 0, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0,128, 1, 0, 0, 0, 0, 0, 0, 0, 3, 96, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 1, 48, 8, 0, 64,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 16,252,
++ 0, 0, 0, 0, 0,240, 0, 0, 0, 0, 0, 0, 0,224, 1, 0, 0, 0, 0, 0, 0,192, 3,120, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,120, 16, 0,224, 1, 48, 0, 0,128, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,252,
++ 8, 0, 0, 0, 0,208, 0, 0, 0, 0, 0, 0, 0,160, 1, 0, 0, 0, 0, 0, 0, 64, 3,104, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 64, 4, 3, 8, 2, 0,160, 1,176, 8, 0,192, 4, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 16, 1, 0, 0, 0, 53,254,
++128, 33, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,128, 0, 16, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0,128, 4, 19, 0, 17, 0,128, 1, 48, 1, 0,128, 68, 0, 0, 17, 2, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0,148,254,
++224, 1, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0,192, 0, 24, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 6,192, 3,113, 0, 0,192, 1, 44, 8, 0,112, 0, 0,192, 3, 0, 0, 0, 0, 0, 0,128, 1, 1, 0, 0, 0, 52,254,
++132, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 96, 64, 0,128, 1, 48, 8, 0,128, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 88,252,
++128, 1, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 16, 5, 3, 1, 2, 0,128, 1, 48, 2, 0, 64, 40, 0, 0,138, 0, 0, 0, 0, 0, 0, 0, 36, 1, 0, 0, 0,108,253,
++ 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30,253,
++ 32, 0, 4,128, 0, 0, 0, 2, 64, 0, 8, 0, 1, 0, 0, 4,128, 0, 16, 0, 2, 0, 0, 0, 0, 1, 32, 0, 0, 0, 0, 0, 0, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 0,204,253,
++ 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,128, 0, 16, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,253,
++ 44, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 16, 8, 0, 1, 32, 0, 4, 0, 0, 0, 0, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32,136, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2,128,245,253,
++ 4, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 8, 0, 0,136,128, 8, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128, 92,253,
++ 32, 0, 4,128, 0, 0, 0, 2, 64, 0, 8, 0, 1, 0, 0, 4,128, 0, 16, 0, 2, 0, 0, 0, 0, 1, 32, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 1, 0, 0, 0,128, 0, 0, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4, 0, 0, 16, 0, 2, 0,169,255,
++ 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 32, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,177,255,
++ 32, 0, 4,128, 0, 16, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4,128, 0, 16, 0, 2, 64, 16, 8, 33, 1, 32, 0, 4, 5, 0, 0, 0, 0, 16, 0, 0, 65, 0, 0, 4, 1, 0,136, 0,130, 0, 0, 0, 2, 64, 0, 8, 0, 1, 32, 0, 4, 0, 64, 16, 0, 2, 0,158,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,150,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,252,
++ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 32, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 12,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 0, 0, 0, 0, 0, 8, 0, 32, 0, 0, 0, 4,255,
++ 0, 0, 32, 0, 4, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 16, 0, 2, 0, 0, 0, 0,180,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 2, 0, 0, 0, 0, 52,254,
++ 0, 0, 32, 0, 4, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 4, 0,248,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0,120,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 45,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0,188,255,
++ 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,255,
++ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 80,254,
++ 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0,164,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 32,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 1, 16, 0, 0,128, 0, 0, 0, 2, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,128,152,253,
++ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 64, 73,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,136, 0, 16, 0, 0, 64, 0, 16, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0,128, 0,130, 2, 0, 0, 32,255,
++128, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 4,128, 64, 0, 0, 0, 0, 0, 16, 0, 0, 32, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0,128, 0, 8, 66, 8, 32, 8, 0, 0, 1, 32, 0, 16, 64, 0, 0, 7, 1, 0, 20, 0, 0, 0, 80, 8, 2, 65, 2, 0, 0,176,253,
++128, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 2,128, 32, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 8, 1, 0, 16, 0, 0, 0, 16, 4, 1, 33, 0, 0, 0, 8,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 4, 0, 0, 16, 0,128, 0, 8, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 88,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 16, 0, 64, 1, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124,252,
++ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 32, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 8,253,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,105,255,
++ 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,188,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 6, 0, 8, 8, 0, 0, 2, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128, 0, 0, 0, 0, 92,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,254,
++ 0, 4,129, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 0, 2, 0, 32, 66, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,132, 0, 0, 0, 0, 0, 0, 0, 32, 1, 36,128, 0,144, 0, 16, 17, 0, 72, 0,132,255,
++ 0, 0, 0, 32, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0,128, 0, 0, 64, 0, 64, 0, 0, 0, 0, 32, 8, 0, 0, 0, 0, 0, 0, 24, 0, 2, 0, 0, 2, 1, 0, 32, 0, 0, 0, 0, 0, 0, 0, 64, 0, 8, 0, 1, 32, 0, 20,128, 2, 16, 0,196,252,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 1, 0, 0,164,255,
++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 2, 64, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 8, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 16, 0, 2, 64, 0, 0, 0, 0, 32, 0,172,253,
++ 0, 23,224, 2,188,128, 11, 80, 1, 42, 64, 5,168, 0, 45,160, 2, 92,128, 10, 80, 1, 46, 64, 5,168, 0, 21,224, 2, 0, 0, 0, 0,128, 10, 80, 1, 42, 64, 5,104, 1, 21,224, 2, 84,128, 10, 80, 1, 42, 64, 5,104, 1, 21,160, 5, 84,128, 10, 80, 1,100,253,
++192, 8, 20, 1,131, 85, 4,136, 0, 17,104, 2, 77,128, 96,145, 1, 34, 64, 6,200, 0, 17, 32, 3, 77,128, 8,144, 1, 0, 0, 0, 0,208, 4,200, 0, 25,120, 2, 77,162, 9,144, 1, 39,208, 4,156, 0, 17, 40, 3, 37,162, 12,148,172, 50, 80, 6,202, 0, 80,255,
++255,255
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/CVS/Entries linux-2.6.17/arch/sh/boards/renesas/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/CVS/Entries 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,5 @@
++D/edosk7705////
++D/hs7751rvoip////
++D/r7780rp////
++D/rts7751r2d////
++D/systemh////
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/CVS/Repository linux-2.6.17/arch/sh/boards/renesas/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/CVS/Repository 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/renesas
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/CVS/Root linux-2.6.17/arch/sh/boards/renesas/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/CVS/Root 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/edosk7705/CVS/Entries linux-2.6.17/arch/sh/boards/renesas/edosk7705/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/edosk7705/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/edosk7705/CVS/Entries 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,4 @@
++/Makefile/1.2/Sun Oct 16 16:31:08 2005/-ko/
++/io.c/1.1/Mon Aug 30 12:55:31 2004/-ko/
++/setup.c/1.1/Mon Aug 30 12:55:31 2004/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/edosk7705/CVS/Repository linux-2.6.17/arch/sh/boards/renesas/edosk7705/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/edosk7705/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/edosk7705/CVS/Repository 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/renesas/edosk7705
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/edosk7705/CVS/Root linux-2.6.17/arch/sh/boards/renesas/edosk7705/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/edosk7705/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/edosk7705/CVS/Root 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/edosk7705/Makefile linux-2.6.17/arch/sh/boards/renesas/edosk7705/Makefile
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/edosk7705/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/edosk7705/Makefile 2006-07-12 16:54:20.000000000 +0000
+@@ -1,10 +1,6 @@
+ #
+ # Makefile for the EDOSK7705 specific parts of the kernel
+ #
+-# Note! Dependencies are done automagically by 'make dep', which also
+-# removes any old dependencies. DON'T put your own dependencies here
+-# unless it's something special (ie not a .c file).
+-#
+
+ obj-y := setup.o io.o
+
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/hs7751rvoip/CVS/Entries linux-2.6.17/arch/sh/boards/renesas/hs7751rvoip/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/hs7751rvoip/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/hs7751rvoip/CVS/Entries 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,7 @@
++/Kconfig/1.1/Fri Jun 24 11:21:00 2005/-ko/
++/Makefile/1.4/Wed Nov 23 15:42:02 2005/-ko/
++/io.c/1.8/Sun Feb 5 21:55:28 2006/-ko/
++/irq.c/1.2/Fri Oct 28 13:12:48 2005/-ko/
++/pci.c/1.3/Sun Aug 15 16:59:25 2004/-ko/
++/setup.c/1.5/Wed Jan 4 16:34:30 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/hs7751rvoip/CVS/Repository linux-2.6.17/arch/sh/boards/renesas/hs7751rvoip/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/hs7751rvoip/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/hs7751rvoip/CVS/Repository 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/renesas/hs7751rvoip
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/hs7751rvoip/CVS/Root linux-2.6.17/arch/sh/boards/renesas/hs7751rvoip/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/hs7751rvoip/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/hs7751rvoip/CVS/Root 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/hs7751rvoip/Kconfig linux-2.6.17/arch/sh/boards/renesas/hs7751rvoip/Kconfig
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/hs7751rvoip/Kconfig 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/hs7751rvoip/Kconfig 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,12 @@
++if SH_HS7751RVOIP
++
++menu "HS7751RVoIP options"
++
++config HS7751RVOIP_CODEC
++ bool "Support VoIP Codec section"
++ help
++ Selecting this option will support CODEC section.
++
++endmenu
++
++endif
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/hs7751rvoip/Makefile linux-2.6.17/arch/sh/boards/renesas/hs7751rvoip/Makefile
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/hs7751rvoip/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/hs7751rvoip/Makefile 2006-07-12 16:54:20.000000000 +0000
+@@ -1,12 +1,8 @@
+ #
+ # Makefile for the HS7751RVoIP specific parts of the kernel
+ #
+-# Note! Dependencies are done automagically by 'make dep', which also
+-# removes any old dependencies. DON'T put your own dependencies here
+-# unless it's something special (ie not a .c file).
+-#
+
+-obj-y := mach.o setup.o io.o irq.o led.o
++obj-y := setup.o io.o irq.o
+
+ obj-$(CONFIG_PCI) += pci.o
+
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/hs7751rvoip/io.c linux-2.6.17/arch/sh/boards/renesas/hs7751rvoip/io.c
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/hs7751rvoip/io.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/hs7751rvoip/io.c 2006-07-12 16:54:20.000000000 +0000
+@@ -14,18 +14,13 @@
+ #include <linux/config.h>
+ #include <linux/kernel.h>
+ #include <linux/types.h>
++#include <linux/module.h>
+ #include <asm/io.h>
+ #include <asm/hs7751rvoip/hs7751rvoip.h>
+ #include <asm/addrspace.h>
+
+-#include <linux/module.h>
+-#include <linux/pci.h>
+-#include "../../../drivers/pci/pci-sh7751.h"
+-
+-extern void *area5_io8_base; /* Area 5 8bit I/O Base address */
+ extern void *area6_io8_base; /* Area 6 8bit I/O Base address */
+ extern void *area5_io16_base; /* Area 5 16bit I/O Base address */
+-extern void *area6_io16_base; /* Area 6 16bit I/O Base address */
+
+ /*
+ * The 7751R HS7751RVoIP uses the built-in PCI controller (PCIC)
+@@ -34,25 +29,8 @@
+ * like the other Solution Engine boards.
+ */
+
+-#define PCIIOBR (volatile long *)PCI_REG(SH7751_PCIIOBR)
+-#define PCIMBR (volatile long *)PCI_REG(SH7751_PCIMBR)
+-#define PCI_IO_AREA SH7751_PCI_IO_BASE
+-#define PCI_MEM_AREA SH7751_PCI_CONFIG_BASE
+-
+-#define PCI_IOMAP(adr) (PCI_IO_AREA + (adr & ~SH7751_PCIIOBR_MASK))
+-
+-#if defined(CONFIG_HS7751RVOIP_CODEC)
+ #define CODEC_IO_BASE 0x1000
+-#endif
+-
+-#define maybebadio(name,port) \
+- printk("bad PC-like io %s for port 0x%lx at 0x%08x\n", \
+- #name, (port), (__u32) __builtin_return_address(0))
+-
+-static inline void delay(void)
+-{
+- ctrl_inw(0xa0000000);
+-}
++#define CODEC_IOMAP(a) ((unsigned long)area6_io8_base + ((a) - CODEC_IO_BASE))
+
+ static inline unsigned long port2adr(unsigned int port)
+ {
+@@ -60,9 +38,10 @@
+ if (port == 0x3f6)
+ return ((unsigned long)area5_io16_base + 0x0c);
+ else
+- return ((unsigned long)area5_io16_base + 0x800 + ((port-0x1f0) << 1));
++ return ((unsigned long)area5_io16_base + 0x800 +
++ ((port-0x1f0) << 1));
+ else
+- maybebadio(port2adr, (unsigned long)port);
++ maybebadio((unsigned long)port);
+ return port;
+ }
+
+@@ -79,25 +58,10 @@
+ }
+
+ #if defined(CONFIG_HS7751RVOIP_CODEC)
+-static inline int
+-codec_port(unsigned long port)
+-{
+- if (CODEC_IO_BASE <= port && port < (CODEC_IO_BASE+0x20))
+- return 1;
+- else
+- return 0;
+-}
+-#endif
+-
+-/* In case someone configures the kernel w/o PCI support: in that */
+-/* scenario, don't ever bother to check for PCI-window addresses */
+-
+-/* NOTE: WINDOW CHECK MAY BE A BIT OFF, HIGH PCIBIOS_MIN_IO WRAPS? */
+-#if defined(CONFIG_PCI)
+-#define CHECK_SH7751_PCIIO(port) \
+- ((port >= PCIBIOS_MIN_IO) && (port < (PCIBIOS_MIN_IO + SH7751_PCI_IO_SIZE)))
++#define codec_port(port) \
++ ((CODEC_IO_BASE <= (port)) && ((port) < (CODEC_IO_BASE + 0x20)))
+ #else
+-#define CHECK_SH7751_PCIIO(port) (0)
++#define codec_port(port) (0)
+ #endif
+
+ /*
+@@ -110,15 +74,13 @@
+ unsigned char hs7751rvoip_inb(unsigned long port)
+ {
+ if (PXSEG(port))
+- return *(volatile unsigned char *)port;
+-#if defined(CONFIG_HS7751RVOIP_CODEC)
++ return ctrl_inb(port);
+ else if (codec_port(port))
+- return *(volatile unsigned char *)((unsigned long)area6_io8_base+(port-CODEC_IO_BASE));
+-#endif
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
+- return *(volatile unsigned char *)PCI_IOMAP(port);
++ return ctrl_inb(CODEC_IOMAP(port));
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ return ctrl_inb(pci_ioaddr(port));
+ else
+- return (*(volatile unsigned short *)port2adr(port) & 0xff);
++ return ctrl_inw(port2adr(port)) & 0xff;
+ }
+
+ unsigned char hs7751rvoip_inb_p(unsigned long port)
+@@ -126,38 +88,36 @@
+ unsigned char v;
+
+ if (PXSEG(port))
+- v = *(volatile unsigned char *)port;
+-#if defined(CONFIG_HS7751RVOIP_CODEC)
++ v = ctrl_inb(port);
+ else if (codec_port(port))
+- v = *(volatile unsigned char *)((unsigned long)area6_io8_base+(port-CODEC_IO_BASE));
+-#endif
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
+- v = *(volatile unsigned char *)PCI_IOMAP(port);
++ v = ctrl_inb(CODEC_IOMAP(port));
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ v = ctrl_inb(pci_ioaddr(port));
+ else
+- v = (*(volatile unsigned short *)port2adr(port) & 0xff);
+- delay();
++ v = ctrl_inw(port2adr(port)) & 0xff;
++ ctrl_delay();
+ return v;
+ }
+
+ unsigned short hs7751rvoip_inw(unsigned long port)
+ {
+ if (PXSEG(port))
+- return *(volatile unsigned short *)port;
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
+- return *(volatile unsigned short *)PCI_IOMAP(port);
++ return ctrl_inw(port);
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ return ctrl_inw(pci_ioaddr(port));
+ else
+- maybebadio(inw, port);
++ maybebadio(port);
+ return 0;
+ }
+
+ unsigned int hs7751rvoip_inl(unsigned long port)
+ {
+ if (PXSEG(port))
+- return *(volatile unsigned long *)port;
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
+- return *(volatile unsigned long *)PCI_IOMAP(port);
++ return ctrl_inl(port);
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ return ctrl_inl(pci_ioaddr(port));
+ else
+- maybebadio(inl, port);
++ maybebadio(port);
+ return 0;
+ }
+
+@@ -165,146 +125,160 @@
+ {
+
+ if (PXSEG(port))
+- *(volatile unsigned char *)port = value;
+-#if defined(CONFIG_HS7751RVOIP_CODEC)
++ ctrl_outb(value, port);
+ else if (codec_port(port))
+- *(volatile unsigned cjar *)((unsigned long)area6_io8_base+(port-CODEC_IO_BASE)) = value;
+-#endif
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
+- *(unsigned char *)PCI_IOMAP(port) = value;
++ ctrl_outb(value, CODEC_IOMAP(port));
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ ctrl_outb(value, pci_ioaddr(port));
+ else
+- *(volatile unsigned short *)port2adr(port) = value;
++ ctrl_outb(value, port2adr(port));
+ }
+
+ void hs7751rvoip_outb_p(unsigned char value, unsigned long port)
+ {
+ if (PXSEG(port))
+- *(volatile unsigned char *)port = value;
+-#if defined(CONFIG_HS7751RVOIP_CODEC)
++ ctrl_outb(value, port);
+ else if (codec_port(port))
+- *(volatile unsigned cjar *)((unsigned long)area6_io8_base+(port-CODEC_IO_BASE)) = value;
+-#endif
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
+- *(unsigned char *)PCI_IOMAP(port) = value;
++ ctrl_outb(value, CODEC_IOMAP(port));
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ ctrl_outb(value, pci_ioaddr(port));
+ else
+- *(volatile unsigned short *)port2adr(port) = value;
+- delay();
++ ctrl_outw(value, port2adr(port));
++
++ ctrl_delay();
+ }
+
+ void hs7751rvoip_outw(unsigned short value, unsigned long port)
+ {
+ if (PXSEG(port))
+- *(volatile unsigned short *)port = value;
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
+- *(unsigned short *)PCI_IOMAP(port) = value;
++ ctrl_outw(value, port);
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ ctrl_outw(value, pci_ioaddr(port));
+ else
+- maybebadio(outw, port);
++ maybebadio(port);
+ }
+
+ void hs7751rvoip_outl(unsigned int value, unsigned long port)
+ {
+ if (PXSEG(port))
+- *(volatile unsigned long *)port = value;
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
+- *((unsigned long *)PCI_IOMAP(port)) = value;
++ ctrl_outl(value, port);
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ ctrl_outl(value, pci_ioaddr(port));
+ else
+- maybebadio(outl, port);
++ maybebadio(port);
+ }
+
+ void hs7751rvoip_insb(unsigned long port, void *addr, unsigned long count)
+ {
++ u8 *buf = addr;
++
+ if (PXSEG(port))
+- while (count--) *((unsigned char *) addr)++ = *(volatile unsigned char *)port;
+-#if defined(CONFIG_HS7751RVOIP_CODEC)
++ while (count--)
++ *buf++ = ctrl_inb(port);
+ else if (codec_port(port))
+- while (count--) *((unsigned char *) addr)++ = *(volatile unsigned char *)((unsigned long)area6_io8_base+(port-CODEC_IO_BASE));
+-#endif
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) {
+- volatile __u8 *bp = (__u8 *)PCI_IOMAP(port);
++ while (count--)
++ *buf++ = ctrl_inb(CODEC_IOMAP(port));
++ else if (is_pci_ioaddr(port) || shifted_port(port)) {
++ volatile u8 *bp = (volatile u8 *)pci_ioaddr(port);
+
+- while (count--) *((volatile unsigned char *) addr)++ = *bp;
++ while (count--)
++ *buf++ = *bp;
+ } else {
+- volatile __u16 *p = (volatile unsigned short *)port2adr(port);
++ volatile u16 *p = (volatile u16 *)port2adr(port);
+
+- while (count--) *((unsigned char *) addr)++ = *p & 0xff;
++ while (count--)
++ *buf++ = *p & 0xff;
+ }
+ }
+
+ void hs7751rvoip_insw(unsigned long port, void *addr, unsigned long count)
+ {
+- volatile __u16 *p;
++ volatile u16 *p;
++ u16 *buf = addr;
+
+ if (PXSEG(port))
+- p = (volatile unsigned short *)port;
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
+- p = (volatile unsigned short *)PCI_IOMAP(port);
+- else
+- p = (volatile unsigned short *)port2adr(port);
+- while (count--) *((__u16 *) addr)++ = *p;
++ p = (volatile u16 *)port;
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ p = (volatile u16 *)pci_ioaddr(port);
++ else
++ p = (volatile u16 *)port2adr(port);
++ while (count--)
++ *buf++ = *p;
+ }
+
+ void hs7751rvoip_insl(unsigned long port, void *addr, unsigned long count)
+ {
+- if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) {
+- volatile __u32 *p = (__u32 *)PCI_IOMAP(port);
+
+- while (count--) *((__u32 *) addr)++ = *p;
++ if (is_pci_ioaddr(port) || shifted_port(port)) {
++ volatile u32 *p = (volatile u32 *)pci_ioaddr(port);
++ u32 *buf = addr;
++
++ while (count--)
++ *buf++ = *p;
+ } else
+- maybebadio(insl, port);
++ maybebadio(port);
+ }
+
+ void hs7751rvoip_outsb(unsigned long port, const void *addr, unsigned long count)
+ {
++ const u8 *buf = addr;
++
+ if (PXSEG(port))
+- while (count--) *(volatile unsigned char *)port = *((unsigned char *) addr)++;
+-#if defined(CONFIG_HS7751RVOIP_CODEC)
++ while (count--)
++ ctrl_outb(*buf++, port);
+ else if (codec_port(port))
+- while (count--) *(volatile unsigned char *)((unsigned long)area6_io8_base+(port-CODEC_IO_BASE)) = *((unsigned char *) addr)++;
+-#endif
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) {
+- volatile __u8 *bp = (__u8 *)PCI_IOMAP(port);
++ while (count--)
++ ctrl_outb(*buf++, CODEC_IOMAP(port));
++ else if (is_pci_ioaddr(port) || shifted_port(port)) {
++ volatile u8 *bp = (volatile u8 *)pci_ioaddr(port);
+
+- while (count--) *bp = *((volatile unsigned char *) addr)++;
++ while (count--)
++ *bp = *buf++;
+ } else {
+- volatile __u16 *p = (volatile unsigned short *)port2adr(port);
++ volatile u16 *p = (volatile u16 *)port2adr(port);
+
+- while (count--) *p = *((unsigned char *) addr)++;
++ while (count--)
++ *p = *buf++;
+ }
+ }
+
+ void hs7751rvoip_outsw(unsigned long port, const void *addr, unsigned long count)
+ {
+- volatile __u16 *p;
++ volatile u16 *p;
++ const u16 *buf = addr;
+
+ if (PXSEG(port))
+- p = (volatile unsigned short *)port;
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
+- p = (volatile unsigned short *)PCI_IOMAP(port);
++ p = (volatile u16 *)port;
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ p = (volatile u16 *)pci_ioaddr(port);
+ else
+- p = (volatile unsigned short *)port2adr(port);
+- while (count--) *p = *((__u16 *) addr)++;
++ p = (volatile u16 *)port2adr(port);
++
++ while (count--)
++ *p = *buf++;
+ }
+
+ void hs7751rvoip_outsl(unsigned long port, const void *addr, unsigned long count)
+ {
+- if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) {
+- volatile __u32 *p = (__u32 *)PCI_IOMAP(port);
++ const u32 *buf = addr;
+
+- while (count--) *p = *((__u32 *) addr)++;
++ if (is_pci_ioaddr(port) || shifted_port(port)) {
++ volatile u32 *p = (volatile u32 *)pci_ioaddr(port);
++
++ while (count--)
++ *p = *buf++;
+ } else
+- maybebadio(outsl, port);
++ maybebadio(port);
+ }
+
+-void *hs7751rvoip_ioremap(unsigned long offset, unsigned long size)
++void __iomem *hs7751rvoip_ioport_map(unsigned long port, unsigned int size)
+ {
+- if (offset >= 0xfd000000)
+- return (void *)offset;
+- else
+- return (void *)P2SEGADDR(offset);
+-}
+-EXPORT_SYMBOL(hs7751rvoip_ioremap);
++ if (PXSEG(port))
++ return (void __iomem *)port;
++ else if (unlikely(codec_port(port) && (size == 1)))
++ return (void __iomem *)CODEC_IOMAP(port);
++ else if (is_pci_ioaddr(port))
++ return (void __iomem *)pci_ioaddr(port);
+
+-unsigned long hs7751rvoip_isa_port2addr(unsigned long offset)
+-{
+- return port2adr(offset);
++ return (void __iomem *)port2adr(port);
+ }
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/hs7751rvoip/setup.c linux-2.6.17/arch/sh/boards/renesas/hs7751rvoip/setup.c
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/hs7751rvoip/setup.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/hs7751rvoip/setup.c 2006-07-12 16:54:20.000000000 +0000
+@@ -13,25 +13,68 @@
+ #include <linux/config.h>
+ #include <linux/init.h>
+ #include <linux/irq.h>
+-
++#include <linux/mm.h>
++#include <linux/vmalloc.h>
+ #include <linux/hdreg.h>
+ #include <linux/ide.h>
++#include <linux/pm.h>
+ #include <asm/io.h>
+ #include <asm/hs7751rvoip/hs7751rvoip.h>
++#include <asm/machvec.h>
++#include <asm/rtc.h>
++#include <asm/irq.h>
+
+-#include <linux/mm.h>
+-#include <linux/vmalloc.h>
++unsigned int debug_counter;
++
++static void __init hs7751rvoip_init_irq(void)
++{
++#if defined(CONFIG_HS7751RVOIP_CODEC)
++ make_ipr_irq(DMTE0_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY);
++ make_ipr_irq(DMTE1_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY);
++#endif
+
+-/* defined in mm/ioremap.c */
+-extern void * p3_ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags);
++ init_hs7751rvoip_IRQ();
++}
+
+-unsigned int debug_counter;
++struct sh_machine_vector mv_hs7751rvoip __initmv = {
++ .mv_nr_irqs = 72,
++
++ .mv_inb = hs7751rvoip_inb,
++ .mv_inw = hs7751rvoip_inw,
++ .mv_inl = hs7751rvoip_inl,
++ .mv_outb = hs7751rvoip_outb,
++ .mv_outw = hs7751rvoip_outw,
++ .mv_outl = hs7751rvoip_outl,
++
++ .mv_inb_p = hs7751rvoip_inb_p,
++ .mv_inw_p = hs7751rvoip_inw,
++ .mv_inl_p = hs7751rvoip_inl,
++ .mv_outb_p = hs7751rvoip_outb_p,
++ .mv_outw_p = hs7751rvoip_outw,
++ .mv_outl_p = hs7751rvoip_outl,
++
++ .mv_insb = hs7751rvoip_insb,
++ .mv_insw = hs7751rvoip_insw,
++ .mv_insl = hs7751rvoip_insl,
++ .mv_outsb = hs7751rvoip_outsb,
++ .mv_outsw = hs7751rvoip_outsw,
++ .mv_outsl = hs7751rvoip_outsl,
++
++ .mv_init_irq = hs7751rvoip_init_irq,
++ .mv_ioport_map = hs7751rvoip_ioport_map,
++};
++ALIAS_MV(hs7751rvoip)
+
+ const char *get_system_type(void)
+ {
+ return "HS7751RVoIP";
+ }
+
++static void hs7751rvoip_power_off(void)
++{
++ ctrl_outw(ctrl_inw(PA_OUTPORTR) & 0xffdf, PA_OUTPORTR);
++}
++
+ /*
+ * Initialize the board
+ */
+@@ -39,6 +82,7 @@
+ {
+ printk(KERN_INFO "Renesas Technology Sales HS7751RVoIP-2 support.\n");
+ ctrl_outb(0xf0, PA_OUTPORTR);
++ pm_power_off = hs7751rvoip_power_off;
+ debug_counter = 0;
+ }
+
+@@ -47,16 +91,15 @@
+ void *area5_io16_base;
+ void *area6_io16_base;
+
+-int __init cf_init(void)
++static int __init hs7751rvoip_cf_init(void)
+ {
+ pgprot_t prot;
+- unsigned long paddrbase, psize;
++ unsigned long paddrbase;
+
+ /* open I/O area window */
+ paddrbase = virt_to_phys((void *)(PA_AREA5_IO+0x00000800));
+- psize = PAGE_SIZE;
+ prot = PAGE_KERNEL_PCC(1, _PAGE_PCC_COM16);
+- area5_io16_base = p3_ioremap(paddrbase, psize, prot.pgprot);
++ area5_io16_base = p3_ioremap(paddrbase, PAGE_SIZE, prot.pgprot);
+ if (!area5_io16_base) {
+ printk("allocate_cf_area : can't open CF I/O window!\n");
+ return -ENOMEM;
+@@ -65,19 +108,18 @@
+ /* XXX : do we need attribute and common-memory area also? */
+
+ paddrbase = virt_to_phys((void *)PA_AREA6_IO);
+- psize = PAGE_SIZE;
+ #if defined(CONFIG_HS7751RVOIP_CODEC)
+ prot = PAGE_KERNEL_PCC(0, _PAGE_PCC_COM8);
+ #else
+ prot = PAGE_KERNEL_PCC(0, _PAGE_PCC_IO8);
+ #endif
+- area6_io8_base = p3_ioremap(paddrbase, psize, prot.pgprot);
++ area6_io8_base = p3_ioremap(paddrbase, PAGE_SIZE, prot.pgprot);
+ if (!area6_io8_base) {
+ printk("allocate_cf_area : can't open CODEC I/O 8bit window!\n");
+ return -ENOMEM;
+ }
+ prot = PAGE_KERNEL_PCC(0, _PAGE_PCC_IO16);
+- area6_io16_base = p3_ioremap(paddrbase, psize, prot.pgprot);
++ area6_io16_base = p3_ioremap(paddrbase, PAGE_SIZE, prot.pgprot);
+ if (!area6_io16_base) {
+ printk("allocate_cf_area : can't open CODEC I/O 16bit window!\n");
+ return -ENOMEM;
+@@ -86,4 +128,4 @@
+ return 0;
+ }
+
+-__initcall (cf_init);
++__initcall(hs7751rvoip_cf_init);
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/r7780rp/CVS/Entries linux-2.6.17/arch/sh/boards/renesas/r7780rp/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/r7780rp/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/r7780rp/CVS/Entries 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,7 @@
++/Makefile/1.1/Sat Jan 7 19:55:56 2006/-ko/
++/io.c/1.2/Sun Feb 5 21:55:28 2006/-ko/
++/led.c/1.1/Sat Jan 7 19:55:56 2006/-ko/
++/Kconfig/1.1/Thu Jul 6 08:19:31 2006/-ko/
++/irq.c/1.2/Thu Jul 6 12:38:03 2006/-ko/
++/setup.c/1.3/Thu Jul 6 12:38:03 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/r7780rp/CVS/Repository linux-2.6.17/arch/sh/boards/renesas/r7780rp/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/r7780rp/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/r7780rp/CVS/Repository 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/renesas/r7780rp
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/r7780rp/CVS/Root linux-2.6.17/arch/sh/boards/renesas/r7780rp/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/r7780rp/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/r7780rp/CVS/Root 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/r7780rp/Kconfig linux-2.6.17/arch/sh/boards/renesas/r7780rp/Kconfig
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/r7780rp/Kconfig 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/r7780rp/Kconfig 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,14 @@
++if SH_R7780RP
++
++menu "R7780RP options"
++
++config SH_R7780MP
++ bool "R7780MP board support"
++ default y
++ help
++ Selecting this option will enable support for the mass-production
++ version of the R7780RP. If in doubt, say Y.
++
++endmenu
++
++endif
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/r7780rp/Makefile linux-2.6.17/arch/sh/boards/renesas/r7780rp/Makefile
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/r7780rp/Makefile 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/r7780rp/Makefile 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,6 @@
++#
++# Makefile for the R7780RP-1 specific parts of the kernel
++#
++
++obj-y := setup.o io.o irq.o
++obj-$(CONFIG_HEARTBEAT) += led.o
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/r7780rp/io.c linux-2.6.17/arch/sh/boards/renesas/r7780rp/io.c
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/r7780rp/io.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/r7780rp/io.c 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,301 @@
++/*
++ * Copyright (C) 2001 Ian da Silva, Jeremy Siegel
++ * Based largely on io_se.c.
++ *
++ * I/O routine for Renesas Solutions Highlander R7780RP-1
++ *
++ * Initial version only to support LAN access; some
++ * placeholder code from io_r7780rp.c left in with the
++ * expectation of later SuperIO and PCMCIA access.
++ */
++#include <linux/pci.h>
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <asm/r7780rp/r7780rp.h>
++#include <asm/addrspace.h>
++#include <asm/io.h>
++
++static inline unsigned long port2adr(unsigned int port)
++{
++ if ((0x1f0 <= port && port < 0x1f8) || port == 0x3f6)
++ if (port == 0x3f6)
++ return (PA_AREA5_IO + 0x80c);
++ else
++ return (PA_AREA5_IO + 0x1000 + ((port-0x1f0) << 1));
++ else
++ maybebadio((unsigned long)port);
++
++ return port;
++}
++
++static inline unsigned long port88796l(unsigned int port, int flag)
++{
++ unsigned long addr;
++
++ if (flag)
++ addr = PA_AX88796L + ((port - AX88796L_IO_BASE) << 1);
++ else
++ addr = PA_AX88796L + ((port - AX88796L_IO_BASE) << 1) + 0x1000;
++
++ return addr;
++}
++
++/* The 7780 R7780RP-1 seems to have everything hooked */
++/* up pretty normally (nothing on high-bytes only...) so this */
++/* shouldn't be needed */
++static inline int shifted_port(unsigned long port)
++{
++ /* For IDE registers, value is not shifted */
++ if ((0x1f0 <= port && port < 0x1f8) || port == 0x3f6)
++ return 0;
++ else
++ return 1;
++}
++
++#if defined(CONFIG_NE2000) || defined(CONFIG_NE2000_MODULE)
++#define CHECK_AX88796L_PORT(port) \
++ ((port >= AX88796L_IO_BASE) && (port < (AX88796L_IO_BASE+0x20)))
++#else
++#define CHECK_AX88796L_PORT(port) (0)
++#endif
++
++/*
++ * General outline: remap really low stuff [eventually] to SuperIO,
++ * stuff in PCI IO space (at or above window at pci.h:PCIBIOS_MIN_IO)
++ * is mapped through the PCI IO window. Stuff with high bits (PXSEG)
++ * should be way beyond the window, and is used w/o translation for
++ * compatibility.
++ */
++u8 r7780rp_inb(unsigned long port)
++{
++ if (CHECK_AX88796L_PORT(port))
++ return ctrl_inw(port88796l(port, 0)) & 0xff;
++ else if (PXSEG(port))
++ return ctrl_inb(port);
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ return ctrl_inb(pci_ioaddr(port));
++
++ return ctrl_inw(port2adr(port)) & 0xff;
++}
++
++u8 r7780rp_inb_p(unsigned long port)
++{
++ u8 v;
++
++ if (CHECK_AX88796L_PORT(port))
++ v = ctrl_inw(port88796l(port, 0)) & 0xff;
++ else if (PXSEG(port))
++ v = ctrl_inb(port);
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ v = ctrl_inb(pci_ioaddr(port));
++ else
++ v = ctrl_inw(port2adr(port)) & 0xff;
++
++ ctrl_delay();
++
++ return v;
++}
++
++u16 r7780rp_inw(unsigned long port)
++{
++ if (CHECK_AX88796L_PORT(port))
++ maybebadio(port);
++ else if (PXSEG(port))
++ return ctrl_inw(port);
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ return ctrl_inw(pci_ioaddr(port));
++ else
++ maybebadio(port);
++
++ return 0;
++}
++
++u32 r7780rp_inl(unsigned long port)
++{
++ if (CHECK_AX88796L_PORT(port))
++ maybebadio(port);
++ else if (PXSEG(port))
++ return ctrl_inl(port);
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ return ctrl_inl(pci_ioaddr(port));
++ else
++ maybebadio(port);
++
++ return 0;
++}
++
++void r7780rp_outb(u8 value, unsigned long port)
++{
++ if (CHECK_AX88796L_PORT(port))
++ ctrl_outw(value, port88796l(port, 0));
++ else if (PXSEG(port))
++ ctrl_outb(value, port);
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ ctrl_outb(value, pci_ioaddr(port));
++ else
++ ctrl_outw(value, port2adr(port));
++}
++
++void r7780rp_outb_p(u8 value, unsigned long port)
++{
++ if (CHECK_AX88796L_PORT(port))
++ ctrl_outw(value, port88796l(port, 0));
++ else if (PXSEG(port))
++ ctrl_outb(value, port);
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ ctrl_outb(value, pci_ioaddr(port));
++ else
++ ctrl_outw(value, port2adr(port));
++
++ ctrl_delay();
++}
++
++void r7780rp_outw(u16 value, unsigned long port)
++{
++ if (CHECK_AX88796L_PORT(port))
++ maybebadio(port);
++ else if (PXSEG(port))
++ ctrl_outw(value, port);
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ ctrl_outw(value, pci_ioaddr(port));
++ else
++ maybebadio(port);
++}
++
++void r7780rp_outl(u32 value, unsigned long port)
++{
++ if (CHECK_AX88796L_PORT(port))
++ maybebadio(port);
++ else if (PXSEG(port))
++ ctrl_outl(value, port);
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ ctrl_outl(value, pci_ioaddr(port));
++ else
++ maybebadio(port);
++}
++
++void r7780rp_insb(unsigned long port, void *dst, unsigned long count)
++{
++ volatile u16 *p;
++ u8 *buf = dst;
++
++ if (CHECK_AX88796L_PORT(port)) {
++ p = (volatile u16 *)port88796l(port, 0);
++ while (count--)
++ *buf++ = *p & 0xff;
++ } else if (PXSEG(port)) {
++ while (count--)
++ *buf++ = *(volatile u8 *)port;
++ } else if (is_pci_ioaddr(port) || shifted_port(port)) {
++ volatile u8 *bp = (volatile u8 *)pci_ioaddr(port);
++
++ while (count--)
++ *buf++ = *bp;
++ } else {
++ p = (volatile u16 *)port2adr(port);
++ while (count--)
++ *buf++ = *p & 0xff;
++ }
++}
++
++void r7780rp_insw(unsigned long port, void *dst, unsigned long count)
++{
++ volatile u16 *p;
++ u16 *buf = dst;
++
++ if (CHECK_AX88796L_PORT(port))
++ p = (volatile u16 *)port88796l(port, 1);
++ else if (PXSEG(port))
++ p = (volatile u16 *)port;
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ p = (volatile u16 *)pci_ioaddr(port);
++ else
++ p = (volatile u16 *)port2adr(port);
++
++ while (count--)
++ *buf++ = *p;
++}
++
++void r7780rp_insl(unsigned long port, void *dst, unsigned long count)
++{
++ u32 *buf = dst;
++
++ if (CHECK_AX88796L_PORT(port))
++ maybebadio(port);
++ else if (is_pci_ioaddr(port) || shifted_port(port)) {
++ volatile u32 *p = (volatile u32 *)pci_ioaddr(port);
++
++ while (count--)
++ *buf++ = *p;
++ } else
++ maybebadio(port);
++}
++
++void r7780rp_outsb(unsigned long port, const void *src, unsigned long count)
++{
++ volatile u16 *p;
++ const u8 *buf = src;
++
++ if (CHECK_AX88796L_PORT(port)) {
++ p = (volatile u16 *)port88796l(port, 0);
++ while (count--)
++ *p = *buf++;
++ } else if (PXSEG(port))
++ while (count--)
++ ctrl_outb(*buf++, port);
++ else if (is_pci_ioaddr(port) || shifted_port(port)) {
++ volatile u8 *bp = (volatile u8 *)pci_ioaddr(port);
++
++ while (count--)
++ *bp = *buf++;
++ } else {
++ p = (volatile u16 *)port2adr(port);
++ while (count--)
++ *p = *buf++;
++ }
++}
++
++void r7780rp_outsw(unsigned long port, const void *src, unsigned long count)
++{
++ volatile u16 *p;
++ const u16 *buf = src;
++
++ if (CHECK_AX88796L_PORT(port))
++ p = (volatile u16 *)port88796l(port, 1);
++ else if (PXSEG(port))
++ p = (volatile u16 *)port;
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ p = (volatile u16 *)pci_ioaddr(port);
++ else
++ p = (volatile u16 *)port2adr(port);
++
++ while (count--)
++ *p = *buf++;
++}
++
++void r7780rp_outsl(unsigned long port, const void *src, unsigned long count)
++{
++ const u32 *buf = src;
++
++ if (CHECK_AX88796L_PORT(port))
++ maybebadio(port);
++ else if (is_pci_ioaddr(port) || shifted_port(port)) {
++ volatile u32 *p = (volatile u32 *)pci_ioaddr(port);
++
++ while (count--)
++ *p = *buf++;
++ } else
++ maybebadio(port);
++}
++
++void __iomem *r7780rp_ioport_map(unsigned long port, unsigned int size)
++{
++ if (CHECK_AX88796L_PORT(port))
++ return (void __iomem *)port88796l(port, size > 1);
++ else if (PXSEG(port))
++ return (void __iomem *)port;
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ return (void __iomem *)pci_ioaddr(port);
++
++ return (void __iomem *)port2adr(port);
++}
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/r7780rp/irq.c linux-2.6.17/arch/sh/boards/renesas/r7780rp/irq.c
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/r7780rp/irq.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/r7780rp/irq.c 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,123 @@
++/*
++ * linux/arch/sh/boards/renesas/r7780rp/irq.c
++ *
++ * Copyright (C) 2000 Kazumoto Kojima
++ *
++ * Renesas Solutions Highlander R7780RP-1 Support.
++ *
++ * Modified for R7780RP-1 by
++ * Atom Create Engineering Co., Ltd. 2002.
++ */
++
++#include <linux/config.h>
++#include <linux/init.h>
++#include <linux/irq.h>
++#include <asm/io.h>
++#include <asm/irq.h>
++#include <asm/r7780rp/r7780rp.h>
++
++#ifdef CONFIG_SH_R7780MP
++static int mask_pos[] = {12, 11, 9, 14, 15, 8, 13, 6, 5, 4, 3, 2, 0, 0, 1, 0};
++#else
++static int mask_pos[] = {15, 14, 13, 12, 11, 10, 9, 8, 7, 5, 6, 4, 0, 1, 2, 0};
++#endif
++
++static void enable_r7780rp_irq(unsigned int irq);
++static void disable_r7780rp_irq(unsigned int irq);
++
++/* shutdown is same as "disable" */
++#define shutdown_r7780rp_irq disable_r7780rp_irq
++
++static void ack_r7780rp_irq(unsigned int irq);
++static void end_r7780rp_irq(unsigned int irq);
++
++static unsigned int startup_r7780rp_irq(unsigned int irq)
++{
++ enable_r7780rp_irq(irq);
++ return 0; /* never anything pending */
++}
++
++static void disable_r7780rp_irq(unsigned int irq)
++{
++ unsigned long flags;
++ unsigned short val;
++ unsigned short mask = 0xffff ^ (0x0001 << mask_pos[irq]);
++
++ /* Set the priority in IPR to 0 */
++ local_irq_save(flags);
++ val = ctrl_inw(IRLCNTR1);
++ val &= mask;
++ ctrl_outw(val, IRLCNTR1);
++ local_irq_restore(flags);
++}
++
++static void enable_r7780rp_irq(unsigned int irq)
++{
++ unsigned long flags;
++ unsigned short val;
++ unsigned short value = (0x0001 << mask_pos[irq]);
++
++ /* Set priority in IPR back to original value */
++ local_irq_save(flags);
++ val = ctrl_inw(IRLCNTR1);
++ val |= value;
++ ctrl_outw(val, IRLCNTR1);
++ local_irq_restore(flags);
++}
++
++static void ack_r7780rp_irq(unsigned int irq)
++{
++ disable_r7780rp_irq(irq);
++}
++
++static void end_r7780rp_irq(unsigned int irq)
++{
++ if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
++ enable_r7780rp_irq(irq);
++}
++
++static struct hw_interrupt_type r7780rp_irq_type = {
++ .typename = "R7780RP-IRQ",
++ .startup = startup_r7780rp_irq,
++ .shutdown = shutdown_r7780rp_irq,
++ .enable = enable_r7780rp_irq,
++ .disable = disable_r7780rp_irq,
++ .ack = ack_r7780rp_irq,
++ .end = end_r7780rp_irq,
++};
++
++static void make_r7780rp_irq(unsigned int irq)
++{
++ disable_irq_nosync(irq);
++ irq_desc[irq].handler = &r7780rp_irq_type;
++ disable_r7780rp_irq(irq);
++}
++
++/*
++ * Initialize IRQ setting
++ */
++void __init init_r7780rp_IRQ(void)
++{
++ int i;
++
++ /* IRL0=PCI Slot #A
++ * IRL1=PCI Slot #B
++ * IRL2=PCI Slot #C
++ * IRL3=PCI Slot #D
++ * IRL4=CF Card
++ * IRL5=CF Card Insert
++ * IRL6=M66596
++ * IRL7=SD Card
++ * IRL8=Touch Panel
++ * IRL9=SCI
++ * IRL10=Serial
++ * IRL11=Extention #A
++ * IRL11=Extention #B
++ * IRL12=Debug LAN
++ * IRL13=Push Switch
++ * IRL14=ZiggBee IO
++ */
++
++ for (i=0; i<15; i++)
++ make_r7780rp_irq(i);
++}
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/r7780rp/led.c linux-2.6.17/arch/sh/boards/renesas/r7780rp/led.c
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/r7780rp/led.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/r7780rp/led.c 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,45 @@
++/*
++ * Copyright (C) Atom Create Engineering Co., Ltd.
++ *
++ * May be copied or modified under the terms of GNU General Public
++ * License. See linux/COPYING for more information.
++ *
++ * This file contains Renesas Solutions HIGHLANDER R7780RP-1 specific LED code.
++ */
++
++#include <linux/config.h>
++#include <linux/sched.h>
++#include <asm/io.h>
++#include <asm/r7780rp/r7780rp.h>
++
++/* Cycle the LED's in the clasic Knightriger/Sun pattern */
++void heartbeat_r7780rp(void)
++{
++ static unsigned int cnt = 0, period = 0;
++ volatile unsigned short *p = (volatile unsigned short *)PA_OBLED;
++ static unsigned bit = 0, up = 1;
++ unsigned bit_pos[] = {2, 1, 0, 3, 6, 5, 4, 7};
++
++ cnt += 1;
++ if (cnt < period)
++ return;
++
++ cnt = 0;
++
++ /* Go through the points (roughly!):
++ * f(0)=10, f(1)=16, f(2)=20, f(5)=35, f(int)->110
++ */
++ period = 110 - ((300 << FSHIFT)/((avenrun[0]/5) + (3<<FSHIFT)));
++
++ *p = 1 << bit_pos[bit];
++ if (up)
++ if (bit == 7) {
++ bit--;
++ up = 0;
++ } else
++ bit++;
++ else if (bit == 0)
++ up = 1;
++ else
++ bit--;
++}
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/r7780rp/setup.c linux-2.6.17/arch/sh/boards/renesas/r7780rp/setup.c
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/r7780rp/setup.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/r7780rp/setup.c 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,164 @@
++/*
++ * arch/sh/boards/renesas/r7780rp/setup.c
++ *
++ * Copyright (C) 2002 Atom Create Engineering Co., Ltd.
++ * Copyright (C) 2005, 2006 Paul Mundt
++ *
++ * Renesas Solutions Highlander R7780RP-1 Support.
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ */
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <asm/machvec.h>
++#include <asm/r7780rp/r7780rp.h>
++#include <asm/clock.h>
++#include <asm/io.h>
++
++extern void heartbeat_r7780rp(void);
++extern void init_r7780rp_IRQ(void);
++
++/*
++ * The Machine Vector
++ */
++struct sh_machine_vector mv_r7780rp __initmv = {
++ .mv_nr_irqs = 109,
++
++ .mv_inb = r7780rp_inb,
++ .mv_inw = r7780rp_inw,
++ .mv_inl = r7780rp_inl,
++ .mv_outb = r7780rp_outb,
++ .mv_outw = r7780rp_outw,
++ .mv_outl = r7780rp_outl,
++
++ .mv_inb_p = r7780rp_inb_p,
++ .mv_inw_p = r7780rp_inw,
++ .mv_inl_p = r7780rp_inl,
++ .mv_outb_p = r7780rp_outb_p,
++ .mv_outw_p = r7780rp_outw,
++ .mv_outl_p = r7780rp_outl,
++
++ .mv_insb = r7780rp_insb,
++ .mv_insw = r7780rp_insw,
++ .mv_insl = r7780rp_insl,
++ .mv_outsb = r7780rp_outsb,
++ .mv_outsw = r7780rp_outsw,
++ .mv_outsl = r7780rp_outsl,
++
++ .mv_ioport_map = r7780rp_ioport_map,
++ .mv_init_irq = init_r7780rp_IRQ,
++#ifdef CONFIG_HEARTBEAT
++ .mv_heartbeat = heartbeat_r7780rp,
++#endif
++};
++ALIAS_MV(r7780rp)
++
++static struct resource m66596_usb_host_resources[] = {
++ [0] = {
++ .start = 0xa4800000,
++ .end = 0xa4ffffff,
++ .flags = IORESOURCE_MEM,
++ },
++ [1] = {
++ .start = 6, /* irq number */
++ .end = 6,
++ .flags = IORESOURCE_IRQ,
++ },
++};
++
++static struct platform_device m66596_usb_host_device = {
++ .name = "m66596-hcd",
++ .id = 0,
++ .dev = {
++ .dma_mask = NULL, /* don't use dma */
++ .coherent_dma_mask = 0xffffffff,
++ },
++ .num_resources = ARRAY_SIZE(m66596_usb_host_resources),
++ .resource = m66596_usb_host_resources,
++};
++
++static struct platform_device *r7780rp_devices[] __initdata = {
++ &m66596_usb_host_device,
++};
++
++static int __init r7780rp_devices_setup(void)
++{
++ return platform_add_devices(r7780rp_devices,
++ ARRAY_SIZE(r7780rp_devices));
++}
++__initcall(r7780rp_devices_setup);
++
++/*
++ * Platform specific clocks
++ */
++static void ivdr_clk_enable(struct clk *clk)
++{
++ ctrl_outw(ctrl_inw(PA_IVDRCTL) | (1 << 8), PA_IVDRCTL);
++}
++
++static void ivdr_clk_disable(struct clk *clk)
++{
++ ctrl_outw(ctrl_inw(PA_IVDRCTL) & ~(1 << 8), PA_IVDRCTL);
++}
++
++static struct clk_ops ivdr_clk_ops = {
++ .enable = ivdr_clk_enable,
++ .disable = ivdr_clk_disable,
++};
++
++static struct clk ivdr_clk = {
++ .name = "ivdr_clk",
++ .ops = &ivdr_clk_ops,
++};
++
++static struct clk *r7780rp_clocks[] = {
++ &ivdr_clk,
++};
++
++const char *get_system_type(void)
++{
++ return "Highlander R7780RP-1";
++}
++
++static void r7780rp_power_off(void)
++{
++#ifdef CONFIG_SH_R7780MP
++ ctrl_outw(0x0001, PA_POFF);
++#endif
++}
++
++/*
++ * Initialize the board
++ */
++void __init platform_setup(void)
++{
++ u16 ver = ctrl_inw(PA_VERREG);
++ int i;
++
++ printk(KERN_INFO "Renesas Solutions Highlander R7780RP-1 support.\n");
++
++ printk(KERN_INFO "Board version: %d (revision %d), "
++ "FPGA version: %d (revision %d)\n",
++ (ver >> 12) & 0xf, (ver >> 8) & 0xf,
++ (ver >> 4) & 0xf, ver & 0xf);
++
++ /*
++ * Enable the important clocks right away..
++ */
++ for (i = 0; i < ARRAY_SIZE(r7780rp_clocks); i++) {
++ struct clk *clk = r7780rp_clocks[i];
++
++ clk_register(clk);
++ clk_enable(clk);
++ }
++
++ ctrl_outw(0x0000, PA_OBLED); /* Clear LED. */
++#ifndef CONFIG_SH_R7780MP
++ ctrl_outw(0x0001, PA_SDPOW); /* SD Power ON */
++#endif
++ ctrl_outw(ctrl_inw(PA_IVDRCTL) | 0x0100, PA_IVDRCTL); /* Si13112 */
++
++ pm_power_off = r7780rp_power_off;
++}
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/rts7751r2d/CVS/Entries linux-2.6.17/arch/sh/boards/renesas/rts7751r2d/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/rts7751r2d/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/rts7751r2d/CVS/Entries 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,8 @@
++/Kconfig/1.1/Fri Jun 24 11:21:00 2005/-ko/
++/Makefile/1.2/Sun Oct 16 16:31:08 2005/-ko/
++/io.c/1.6/Sun Feb 5 21:55:28 2006/-ko/
++/irq.c/1.3/Fri Oct 28 13:12:48 2005/-ko/
++/mach.c/1.6/Tue Jan 3 22:51:46 2006/-ko/
++/led.c/1.3/Sat Jul 8 20:16:04 2006/-ko/
++/setup.c/1.5/Sat Jul 8 20:16:04 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/rts7751r2d/CVS/Repository linux-2.6.17/arch/sh/boards/renesas/rts7751r2d/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/rts7751r2d/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/rts7751r2d/CVS/Repository 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/renesas/rts7751r2d
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/rts7751r2d/CVS/Root linux-2.6.17/arch/sh/boards/renesas/rts7751r2d/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/rts7751r2d/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/rts7751r2d/CVS/Root 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/rts7751r2d/Kconfig linux-2.6.17/arch/sh/boards/renesas/rts7751r2d/Kconfig
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/rts7751r2d/Kconfig 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/rts7751r2d/Kconfig 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,12 @@
++if SH_RTS7751R2D
++
++menu "RTS7751R2D options"
++
++config RTS7751R2D_REV11
++ bool "RTS7751R2D Rev. 1.1 board support"
++ help
++ Selecting this option will support version rev. 1.1.
++endmenu
++
++endif
++
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/rts7751r2d/Makefile linux-2.6.17/arch/sh/boards/renesas/rts7751r2d/Makefile
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/rts7751r2d/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/rts7751r2d/Makefile 2006-07-12 16:54:20.000000000 +0000
+@@ -1,10 +1,6 @@
+ #
+ # Makefile for the RTS7751R2D specific parts of the kernel
+ #
+-# Note! Dependencies are done automagically by 'make dep', which also
+-# removes any old dependencies. DON'T put your own dependencies here
+-# unless it's something special (ie not a .c file).
+-#
+
+ obj-y := mach.o setup.o io.o irq.o led.o
+
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/rts7751r2d/io.c linux-2.6.17/arch/sh/boards/renesas/rts7751r2d/io.c
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/rts7751r2d/io.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/rts7751r2d/io.c 2006-07-12 16:54:20.000000000 +0000
+@@ -1,6 +1,4 @@
+ /*
+- * linux/arch/sh/kernel/io_rts7751r2d.c
+- *
+ * Copyright (C) 2001 Ian da Silva, Jeremy Siegel
+ * Based largely on io_se.c.
+ *
+@@ -10,17 +8,13 @@
+ * placeholder code from io_rts7751r2d.c left in with the
+ * expectation of later SuperIO and PCMCIA access.
+ */
+-
+ #include <linux/kernel.h>
+ #include <linux/types.h>
+-#include <asm/io.h>
++#include <linux/pci.h>
+ #include <asm/rts7751r2d/rts7751r2d.h>
++#include <asm/io.h>
+ #include <asm/addrspace.h>
+
+-#include <linux/module.h>
+-#include <linux/pci.h>
+-#include "../../../drivers/pci/pci-sh7751.h"
+-
+ /*
+ * The 7751R RTS7751R2D uses the built-in PCI controller (PCIC)
+ * of the 7751R processor, and has a SuperIO accessible via the PCI.
+@@ -28,22 +22,6 @@
+ * like the other Solution Engine boards.
+ */
+
+-#define PCIIOBR (volatile long *)PCI_REG(SH7751_PCIIOBR)
+-#define PCIMBR (volatile long *)PCI_REG(SH7751_PCIMBR)
+-#define PCI_IO_AREA SH7751_PCI_IO_BASE
+-#define PCI_MEM_AREA SH7751_PCI_CONFIG_BASE
+-
+-#define PCI_IOMAP(adr) (PCI_IO_AREA + (adr & ~SH7751_PCIIOBR_MASK))
+-
+-#define maybebadio(name,port) \
+- printk("bad PC-like io %s for port 0x%lx at 0x%08x\n", \
+- #name, (port), (__u32) __builtin_return_address(0))
+-
+-static inline void delay(void)
+-{
+- ctrl_inw(0xa0000000);
+-}
+-
+ static inline unsigned long port2adr(unsigned int port)
+ {
+ if ((0x1f0 <= port && port < 0x1f8) || port == 0x3f6)
+@@ -52,7 +30,7 @@
+ else
+ return (PA_AREA5_IO + 0x1000 + ((port-0x1f0) << 1));
+ else
+- maybebadio(port2adr, (unsigned long)port);
++ maybebadio((unsigned long)port);
+
+ return port;
+ }
+@@ -81,17 +59,6 @@
+ return 1;
+ }
+
+-/* In case someone configures the kernel w/o PCI support: in that */
+-/* scenario, don't ever bother to check for PCI-window addresses */
+-
+-/* NOTE: WINDOW CHECK MAY BE A BIT OFF, HIGH PCIBIOS_MIN_IO WRAPS? */
+-#if defined(CONFIG_PCI)
+-#define CHECK_SH7751_PCIIO(port) \
+- ((port >= PCIBIOS_MIN_IO) && (port < (PCIBIOS_MIN_IO + SH7751_PCI_IO_SIZE)))
+-#else
+-#define CHECK_SH7751_PCIIO(port) (0)
+-#endif
+-
+ #if defined(CONFIG_NE2000) || defined(CONFIG_NE2000_MODULE)
+ #define CHECK_AX88796L_PORT(port) \
+ ((port >= AX88796L_IO_BASE) && (port < (AX88796L_IO_BASE+0x20)))
+@@ -112,8 +79,8 @@
+ return (*(volatile unsigned short *)port88796l(port, 0)) & 0xff;
+ else if (PXSEG(port))
+ return *(volatile unsigned char *)port;
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
+- return *(volatile unsigned char *)PCI_IOMAP(port);
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ return *(volatile unsigned char *)pci_ioaddr(port);
+ else
+ return (*(volatile unsigned short *)port2adr(port) & 0xff);
+ }
+@@ -126,11 +93,12 @@
+ v = (*(volatile unsigned short *)port88796l(port, 0)) & 0xff;
+ else if (PXSEG(port))
+ v = *(volatile unsigned char *)port;
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
+- v = *(volatile unsigned char *)PCI_IOMAP(port);
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ v = *(volatile unsigned char *)pci_ioaddr(port);
+ else
+ v = (*(volatile unsigned short *)port2adr(port) & 0xff);
+- delay();
++
++ ctrl_delay();
+
+ return v;
+ }
+@@ -138,13 +106,13 @@
+ unsigned short rts7751r2d_inw(unsigned long port)
+ {
+ if (CHECK_AX88796L_PORT(port))
+- maybebadio(inw, port);
++ maybebadio(port);
+ else if (PXSEG(port))
+ return *(volatile unsigned short *)port;
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
+- return *(volatile unsigned short *)PCI_IOMAP(port);
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ return *(volatile unsigned short *)pci_ioaddr(port);
+ else
+- maybebadio(inw, port);
++ maybebadio(port);
+
+ return 0;
+ }
+@@ -152,13 +120,13 @@
+ unsigned int rts7751r2d_inl(unsigned long port)
+ {
+ if (CHECK_AX88796L_PORT(port))
+- maybebadio(inl, port);
++ maybebadio(port);
+ else if (PXSEG(port))
+ return *(volatile unsigned long *)port;
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
+- return *(volatile unsigned long *)PCI_IOMAP(port);
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ return *(volatile unsigned long *)pci_ioaddr(port);
+ else
+- maybebadio(inl, port);
++ maybebadio(port);
+
+ return 0;
+ }
+@@ -169,8 +137,8 @@
+ *((volatile unsigned short *)port88796l(port, 0)) = value;
+ else if (PXSEG(port))
+ *(volatile unsigned char *)port = value;
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
+- *(volatile unsigned char *)PCI_IOMAP(port) = value;
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ *(volatile unsigned char *)pci_ioaddr(port) = value;
+ else
+ *(volatile unsigned short *)port2adr(port) = value;
+ }
+@@ -181,143 +149,152 @@
+ *((volatile unsigned short *)port88796l(port, 0)) = value;
+ else if (PXSEG(port))
+ *(volatile unsigned char *)port = value;
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
+- *(volatile unsigned char *)PCI_IOMAP(port) = value;
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ *(volatile unsigned char *)pci_ioaddr(port) = value;
+ else
+ *(volatile unsigned short *)port2adr(port) = value;
+- delay();
++
++ ctrl_delay();
+ }
+
+ void rts7751r2d_outw(unsigned short value, unsigned long port)
+ {
+ if (CHECK_AX88796L_PORT(port))
+- maybebadio(outw, port);
++ maybebadio(port);
+ else if (PXSEG(port))
+ *(volatile unsigned short *)port = value;
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
+- *(volatile unsigned short *)PCI_IOMAP(port) = value;
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ *(volatile unsigned short *)pci_ioaddr(port) = value;
+ else
+- maybebadio(outw, port);
++ maybebadio(port);
+ }
+
+ void rts7751r2d_outl(unsigned int value, unsigned long port)
+ {
+ if (CHECK_AX88796L_PORT(port))
+- maybebadio(outl, port);
++ maybebadio(port);
+ else if (PXSEG(port))
+ *(volatile unsigned long *)port = value;
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
+- *(volatile unsigned long *)PCI_IOMAP(port) = value;
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ *(volatile unsigned long *)pci_ioaddr(port) = value;
+ else
+- maybebadio(outl, port);
++ maybebadio(port);
+ }
+
+ void rts7751r2d_insb(unsigned long port, void *addr, unsigned long count)
+ {
++ unsigned long a = (unsigned long)addr;
+ volatile __u8 *bp;
+ volatile __u16 *p;
+- unsigned char *s = addr;
+
+ if (CHECK_AX88796L_PORT(port)) {
+ p = (volatile unsigned short *)port88796l(port, 0);
+- while (count--) *s++ = *p & 0xff;
++ while (count--)
++ ctrl_outb(*p & 0xff, a++);
+ } else if (PXSEG(port))
+- while (count--) *s++ = *(volatile unsigned char *)port;
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) {
+- bp = (__u8 *)PCI_IOMAP(port);
+- while (count--) *s++ = *bp;
++ while (count--)
++ ctrl_outb(ctrl_inb(port), a++);
++ else if (is_pci_ioaddr(port) || shifted_port(port)) {
++ bp = (__u8 *)pci_ioaddr(port);
++ while (count--)
++ ctrl_outb(*bp, a++);
+ } else {
+ p = (volatile unsigned short *)port2adr(port);
+- while (count--) *s++ = *p & 0xff;
++ while (count--)
++ ctrl_outb(*p & 0xff, a++);
+ }
+ }
+
+ void rts7751r2d_insw(unsigned long port, void *addr, unsigned long count)
+ {
++ unsigned long a = (unsigned long)addr;
+ volatile __u16 *p;
+- __u16 *s = addr;
+
+ if (CHECK_AX88796L_PORT(port))
+ p = (volatile unsigned short *)port88796l(port, 1);
+ else if (PXSEG(port))
+ p = (volatile unsigned short *)port;
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
+- p = (volatile unsigned short *)PCI_IOMAP(port);
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ p = (volatile unsigned short *)pci_ioaddr(port);
+ else
+ p = (volatile unsigned short *)port2adr(port);
+- while (count--) *s++ = *p;
++ while (count--)
++ ctrl_outw(*p, a++);
+ }
+
+ void rts7751r2d_insl(unsigned long port, void *addr, unsigned long count)
+ {
+ if (CHECK_AX88796L_PORT(port))
+- maybebadio(insl, port);
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) {
+- volatile __u32 *p = (__u32 *)PCI_IOMAP(port);
+- __u32 *s = addr;
+-
+- while (count--) *s++ = *p;
++ maybebadio(port);
++ else if (is_pci_ioaddr(port) || shifted_port(port)) {
++ unsigned long a = (unsigned long)addr;
++
++ while (count--) {
++ ctrl_outl(ctrl_inl(pci_ioaddr(port)), a);
++ a += 4;
++ }
+ } else
+- maybebadio(insl, port);
++ maybebadio(port);
+ }
+
+ void rts7751r2d_outsb(unsigned long port, const void *addr, unsigned long count)
+ {
++ unsigned long a = (unsigned long)addr;
+ volatile __u8 *bp;
+ volatile __u16 *p;
+- const __u8 *s = addr;
+
+ if (CHECK_AX88796L_PORT(port)) {
+ p = (volatile unsigned short *)port88796l(port, 0);
+- while (count--) *p = *s++;
++ while (count--)
++ *p = ctrl_inb(a++);
+ } else if (PXSEG(port))
+- while (count--) *(volatile unsigned char *)port = *s++;
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) {
+- bp = (__u8 *)PCI_IOMAP(port);
+- while (count--) *bp = *s++;
++ while (count--)
++ ctrl_outb(a++, port);
++ else if (is_pci_ioaddr(port) || shifted_port(port)) {
++ bp = (__u8 *)pci_ioaddr(port);
++ while (count--)
++ *bp = ctrl_inb(a++);
+ } else {
+ p = (volatile unsigned short *)port2adr(port);
+- while (count--) *p = *s++;
++ while (count--)
++ *p = ctrl_inb(a++);
+ }
+ }
+
+ void rts7751r2d_outsw(unsigned long port, const void *addr, unsigned long count)
+ {
++ unsigned long a = (unsigned long)addr;
+ volatile __u16 *p;
+- const __u16 *s = addr;
+
+ if (CHECK_AX88796L_PORT(port))
+ p = (volatile unsigned short *)port88796l(port, 1);
+ else if (PXSEG(port))
+ p = (volatile unsigned short *)port;
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port))
+- p = (volatile unsigned short *)PCI_IOMAP(port);
++ else if (is_pci_ioaddr(port) || shifted_port(port))
++ p = (volatile unsigned short *)pci_ioaddr(port);
+ else
+ p = (volatile unsigned short *)port2adr(port);
+- while (count--) *p = *s++;
++
++ while (count--) {
++ ctrl_outw(*p, a);
++ a += 2;
++ }
+ }
+
+ void rts7751r2d_outsl(unsigned long port, const void *addr, unsigned long count)
+ {
+ if (CHECK_AX88796L_PORT(port))
+- maybebadio(outsl, port);
+- else if (CHECK_SH7751_PCIIO(port) || shifted_port(port)) {
+- volatile __u32 *p = (__u32 *)PCI_IOMAP(port);
+- const __u32 *s = addr;
+-
+- while (count--) *p = *s++;
++ maybebadio(port);
++ else if (is_pci_ioaddr(port) || shifted_port(port)) {
++ unsigned long a = (unsigned long)addr;
++
++ while (count--) {
++ ctrl_outl(ctrl_inl(a), pci_ioaddr(port));
++ a += 4;
++ }
+ } else
+- maybebadio(outsl, port);
+-}
+-
+-void *rts7751r2d_ioremap(unsigned long offset, unsigned long size)
+-{
+- if (offset >= 0xfd000000)
+- return (void *)offset;
+- else
+- return (void *)P2SEGADDR(offset);
++ maybebadio(port);
+ }
+-EXPORT_SYMBOL(rts7751r2d_ioremap);
+
+ unsigned long rts7751r2d_isa_port2addr(unsigned long offset)
+ {
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/rts7751r2d/led.c linux-2.6.17/arch/sh/boards/renesas/rts7751r2d/led.c
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/rts7751r2d/led.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/rts7751r2d/led.c 2006-07-12 16:54:20.000000000 +0000
+@@ -13,8 +13,6 @@
+ #include <asm/io.h>
+ #include <asm/rts7751r2d/rts7751r2d.h>
+
+-extern unsigned int debug_counter;
+-
+ #ifdef CONFIG_HEARTBEAT
+
+ #include <linux/sched.h>
+@@ -56,12 +54,3 @@
+ ctrl_outw(value, PA_OUTPORT);
+ }
+
+-void debug_led_disp(void)
+-{
+- unsigned short value;
+-
+- value = (unsigned short)debug_counter++;
+- rts7751r2d_led(value);
+- if (value == 0xff)
+- debug_counter = 0;
+-}
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/rts7751r2d/mach.c linux-2.6.17/arch/sh/boards/renesas/rts7751r2d/mach.c
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/rts7751r2d/mach.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/rts7751r2d/mach.c 2006-07-12 16:54:20.000000000 +0000
+@@ -16,15 +16,16 @@
+ #include <asm/machvec.h>
+ #include <asm/rtc.h>
+ #include <asm/irq.h>
+-#include <asm/rts7751r2d/io.h>
++#include <asm/mach/rts7751r2d.h>
+
+ extern void heartbeat_rts7751r2d(void);
+ extern void init_rts7751r2d_IRQ(void);
+-extern void *rts7751r2d_ioremap(unsigned long, unsigned long);
+ extern int rts7751r2d_irq_demux(int irq);
+
++#ifdef CONFIG_USB_SM501
+ extern void *voyagergx_consistent_alloc(struct device *, size_t, dma_addr_t *, gfp_t);
+ extern int voyagergx_consistent_free(struct device *, size_t, void *, dma_addr_t);
++#endif
+
+ /*
+ * The Machine Vector
+@@ -54,15 +55,13 @@
+ .mv_outsw = rts7751r2d_outsw,
+ .mv_outsl = rts7751r2d_outsl,
+
+- .mv_ioremap = rts7751r2d_ioremap,
+- .mv_isa_port2addr = rts7751r2d_isa_port2addr,
+ .mv_init_irq = init_rts7751r2d_IRQ,
+ #ifdef CONFIG_HEARTBEAT
+ .mv_heartbeat = heartbeat_rts7751r2d,
+ #endif
+ .mv_irq_demux = rts7751r2d_irq_demux,
+
+-#ifdef CONFIG_USB_OHCI_HCD
++#ifdef CONFIG_USB_SM501
+ .mv_consistent_alloc = voyagergx_consistent_alloc,
+ .mv_consistent_free = voyagergx_consistent_free,
+ #endif
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/rts7751r2d/setup.c linux-2.6.17/arch/sh/boards/renesas/rts7751r2d/setup.c
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/rts7751r2d/setup.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/rts7751r2d/setup.c 2006-07-12 16:54:20.000000000 +0000
+@@ -1,25 +1,87 @@
+ /*
+- * linux/arch/sh/kernel/setup_rts7751r2d.c
+- *
+- * Copyright (C) 2000 Kazumoto Kojima
+- *
+ * Renesas Technology Sales RTS7751R2D Support.
+ *
+- * Modified for RTS7751R2D by
+- * Atom Create Engineering Co., Ltd. 2002.
++ * Copyright (C) 2002 Atom Create Engineering Co., Ltd.
++ * Copyright (C) 2004 - 2006 Paul Mundt
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
+ */
+-
+ #include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/serial_8250.h>
++#include <linux/pm.h>
+ #include <asm/io.h>
+-#include <asm/rts7751r2d/rts7751r2d.h>
++#include <asm/mach/rts7751r2d.h>
++#include <asm/mach/voyagergx_reg.h>
++
++static struct plat_serial8250_port uart_platform_data[] = {
++ {
++ .membase = (void *)VOYAGER_UART_BASE,
++ .mapbase = VOYAGER_UART_BASE,
++ .iotype = UPIO_MEM,
++ .irq = VOYAGER_UART0_IRQ,
++ .flags = UPF_BOOT_AUTOCONF,
++ .regshift = 2,
++ .uartclk = (9600 * 16),
++ }, {
++ .flags = 0,
++ },
++};
+
+-unsigned int debug_counter;
++static void __init voyagergx_serial_init(void)
++{
++ unsigned long val;
++
++ /*
++ * GPIO Control
++ */
++ val = inl(GPIO_MUX_HIGH);
++ val |= 0x00001fe0;
++ outl(val, GPIO_MUX_HIGH);
++
++ /*
++ * Power Mode Gate
++ */
++ val = inl(POWER_MODE0_GATE);
++ val |= (POWER_MODE0_GATE_U0 | POWER_MODE0_GATE_U1);
++ outl(val, POWER_MODE0_GATE);
++
++ val = inl(POWER_MODE1_GATE);
++ val |= (POWER_MODE1_GATE_U0 | POWER_MODE1_GATE_U1);
++ outl(val, POWER_MODE1_GATE);
++}
++
++static struct platform_device uart_device = {
++ .name = "serial8250",
++ .id = -1,
++ .dev = {
++ .platform_data = uart_platform_data,
++ },
++};
++
++static struct platform_device *rts7751r2d_devices[] __initdata = {
++ &uart_device,
++};
++
++static int __init rts7751r2d_devices_setup(void)
++{
++ return platform_add_devices(rts7751r2d_devices,
++ ARRAY_SIZE(rts7751r2d_devices));
++}
++__initcall(rts7751r2d_devices_setup);
+
+ const char *get_system_type(void)
+ {
+ return "RTS7751R2D";
+ }
+
++static void rts7751r2d_power_off(void)
++{
++ ctrl_outw(0x0001, PA_POWOFF);
++}
++
+ /*
+ * Initialize the board
+ */
+@@ -27,5 +89,7 @@
+ {
+ printk(KERN_INFO "Renesas Technology Sales RTS7751R2D support.\n");
+ ctrl_outw(0x0000, PA_OUTPORT);
+- debug_counter = 0;
++ pm_power_off = rts7751r2d_power_off;
++
++ voyagergx_serial_init();
+ }
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/systemh/CVS/Entries linux-2.6.17/arch/sh/boards/renesas/systemh/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/systemh/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/systemh/CVS/Entries 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,5 @@
++/Makefile/1.1/Tue Jun 15 18:32:21 2004/-ko/
++/io.c/1.5/Sun Feb 5 21:55:29 2006/-ko/
++/irq.c/1.4/Wed Jan 4 18:52:50 2006/-ko/
++/setup.c/1.3/Wed Jan 4 18:52:50 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/systemh/CVS/Repository linux-2.6.17/arch/sh/boards/renesas/systemh/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/systemh/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/systemh/CVS/Repository 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/renesas/systemh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/systemh/CVS/Root linux-2.6.17/arch/sh/boards/renesas/systemh/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/systemh/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/systemh/CVS/Root 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/systemh/io.c linux-2.6.17/arch/sh/boards/renesas/systemh/io.c
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/systemh/io.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/systemh/io.c 2006-07-12 16:54:20.000000000 +0000
+@@ -5,66 +5,25 @@
+ * Based largely on io_se.c.
+ *
+ * I/O routine for Hitachi 7751 Systemh.
+- *
+ */
+-
+ #include <linux/kernel.h>
+ #include <linux/types.h>
+-#include <asm/systemh/7751systemh.h>
++#include <linux/pci.h>
++#include <asm/systemh7751.h>
+ #include <asm/addrspace.h>
+ #include <asm/io.h>
+
+-#include <linux/pci.h>
+-#include "../../drivers/pci/pci-sh7751.h"
+-
+-/*
+- * The 7751 SystemH Engine uses the built-in PCI controller (PCIC)
+- * of the 7751 processor, and has a SuperIO accessible on its memory
+- * bus.
+- */
+-
+-#define PCIIOBR (volatile long *)PCI_REG(SH7751_PCIIOBR)
+-#define PCIMBR (volatile long *)PCI_REG(SH7751_PCIMBR)
+-#define PCI_IO_AREA SH7751_PCI_IO_BASE
+-#define PCI_MEM_AREA SH7751_PCI_CONFIG_BASE
+-
+-#define PCI_IOMAP(adr) (PCI_IO_AREA + (adr & ~SH7751_PCIIOBR_MASK))
+ #define ETHER_IOMAP(adr) (0xB3000000 + (adr)) /*map to 16bits access area
+ of smc lan chip*/
+-
+-#define maybebadio(name,port) \
+- printk("bad PC-like io %s for port 0x%lx at 0x%08x\n", \
+- #name, (port), (__u32) __builtin_return_address(0))
+-
+-static inline void delay(void)
+-{
+- ctrl_inw(0xa0000000);
+-}
+-
+ static inline volatile __u16 *
+ port2adr(unsigned int port)
+ {
+ if (port >= 0x2000)
+ return (volatile __u16 *) (PA_MRSHPC + (port - 0x2000));
+-#if 0
+- else
+- return (volatile __u16 *) (PA_SUPERIO + (port << 1));
+-#endif
+- maybebadio(name,(unsigned long)port);
++ maybebadio((unsigned long)port);
+ return (volatile __u16*)port;
+ }
+
+-/* In case someone configures the kernel w/o PCI support: in that */
+-/* scenario, don't ever bother to check for PCI-window addresses */
+-
+-/* NOTE: WINDOW CHECK MAY BE A BIT OFF, HIGH PCIBIOS_MIN_IO WRAPS? */
+-#if defined(CONFIG_PCI)
+-#define CHECK_SH7751_PCIIO(port) \
+- ((port >= PCIBIOS_MIN_IO) && (port < (PCIBIOS_MIN_IO + SH7751_PCI_IO_SIZE)))
+-#else
+-#define CHECK_SH7751_PCIIO(port) (0)
+-#endif
+-
+ /*
+ * General outline: remap really low stuff [eventually] to SuperIO,
+ * stuff in PCI IO space (at or above window at pci.h:PCIBIOS_MIN_IO)
+@@ -76,8 +35,8 @@
+ {
+ if (PXSEG(port))
+ return *(volatile unsigned char *)port;
+- else if (CHECK_SH7751_PCIIO(port))
+- return *(volatile unsigned char *)PCI_IOMAP(port);
++ else if (is_pci_ioaddr(port))
++ return *(volatile unsigned char *)pci_ioaddr(port);
+ else if (port <= 0x3F1)
+ return *(volatile unsigned char *)ETHER_IOMAP(port);
+ else
+@@ -90,13 +49,13 @@
+
+ if (PXSEG(port))
+ v = *(volatile unsigned char *)port;
+- else if (CHECK_SH7751_PCIIO(port))
+- v = *(volatile unsigned char *)PCI_IOMAP(port);
++ else if (is_pci_ioaddr(port))
++ v = *(volatile unsigned char *)pci_ioaddr(port);
+ else if (port <= 0x3F1)
+ v = *(volatile unsigned char *)ETHER_IOMAP(port);
+ else
+ v = (*port2adr(port))&0xff;
+- delay();
++ ctrl_delay();
+ return v;
+ }
+
+@@ -104,14 +63,14 @@
+ {
+ if (PXSEG(port))
+ return *(volatile unsigned short *)port;
+- else if (CHECK_SH7751_PCIIO(port))
+- return *(volatile unsigned short *)PCI_IOMAP(port);
++ else if (is_pci_ioaddr(port))
++ return *(volatile unsigned short *)pci_ioaddr(port);
+ else if (port >= 0x2000)
+ return *port2adr(port);
+ else if (port <= 0x3F1)
+ return *(volatile unsigned int *)ETHER_IOMAP(port);
+ else
+- maybebadio(inw, port);
++ maybebadio(port);
+ return 0;
+ }
+
+@@ -119,14 +78,14 @@
+ {
+ if (PXSEG(port))
+ return *(volatile unsigned long *)port;
+- else if (CHECK_SH7751_PCIIO(port))
+- return *(volatile unsigned int *)PCI_IOMAP(port);
++ else if (is_pci_ioaddr(port))
++ return *(volatile unsigned int *)pci_ioaddr(port);
+ else if (port >= 0x2000)
+ return *port2adr(port);
+ else if (port <= 0x3F1)
+ return *(volatile unsigned int *)ETHER_IOMAP(port);
+ else
+- maybebadio(inl, port);
++ maybebadio(port);
+ return 0;
+ }
+
+@@ -135,8 +94,8 @@
+
+ if (PXSEG(port))
+ *(volatile unsigned char *)port = value;
+- else if (CHECK_SH7751_PCIIO(port))
+- *((unsigned char*)PCI_IOMAP(port)) = value;
++ else if (is_pci_ioaddr(port))
++ *((unsigned char*)pci_ioaddr(port)) = value;
+ else if (port <= 0x3F1)
+ *(volatile unsigned char *)ETHER_IOMAP(port) = value;
+ else
+@@ -147,37 +106,37 @@
+ {
+ if (PXSEG(port))
+ *(volatile unsigned char *)port = value;
+- else if (CHECK_SH7751_PCIIO(port))
+- *((unsigned char*)PCI_IOMAP(port)) = value;
++ else if (is_pci_ioaddr(port))
++ *((unsigned char*)pci_ioaddr(port)) = value;
+ else if (port <= 0x3F1)
+ *(volatile unsigned char *)ETHER_IOMAP(port) = value;
+ else
+ *(port2adr(port)) = value;
+- delay();
++ ctrl_delay();
+ }
+
+ void sh7751systemh_outw(unsigned short value, unsigned long port)
+ {
+ if (PXSEG(port))
+ *(volatile unsigned short *)port = value;
+- else if (CHECK_SH7751_PCIIO(port))
+- *((unsigned short *)PCI_IOMAP(port)) = value;
++ else if (is_pci_ioaddr(port))
++ *((unsigned short *)pci_ioaddr(port)) = value;
+ else if (port >= 0x2000)
+ *port2adr(port) = value;
+ else if (port <= 0x3F1)
+ *(volatile unsigned short *)ETHER_IOMAP(port) = value;
+ else
+- maybebadio(outw, port);
++ maybebadio(port);
+ }
+
+ void sh7751systemh_outl(unsigned int value, unsigned long port)
+ {
+ if (PXSEG(port))
+ *(volatile unsigned long *)port = value;
+- else if (CHECK_SH7751_PCIIO(port))
+- *((unsigned long*)PCI_IOMAP(port)) = value;
++ else if (is_pci_ioaddr(port))
++ *((unsigned long*)pci_ioaddr(port)) = value;
+ else
+- maybebadio(outl, port);
++ maybebadio(port);
+ }
+
+ void sh7751systemh_insb(unsigned long port, void *addr, unsigned long count)
+@@ -194,7 +153,7 @@
+
+ void sh7751systemh_insl(unsigned long port, void *addr, unsigned long count)
+ {
+- maybebadio(insl, port);
++ maybebadio(port);
+ }
+
+ void sh7751systemh_outsb(unsigned long port, const void *addr, unsigned long count)
+@@ -211,73 +170,5 @@
+
+ void sh7751systemh_outsl(unsigned long port, const void *addr, unsigned long count)
+ {
+- maybebadio(outsw, port);
+-}
+-
+-/* For read/write calls, just copy generic (pass-thru); PCIMBR is */
+-/* already set up. For a larger memory space, these would need to */
+-/* reset PCIMBR as needed on a per-call basis... */
+-
+-unsigned char sh7751systemh_readb(unsigned long addr)
+-{
+- return *(volatile unsigned char*)addr;
+-}
+-
+-unsigned short sh7751systemh_readw(unsigned long addr)
+-{
+- return *(volatile unsigned short*)addr;
+-}
+-
+-unsigned int sh7751systemh_readl(unsigned long addr)
+-{
+- return *(volatile unsigned long*)addr;
+-}
+-
+-void sh7751systemh_writeb(unsigned char b, unsigned long addr)
+-{
+- *(volatile unsigned char*)addr = b;
+-}
+-
+-void sh7751systemh_writew(unsigned short b, unsigned long addr)
+-{
+- *(volatile unsigned short*)addr = b;
+-}
+-
+-void sh7751systemh_writel(unsigned int b, unsigned long addr)
+-{
+- *(volatile unsigned long*)addr = b;
+-}
+-
+-
+-
+-/* Map ISA bus address to the real address. Only for PCMCIA. */
+-
+-/* ISA page descriptor. */
+-static __u32 sh_isa_memmap[256];
+-
+-#if 0
+-static int
+-sh_isa_mmap(__u32 start, __u32 length, __u32 offset)
+-{
+- int idx;
+-
+- if (start >= 0x100000 || (start & 0xfff) || (length != 0x1000))
+- return -1;
+-
+- idx = start >> 12;
+- sh_isa_memmap[idx] = 0xb8000000 + (offset &~ 0xfff);
+- printk("sh_isa_mmap: start %x len %x offset %x (idx %x paddr %x)\n",
+- start, length, offset, idx, sh_isa_memmap[idx]);
+- return 0;
+-}
+-#endif
+-
+-unsigned long
+-sh7751systemh_isa_port2addr(unsigned long offset)
+-{
+- int idx;
+-
+- idx = (offset >> 12) & 0xff;
+- offset &= 0xfff;
+- return sh_isa_memmap[idx] + offset;
++ maybebadio(port);
+ }
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/systemh/irq.c linux-2.6.17/arch/sh/boards/renesas/systemh/irq.c
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/systemh/irq.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/systemh/irq.c 2006-07-12 16:54:20.000000000 +0000
+@@ -16,7 +16,7 @@
+ #include <linux/hdreg.h>
+ #include <linux/ide.h>
+ #include <asm/io.h>
+-#include <asm/mach/7751systemh.h>
++#include <asm/systemh7751.h>
+ #include <asm/smc37c93x.h>
+
+ /* address of external interrupt mask register
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/renesas/systemh/setup.c linux-2.6.17/arch/sh/boards/renesas/systemh/setup.c
+--- linux-2.6.17-vanilla/arch/sh/boards/renesas/systemh/setup.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/renesas/systemh/setup.c 2006-07-12 16:54:20.000000000 +0000
+@@ -15,9 +15,8 @@
+ * for more details.
+ */
+ #include <linux/init.h>
+-#include <asm/mach/7751systemh.h>
+-#include <asm/mach/io.h>
+ #include <asm/machvec.h>
++#include <asm/systemh7751.h>
+
+ extern void make_systemh_irq(unsigned int irq);
+
+@@ -31,8 +30,6 @@
+ */
+ void __init init_7751systemh_IRQ(void)
+ {
+-/* make_ipr_irq(10, BCR_ILCRD, 1, 0x0f-10); LAN */
+-/* make_ipr_irq(14, BCR_ILCRA, 2, 0x0f-4); */
+ make_systemh_irq(0xb); /* Ethernet interrupt */
+ }
+
+@@ -60,15 +57,6 @@
+ .mv_outsw = sh7751systemh_outsw,
+ .mv_outsl = sh7751systemh_outsl,
+
+- .mv_readb = sh7751systemh_readb,
+- .mv_readw = sh7751systemh_readw,
+- .mv_readl = sh7751systemh_readl,
+- .mv_writeb = sh7751systemh_writeb,
+- .mv_writew = sh7751systemh_writew,
+- .mv_writel = sh7751systemh_writel,
+-
+- .mv_isa_port2addr = sh7751systemh_isa_port2addr,
+-
+ .mv_init_irq = init_7751systemh_IRQ,
+ };
+ ALIAS_MV(7751systemh)
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/saturn/CVS/Entries linux-2.6.17/arch/sh/boards/saturn/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/saturn/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/saturn/CVS/Entries 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,6 @@
++/Makefile/1.4/Thu Mar 11 18:08:03 2004/-ko/
++/io.c/1.2/Sun May 4 19:29:47 2003/-ko/
++/irq.c/1.4/Sun Oct 26 23:41:36 2003/-ko/
++/setup.c/1.4/Sun Oct 26 23:41:36 2003/-ko/
++/smp.c/1.3/Sun Oct 26 23:41:36 2003/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/saturn/CVS/Repository linux-2.6.17/arch/sh/boards/saturn/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/saturn/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/saturn/CVS/Repository 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/saturn
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/saturn/CVS/Root linux-2.6.17/arch/sh/boards/saturn/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/saturn/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/saturn/CVS/Root 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/7300/CVS/Entries linux-2.6.17/arch/sh/boards/se/7300/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/se/7300/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/7300/CVS/Entries 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,6 @@
++/Makefile/1.1/Fri Jun 11 13:02:47 2004//
++/io.c/1.3/Wed Jan 4 17:25:52 2006//
++/irq.c/1.2/Wed Jan 4 17:25:52 2006//
++/led.c/1.2/Wed Jan 4 17:25:52 2006//
++/setup.c/1.2/Wed Jan 4 17:25:52 2006//
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/7300/CVS/Repository linux-2.6.17/arch/sh/boards/se/7300/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/se/7300/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/7300/CVS/Repository 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/se/7300
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/7300/CVS/Root linux-2.6.17/arch/sh/boards/se/7300/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/se/7300/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/7300/CVS/Root 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/7300/io.c linux-2.6.17/arch/sh/boards/se/7300/io.c
+--- linux-2.6.17-vanilla/arch/sh/boards/se/7300/io.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/7300/io.c 2006-07-12 16:54:20.000000000 +0000
+@@ -10,8 +10,8 @@
+
+ #include <linux/config.h>
+ #include <linux/kernel.h>
+-#include <asm/mach/se7300.h>
+ #include <asm/io.h>
++#include <asm/se7300.h>
+
+ #define badio(fn, a) panic("bad i/o operation %s for %08lx.", #fn, a)
+
+@@ -100,6 +100,7 @@
+ badio(inw, port);
+ }
+
++#ifdef CONFIG_SMC91X
+ /* MSTLANEX01 LAN at 0xb400:0000 */
+ static struct iop laniop = {
+ .start = 0x300,
+@@ -111,6 +112,7 @@
+ .outb = simple_outb,
+ .outw = simple_outw,
+ };
++#endif
+
+ /* NE2000 pc card NIC */
+ static struct iop neiop = {
+@@ -124,6 +126,7 @@
+ .outw = simple_outw,
+ };
+
++#ifdef CONFIG_IDE
+ /* CF in CF slot */
+ static struct iop cfiop = {
+ .base = 0xb0600000,
+@@ -133,12 +136,13 @@
+ .outb = pcc_outb,
+ .outw = simple_outw,
+ };
++#endif
+
+ static __inline__ struct iop *
+ port2iop(unsigned long port)
+ {
+ if (0) ;
+-#if defined(CONFIG_SMC91111)
++#if defined(CONFIG_SMC91X)
+ else if (laniop.check(&laniop, port))
+ return &laniop;
+ #endif
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/7300/irq.c linux-2.6.17/arch/sh/boards/se/7300/irq.c
+--- linux-2.6.17-vanilla/arch/sh/boards/se/7300/irq.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/7300/irq.c 2006-07-12 16:54:20.000000000 +0000
+@@ -12,7 +12,7 @@
+ #include <linux/irq.h>
+ #include <asm/irq.h>
+ #include <asm/io.h>
+-#include <asm/mach/se7300.h>
++#include <asm/se7300.h>
+
+ /*
+ * Initialize IRQ setting
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/7300/led.c linux-2.6.17/arch/sh/boards/se/7300/led.c
+--- linux-2.6.17-vanilla/arch/sh/boards/se/7300/led.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/7300/led.c 2006-07-12 16:54:20.000000000 +0000
+@@ -13,24 +13,10 @@
+
+ #include <linux/config.h>
+ #include <linux/sched.h>
+-#include <asm/mach/se7300.h>
+-
+-static void
+-mach_led(int position, int value)
+-{
+- volatile unsigned short *p = (volatile unsigned short *) PA_LED;
+-
+- if (value) {
+- *p |= (1 << 8);
+- } else {
+- *p &= ~(1 << 8);
+- }
+-}
+-
++#include <asm/se7300.h>
+
+ /* Cycle the LED's in the clasic Knightrider/Sun pattern */
+-void
+-heartbeat_7300se(void)
++void heartbeat_7300se(void)
+ {
+ static unsigned int cnt = 0, period = 0;
+ volatile unsigned short *p = (volatile unsigned short *) PA_LED;
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/7300/setup.c linux-2.6.17/arch/sh/boards/se/7300/setup.c
+--- linux-2.6.17-vanilla/arch/sh/boards/se/7300/setup.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/7300/setup.c 2006-07-12 16:54:20.000000000 +0000
+@@ -10,8 +10,7 @@
+ #include <linux/config.h>
+ #include <linux/init.h>
+ #include <asm/machvec.h>
+-#include <asm/machvec_init.h>
+-#include <asm/mach/io.h>
++#include <asm/se7300.h>
+
+ void heartbeat_7300se(void);
+ void init_7300se_IRQ(void);
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/73180/CVS/Entries linux-2.6.17/arch/sh/boards/se/73180/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/se/73180/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/73180/CVS/Entries 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,6 @@
++/Makefile/1.1/Mon Jun 28 13:18:45 2004//
++/io.c/1.2/Tue May 31 14:00:25 2005//
++/irq.c/1.2/Tue May 31 14:00:25 2005//
++/led.c/1.2/Tue May 31 14:00:25 2005//
++/setup.c/1.3/Sun Jan 8 12:22:57 2006//
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/73180/CVS/Repository linux-2.6.17/arch/sh/boards/se/73180/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/se/73180/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/73180/CVS/Repository 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/se/73180
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/73180/CVS/Root linux-2.6.17/arch/sh/boards/se/73180/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/se/73180/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/73180/CVS/Root 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/73180/io.c linux-2.6.17/arch/sh/boards/se/73180/io.c
+--- linux-2.6.17-vanilla/arch/sh/boards/se/73180/io.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/73180/io.c 2006-07-12 16:54:20.000000000 +0000
+@@ -100,6 +100,7 @@
+ badio(inw, port);
+ }
+
++#ifdef CONFIG_SMC91X
+ /* MSTLANEX01 LAN at 0xb400:0000 */
+ static struct iop laniop = {
+ .start = 0x300,
+@@ -111,6 +112,7 @@
+ .outb = simple_outb,
+ .outw = simple_outw,
+ };
++#endif
+
+ /* NE2000 pc card NIC */
+ static struct iop neiop = {
+@@ -124,6 +126,7 @@
+ .outw = simple_outw,
+ };
+
++#ifdef CONFIG_IDE
+ /* CF in CF slot */
+ static struct iop cfiop = {
+ .base = 0xb0600000,
+@@ -133,12 +136,13 @@
+ .outb = pcc_outb,
+ .outw = simple_outw,
+ };
++#endif
+
+ static __inline__ struct iop *
+ port2iop(unsigned long port)
+ {
+ if (0) ;
+-#if defined(CONFIG_SMC91111)
++#if defined(CONFIG_SMC91X)
+ else if (laniop.check(&laniop, port))
+ return &laniop;
+ #endif
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/73180/irq.c linux-2.6.17/arch/sh/boards/se/73180/irq.c
+--- linux-2.6.17-vanilla/arch/sh/boards/se/73180/irq.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/73180/irq.c 2006-07-12 16:54:20.000000000 +0000
+@@ -7,7 +7,6 @@
+ * Modified for SH-Mobile SolutionEngine 73180 Support
+ * by YOSHII Takashi <yoshii-takashi@hitachi-ul.co.jp>
+ *
+- *
+ */
+
+ #include <linux/config.h>
+@@ -18,14 +17,6 @@
+ #include <asm/mach/se73180.h>
+
+ static int
+-intreq2irq(int i)
+-{
+- if (i == 5)
+- return 10;
+- return 32 + 7 - i;
+-}
+-
+-static int
+ irq2intreq(int irq)
+ {
+ if (irq == 10)
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/73180/led.c linux-2.6.17/arch/sh/boards/se/73180/led.c
+--- linux-2.6.17-vanilla/arch/sh/boards/se/73180/led.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/73180/led.c 2006-07-12 16:54:20.000000000 +0000
+@@ -15,21 +15,8 @@
+ #include <linux/sched.h>
+ #include <asm/mach/se73180.h>
+
+-static void
+-mach_led(int position, int value)
+-{
+- volatile unsigned short *p = (volatile unsigned short *) PA_LED;
+-
+- if (value) {
+- *p |= (1 << LED_SHIFT);
+- } else {
+- *p &= ~(1 << LED_SHIFT);
+- }
+-}
+-
+ /* Cycle the LED's in the clasic Knightrider/Sun pattern */
+-void
+-heartbeat_73180se(void)
++void heartbeat_73180se(void)
+ {
+ static unsigned int cnt = 0, period = 0;
+ volatile unsigned short *p = (volatile unsigned short *) PA_LED;
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/73180/setup.c linux-2.6.17/arch/sh/boards/se/73180/setup.c
+--- linux-2.6.17-vanilla/arch/sh/boards/se/73180/setup.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/73180/setup.c 2006-07-12 16:54:20.000000000 +0000
+@@ -12,8 +12,8 @@
+ #include <linux/config.h>
+ #include <linux/init.h>
+ #include <asm/machvec.h>
+-#include <asm/machvec_init.h>
+-#include <asm/mach/io.h>
++#include <asm/se73180.h>
++#include <asm/irq.h>
+
+ void heartbeat_73180se(void);
+ void init_73180se_IRQ(void);
+@@ -52,6 +52,7 @@
+ .mv_outsl = sh73180se_outsl,
+
+ .mv_init_irq = init_73180se_IRQ,
++ .mv_irq_demux = shmse_irq_demux,
+ #ifdef CONFIG_HEARTBEAT
+ .mv_heartbeat = heartbeat_73180se,
+ #endif
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/770x/CVS/Entries linux-2.6.17/arch/sh/boards/se/770x/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/se/770x/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/770x/CVS/Entries 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,7 @@
++/Makefile/1.5/Tue May 31 14:49:59 2005//
++/io.c/1.7/Sun Feb 5 21:55:29 2006//
++/irq.c/1.7/Wed Jan 4 17:53:54 2006/-ko/
++/led.c/1.4/Wed Jan 4 17:53:54 2006//
++/mach.c/1.8/Wed Jan 4 17:53:54 2006//
++/setup.c/1.5/Wed Jan 4 17:53:54 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/770x/CVS/Repository linux-2.6.17/arch/sh/boards/se/770x/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/se/770x/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/770x/CVS/Repository 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/se/770x
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/770x/CVS/Root linux-2.6.17/arch/sh/boards/se/770x/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/se/770x/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/770x/CVS/Root 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/770x/Makefile linux-2.6.17/arch/sh/boards/se/770x/Makefile
+--- linux-2.6.17-vanilla/arch/sh/boards/se/770x/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/770x/Makefile 2006-07-12 16:54:20.000000000 +0000
+@@ -2,5 +2,6 @@
+ # Makefile for the 770x SolutionEngine specific parts of the kernel
+ #
+
+-obj-y := mach.o setup.o io.o irq.o led.o
++obj-y := mach.o setup.o io.o irq.o
+
++obj-$(CONFIG_HEARTBEAT) += led.o
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/770x/io.c linux-2.6.17/arch/sh/boards/se/770x/io.c
+--- linux-2.6.17-vanilla/arch/sh/boards/se/770x/io.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/770x/io.c 2006-07-12 16:54:20.000000000 +0000
+@@ -1,4 +1,4 @@
+-/* $Id: io.c,v 1.5 2004/02/22 23:08:43 kkojima Exp $
++/* $Id: io.c,v 1.7 2006/02/05 21:55:29 lethal Exp $
+ *
+ * linux/arch/sh/kernel/io_se.c
+ *
+@@ -11,7 +11,7 @@
+ #include <linux/kernel.h>
+ #include <linux/types.h>
+ #include <asm/io.h>
+-#include <asm/se/se.h>
++#include <asm/se.h>
+
+ /* SH pcmcia io window base, start and end. */
+ int sh_pcic_io_wbase = 0xb8400000;
+@@ -20,11 +20,6 @@
+ int sh_pcic_io_type;
+ int sh_pcic_io_dummy;
+
+-static inline void delay(void)
+-{
+- ctrl_inw(0xa0000000);
+-}
+-
+ /* MS7750 requires special versions of in*, out* routines, since
+ PC-like io ports are located at upper half byte of 16-bit word which
+ can be accessed only with 16-bit wide. */
+@@ -52,10 +47,6 @@
+ return 1;
+ }
+
+-#define maybebadio(name,port) \
+- printk("bad PC-like io %s for port 0x%lx at 0x%08x\n", \
+- #name, (port), (__u32) __builtin_return_address(0))
+-
+ unsigned char se_inb(unsigned long port)
+ {
+ if (sh_pcic_io_start <= port && port <= sh_pcic_io_stop)
+@@ -76,7 +67,7 @@
+ v = (*port2adr(port) >> 8);
+ else
+ v = (*port2adr(port))&0xff;
+- delay();
++ ctrl_delay();
+ return v;
+ }
+
+@@ -86,13 +77,13 @@
+ (sh_pcic_io_start <= port && port <= sh_pcic_io_stop))
+ return *port2adr(port);
+ else
+- maybebadio(inw, port);
++ maybebadio(port);
+ return 0;
+ }
+
+ unsigned int se_inl(unsigned long port)
+ {
+- maybebadio(inl, port);
++ maybebadio(port);
+ return 0;
+ }
+
+@@ -114,7 +105,7 @@
+ *(port2adr(port)) = value << 8;
+ else
+ *(port2adr(port)) = value;
+- delay();
++ ctrl_delay();
+ }
+
+ void se_outw(unsigned short value, unsigned long port)
+@@ -123,12 +114,12 @@
+ (sh_pcic_io_start <= port && port <= sh_pcic_io_stop))
+ *port2adr(port) = value;
+ else
+- maybebadio(outw, port);
++ maybebadio(port);
+ }
+
+ void se_outl(unsigned int value, unsigned long port)
+ {
+- maybebadio(outl, port);
++ maybebadio(port);
+ }
+
+ void se_insb(unsigned long port, void *addr, unsigned long count)
+@@ -159,7 +150,7 @@
+
+ void se_insl(unsigned long port, void *addr, unsigned long count)
+ {
+- maybebadio(insl, port);
++ maybebadio(port);
+ }
+
+ void se_outsb(unsigned long port, const void *addr, unsigned long count)
+@@ -190,37 +181,5 @@
+
+ void se_outsl(unsigned long port, const void *addr, unsigned long count)
+ {
+- maybebadio(outsw, port);
+-}
+-
+-/* Map ISA bus address to the real address. Only for PCMCIA. */
+-
+-/* ISA page descriptor. */
+-static __u32 sh_isa_memmap[256];
+-
+-static int
+-sh_isa_mmap(__u32 start, __u32 length, __u32 offset)
+-{
+- int idx;
+-
+- if (start >= 0x100000 || (start & 0xfff) || (length != 0x1000))
+- return -1;
+-
+- idx = start >> 12;
+- sh_isa_memmap[idx] = 0xb8000000 + (offset &~ 0xfff);
+-#if 0
+- printk("sh_isa_mmap: start %x len %x offset %x (idx %x paddr %x)\n",
+- start, length, offset, idx, sh_isa_memmap[idx]);
+-#endif
+- return 0;
+-}
+-
+-unsigned long
+-se_isa_port2addr(unsigned long offset)
+-{
+- int idx;
+-
+- idx = (offset >> 12) & 0xff;
+- offset &= 0xfff;
+- return sh_isa_memmap[idx] + offset;
++ maybebadio(port);
+ }
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/770x/irq.c linux-2.6.17/arch/sh/boards/se/770x/irq.c
+--- linux-2.6.17-vanilla/arch/sh/boards/se/770x/irq.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/770x/irq.c 2006-07-12 16:54:20.000000000 +0000
+@@ -12,7 +12,7 @@
+ #include <linux/irq.h>
+ #include <asm/irq.h>
+ #include <asm/io.h>
+-#include <asm/se/se.h>
++#include <asm/se.h>
+
+ /*
+ * Initialize IRQ setting
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/770x/led.c linux-2.6.17/arch/sh/boards/se/770x/led.c
+--- linux-2.6.17-vanilla/arch/sh/boards/se/770x/led.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/770x/led.c 2006-07-12 16:54:20.000000000 +0000
+@@ -10,22 +10,8 @@
+ */
+
+ #include <linux/config.h>
+-#include <asm/se/se.h>
+-
+-static void mach_led(int position, int value)
+-{
+- volatile unsigned short* p = (volatile unsigned short*)PA_LED;
+-
+- if (value) {
+- *p |= (1<<8);
+- } else {
+- *p &= ~(1<<8);
+- }
+-}
+-
+-#ifdef CONFIG_HEARTBEAT
+-
+ #include <linux/sched.h>
++#include <asm/se.h>
+
+ /* Cycle the LED's in the clasic Knightrider/Sun pattern */
+ void heartbeat_se(void)
+@@ -65,4 +51,3 @@
+ *p = 1<<(bit+8);
+
+ }
+-#endif /* CONFIG_HEARTBEAT */
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/770x/mach.c linux-2.6.17/arch/sh/boards/se/770x/mach.c
+--- linux-2.6.17-vanilla/arch/sh/boards/se/770x/mach.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/770x/mach.c 2006-07-12 16:54:20.000000000 +0000
+@@ -14,12 +14,9 @@
+
+ #include <asm/machvec.h>
+ #include <asm/rtc.h>
+-#include <asm/machvec_init.h>
+-
+-#include <asm/se/io.h>
++#include <asm/se.h>
+
+ void heartbeat_se(void);
+-void setup_se(void);
+ void init_se_IRQ(void);
+
+ /*
+@@ -58,8 +55,6 @@
+ .mv_outsw = se_outsw,
+ .mv_outsl = se_outsl,
+
+- .mv_isa_port2addr = se_isa_port2addr,
+-
+ .mv_init_irq = init_se_IRQ,
+ #ifdef CONFIG_HEARTBEAT
+ .mv_heartbeat = heartbeat_se,
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/770x/setup.c linux-2.6.17/arch/sh/boards/se/770x/setup.c
+--- linux-2.6.17-vanilla/arch/sh/boards/se/770x/setup.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/770x/setup.c 2006-07-12 16:54:20.000000000 +0000
+@@ -1,4 +1,4 @@
+-/* $Id: setup.c,v 1.1.2.4 2002/03/02 21:57:07 lethal Exp $
++/* $Id: setup.c,v 1.3 2003/05/04 19:29:47 lethal Exp $
+ *
+ * linux/arch/sh/boards/se/770x/setup.c
+ *
+@@ -15,8 +15,8 @@
+ #include <linux/hdreg.h>
+ #include <linux/ide.h>
+ #include <asm/io.h>
+-#include <asm/se/se.h>
+-#include <asm/se/smc37c93x.h>
++#include <asm/se.h>
++#include <asm/smc37c93x.h>
+
+ /*
+ * Configure the Super I/O chip
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/7751/CVS/Entries linux-2.6.17/arch/sh/boards/se/7751/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/se/7751/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/7751/CVS/Entries 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,8 @@
++/Makefile/1.5/Tue May 31 15:16:49 2005//
++/io.c/1.6/Sun Feb 5 21:55:29 2006//
++/irq.c/1.3/Wed Jan 4 18:13:24 2006//
++/led.c/1.4/Wed Jan 4 18:13:24 2006//
++/mach.c/1.6/Wed Jan 4 18:13:24 2006//
++/pci.c/1.8/Fri Sep 24 15:16:19 2004//
++/setup.c/1.3/Wed Jan 4 18:13:24 2006//
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/7751/CVS/Repository linux-2.6.17/arch/sh/boards/se/7751/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/se/7751/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/7751/CVS/Repository 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/se/7751
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/7751/CVS/Root linux-2.6.17/arch/sh/boards/se/7751/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/se/7751/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/7751/CVS/Root 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/7751/Makefile linux-2.6.17/arch/sh/boards/se/7751/Makefile
+--- linux-2.6.17-vanilla/arch/sh/boards/se/7751/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/7751/Makefile 2006-07-12 16:54:20.000000000 +0000
+@@ -2,7 +2,8 @@
+ # Makefile for the 7751 SolutionEngine specific parts of the kernel
+ #
+
+-obj-y := mach.o setup.o io.o irq.o led.o
++obj-y := mach.o setup.o io.o irq.o
+
+ obj-$(CONFIG_PCI) += pci.o
++obj-$(CONFIG_HEARTBEAT) += led.o
+
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/7751/io.c linux-2.6.17/arch/sh/boards/se/7751/io.c
+--- linux-2.6.17-vanilla/arch/sh/boards/se/7751/io.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/7751/io.c 2006-07-12 16:54:20.000000000 +0000
+@@ -1,6 +1,4 @@
+-/*
+- * linux/arch/sh/kernel/io_7751se.c
+- *
++/*
+ * Copyright (C) 2001 Ian da Silva, Jeremy Siegel
+ * Based largely on io_se.c.
+ *
+@@ -10,96 +8,21 @@
+ * placeholder code from io_se.c left in with the
+ * expectation of later SuperIO and PCMCIA access.
+ */
+-
+ #include <linux/kernel.h>
+ #include <linux/types.h>
++#include <linux/pci.h>
+ #include <asm/io.h>
+-#include <asm/se7751/se7751.h>
++#include <asm/se7751.h>
+ #include <asm/addrspace.h>
+
+-#include <linux/pci.h>
+-#include "../../../drivers/pci/pci-sh7751.h"
+-
+-#if 0
+-/******************************************************************
+- * Variables from io_se.c, related to PCMCIA (not PCI); we're not
+- * compiling them in, and have removed references from functions
+- * which follow. [Many checked for IO ports in the range bounded
+- * by sh_pcic_io_start/stop, and used sh_pcic_io_wbase as offset.
+- * As start/stop are uninitialized, only port 0x0 would match?]
+- * When used, remember to adjust names to avoid clash with io_se?
+- *****************************************************************/
+-/* SH pcmcia io window base, start and end. */
+-int sh_pcic_io_wbase = 0xb8400000;
+-int sh_pcic_io_start;
+-int sh_pcic_io_stop;
+-int sh_pcic_io_type;
+-int sh_pcic_io_dummy;
+-/*************************************************************/
+-#endif
+-
+-/*
+- * The 7751 Solution Engine uses the built-in PCI controller (PCIC)
+- * of the 7751 processor, and has a SuperIO accessible via the PCI.
+- * The board also includes a PCMCIA controller on its memory bus,
+- * like the other Solution Engine boards.
+- */
+-
+-#define PCIIOBR (volatile long *)PCI_REG(SH7751_PCIIOBR)
+-#define PCIMBR (volatile long *)PCI_REG(SH7751_PCIMBR)
+-#define PCI_IO_AREA SH7751_PCI_IO_BASE
+-#define PCI_MEM_AREA SH7751_PCI_CONFIG_BASE
+-
+-#define PCI_IOMAP(adr) (PCI_IO_AREA + (adr & ~SH7751_PCIIOBR_MASK))
+-
+-#define maybebadio(name,port) \
+- printk("bad PC-like io %s for port 0x%lx at 0x%08x\n", \
+- #name, (port), (__u32) __builtin_return_address(0))
+-
+-static inline void delay(void)
+-{
+- ctrl_inw(0xa0000000);
+-}
+-
+-static inline volatile __u16 *
+-port2adr(unsigned int port)
++static inline volatile u16 *port2adr(unsigned int port)
+ {
+ if (port >= 0x2000)
+ return (volatile __u16 *) (PA_MRSHPC + (port - 0x2000));
+-#if 0
+- else
+- return (volatile __u16 *) (PA_SUPERIO + (port << 1));
+-#endif
+- maybebadio(name,(unsigned long)port);
++ maybebadio((unsigned long)port);
+ return (volatile __u16*)port;
+ }
+
+-#if 0
+-/* The 7751 Solution Engine seems to have everything hooked */
+-/* up pretty normally (nothing on high-bytes only...) so this */
+-/* shouldn't be needed */
+-static inline int
+-shifted_port(unsigned long port)
+-{
+- /* For IDE registers, value is not shifted */
+- if ((0x1f0 <= port && port < 0x1f8) || port == 0x3f6)
+- return 0;
+- else
+- return 1;
+-}
+-#endif
+-
+-/* In case someone configures the kernel w/o PCI support: in that */
+-/* scenario, don't ever bother to check for PCI-window addresses */
+-
+-/* NOTE: WINDOW CHECK MAY BE A BIT OFF, HIGH PCIBIOS_MIN_IO WRAPS? */
+-#if defined(CONFIG_PCI)
+-#define CHECK_SH7751_PCIIO(port) \
+- ((port >= PCIBIOS_MIN_IO) && (port < (PCIBIOS_MIN_IO + SH7751_PCI_IO_SIZE)))
+-#else
+-#define CHECK_SH7751_PCIIO(port) (0)
+-#endif
+-
+ /*
+ * General outline: remap really low stuff [eventually] to SuperIO,
+ * stuff in PCI IO space (at or above window at pci.h:PCIBIOS_MIN_IO)
+@@ -111,10 +34,10 @@
+ {
+ if (PXSEG(port))
+ return *(volatile unsigned char *)port;
+- else if (CHECK_SH7751_PCIIO(port))
+- return *(volatile unsigned char *)PCI_IOMAP(port);
++ else if (is_pci_ioaddr(port))
++ return *(volatile unsigned char *)pci_ioaddr(port);
+ else
+- return (*port2adr(port))&0xff;
++ return (*port2adr(port)) & 0xff;
+ }
+
+ unsigned char sh7751se_inb_p(unsigned long port)
+@@ -123,11 +46,11 @@
+
+ if (PXSEG(port))
+ v = *(volatile unsigned char *)port;
+- else if (CHECK_SH7751_PCIIO(port))
+- v = *(volatile unsigned char *)PCI_IOMAP(port);
++ else if (is_pci_ioaddr(port))
++ v = *(volatile unsigned char *)pci_ioaddr(port);
+ else
+- v = (*port2adr(port))&0xff;
+- delay();
++ v = (*port2adr(port)) & 0xff;
++ ctrl_delay();
+ return v;
+ }
+
+@@ -135,12 +58,12 @@
+ {
+ if (PXSEG(port))
+ return *(volatile unsigned short *)port;
+- else if (CHECK_SH7751_PCIIO(port))
+- return *(volatile unsigned short *)PCI_IOMAP(port);
++ else if (is_pci_ioaddr(port))
++ return *(volatile unsigned short *)pci_ioaddr(port);
+ else if (port >= 0x2000)
+ return *port2adr(port);
+ else
+- maybebadio(inw, port);
++ maybebadio(port);
+ return 0;
+ }
+
+@@ -148,12 +71,12 @@
+ {
+ if (PXSEG(port))
+ return *(volatile unsigned long *)port;
+- else if (CHECK_SH7751_PCIIO(port))
+- return *(volatile unsigned int *)PCI_IOMAP(port);
++ else if (is_pci_ioaddr(port))
++ return *(volatile unsigned int *)pci_ioaddr(port);
+ else if (port >= 0x2000)
+ return *port2adr(port);
+ else
+- maybebadio(inl, port);
++ maybebadio(port);
+ return 0;
+ }
+
+@@ -162,8 +85,8 @@
+
+ if (PXSEG(port))
+ *(volatile unsigned char *)port = value;
+- else if (CHECK_SH7751_PCIIO(port))
+- *((unsigned char*)PCI_IOMAP(port)) = value;
++ else if (is_pci_ioaddr(port))
++ *((unsigned char*)pci_ioaddr(port)) = value;
+ else
+ *(port2adr(port)) = value;
+ }
+@@ -172,73 +95,41 @@
+ {
+ if (PXSEG(port))
+ *(volatile unsigned char *)port = value;
+- else if (CHECK_SH7751_PCIIO(port))
+- *((unsigned char*)PCI_IOMAP(port)) = value;
++ else if (is_pci_ioaddr(port))
++ *((unsigned char*)pci_ioaddr(port)) = value;
+ else
+ *(port2adr(port)) = value;
+- delay();
++ ctrl_delay();
+ }
+
+ void sh7751se_outw(unsigned short value, unsigned long port)
+ {
+ if (PXSEG(port))
+ *(volatile unsigned short *)port = value;
+- else if (CHECK_SH7751_PCIIO(port))
+- *((unsigned short *)PCI_IOMAP(port)) = value;
++ else if (is_pci_ioaddr(port))
++ *((unsigned short *)pci_ioaddr(port)) = value;
+ else if (port >= 0x2000)
+ *port2adr(port) = value;
+ else
+- maybebadio(outw, port);
++ maybebadio(port);
+ }
+
+ void sh7751se_outl(unsigned int value, unsigned long port)
+ {
+ if (PXSEG(port))
+ *(volatile unsigned long *)port = value;
+- else if (CHECK_SH7751_PCIIO(port))
+- *((unsigned long*)PCI_IOMAP(port)) = value;
++ else if (is_pci_ioaddr(port))
++ *((unsigned long*)pci_ioaddr(port)) = value;
+ else
+- maybebadio(outl, port);
++ maybebadio(port);
+ }
+
+ void sh7751se_insl(unsigned long port, void *addr, unsigned long count)
+ {
+- maybebadio(insl, port);
++ maybebadio(port);
+ }
+
+ void sh7751se_outsl(unsigned long port, const void *addr, unsigned long count)
+ {
+- maybebadio(outsw, port);
+-}
+-
+-/* Map ISA bus address to the real address. Only for PCMCIA. */
+-
+-/* ISA page descriptor. */
+-static __u32 sh_isa_memmap[256];
+-
+-#if 0
+-static int
+-sh_isa_mmap(__u32 start, __u32 length, __u32 offset)
+-{
+- int idx;
+-
+- if (start >= 0x100000 || (start & 0xfff) || (length != 0x1000))
+- return -1;
+-
+- idx = start >> 12;
+- sh_isa_memmap[idx] = 0xb8000000 + (offset &~ 0xfff);
+- printk("sh_isa_mmap: start %x len %x offset %x (idx %x paddr %x)\n",
+- start, length, offset, idx, sh_isa_memmap[idx]);
+- return 0;
+-}
+-#endif
+-
+-unsigned long
+-sh7751se_isa_port2addr(unsigned long offset)
+-{
+- int idx;
+-
+- idx = (offset >> 12) & 0xff;
+- offset &= 0xfff;
+- return sh_isa_memmap[idx] + offset;
++ maybebadio(port);
+ }
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/7751/irq.c linux-2.6.17/arch/sh/boards/se/7751/irq.c
+--- linux-2.6.17-vanilla/arch/sh/boards/se/7751/irq.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/7751/irq.c 2006-07-12 16:54:20.000000000 +0000
+@@ -13,7 +13,7 @@
+ #include <linux/init.h>
+ #include <linux/irq.h>
+ #include <asm/irq.h>
+-#include <asm/se7751/se7751.h>
++#include <asm/se7751.h>
+
+ /*
+ * Initialize IRQ setting
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/7751/led.c linux-2.6.17/arch/sh/boards/se/7751/led.c
+--- linux-2.6.17-vanilla/arch/sh/boards/se/7751/led.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/7751/led.c 2006-07-12 16:54:20.000000000 +0000
+@@ -8,24 +8,8 @@
+ *
+ * This file contains Solution Engine specific LED code.
+ */
+-
+-#include <linux/config.h>
+-#include <asm/se7751/se7751.h>
+-
+-static void mach_led(int position, int value)
+-{
+- volatile unsigned short* p = (volatile unsigned short*)PA_LED;
+-
+- if (value) {
+- *p |= (1<<8);
+- } else {
+- *p &= ~(1<<8);
+- }
+-}
+-
+-#ifdef CONFIG_HEARTBEAT
+-
+ #include <linux/sched.h>
++#include <asm/se7751.h>
+
+ /* Cycle the LED's in the clasic Knightrider/Sun pattern */
+ void heartbeat_7751se(void)
+@@ -65,4 +49,3 @@
+ *p = 1<<(bit+8);
+
+ }
+-#endif /* CONFIG_HEARTBEAT */
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/7751/mach.c linux-2.6.17/arch/sh/boards/se/7751/mach.c
+--- linux-2.6.17-vanilla/arch/sh/boards/se/7751/mach.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/7751/mach.c 2006-07-12 16:54:20.000000000 +0000
+@@ -11,12 +11,8 @@
+
+ #include <linux/config.h>
+ #include <linux/init.h>
+-
+ #include <asm/machvec.h>
+-#include <asm/rtc.h>
+-#include <asm/machvec_init.h>
+-
+-#include <asm/se7751/io.h>
++#include <asm/se7751.h>
+
+ void heartbeat_7751se(void);
+ void init_7751se_IRQ(void);
+@@ -45,8 +41,6 @@
+ .mv_insl = sh7751se_insl,
+ .mv_outsl = sh7751se_outsl,
+
+- .mv_isa_port2addr = sh7751se_isa_port2addr,
+-
+ .mv_init_irq = init_7751se_IRQ,
+ #ifdef CONFIG_HEARTBEAT
+ .mv_heartbeat = heartbeat_7751se,
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/7751/setup.c linux-2.6.17/arch/sh/boards/se/7751/setup.c
+--- linux-2.6.17-vanilla/arch/sh/boards/se/7751/setup.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/7751/setup.c 2006-07-12 16:54:20.000000000 +0000
+@@ -1,4 +1,4 @@
+-/*
++/*
+ * linux/arch/sh/kernel/setup_7751se.c
+ *
+ * Copyright (C) 2000 Kazumoto Kojima
+@@ -12,11 +12,9 @@
+ #include <linux/config.h>
+ #include <linux/init.h>
+ #include <linux/irq.h>
+-
+-#include <linux/hdreg.h>
+ #include <linux/ide.h>
+ #include <asm/io.h>
+-#include <asm/se7751/se7751.h>
++#include <asm/se7751.h>
+
+ #ifdef CONFIG_SH_KGDB
+ #include <asm/kgdb.h>
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/CVS/Entries linux-2.6.17/arch/sh/boards/se/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/se/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/CVS/Entries 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,4 @@
++D/7300////
++D/73180////
++D/770x////
++D/7751////
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/CVS/Repository linux-2.6.17/arch/sh/boards/se/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/se/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/CVS/Repository 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/se
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/se/CVS/Root linux-2.6.17/arch/sh/boards/se/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/se/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/se/CVS/Root 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/sh03/CVS/Entries linux-2.6.17/arch/sh/boards/sh03/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/sh03/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/sh03/CVS/Entries 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,5 @@
++/Makefile/1.1/Thu Oct 7 11:01:14 2004/-ko/
++/led.c/1.1/Thu Oct 7 11:01:14 2004/-ko/
++/setup.c/1.3/Sun Feb 5 21:55:29 2006/-ko/
++/rtc.c/1.4/Sat Jul 8 20:16:05 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/sh03/CVS/Repository linux-2.6.17/arch/sh/boards/sh03/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/sh03/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/sh03/CVS/Repository 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/sh03
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/sh03/CVS/Root linux-2.6.17/arch/sh/boards/sh03/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/sh03/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/sh03/CVS/Root 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/sh03/rtc.c linux-2.6.17/arch/sh/boards/sh03/rtc.c
+--- linux-2.6.17-vanilla/arch/sh/boards/sh03/rtc.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/sh03/rtc.c 2006-07-12 16:54:20.000000000 +0000
+@@ -10,9 +10,10 @@
+ #include <linux/sched.h>
+ #include <linux/time.h>
+ #include <linux/bcd.h>
+-#include <asm/io.h>
+ #include <linux/rtc.h>
+ #include <linux/spinlock.h>
++#include <asm/io.h>
++#include <asm/rtc.h>
+
+ #define RTC_BASE 0xb0000000
+ #define RTC_SEC1 (RTC_BASE + 0)
+@@ -34,8 +35,6 @@
+ #define RTC_BUSY 1
+ #define RTC_STOP 2
+
+-extern void (*rtc_get_time)(struct timespec *);
+-extern int (*rtc_set_time)(const time_t);
+ extern spinlock_t rtc_lock;
+
+ unsigned long get_cmos_time(void)
+@@ -128,6 +127,6 @@
+
+ void sh03_time_init(void)
+ {
+- rtc_get_time = sh03_rtc_gettimeofday;
+- rtc_set_time = sh03_rtc_settimeofday;
++ rtc_sh_get_time = sh03_rtc_gettimeofday;
++ rtc_sh_set_time = sh03_rtc_settimeofday;
+ }
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/sh03/setup.c linux-2.6.17/arch/sh/boards/sh03/setup.c
+--- linux-2.6.17-vanilla/arch/sh/boards/sh03/setup.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/sh03/setup.c 2006-07-12 16:54:20.000000000 +0000
+@@ -8,22 +8,18 @@
+ #include <linux/config.h>
+ #include <linux/init.h>
+ #include <linux/irq.h>
+-#include <linux/hdreg.h>
+-#include <linux/ide.h>
+ #include <asm/io.h>
++#include <asm/rtc.h>
+ #include <asm/sh03/io.h>
+ #include <asm/sh03/sh03.h>
+ #include <asm/addrspace.h>
+-#include "../../drivers/pci/pci-sh7751.h"
+-
+-extern void (*board_time_init)(void);
+
+ const char *get_system_type(void)
+ {
+- return "Interface CTP/PCI-SH03)";
++ return "Interface (CTP/PCI-SH03)";
+ }
+
+-void init_sh03_IRQ(void)
++static void init_sh03_IRQ(void)
+ {
+ ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR);
+
+@@ -35,31 +31,26 @@
+
+ extern void *cf_io_base;
+
+-unsigned long sh03_isa_port2addr(unsigned long port)
++static void __iomem *sh03_ioport_map(unsigned long port, unsigned int size)
+ {
+ if (PXSEG(port))
+- return port;
++ return (void __iomem *)port;
+ /* CompactFlash (IDE) */
+- if (((port >= 0x1f0) && (port <= 0x1f7)) || (port == 0x3f6)) {
+- return (unsigned long)cf_io_base + port;
+- }
+- return port + SH7751_PCI_IO_BASE;
+-}
++ if (((port >= 0x1f0) && (port <= 0x1f7)) || (port == 0x3f6))
++ return (void __iomem *)((unsigned long)cf_io_base + port);
+
+-/*
+- * The Machine Vector
+- */
++ return (void __iomem *)(port + PCI_IO_BASE);
++}
+
+ struct sh_machine_vector mv_sh03 __initmv = {
+ .mv_nr_irqs = 48,
+- .mv_isa_port2addr = sh03_isa_port2addr,
++ .mv_ioport_map = sh03_ioport_map,
+ .mv_init_irq = init_sh03_IRQ,
+
+ #ifdef CONFIG_HEARTBEAT
+ .mv_heartbeat = heartbeat_sh03,
+ #endif
+ };
+-
+ ALIAS_MV(sh03)
+
+ /* arch/sh/boards/sh03/rtc.c */
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/sh2000/CVS/Entries linux-2.6.17/arch/sh/boards/sh2000/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/sh2000/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/sh2000/CVS/Entries 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,3 @@
++/Makefile/1.6/Thu Mar 11 18:08:03 2004//
++/setup.c/1.4/Mon Aug 4 01:57:07 2003//
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/sh2000/CVS/Repository linux-2.6.17/arch/sh/boards/sh2000/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/sh2000/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/sh2000/CVS/Repository 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/sh2000
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/sh2000/CVS/Root linux-2.6.17/arch/sh/boards/sh2000/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/sh2000/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/sh2000/CVS/Root 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/snapgear/CVS/Entries linux-2.6.17/arch/sh/boards/snapgear/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/snapgear/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/snapgear/CVS/Entries 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,5 @@
++/Makefile/1.3/Thu Mar 11 18:08:03 2004//
++/io.c/1.5/Sun Feb 5 21:55:29 2006//
++/setup.c/1.4/Wed Jan 4 18:42:42 2006//
++/rtc.c/1.3/Sat Jul 8 20:16:05 2006//
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/snapgear/CVS/Repository linux-2.6.17/arch/sh/boards/snapgear/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/snapgear/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/snapgear/CVS/Repository 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/snapgear
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/snapgear/CVS/Root linux-2.6.17/arch/sh/boards/snapgear/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/snapgear/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/snapgear/CVS/Root 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/snapgear/io.c linux-2.6.17/arch/sh/boards/snapgear/io.c
+--- linux-2.6.17-vanilla/arch/sh/boards/snapgear/io.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/snapgear/io.c 2006-07-12 16:54:20.000000000 +0000
+@@ -1,6 +1,4 @@
+-/*
+- * linux/arch/sh/kernel/io_7751se.c
+- *
++/*
+ * Copyright (C) 2002 David McCullough <davidm@snapgear.com>
+ * Copyright (C) 2001 Ian da Silva, Jeremy Siegel
+ * Based largely on io_se.c.
+@@ -11,67 +9,22 @@
+ * placeholder code from io_se.c left in with the
+ * expectation of later SuperIO and PCMCIA access.
+ */
+-
+ #include <linux/kernel.h>
+ #include <linux/types.h>
+ #include <linux/pci.h>
+ #include <asm/io.h>
+ #include <asm/addrspace.h>
+
+-#include <asm/pci.h>
+-#include "../../drivers/pci/pci-sh7751.h"
+-
+ #ifdef CONFIG_SH_SECUREEDGE5410
+ unsigned short secureedge5410_ioport;
+ #endif
+
+-/*
+- * The SnapGear uses the built-in PCI controller (PCIC)
+- * of the 7751 processor
+- */
+-
+-#define PCIIOBR (volatile long *)PCI_REG(SH7751_PCIIOBR)
+-#define PCIMBR (volatile long *)PCI_REG(SH7751_PCIMBR)
+-#define PCI_IO_AREA SH7751_PCI_IO_BASE
+-#define PCI_MEM_AREA SH7751_PCI_CONFIG_BASE
+-
+-
+-#define PCI_IOMAP(adr) (PCI_IO_AREA + (adr & ~SH7751_PCIIOBR_MASK))
+-
+-
+-#define maybebadio(name,port) \
+- printk("bad PC-like io %s for port 0x%lx at 0x%08x\n", \
+- #name, (port), (__u32) __builtin_return_address(0))
+-
+-
+-static inline void delay(void)
+-{
+- ctrl_inw(0xa0000000);
+-}
+-
+-
+ static inline volatile __u16 *port2adr(unsigned int port)
+ {
+-#if 0
+- if (port >= 0x2000)
+- return (volatile __u16 *) (PA_MRSHPC + (port - 0x2000));
+-#endif
+- maybebadio(name,(unsigned long)port);
++ maybebadio((unsigned long)port);
+ return (volatile __u16*)port;
+ }
+
+-
+-/* In case someone configures the kernel w/o PCI support: in that */
+-/* scenario, don't ever bother to check for PCI-window addresses */
+-
+-/* NOTE: WINDOW CHECK MAY BE A BIT OFF, HIGH PCIBIOS_MIN_IO WRAPS? */
+-#if defined(CONFIG_PCI)
+-#define CHECK_SH7751_PCIIO(port) \
+- ((port >= PCIBIOS_MIN_IO) && (port < (PCIBIOS_MIN_IO + SH7751_PCI_IO_SIZE)))
+-#else
+-#define CHECK_SH7751_PCIIO(port) (0)
+-#endif
+-
+ /*
+ * General outline: remap really low stuff [eventually] to SuperIO,
+ * stuff in PCI IO space (at or above window at pci.h:PCIBIOS_MIN_IO)
+@@ -79,148 +32,106 @@
+ * should be way beyond the window, and is used w/o translation for
+ * compatibility.
+ */
+-
+ unsigned char snapgear_inb(unsigned long port)
+ {
+ if (PXSEG(port))
+ return *(volatile unsigned char *)port;
+- else if (CHECK_SH7751_PCIIO(port))
+- return *(volatile unsigned char *)PCI_IOMAP(port);
++ else if (is_pci_ioaddr(port))
++ return *(volatile unsigned char *)pci_ioaddr(port);
+ else
+- return (*port2adr(port))&0xff;
++ return (*port2adr(port)) & 0xff;
+ }
+
+-
+ unsigned char snapgear_inb_p(unsigned long port)
+ {
+ unsigned char v;
+
+ if (PXSEG(port))
+ v = *(volatile unsigned char *)port;
+- else if (CHECK_SH7751_PCIIO(port))
+- v = *(volatile unsigned char *)PCI_IOMAP(port);
++ else if (is_pci_ioaddr(port))
++ v = *(volatile unsigned char *)pci_ioaddr(port);
+ else
+- v = (*port2adr(port))&0xff;
+- delay();
++ v = (*port2adr(port))&0xff;
++ ctrl_delay();
+ return v;
+ }
+
+-
+ unsigned short snapgear_inw(unsigned long port)
+ {
+ if (PXSEG(port))
+ return *(volatile unsigned short *)port;
+- else if (CHECK_SH7751_PCIIO(port))
+- return *(volatile unsigned short *)PCI_IOMAP(port);
++ else if (is_pci_ioaddr(port))
++ return *(volatile unsigned short *)pci_ioaddr(port);
+ else if (port >= 0x2000)
+ return *port2adr(port);
+ else
+- maybebadio(inw, port);
++ maybebadio(port);
+ return 0;
+ }
+
+-
+ unsigned int snapgear_inl(unsigned long port)
+ {
+ if (PXSEG(port))
+ return *(volatile unsigned long *)port;
+- else if (CHECK_SH7751_PCIIO(port))
+- return *(volatile unsigned int *)PCI_IOMAP(port);
++ else if (is_pci_ioaddr(port))
++ return *(volatile unsigned int *)pci_ioaddr(port);
+ else if (port >= 0x2000)
+ return *port2adr(port);
+ else
+- maybebadio(inl, port);
++ maybebadio(port);
+ return 0;
+ }
+
+-
+ void snapgear_outb(unsigned char value, unsigned long port)
+ {
+
+ if (PXSEG(port))
+ *(volatile unsigned char *)port = value;
+- else if (CHECK_SH7751_PCIIO(port))
+- *((unsigned char*)PCI_IOMAP(port)) = value;
++ else if (is_pci_ioaddr(port))
++ *((unsigned char*)pci_ioaddr(port)) = value;
+ else
+ *(port2adr(port)) = value;
+ }
+
+-
+ void snapgear_outb_p(unsigned char value, unsigned long port)
+ {
+ if (PXSEG(port))
+ *(volatile unsigned char *)port = value;
+- else if (CHECK_SH7751_PCIIO(port))
+- *((unsigned char*)PCI_IOMAP(port)) = value;
++ else if (is_pci_ioaddr(port))
++ *((unsigned char*)pci_ioaddr(port)) = value;
+ else
+ *(port2adr(port)) = value;
+- delay();
++ ctrl_delay();
+ }
+
+-
+ void snapgear_outw(unsigned short value, unsigned long port)
+ {
+ if (PXSEG(port))
+ *(volatile unsigned short *)port = value;
+- else if (CHECK_SH7751_PCIIO(port))
+- *((unsigned short *)PCI_IOMAP(port)) = value;
++ else if (is_pci_ioaddr(port))
++ *((unsigned short *)pci_ioaddr(port)) = value;
+ else if (port >= 0x2000)
+ *port2adr(port) = value;
+ else
+- maybebadio(outw, port);
++ maybebadio(port);
+ }
+
+-
+ void snapgear_outl(unsigned int value, unsigned long port)
+ {
+ if (PXSEG(port))
+ *(volatile unsigned long *)port = value;
+- else if (CHECK_SH7751_PCIIO(port))
+- *((unsigned long*)PCI_IOMAP(port)) = value;
++ else if (is_pci_ioaddr(port))
++ *((unsigned long*)pci_ioaddr(port)) = value;
+ else
+- maybebadio(outl, port);
++ maybebadio(port);
+ }
+
+ void snapgear_insl(unsigned long port, void *addr, unsigned long count)
+ {
+- maybebadio(insl, port);
++ maybebadio(port);
+ }
+
+ void snapgear_outsl(unsigned long port, const void *addr, unsigned long count)
+ {
+- maybebadio(outsw, port);
+-}
+-
+-/* Map ISA bus address to the real address. Only for PCMCIA. */
+-
+-
+-/* ISA page descriptor. */
+-static __u32 sh_isa_memmap[256];
+-
+-
+-#if 0
+-static int sh_isa_mmap(__u32 start, __u32 length, __u32 offset)
+-{
+- int idx;
+-
+- if (start >= 0x100000 || (start & 0xfff) || (length != 0x1000))
+- return -1;
+-
+- idx = start >> 12;
+- sh_isa_memmap[idx] = 0xb8000000 + (offset &~ 0xfff);
+-#if 0
+- printk("sh_isa_mmap: start %x len %x offset %x (idx %x paddr %x)\n",
+- start, length, offset, idx, sh_isa_memmap[idx]);
+-#endif
+- return 0;
+-}
+-#endif
+-
+-unsigned long snapgear_isa_port2addr(unsigned long offset)
+-{
+- int idx;
+-
+- idx = (offset >> 12) & 0xff;
+- offset &= 0xfff;
+- return sh_isa_memmap[idx] + offset;
++ maybebadio(port);
+ }
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/snapgear/rtc.c linux-2.6.17/arch/sh/boards/snapgear/rtc.c
+--- linux-2.6.17-vanilla/arch/sh/boards/snapgear/rtc.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/snapgear/rtc.c 2006-07-12 16:54:20.000000000 +0000
+@@ -17,10 +17,7 @@
+ #include <linux/time.h>
+ #include <linux/rtc.h>
+ #include <linux/mc146818rtc.h>
+-
+ #include <asm/io.h>
+-#include <asm/rtc.h>
+-#include <asm/mc146818rtc.h>
+
+ /****************************************************************************/
+
+@@ -168,11 +165,11 @@
+ }
+
+ if (use_ds1302) {
+- rtc_get_time = snapgear_rtc_gettimeofday;
+- rtc_set_time = snapgear_rtc_settimeofday;
++ rtc_sh_get_time = snapgear_rtc_gettimeofday;
++ rtc_sh_set_time = snapgear_rtc_settimeofday;
+ } else {
+- rtc_get_time = sh_rtc_gettimeofday;
+- rtc_set_time = sh_rtc_settimeofday;
++ rtc_sh_get_time = sh_rtc_gettimeofday;
++ rtc_sh_set_time = sh_rtc_settimeofday;
+ }
+
+ printk("SnapGear RTC: using %s rtc.\n", use_ds1302 ? "ds1302" : "internal");
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/snapgear/setup.c linux-2.6.17/arch/sh/boards/snapgear/setup.c
+--- linux-2.6.17-vanilla/arch/sh/boards/snapgear/setup.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/snapgear/setup.c 2006-07-12 16:54:20.000000000 +0000
+@@ -1,5 +1,4 @@
+-/****************************************************************************/
+-/*
++/*
+ * linux/arch/sh/boards/snapgear/setup.c
+ *
+ * Copyright (C) 2002 David McCullough <davidm@snapgear.com>
+@@ -12,8 +11,6 @@
+ * Modified for 7751 Solution Engine by
+ * Ian da Silva and Jeremy Siegel, 2001.
+ */
+-/****************************************************************************/
+-
+ #include <linux/config.h>
+ #include <linux/init.h>
+ #include <linux/irq.h>
+@@ -22,14 +19,13 @@
+ #include <linux/delay.h>
+ #include <linux/module.h>
+ #include <linux/sched.h>
+-
+ #include <asm/machvec.h>
+-#include <asm/mach/io.h>
++#include <asm/snapgear.h>
+ #include <asm/irq.h>
+ #include <asm/io.h>
++#include <asm/rtc.h>
+ #include <asm/cpu/timer.h>
+
+-extern void (*board_time_init)(void);
+ extern void secureedge5410_rtc_init(void);
+ extern void pcibios_init(void);
+
+@@ -86,91 +82,6 @@
+ make_ipr_irq(IRL3_IRQ, IRL3_IPR_ADDR, IRL3_IPR_POS, IRL3_PRIORITY);
+ }
+
+-/****************************************************************************/
+-/*
+- * Fast poll interrupt simulator.
+- */
+-
+-/*
+- * Leave all of the fast timer/fast poll stuff commented out for now, since
+- * it's not clear whether it actually works or not. Since it wasn't being used
+- * at all in 2.4, we'll assume it's not sane for 2.6 either.. -- PFM
+- */
+-#if 0
+-#define FAST_POLL 1000
+-//#define FAST_POLL_INTR
+-
+-#define FASTTIMER_IRQ 17
+-#define FASTTIMER_IPR_ADDR INTC_IPRA
+-#define FASTTIMER_IPR_POS 2
+-#define FASTTIMER_PRIORITY 3
+-
+-#ifdef FAST_POLL_INTR
+-#define TMU1_TCR_INIT 0x0020
+-#else
+-#define TMU1_TCR_INIT 0
+-#endif
+-#define TMU_TSTR_INIT 1
+-#define TMU1_TCR_CALIB 0x0000
+-
+-
+-#ifdef FAST_POLL_INTR
+-static void fast_timer_irq(int irq, void *dev_instance, struct pt_regs *regs)
+-{
+- unsigned long timer_status;
+- timer_status = ctrl_inw(TMU1_TCR);
+- timer_status &= ~0x100;
+- ctrl_outw(timer_status, TMU1_TCR);
+-}
+-#endif
+-
+-/*
+- * return the current ticks on the fast timer
+- */
+-
+-unsigned long fast_timer_count(void)
+-{
+- return(ctrl_inl(TMU1_TCNT));
+-}
+-
+-/*
+- * setup a fast timer for profiling etc etc
+- */
+-
+-static void setup_fast_timer()
+-{
+- unsigned long interval;
+-
+-#ifdef FAST_POLL_INTR
+- interval = (current_cpu_data.module_clock/4 + FAST_POLL/2) / FAST_POLL;
+-
+- make_ipr_irq(FASTTIMER_IRQ, FASTTIMER_IPR_ADDR, FASTTIMER_IPR_POS,
+- FASTTIMER_PRIORITY);
+-
+- printk("SnapGear: %dHz fast timer on IRQ %d\n",FAST_POLL,FASTTIMER_IRQ);
+-
+- if (request_irq(FASTTIMER_IRQ, fast_timer_irq, 0, "SnapGear fast timer",
+- NULL) != 0)
+- printk("%s(%d): request_irq() failed?\n", __FILE__, __LINE__);
+-#else
+- printk("SnapGear: fast timer running\n",FAST_POLL,FASTTIMER_IRQ);
+- interval = 0xffffffff;
+-#endif
+-
+- ctrl_outb(ctrl_inb(TMU_TSTR) & ~0x2, TMU_TSTR); /* disable timer 1 */
+- ctrl_outw(TMU1_TCR_INIT, TMU1_TCR);
+- ctrl_outl(interval, TMU1_TCOR);
+- ctrl_outl(interval, TMU1_TCNT);
+- ctrl_outb(ctrl_inb(TMU_TSTR) | 0x2, TMU_TSTR); /* enable timer 1 */
+-
+- printk("Timer count 1 = 0x%x\n", fast_timer_count());
+- udelay(1000);
+- printk("Timer count 2 = 0x%x\n", fast_timer_count());
+-}
+-#endif
+-
+-/****************************************************************************/
+-
+ const char *get_system_type(void)
+ {
+ return "SnapGear SecureEdge5410";
+@@ -197,8 +108,6 @@
+ .mv_outw_p = snapgear_outw,
+ .mv_outl_p = snapgear_outl,
+
+- .mv_isa_port2addr = snapgear_isa_port2addr,
+-
+ .mv_init_irq = init_snapgear_IRQ,
+ };
+ ALIAS_MV(snapgear)
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/superh/CVS/Entries linux-2.6.17/arch/sh/boards/superh/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/superh/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/superh/CVS/Entries 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++D/microdev////
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/superh/CVS/Repository linux-2.6.17/arch/sh/boards/superh/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/superh/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/superh/CVS/Repository 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/superh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/superh/CVS/Root linux-2.6.17/arch/sh/boards/superh/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/superh/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/superh/CVS/Root 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/superh/microdev/CVS/Entries linux-2.6.17/arch/sh/boards/superh/microdev/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/superh/microdev/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/superh/microdev/CVS/Entries 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1,6 @@
++/Makefile/1.1/Wed Aug 4 01:04:30 2004//
++/io.c/1.3/Wed Jan 4 17:14:53 2006//
++/irq.c/1.3/Sat Dec 17 23:34:08 2005//
++/led.c/1.1/Wed Aug 4 01:04:30 2004//
++/setup.c/1.7/Tue Jan 3 22:35:50 2006//
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/superh/microdev/CVS/Repository linux-2.6.17/arch/sh/boards/superh/microdev/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/superh/microdev/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/superh/microdev/CVS/Repository 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/superh/microdev
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/superh/microdev/CVS/Root linux-2.6.17/arch/sh/boards/superh/microdev/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/superh/microdev/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/superh/microdev/CVS/Root 2006-07-12 16:54:20.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/superh/microdev/setup.c linux-2.6.17/arch/sh/boards/superh/microdev/setup.c
+--- linux-2.6.17-vanilla/arch/sh/boards/superh/microdev/setup.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/superh/microdev/setup.c 2006-07-12 16:54:21.000000000 +0000
+@@ -398,7 +398,7 @@
+ /* enable the appropriate GPIO pins for IDE functionality:
+ * bit[0] In/Out 1==input; 0==output
+ * bit[1] Polarity 1==invert; 0==no invert
+- * bit[2] Int Enb #1 1==Enable Combined IRQ #1; 0==disable
++ * bit[2] Int Enb #1 1==Enable Combined IRQ #1; 0==disable
+ * bit[3:4] Function Select 00==original; 01==Alternate Function #1
+ */
+ SMSC_WRITE_INDEXED(0x00, 0xc2); /* GP42 = nIDE1_OE */
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/titan/CVS/Entries linux-2.6.17/arch/sh/boards/titan/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/titan/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/titan/CVS/Entries 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,4 @@
++/Makefile/1.1/Wed Nov 9 14:56:34 2005/-ko/
++/io.c/1.6/Sun Feb 5 21:55:29 2006/-ko/
++/setup.c/1.3/Tue Jan 3 22:51:46 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/titan/CVS/Repository linux-2.6.17/arch/sh/boards/titan/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/titan/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/titan/CVS/Repository 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/titan
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/titan/CVS/Root linux-2.6.17/arch/sh/boards/titan/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/titan/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/titan/CVS/Root 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/titan/Makefile linux-2.6.17/arch/sh/boards/titan/Makefile
+--- linux-2.6.17-vanilla/arch/sh/boards/titan/Makefile 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/titan/Makefile 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,5 @@
++#
++# Makefile for the Nimble Microsystems TITAN specific parts of the kernel
++#
++
++obj-y := setup.o io.o
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/titan/io.c linux-2.6.17/arch/sh/boards/titan/io.c
+--- linux-2.6.17-vanilla/arch/sh/boards/titan/io.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/titan/io.c 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,126 @@
++/*
++ * I/O routines for Titan
++ */
++#include <linux/pci.h>
++#include <asm/machvec.h>
++#include <asm/addrspace.h>
++#include <asm/titan.h>
++#include <asm/io.h>
++
++static inline unsigned int port2adr(unsigned int port)
++{
++ maybebadio((unsigned long)port);
++ return port;
++}
++
++u8 titan_inb(unsigned long port)
++{
++ if (PXSEG(port))
++ return ctrl_inb(port);
++ else if (is_pci_ioaddr(port))
++ return ctrl_inb(pci_ioaddr(port));
++ return ctrl_inw(port2adr(port)) & 0xff;
++}
++
++u8 titan_inb_p(unsigned long port)
++{
++ u8 v;
++
++ if (PXSEG(port))
++ v = ctrl_inb(port);
++ else if (is_pci_ioaddr(port))
++ v = ctrl_inb(pci_ioaddr(port));
++ else
++ v = ctrl_inw(port2adr(port)) & 0xff;
++ ctrl_delay();
++ return v;
++}
++
++u16 titan_inw(unsigned long port)
++{
++ if (PXSEG(port))
++ return ctrl_inw(port);
++ else if (is_pci_ioaddr(port))
++ return ctrl_inw(pci_ioaddr(port));
++ else if (port >= 0x2000)
++ return ctrl_inw(port2adr(port));
++ else
++ maybebadio(port);
++ return 0;
++}
++
++u32 titan_inl(unsigned long port)
++{
++ if (PXSEG(port))
++ return ctrl_inl(port);
++ else if (is_pci_ioaddr(port))
++ return ctrl_inl(pci_ioaddr(port));
++ else if (port >= 0x2000)
++ return ctrl_inw(port2adr(port));
++ else
++ maybebadio(port);
++ return 0;
++}
++
++void titan_outb(u8 value, unsigned long port)
++{
++ if (PXSEG(port))
++ ctrl_outb(value, port);
++ else if (is_pci_ioaddr(port))
++ ctrl_outb(value, pci_ioaddr(port));
++ else
++ ctrl_outw(value, port2adr(port));
++}
++
++void titan_outb_p(u8 value, unsigned long port)
++{
++ if (PXSEG(port))
++ ctrl_outb(value, port);
++ else if (is_pci_ioaddr(port))
++ ctrl_outb(value, pci_ioaddr(port));
++ else
++ ctrl_outw(value, port2adr(port));
++ ctrl_delay();
++}
++
++void titan_outw(u16 value, unsigned long port)
++{
++ if (PXSEG(port))
++ ctrl_outw(value, port);
++ else if (is_pci_ioaddr(port))
++ ctrl_outw(value, pci_ioaddr(port));
++ else if (port >= 0x2000)
++ ctrl_outw(value, port2adr(port));
++ else
++ maybebadio(port);
++}
++
++void titan_outl(u32 value, unsigned long port)
++{
++ if (PXSEG(port))
++ ctrl_outl(value, port);
++ else if (is_pci_ioaddr(port))
++ ctrl_outl(value, pci_ioaddr(port));
++ else
++ maybebadio(port);
++}
++
++void titan_insl(unsigned long port, void *dst, unsigned long count)
++{
++ maybebadio(port);
++}
++
++void titan_outsl(unsigned long port, const void *src, unsigned long count)
++{
++ maybebadio(port);
++}
++
++void __iomem *titan_ioport_map(unsigned long port, unsigned int size)
++{
++ if (PXSEG(port) || is_pci_memaddr(port))
++ return (void __iomem *)port;
++ else if (is_pci_ioaddr(port))
++ return (void __iomem *)pci_ioaddr(port);
++
++ return (void __iomem *)port2adr(port);
++}
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/titan/setup.c linux-2.6.17/arch/sh/boards/titan/setup.c
+--- linux-2.6.17-vanilla/arch/sh/boards/titan/setup.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/titan/setup.c 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,59 @@
++/*
++ * Setup for Titan
++ */
++
++#include <linux/init.h>
++#include <asm/irq.h>
++#include <asm/titan.h>
++#include <asm/io.h>
++
++extern void __init pcibios_init_platform(void);
++
++static void __init init_titan_irq(void)
++{
++ /* enable individual interrupt mode for externals */
++ ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR);
++
++ make_ipr_irq( TITAN_IRQ_WAN, IRL0_IPR_ADDR, IRL0_IPR_POS, IRL0_PRIORITY); /* PCIRQ0 */
++ make_ipr_irq( TITAN_IRQ_LAN, IRL1_IPR_ADDR, IRL1_IPR_POS, IRL1_PRIORITY); /* PCIRQ1 */
++ make_ipr_irq( TITAN_IRQ_MPCIA, IRL2_IPR_ADDR, IRL2_IPR_POS, IRL2_PRIORITY); /* PCIRQ2 */
++ make_ipr_irq( TITAN_IRQ_USB, IRL3_IPR_ADDR, IRL3_IPR_POS, IRL3_PRIORITY); /* PCIRQ3 */
++}
++
++const char *get_system_type(void)
++{
++ return "Titan";
++}
++
++int __init platform_setup(void)
++{
++ printk("%s Platform Setup\n", get_system_type());
++ return 0;
++}
++
++struct sh_machine_vector mv_titan __initmv = {
++ .mv_nr_irqs = NR_IRQS,
++
++ .mv_inb = titan_inb,
++ .mv_inw = titan_inw,
++ .mv_inl = titan_inl,
++ .mv_outb = titan_outb,
++ .mv_outw = titan_outw,
++ .mv_outl = titan_outl,
++
++ .mv_inb_p = titan_inb_p,
++ .mv_inw_p = titan_inw,
++ .mv_inl_p = titan_inl,
++ .mv_outb_p = titan_outb_p,
++ .mv_outw_p = titan_outw,
++ .mv_outl_p = titan_outl,
++
++ .mv_insl = titan_insl,
++ .mv_outsl = titan_outsl,
++
++ .mv_ioport_map = titan_ioport_map,
++
++ .mv_init_irq = init_titan_irq,
++ .mv_init_pci = pcibios_init_platform,
++};
++ALIAS_MV(titan)
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/unknown/CVS/Entries linux-2.6.17/arch/sh/boards/unknown/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boards/unknown/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/unknown/CVS/Entries 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,3 @@
++/Makefile/1.5/Tue Nov 8 19:55:58 2005//
++/setup.c/1.3/Tue Nov 8 19:55:58 2005//
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/unknown/CVS/Repository linux-2.6.17/arch/sh/boards/unknown/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boards/unknown/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/unknown/CVS/Repository 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boards/unknown
+diff -ruN linux-2.6.17-vanilla/arch/sh/boards/unknown/CVS/Root linux-2.6.17/arch/sh/boards/unknown/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boards/unknown/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boards/unknown/CVS/Root 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boot/.cvsignore linux-2.6.17/arch/sh/boot/.cvsignore
+--- linux-2.6.17-vanilla/arch/sh/boot/.cvsignore 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boot/.cvsignore 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++zImage
+diff -ruN linux-2.6.17-vanilla/arch/sh/boot/CVS/Entries linux-2.6.17/arch/sh/boot/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boot/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boot/CVS/Entries 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,3 @@
++/.cvsignore/1.1.1.1/Mon Oct 15 20:44:47 2001//
++/Makefile/1.9/Wed Jun 16 15:21:46 2004/-ko/
++D/compressed////
+diff -ruN linux-2.6.17-vanilla/arch/sh/boot/CVS/Repository linux-2.6.17/arch/sh/boot/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boot/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boot/CVS/Repository 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boot
+diff -ruN linux-2.6.17-vanilla/arch/sh/boot/CVS/Root linux-2.6.17/arch/sh/boot/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boot/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boot/CVS/Root 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/boot/compressed/.cvsignore linux-2.6.17/arch/sh/boot/compressed/.cvsignore
+--- linux-2.6.17-vanilla/arch/sh/boot/compressed/.cvsignore 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boot/compressed/.cvsignore 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,3 @@
++vmlinux
++vmlinux.bin
++vmlinux.bin.gz
+diff -ruN linux-2.6.17-vanilla/arch/sh/boot/compressed/CVS/Entries linux-2.6.17/arch/sh/boot/compressed/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/boot/compressed/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boot/compressed/CVS/Entries 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,6 @@
++/.cvsignore/1.2/Sat May 10 03:22:05 2003//
++/Makefile/1.13/Mon Oct 25 10:41:02 2004//
++/head.S/1.3/Mon Aug 11 07:14:13 2003/-ko/
++/misc.c/1.4/Mon May 31 21:20:29 2004/-ko/
++/vmlinux.scr/1.1/Sat May 10 03:22:05 2003//
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/boot/compressed/CVS/Repository linux-2.6.17/arch/sh/boot/compressed/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/boot/compressed/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boot/compressed/CVS/Repository 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/boot/compressed
+diff -ruN linux-2.6.17-vanilla/arch/sh/boot/compressed/CVS/Root linux-2.6.17/arch/sh/boot/compressed/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/boot/compressed/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/boot/compressed/CVS/Root 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/CVS/Entries linux-2.6.17/arch/sh/cchips/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/cchips/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/CVS/Entries 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,3 @@
++/Kconfig/1.5/Wed Jan 4 16:34:31 2006//
++D/hd6446x////
++D/voyagergx////
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/CVS/Repository linux-2.6.17/arch/sh/cchips/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/cchips/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/CVS/Repository 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/cchips
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/CVS/Root linux-2.6.17/arch/sh/cchips/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/cchips/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/CVS/Root 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/Kconfig linux-2.6.17/arch/sh/cchips/Kconfig
+--- linux-2.6.17-vanilla/arch/sh/cchips/Kconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/Kconfig 2006-07-12 16:54:21.000000000 +0000
+@@ -65,6 +65,11 @@
+
+ Do not change this unless you know what you are doing.
+
++config HD64461_IOBASE
++ hex "HD64461 start address"
++ depends on HD64461
++ default "0xb0000000"
++
+ config HD64461_ENABLER
+ bool "HD64461 PCMCIA enabler"
+ depends on HD64461
+@@ -73,7 +78,6 @@
+ via the HD64461 companion chip.
+ Otherwise, say N.
+
+-
+ config HD64465_IOBASE
+ hex "HD64465 start address"
+ depends on HD64465
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/CVS/Entries linux-2.6.17/arch/sh/cchips/hd6446x/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/hd6446x/CVS/Entries 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,2 @@
++D/hd64461////
++D/hd64465////
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/CVS/Repository linux-2.6.17/arch/sh/cchips/hd6446x/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/hd6446x/CVS/Repository 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/cchips/hd6446x
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/CVS/Root linux-2.6.17/arch/sh/cchips/hd6446x/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/hd6446x/CVS/Root 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/hd64461/CVS/Entries linux-2.6.17/arch/sh/cchips/hd6446x/hd64461/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/hd64461/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/hd6446x/hd64461/CVS/Entries 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,4 @@
++/Makefile/1.4/Thu Mar 11 18:08:03 2004//
++/io.c/1.8/Sun Feb 5 21:55:29 2006//
++/setup.c/1.7/Wed Jan 4 14:53:18 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/hd64461/CVS/Repository linux-2.6.17/arch/sh/cchips/hd6446x/hd64461/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/hd64461/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/hd6446x/hd64461/CVS/Repository 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/cchips/hd6446x/hd64461
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/hd64461/CVS/Root linux-2.6.17/arch/sh/cchips/hd6446x/hd64461/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/hd64461/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/hd6446x/hd64461/CVS/Root 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/hd64461/io.c linux-2.6.17/arch/sh/cchips/hd6446x/hd64461/io.c
+--- linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/hd64461/io.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/hd6446x/hd64461/io.c 2006-07-12 16:54:21.000000000 +0000
+@@ -1,12 +1,12 @@
+ /*
+- * $Id: io.c,v 1.6 2004/03/16 00:07:50 lethal Exp $
++ * $Id: io.c,v 1.8 2006/02/05 21:55:29 lethal Exp $
+ * Copyright (C) 2000 YAEGASHI Takeshi
+ * Typical I/O routines for HD64461 system.
+ */
+
+ #include <linux/config.h>
+ #include <asm/io.h>
+-#include <asm/hd64461/hd64461.h>
++#include <asm/hd64461.h>
+
+ #define MEM_BASE (CONFIG_HD64461_IOBASE - HD64461_STBCR)
+
+@@ -55,11 +55,6 @@
+ return 0xa0000000 + (port & 0x1fffffff);
+ }
+
+-static inline void delay(void)
+-{
+- ctrl_inw(0xa0000000);
+-}
+-
+ unsigned char hd64461_inb(unsigned long port)
+ {
+ return *(volatile unsigned char*)PORT2ADDR(port);
+@@ -68,7 +63,7 @@
+ unsigned char hd64461_inb_p(unsigned long port)
+ {
+ unsigned long v = *(volatile unsigned char*)PORT2ADDR(port);
+- delay();
++ ctrl_delay();
+ return v;
+ }
+
+@@ -90,7 +85,7 @@
+ void hd64461_outb_p(unsigned char b, unsigned long port)
+ {
+ *(volatile unsigned char*)PORT2ADDR(port) = b;
+- delay();
++ ctrl_delay();
+ }
+
+ void hd64461_outw(unsigned short b, unsigned long port)
+@@ -145,13 +140,13 @@
+ while(count--) *addr=*buf++;
+ }
+
+-unsigned short hd64461_readw(unsigned long addr)
++unsigned short hd64461_readw(void __iomem *addr)
+ {
+- return *(volatile unsigned short*)(MEM_BASE+addr);
++ return ctrl_inw(MEM_BASE+(unsigned long __force)addr);
+ }
+
+-void hd64461_writew(unsigned short b, unsigned long addr)
++void hd64461_writew(unsigned short b, void __iomem *addr)
+ {
+- *(volatile unsigned short*)(MEM_BASE+addr) = b;
++ ctrl_outw(b, MEM_BASE+(unsigned long __force)addr);
+ }
+
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/hd64461/setup.c linux-2.6.17/arch/sh/cchips/hd6446x/hd64461/setup.c
+--- linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/hd64461/setup.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/hd6446x/hd64461/setup.c 2006-07-12 16:54:21.000000000 +0000
+@@ -15,8 +15,7 @@
+
+ #include <asm/io.h>
+ #include <asm/irq.h>
+-
+-#include <asm/hd64461/hd64461.h>
++#include <asm/hd64461.h>
+
+ static void disable_hd64461_irq(unsigned int irq)
+ {
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/hd64465/CVS/Entries linux-2.6.17/arch/sh/cchips/hd6446x/hd64465/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/hd64465/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/hd6446x/hd64465/CVS/Entries 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,5 @@
++/Makefile/1.4/Thu Mar 11 18:08:03 2004//
++/gpio.c/1.4/Mon May 19 22:24:18 2003//
++/io.c/1.5/Tue Mar 8 06:46:56 2005/-ko/
++/setup.c/1.5/Sun Aug 15 16:59:26 2004/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/hd64465/CVS/Repository linux-2.6.17/arch/sh/cchips/hd6446x/hd64465/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/hd64465/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/hd6446x/hd64465/CVS/Repository 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/cchips/hd6446x/hd64465
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/hd64465/CVS/Root linux-2.6.17/arch/sh/cchips/hd6446x/hd64465/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/cchips/hd6446x/hd64465/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/hd6446x/hd64465/CVS/Root 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/voyagergx/CVS/Entries linux-2.6.17/arch/sh/cchips/voyagergx/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/cchips/voyagergx/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/voyagergx/CVS/Entries 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,5 @@
++/Makefile/1.2/Tue May 31 14:33:28 2005/-ko/
++/consistent.c/1.5/Fri Jan 27 16:11:52 2006/-ko/
++/irq.c/1.5/Wed Feb 8 22:08:10 2006/-ko/
++/setup.c/1.2/Wed Feb 8 22:08:10 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/voyagergx/CVS/Repository linux-2.6.17/arch/sh/cchips/voyagergx/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/cchips/voyagergx/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/voyagergx/CVS/Repository 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/cchips/voyagergx
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/voyagergx/CVS/Root linux-2.6.17/arch/sh/cchips/voyagergx/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/cchips/voyagergx/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/voyagergx/CVS/Root 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/voyagergx/Makefile linux-2.6.17/arch/sh/cchips/voyagergx/Makefile
+--- linux-2.6.17-vanilla/arch/sh/cchips/voyagergx/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/voyagergx/Makefile 2006-07-12 16:54:21.000000000 +0000
+@@ -4,5 +4,5 @@
+
+ obj-y := irq.o setup.o
+
+-obj-$(CONFIG_USB_OHCI_HCD) += consistent.o
++obj-$(CONFIG_USB_SM501) += consistent.o
+
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/voyagergx/irq.c linux-2.6.17/arch/sh/cchips/voyagergx/irq.c
+--- linux-2.6.17-vanilla/arch/sh/cchips/voyagergx/irq.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/voyagergx/irq.c 2006-07-12 16:54:21.000000000 +0000
+@@ -33,8 +33,7 @@
+
+ #include <asm/io.h>
+ #include <asm/irq.h>
+-#include <asm/rts7751r2d/rts7751r2d.h>
+-#include <asm/rts7751r2d/voyagergx_reg.h>
++#include <asm/mach/voyagergx_reg.h>
+
+ static void disable_voyagergx_irq(unsigned int irq)
+ {
+diff -ruN linux-2.6.17-vanilla/arch/sh/cchips/voyagergx/setup.c linux-2.6.17/arch/sh/cchips/voyagergx/setup.c
+--- linux-2.6.17-vanilla/arch/sh/cchips/voyagergx/setup.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/cchips/voyagergx/setup.c 2006-07-12 16:54:21.000000000 +0000
+@@ -13,7 +13,7 @@
+ #include <linux/init.h>
+ #include <linux/module.h>
+ #include <asm/io.h>
+-#include <asm/rts7751r2d/voyagergx_reg.h>
++#include <asm/mach/voyagergx_reg.h>
+
+ static int __init setup_voyagergx(void)
+ {
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/CVS/Entries linux-2.6.17/arch/sh/configs/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/configs/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/CVS/Entries 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,19 @@
++/adx_defconfig/1.3/Wed Oct 5 21:34:14 2005//
++/cqreek_defconfig/1.3/Wed Oct 5 21:34:14 2005//
++/dreamcast_defconfig/1.8/Wed Jan 4 19:03:16 2006//
++/hs7751rvoip_defconfig/1.4/Wed Jan 4 19:03:16 2006//
++/landisk_defconfig/1.4/Sun Dec 18 00:20:37 2005/-ko/
++/microdev_defconfig/1.7/Wed Jan 4 19:03:16 2006/-ko/
++/rts7751r2d_defconfig/1.6/Wed Jan 4 19:03:16 2006/-ko/
++/se7300_defconfig/1.5/Wed Jan 4 19:03:16 2006//
++/se73180_defconfig/1.7/Sun Jan 8 12:22:57 2006//
++/se7705_defconfig/1.4/Wed Jan 4 19:03:16 2006/-ko/
++/se7750_defconfig/1.4/Wed Jan 4 19:03:16 2006/-ko/
++/se7751_defconfig/1.4/Wed Jan 4 19:03:16 2006//
++/sh03_defconfig/1.4/Wed Jan 4 19:03:16 2006/-ko/
++/snapgear_defconfig/1.5/Wed Jan 4 19:03:16 2006//
++/systemh_defconfig/1.4/Wed Jan 4 19:03:16 2006//
++/r7780rp_defconfig/1.2/Wed Jul 5 14:50:34 2006/-ko/
++/hp6xx_defconfig/1.8/Thu Jul 6 12:38:07 2006/-ko/
++/titan_defconfig/1.3/Thu Jul 6 18:40:37 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/CVS/Repository linux-2.6.17/arch/sh/configs/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/configs/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/CVS/Repository 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/configs
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/CVS/Root linux-2.6.17/arch/sh/configs/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/configs/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/CVS/Root 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/adx_defconfig linux-2.6.17/arch/sh/configs/adx_defconfig
+--- linux-2.6.17-vanilla/arch/sh/configs/adx_defconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/adx_defconfig 2006-07-12 16:54:21.000000000 +0000
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.11-sh
+-# Wed Mar 2 15:09:26 2005
++# Linux kernel version: 2.6.13-sh
++# Thu Oct 6 00:20:11 2005
+ #
+ CONFIG_SUPERH=y
+ CONFIG_UID16=y
+@@ -16,6 +16,7 @@
+ CONFIG_EXPERIMENTAL=y
+ CONFIG_CLEAN_COMPILE=y
+ CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
+
+ #
+ # General setup
+@@ -25,22 +26,23 @@
+ # CONFIG_SYSVIPC is not set
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_SYSCTL is not set
+-# CONFIG_AUDIT is not set
+-CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_HOTPLUG is not set
+ # CONFIG_IKCONFIG is not set
+ # CONFIG_EMBEDDED is not set
+ CONFIG_KALLSYMS=y
+ # CONFIG_KALLSYMS_EXTRA_PASS is not set
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_EPOLL=y
+-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_SHMEM=y
+ CONFIG_CC_ALIGN_FUNCTIONS=0
+ CONFIG_CC_ALIGN_LABELS=0
+ CONFIG_CC_ALIGN_LOOPS=0
+ CONFIG_CC_ALIGN_JUMPS=0
+ # CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
+
+ #
+ # Loadable module support
+@@ -57,9 +59,7 @@
+ # CONFIG_SH_7751_SYSTEMH is not set
+ # CONFIG_SH_STB1_HARP is not set
+ # CONFIG_SH_STB1_OVERDRIVE is not set
+-# CONFIG_SH_HP620 is not set
+-# CONFIG_SH_HP680 is not set
+-# CONFIG_SH_HP690 is not set
++# CONFIG_SH_HP6XX is not set
+ # CONFIG_SH_CQREEK is not set
+ # CONFIG_SH_DMIDA is not set
+ # CONFIG_SH_EC3104 is not set
+@@ -76,46 +76,90 @@
+ # CONFIG_SH_RTS7751R2D is not set
+ # CONFIG_SH_EDOSK7705 is not set
+ # CONFIG_SH_SH4202_MICRODEV is not set
++# CONFIG_SH_LANDISK is not set
+ # CONFIG_SH_UNKNOWN is not set
+-# CONFIG_CPU_SH2 is not set
+-# CONFIG_CPU_SH3 is not set
++
++#
++# Processor selection
++#
+ CONFIG_CPU_SH4=y
++
++#
++# SH-2 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7604 is not set
++
++#
++# SH-3 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7300 is not set
+ # CONFIG_CPU_SUBTYPE_SH7705 is not set
+ # CONFIG_CPU_SUBTYPE_SH7707 is not set
+ # CONFIG_CPU_SUBTYPE_SH7708 is not set
+ # CONFIG_CPU_SUBTYPE_SH7709 is not set
++
++#
++# SH-4 Processor Support
++#
+ CONFIG_CPU_SUBTYPE_SH7750=y
++# CONFIG_CPU_SUBTYPE_SH7091 is not set
++# CONFIG_CPU_SUBTYPE_SH7750R is not set
++# CONFIG_CPU_SUBTYPE_SH7750S is not set
+ # CONFIG_CPU_SUBTYPE_SH7751 is not set
++# CONFIG_CPU_SUBTYPE_SH7751R is not set
+ # CONFIG_CPU_SUBTYPE_SH7760 is not set
+-# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# ST40 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_ST40STB1 is not set
+ # CONFIG_CPU_SUBTYPE_ST40GX1 is not set
+-# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# SH-4A Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH7770 is not set
++# CONFIG_CPU_SUBTYPE_SH7780 is not set
++
++#
++# Memory management options
++#
+ CONFIG_MMU=y
+-# CONFIG_CMDLINE_BOOL 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
++
++#
++# Cache configuration
++#
++# CONFIG_SH_DIRECT_MAPPED is not set
++# CONFIG_SH_WRITETHROUGH is not set
++# CONFIG_SH_OCRAM is not set
+ CONFIG_MEMORY_START=0x08000000
+ CONFIG_MEMORY_SIZE=0x00400000
+-CONFIG_MEMORY_SET=y
+-# CONFIG_MEMORY_OVERRIDE is not set
+ CONFIG_CF_ENABLER=y
+ # CONFIG_CF_AREA5 is not set
+ CONFIG_CF_AREA6=y
+ CONFIG_CF_BASE_ADDR=0xb8000000
++
++#
++# Processor features
++#
++CONFIG_CPU_LITTLE_ENDIAN=y
+ CONFIG_SH_RTC=y
+ CONFIG_SH_FPU=y
+-CONFIG_ZERO_PAGE_OFFSET=0x00001000
+-CONFIG_BOOT_LINK_OFFSET=0x00800000
+-CONFIG_CPU_LITTLE_ENDIAN=y
+-# CONFIG_PREEMPT is not set
+-# CONFIG_UBC_WAKEUP is not set
+-# CONFIG_SH_WRITETHROUGH is not set
+-# CONFIG_SH_OCRAM is not set
+ # CONFIG_SH_STORE_QUEUES is not set
+-# CONFIG_SMP is not set
+-CONFIG_SH_PCLK_CALC=y
+-CONFIG_SH_PCLK_FREQ=50000000
++
++#
++# Timer support
++#
++CONFIG_SH_TMU=y
++# CONFIG_SH_PCLK_FREQ_BOOL is not set
+
+ #
+ # CPU Frequency scaling
+@@ -133,18 +177,29 @@
+ # CONFIG_HD6446X_SERIES is not set
+
+ #
+-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
++# Kernel features
+ #
+-# CONFIG_PCI is not set
++# CONFIG_KEXEC is not set
++# CONFIG_PREEMPT is not set
++# CONFIG_SMP is not set
+
+ #
+-# PCCARD (PCMCIA/CardBus) support
++# Boot options
+ #
+-# CONFIG_PCCARD is not set
++CONFIG_ZERO_PAGE_OFFSET=0x00001000
++CONFIG_BOOT_LINK_OFFSET=0x00800000
++# CONFIG_UBC_WAKEUP is not set
++# CONFIG_CMDLINE_BOOL is not set
++
++#
++# Bus options
++#
++# CONFIG_PCI is not set
+
+ #
+-# PC-card bridges
++# PCCARD (PCMCIA/CardBus) support
+ #
++# CONFIG_PCCARD is not set
+
+ #
+ # PCI Hotplug Support
+@@ -158,9 +213,9 @@
+ # CONFIG_BINFMT_MISC is not set
+
+ #
+-# SH initrd options
++# Networking
+ #
+-# CONFIG_EMBEDDED_RAMDISK is not set
++# CONFIG_NET is not set
+
+ #
+ # Device Drivers
+@@ -250,6 +305,7 @@
+ #
+ # Fusion MPT device support
+ #
++# CONFIG_FUSION is not set
+
+ #
+ # IEEE 1394 (FireWire) support
+@@ -260,9 +316,8 @@
+ #
+
+ #
+-# Networking support
++# Network device support
+ #
+-# CONFIG_NET is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+
+@@ -293,18 +348,6 @@
+ # CONFIG_INPUT_EVBUG is not set
+
+ #
+-# Input I/O drivers
+-#
+-# CONFIG_GAMEPORT is not set
+-CONFIG_SOUND_GAMEPORT=y
+-CONFIG_SERIO=y
+-CONFIG_SERIO_I8042=y
+-CONFIG_SERIO_SERPORT=y
+-# CONFIG_SERIO_CT82C710 is not set
+-CONFIG_SERIO_LIBPS2=y
+-# CONFIG_SERIO_RAW is not set
+-
+-#
+ # Input Device Drivers
+ #
+ CONFIG_INPUT_KEYBOARD=y
+@@ -322,6 +365,16 @@
+ # CONFIG_INPUT_MISC is not set
+
+ #
++# Hardware I/O ports
++#
++CONFIG_SERIO=y
++CONFIG_SERIO_I8042=y
++CONFIG_SERIO_SERPORT=y
++CONFIG_SERIO_LIBPS2=y
++# CONFIG_SERIO_RAW is not set
++# CONFIG_GAMEPORT is not set
++
++#
+ # Character devices
+ #
+ CONFIG_VT=y
+@@ -359,13 +412,17 @@
+ #
+ # Ftape, the floppy tape device driver
+ #
+-# CONFIG_DRM is not set
+ # CONFIG_RAW_DRIVER is not set
+
+ #
++# TPM devices
++#
++
++#
+ # I2C support
+ #
+ # CONFIG_I2C is not set
++# CONFIG_I2C_SENSOR is not set
+
+ #
+ # Dallas's 1-wire bus
+@@ -373,6 +430,12 @@
+ # CONFIG_W1 is not set
+
+ #
++# Hardware Monitoring support
++#
++CONFIG_HWMON=y
++# CONFIG_HWMON_DEBUG_CHIP is not set
++
++#
+ # Misc devices
+ #
+
+@@ -393,7 +456,6 @@
+ #
+ # Console display driver support
+ #
+-CONFIG_VGA_CONSOLE=y
+ CONFIG_DUMMY_CONSOLE=y
+
+ #
+@@ -408,10 +470,6 @@
+ # CONFIG_USB_ARCH_HAS_OHCI is not set
+
+ #
+-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+-#
+-
+-#
+ # USB Gadget Support
+ #
+ # CONFIG_USB_GADGET is not set
+@@ -424,17 +482,22 @@
+ #
+ # InfiniBand support
+ #
+-# CONFIG_INFINIBAND is not set
++
++#
++# SN Devices
++#
+
+ #
+ # File systems
+ #
+ CONFIG_EXT2_FS=y
+ # CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
+ # CONFIG_EXT3_FS is not set
+ # CONFIG_JBD is not set
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
++# CONFIG_FS_POSIX_ACL is not set
+
+ #
+ # XFS support
+@@ -442,6 +505,7 @@
+ # CONFIG_XFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+ # CONFIG_ROMFS_FS is not set
++CONFIG_INOTIFY=y
+ # CONFIG_QUOTA is not set
+ CONFIG_DNOTIFY=y
+ # CONFIG_AUTOFS_FS is not set
+@@ -466,7 +530,6 @@
+ CONFIG_PROC_FS=y
+ # CONFIG_PROC_KCORE is not set
+ CONFIG_SYSFS=y
+-# CONFIG_DEVFS_FS is not set
+ # CONFIG_DEVPTS_FS_XATTR is not set
+ # CONFIG_TMPFS is not set
+ # CONFIG_HUGETLBFS is not set
+@@ -509,7 +572,9 @@
+ #
+ # Kernel hacking
+ #
++# CONFIG_PRINTK_TIME is not set
+ # CONFIG_DEBUG_KERNEL is not set
++CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_FRAME_POINTER is not set
+ CONFIG_SH_STANDARD_BIOS=y
+ # CONFIG_EARLY_SCIF_CONSOLE is not set
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/cqreek_defconfig linux-2.6.17/arch/sh/configs/cqreek_defconfig
+--- linux-2.6.17-vanilla/arch/sh/configs/cqreek_defconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/cqreek_defconfig 2006-07-12 16:54:21.000000000 +0000
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.11-sh
+-# Wed Mar 2 15:09:38 2005
++# Linux kernel version: 2.6.13-sh
++# Thu Oct 6 00:20:14 2005
+ #
+ CONFIG_SUPERH=y
+ CONFIG_UID16=y
+@@ -16,6 +16,7 @@
+ CONFIG_EXPERIMENTAL=y
+ CONFIG_CLEAN_COMPILE=y
+ CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
+
+ #
+ # General setup
+@@ -25,22 +26,23 @@
+ # CONFIG_SYSVIPC is not set
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_SYSCTL is not set
+-# CONFIG_AUDIT is not set
+-CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_HOTPLUG is not set
+ # CONFIG_IKCONFIG is not set
+ # CONFIG_EMBEDDED is not set
+ CONFIG_KALLSYMS=y
+ # CONFIG_KALLSYMS_EXTRA_PASS is not set
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_EPOLL=y
+-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_SHMEM=y
+ CONFIG_CC_ALIGN_FUNCTIONS=0
+ CONFIG_CC_ALIGN_LABELS=0
+ CONFIG_CC_ALIGN_LOOPS=0
+ CONFIG_CC_ALIGN_JUMPS=0
+ # CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
+
+ #
+ # Loadable module support
+@@ -57,9 +59,7 @@
+ # CONFIG_SH_7751_SYSTEMH is not set
+ # CONFIG_SH_STB1_HARP is not set
+ # CONFIG_SH_STB1_OVERDRIVE is not set
+-# CONFIG_SH_HP620 is not set
+-# CONFIG_SH_HP680 is not set
+-# CONFIG_SH_HP690 is not set
++# CONFIG_SH_HP6XX is not set
+ CONFIG_SH_CQREEK=y
+ # CONFIG_SH_DMIDA is not set
+ # CONFIG_SH_EC3104 is not set
+@@ -76,41 +76,86 @@
+ # CONFIG_SH_RTS7751R2D is not set
+ # CONFIG_SH_EDOSK7705 is not set
+ # CONFIG_SH_SH4202_MICRODEV is not set
++# CONFIG_SH_LANDISK is not set
+ # CONFIG_SH_UNKNOWN is not set
+-# CONFIG_CPU_SH2 is not set
++
++#
++# Processor selection
++#
+ CONFIG_CPU_SH3=y
+-# CONFIG_CPU_SH4 is not set
++
++#
++# SH-2 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7604 is not set
++
++#
++# SH-3 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7300 is not set
+ # CONFIG_CPU_SUBTYPE_SH7705 is not set
+ # CONFIG_CPU_SUBTYPE_SH7707 is not set
+ CONFIG_CPU_SUBTYPE_SH7708=y
+ # CONFIG_CPU_SUBTYPE_SH7709 is not set
++
++#
++# SH-4 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7750 is not set
++# CONFIG_CPU_SUBTYPE_SH7091 is not set
++# CONFIG_CPU_SUBTYPE_SH7750R is not set
++# CONFIG_CPU_SUBTYPE_SH7750S is not set
+ # CONFIG_CPU_SUBTYPE_SH7751 is not set
++# CONFIG_CPU_SUBTYPE_SH7751R is not set
+ # CONFIG_CPU_SUBTYPE_SH7760 is not set
+-# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# ST40 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_ST40STB1 is not set
+ # CONFIG_CPU_SUBTYPE_ST40GX1 is not set
+-# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# SH-4A Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH7770 is not set
++# CONFIG_CPU_SUBTYPE_SH7780 is not set
++
++#
++# Memory management options
++#
+ CONFIG_MMU=y
+-# CONFIG_CMDLINE_BOOL 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
++
++#
++# Cache configuration
++#
++# CONFIG_SH_DIRECT_MAPPED is not set
++# CONFIG_SH_WRITETHROUGH is not set
++# CONFIG_SH_OCRAM is not set
+ CONFIG_MEMORY_START=0x0c000000
+ CONFIG_MEMORY_SIZE=0x00400000
+-# CONFIG_MEMORY_OVERRIDE is not set
++
++#
++# Processor features
++#
++CONFIG_CPU_LITTLE_ENDIAN=y
+ CONFIG_SH_RTC=y
+ CONFIG_SH_DSP=y
+ CONFIG_SH_ADC=y
+-CONFIG_ZERO_PAGE_OFFSET=0x00001000
+-CONFIG_BOOT_LINK_OFFSET=0x00800000
+-CONFIG_CPU_LITTLE_ENDIAN=y
+-# CONFIG_PREEMPT is not set
+-# CONFIG_UBC_WAKEUP is not set
+-# CONFIG_SH_WRITETHROUGH is not set
+-# CONFIG_SH_OCRAM is not set
+-# CONFIG_SMP is not set
+-CONFIG_SH_PCLK_CALC=y
+-CONFIG_SH_PCLK_FREQ=1193182
++
++#
++# Timer support
++#
++CONFIG_SH_TMU=y
++# CONFIG_SH_PCLK_FREQ_BOOL is not set
+
+ #
+ # CPU Frequency scaling
+@@ -128,18 +173,29 @@
+ # CONFIG_HD6446X_SERIES is not set
+
+ #
+-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
++# Kernel features
+ #
+-# CONFIG_PCI is not set
++# CONFIG_KEXEC is not set
++# CONFIG_PREEMPT is not set
++# CONFIG_SMP is not set
+
+ #
+-# PCCARD (PCMCIA/CardBus) support
++# Boot options
+ #
+-# CONFIG_PCCARD is not set
++CONFIG_ZERO_PAGE_OFFSET=0x00001000
++CONFIG_BOOT_LINK_OFFSET=0x00800000
++# CONFIG_UBC_WAKEUP is not set
++# CONFIG_CMDLINE_BOOL is not set
++
++#
++# Bus options
++#
++# CONFIG_PCI is not set
+
+ #
+-# PC-card bridges
++# PCCARD (PCMCIA/CardBus) support
+ #
++# CONFIG_PCCARD is not set
+
+ #
+ # PCI Hotplug Support
+@@ -153,9 +209,9 @@
+ # CONFIG_BINFMT_MISC is not set
+
+ #
+-# SH initrd options
++# Networking
+ #
+-# CONFIG_EMBEDDED_RAMDISK is not set
++# CONFIG_NET is not set
+
+ #
+ # Device Drivers
+@@ -245,6 +301,7 @@
+ #
+ # Fusion MPT device support
+ #
++# CONFIG_FUSION is not set
+
+ #
+ # IEEE 1394 (FireWire) support
+@@ -255,9 +312,8 @@
+ #
+
+ #
+-# Networking support
++# Network device support
+ #
+-# CONFIG_NET is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+
+@@ -288,18 +344,6 @@
+ # CONFIG_INPUT_EVBUG is not set
+
+ #
+-# Input I/O drivers
+-#
+-# CONFIG_GAMEPORT is not set
+-CONFIG_SOUND_GAMEPORT=y
+-CONFIG_SERIO=y
+-CONFIG_SERIO_I8042=y
+-CONFIG_SERIO_SERPORT=y
+-# CONFIG_SERIO_CT82C710 is not set
+-CONFIG_SERIO_LIBPS2=y
+-# CONFIG_SERIO_RAW is not set
+-
+-#
+ # Input Device Drivers
+ #
+ CONFIG_INPUT_KEYBOARD=y
+@@ -317,6 +361,16 @@
+ # CONFIG_INPUT_MISC is not set
+
+ #
++# Hardware I/O ports
++#
++CONFIG_SERIO=y
++CONFIG_SERIO_I8042=y
++CONFIG_SERIO_SERPORT=y
++CONFIG_SERIO_LIBPS2=y
++# CONFIG_SERIO_RAW is not set
++# CONFIG_GAMEPORT is not set
++
++#
+ # Character devices
+ #
+ CONFIG_VT=y
+@@ -354,13 +408,17 @@
+ #
+ # Ftape, the floppy tape device driver
+ #
+-# CONFIG_DRM is not set
+ # CONFIG_RAW_DRIVER is not set
+
+ #
++# TPM devices
++#
++
++#
+ # I2C support
+ #
+ # CONFIG_I2C is not set
++# CONFIG_I2C_SENSOR is not set
+
+ #
+ # Dallas's 1-wire bus
+@@ -368,6 +426,12 @@
+ # CONFIG_W1 is not set
+
+ #
++# Hardware Monitoring support
++#
++CONFIG_HWMON=y
++# CONFIG_HWMON_DEBUG_CHIP is not set
++
++#
+ # Misc devices
+ #
+
+@@ -388,7 +452,6 @@
+ #
+ # Console display driver support
+ #
+-CONFIG_VGA_CONSOLE=y
+ CONFIG_DUMMY_CONSOLE=y
+
+ #
+@@ -403,10 +466,6 @@
+ # CONFIG_USB_ARCH_HAS_OHCI is not set
+
+ #
+-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
+-#
+-
+-#
+ # USB Gadget Support
+ #
+ # CONFIG_USB_GADGET is not set
+@@ -419,17 +478,22 @@
+ #
+ # InfiniBand support
+ #
+-# CONFIG_INFINIBAND is not set
++
++#
++# SN Devices
++#
+
+ #
+ # File systems
+ #
+ CONFIG_EXT2_FS=y
+ # CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
+ # CONFIG_EXT3_FS is not set
+ # CONFIG_JBD is not set
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
++# CONFIG_FS_POSIX_ACL is not set
+
+ #
+ # XFS support
+@@ -437,6 +501,7 @@
+ # CONFIG_XFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+ # CONFIG_ROMFS_FS is not set
++CONFIG_INOTIFY=y
+ # CONFIG_QUOTA is not set
+ CONFIG_DNOTIFY=y
+ # CONFIG_AUTOFS_FS is not set
+@@ -461,7 +526,6 @@
+ CONFIG_PROC_FS=y
+ # CONFIG_PROC_KCORE is not set
+ CONFIG_SYSFS=y
+-# CONFIG_DEVFS_FS is not set
+ # CONFIG_DEVPTS_FS_XATTR is not set
+ # CONFIG_TMPFS is not set
+ # CONFIG_HUGETLBFS is not set
+@@ -504,7 +568,9 @@
+ #
+ # Kernel hacking
+ #
++# CONFIG_PRINTK_TIME is not set
+ # CONFIG_DEBUG_KERNEL is not set
++CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_FRAME_POINTER is not set
+ CONFIG_SH_STANDARD_BIOS=y
+ # CONFIG_EARLY_PRINTK is not set
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/dreamcast_defconfig linux-2.6.17/arch/sh/configs/dreamcast_defconfig
+--- linux-2.6.17-vanilla/arch/sh/configs/dreamcast_defconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/dreamcast_defconfig 2006-07-12 16:54:21.000000000 +0000
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.11-sh
+-# Wed Mar 2 15:09:40 2005
++# Linux kernel version: 2.6.15-sh
++# Wed Jan 4 14:20:29 2006
+ #
+ CONFIG_SUPERH=y
+ CONFIG_UID16=y
+@@ -17,11 +17,13 @@
+ CONFIG_CLEAN_COMPILE=y
+ CONFIG_BROKEN_ON_SMP=y
+ CONFIG_LOCK_KERNEL=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
+
+ #
+ # General setup
+ #
+ CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
+ CONFIG_SWAP=y
+ CONFIG_SYSVIPC=y
+ # CONFIG_POSIX_MQUEUE is not set
+@@ -29,22 +31,26 @@
+ # CONFIG_BSD_PROCESS_ACCT_V3 is not set
+ CONFIG_SYSCTL=y
+ # CONFIG_AUDIT is not set
+-CONFIG_LOG_BUF_SHIFT=14
+ CONFIG_HOTPLUG=y
+ CONFIG_KOBJECT_UEVENT=y
+ # CONFIG_IKCONFIG is not set
++CONFIG_INITRAMFS_SOURCE=""
++CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+ CONFIG_EMBEDDED=y
+ CONFIG_KALLSYMS=y
+ # CONFIG_KALLSYMS_EXTRA_PASS is not set
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_EPOLL=y
+-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+ CONFIG_SHMEM=y
+ CONFIG_CC_ALIGN_FUNCTIONS=0
+ CONFIG_CC_ALIGN_LABELS=0
+ CONFIG_CC_ALIGN_LOOPS=0
+ CONFIG_CC_ALIGN_JUMPS=0
+ # CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
+
+ #
+ # Loadable module support
+@@ -58,6 +64,24 @@
+ CONFIG_KMOD=y
+
+ #
++# Block layer
++#
++# CONFIG_LBD 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_SH_SOLUTION_ENGINE is not set
+@@ -67,9 +91,7 @@
+ # CONFIG_SH_7751_SYSTEMH is not set
+ # CONFIG_SH_STB1_HARP is not set
+ # CONFIG_SH_STB1_OVERDRIVE is not set
+-# CONFIG_SH_HP620 is not set
+-# CONFIG_SH_HP680 is not set
+-# CONFIG_SH_HP690 is not set
++# CONFIG_SH_HP6XX is not set
+ # CONFIG_SH_CQREEK is not set
+ # CONFIG_SH_DMIDA is not set
+ # CONFIG_SH_EC3104 is not set
+@@ -86,48 +108,97 @@
+ # CONFIG_SH_RTS7751R2D is not set
+ # CONFIG_SH_EDOSK7705 is not set
+ # CONFIG_SH_SH4202_MICRODEV is not set
++# CONFIG_SH_LANDISK is not set
++# CONFIG_SH_TITAN is not set
+ # CONFIG_SH_UNKNOWN is not set
+-# CONFIG_CPU_SH2 is not set
+-# CONFIG_CPU_SH3 is not set
++
++#
++# Processor selection
++#
+ CONFIG_CPU_SH4=y
++
++#
++# SH-2 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7604 is not set
++
++#
++# SH-3 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7300 is not set
+ # CONFIG_CPU_SUBTYPE_SH7705 is not set
+ # CONFIG_CPU_SUBTYPE_SH7707 is not set
+ # CONFIG_CPU_SUBTYPE_SH7708 is not set
+ # CONFIG_CPU_SUBTYPE_SH7709 is not set
++
++#
++# SH-4 Processor Support
++#
+ CONFIG_CPU_SUBTYPE_SH7750=y
++CONFIG_CPU_SUBTYPE_SH7091=y
++CONFIG_CPU_SUBTYPE_SH7750R=y
++# CONFIG_CPU_SUBTYPE_SH7750S is not set
+ # CONFIG_CPU_SUBTYPE_SH7751 is not set
++# CONFIG_CPU_SUBTYPE_SH7751R is not set
+ # CONFIG_CPU_SUBTYPE_SH7760 is not set
+-# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# ST40 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_ST40STB1 is not set
+ # CONFIG_CPU_SUBTYPE_ST40GX1 is not set
+-# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# SH-4A Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH7770 is not set
++# CONFIG_CPU_SUBTYPE_SH7780 is not set
++
++#
++# Memory management options
++#
+ CONFIG_MMU=y
+ CONFIG_HUGETLB_PAGE_SIZE_64K=y
+ # CONFIG_HUGETLB_PAGE_SIZE_1MB is not set
+-# CONFIG_CMDLINE_BOOL 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=4
++
++#
++# Cache configuration
++#
++# CONFIG_SH_DIRECT_MAPPED is not set
++# CONFIG_SH_WRITETHROUGH is not set
++# CONFIG_SH_OCRAM is not set
+ CONFIG_MEMORY_START=0x0c000000
+ CONFIG_MEMORY_SIZE=0x01000000
+-CONFIG_MEMORY_SET=y
+-# CONFIG_MEMORY_OVERRIDE is not set
+-CONFIG_SH_FPU=y
+-CONFIG_ZERO_PAGE_OFFSET=0x00001000
+-CONFIG_BOOT_LINK_OFFSET=0x00800000
++
++#
++# Processor features
++#
+ CONFIG_CPU_LITTLE_ENDIAN=y
+-CONFIG_PREEMPT=y
+-# CONFIG_UBC_WAKEUP is not set
+-# CONFIG_SH_WRITETHROUGH is not set
+-CONFIG_SH_OCRAM=y
++CONFIG_SH_FPU=y
+ CONFIG_SH_STORE_QUEUES=y
+-# CONFIG_SMP is not set
+-CONFIG_SH_PCLK_CALC=y
++
++#
++# Timer support
++#
++CONFIG_SH_TMU=y
++CONFIG_SH_PCLK_FREQ_BOOL=y
+ CONFIG_SH_PCLK_FREQ=49876504
+
+ #
+ # CPU Frequency scaling
+ #
+ CONFIG_CPU_FREQ=y
++CONFIG_CPU_FREQ_TABLE=y
+ # CONFIG_CPU_FREQ_DEBUG is not set
+ CONFIG_CPU_FREQ_STAT=y
+ # CONFIG_CPU_FREQ_STAT_DETAILS is not set
+@@ -137,16 +208,13 @@
+ CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+ CONFIG_CPU_FREQ_GOV_USERSPACE=y
+ # CONFIG_CPU_FREQ_GOV_ONDEMAND is not set
+-CONFIG_CPU_FREQ_TABLE=y
+-CONFIG_SH_CPU_FREQ=y
++# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
++# CONFIG_SH_CPU_FREQ is not set
+
+ #
+ # DMA support
+ #
+-CONFIG_SH_DMA=y
+-CONFIG_NR_ONCHIP_DMA_CHANNELS=4
+-CONFIG_NR_DMA_CHANNELS_BOOL=y
+-CONFIG_NR_DMA_CHANNELS=9
++# CONFIG_SH_DMA is not set
+
+ #
+ # Companion Chips
+@@ -154,14 +222,28 @@
+ # CONFIG_HD6446X_SERIES is not set
+
+ #
+-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
++# Kernel features
++#
++# CONFIG_KEXEC is not set
++CONFIG_PREEMPT=y
++# CONFIG_SMP is not set
++
++#
++# Boot options
++#
++CONFIG_ZERO_PAGE_OFFSET=0x00001000
++CONFIG_BOOT_LINK_OFFSET=0x00800000
++# CONFIG_UBC_WAKEUP is not set
++CONFIG_CMDLINE_BOOL=y
++CONFIG_CMDLINE="console=ttySC1,115200 panic=3"
++
++#
++# Bus options
+ #
+-CONFIG_MAPLE=y
+ CONFIG_PCI=y
+ # CONFIG_SH_PCIDMA_NONCOHERENT is not set
+ CONFIG_PCI_AUTO=y
+ CONFIG_PCI_LEGACY_PROC=y
+-CONFIG_PCI_NAMES=y
+
+ #
+ # PCCARD (PCMCIA/CardBus) support
+@@ -169,10 +251,6 @@
+ # CONFIG_PCCARD is not set
+
+ #
+-# PC-card bridges
+-#
+-
+-#
+ # PCI Hotplug Support
+ #
+ # CONFIG_HOTPLUG_PCI is not set
+@@ -185,9 +263,72 @@
+ # CONFIG_BINFMT_MISC is not set
+
+ #
+-# SH initrd options
++# Networking
++#
++CONFIG_NET=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++# CONFIG_PACKET_MMAP is not set
++CONFIG_UNIX=y
++# 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 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_TUNNEL is not set
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_BIC=y
++# CONFIG_IPV6 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
++# 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_NET_DIVERT is not set
++# CONFIG_ECONET is not set
++# CONFIG_WAN_ROUTER is not set
++
++#
++# QoS and/or fair queueing
+ #
+-# CONFIG_EMBEDDED_RAMDISK is not set
++# 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
+@@ -201,6 +342,11 @@
+ # CONFIG_FW_LOADER is not set
+
+ #
++# Connector - unified userspace <-> kernelspace linker
++#
++# CONFIG_CONNECTOR is not set
++
++#
+ # Memory Technology Devices (MTD)
+ #
+ # CONFIG_MTD is not set
+@@ -217,7 +363,6 @@
+ #
+ # Block devices
+ #
+-# CONFIG_BLK_DEV_FD is not set
+ # CONFIG_BLK_CPQ_DA is not set
+ # CONFIG_BLK_CPQ_CISS_DA is not set
+ # CONFIG_BLK_DEV_DAC960 is not set
+@@ -226,21 +371,9 @@
+ # CONFIG_BLK_DEV_LOOP is not set
+ # CONFIG_BLK_DEV_NBD is not set
+ # CONFIG_BLK_DEV_SX8 is not set
+-CONFIG_BLK_DEV_RAM=y
++# CONFIG_BLK_DEV_RAM is not set
+ CONFIG_BLK_DEV_RAM_COUNT=16
+-CONFIG_BLK_DEV_RAM_SIZE=1024
+-CONFIG_BLK_DEV_INITRD=y
+-CONFIG_INITRAMFS_SOURCE=""
+-# CONFIG_LBD is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+-
+-#
+-# IO Schedulers
+-#
+-CONFIG_IOSCHED_NOOP=y
+-CONFIG_IOSCHED_AS=y
+-CONFIG_IOSCHED_DEADLINE=y
+-CONFIG_IOSCHED_CFQ=y
+ # CONFIG_ATA_OVER_ETH is not set
+
+ #
+@@ -251,6 +384,7 @@
+ #
+ # SCSI device support
+ #
++# CONFIG_RAID_ATTRS is not set
+ # CONFIG_SCSI is not set
+
+ #
+@@ -261,6 +395,7 @@
+ #
+ # Fusion MPT device support
+ #
++# CONFIG_FUSION is not set
+
+ #
+ # IEEE 1394 (FireWire) support
+@@ -273,70 +408,8 @@
+ # CONFIG_I2O is not set
+
+ #
+-# Networking support
+-#
+-CONFIG_NET=y
+-
+-#
+-# Networking options
+-#
+-CONFIG_PACKET=y
+-# CONFIG_PACKET_MMAP is not set
+-# CONFIG_NETLINK_DEV is not set
+-CONFIG_UNIX=y
+-# CONFIG_NET_KEY is not set
+-CONFIG_INET=y
+-# CONFIG_IP_MULTICAST is not set
+-# CONFIG_IP_ADVANCED_ROUTER is not set
+-CONFIG_IP_PNP=y
+-CONFIG_IP_PNP_DHCP=y
+-# CONFIG_IP_PNP_BOOTP is not set
+-# 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_TUNNEL is not set
+-CONFIG_IP_TCPDIAG=y
+-# CONFIG_IP_TCPDIAG_IPV6 is not set
+-# CONFIG_IPV6 is not set
+-# CONFIG_NETFILTER is not set
+-
+-#
+-# SCTP Configuration (EXPERIMENTAL)
+-#
+-# CONFIG_IP_SCTP 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_NET_DIVERT is not set
+-# CONFIG_ECONET is not set
+-# CONFIG_WAN_ROUTER is not set
+-
+-#
+-# QoS and/or fair queueing
++# Network device support
+ #
+-# CONFIG_NET_SCHED is not set
+-# CONFIG_NET_CLS_ROUTE is not set
+-
+-#
+-# Network testing
+-#
+-# CONFIG_NET_PKTGEN is not set
+-# CONFIG_NETPOLL is not set
+-# CONFIG_NET_POLL_CONTROLLER is not set
+-# CONFIG_HAMRADIO is not set
+-# CONFIG_IRDA is not set
+-# CONFIG_BT is not set
+ CONFIG_NETDEVICES=y
+ # CONFIG_DUMMY is not set
+ # CONFIG_BONDING is not set
+@@ -349,6 +422,11 @@
+ # CONFIG_ARCNET is not set
+
+ #
++# PHY device support
++#
++# CONFIG_PHYLIB is not set
++
++#
+ # Ethernet (10 or 100Mbit)
+ #
+ CONFIG_NET_ETHERNET=y
+@@ -356,6 +434,7 @@
+ # CONFIG_STNIC is not set
+ # CONFIG_HAPPYMEAL is not set
+ # CONFIG_SUNGEM is not set
++# CONFIG_CASSINI is not set
+ # CONFIG_NET_VENDOR_3COM is not set
+ # CONFIG_SMC91X is not set
+
+@@ -364,6 +443,7 @@
+ #
+ # CONFIG_NET_TULIP is not set
+ # CONFIG_HP100 is not set
++# CONFIG_NE2000 is not set
+ CONFIG_NET_PCI=y
+ # CONFIG_PCNET32 is not set
+ # CONFIG_AMD8111_ETH is not set
+@@ -398,13 +478,17 @@
+ # CONFIG_HAMACHI is not set
+ # CONFIG_YELLOWFIN is not set
+ # CONFIG_R8169 is not set
++# CONFIG_SIS190 is not set
++# CONFIG_SKGE is not set
+ # CONFIG_SK98LIN is not set
+ # CONFIG_VIA_VELOCITY is not set
+ # CONFIG_TIGON3 is not set
++# CONFIG_BNX2 is not set
+
+ #
+ # Ethernet (10000 Mbit)
+ #
++# CONFIG_CHELSIO_T1 is not set
+ # CONFIG_IXGB is not set
+ # CONFIG_S2IO is not set
+
+@@ -428,6 +512,8 @@
+ # 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
+@@ -457,19 +543,6 @@
+ # CONFIG_INPUT_EVBUG is not set
+
+ #
+-# Input I/O drivers
+-#
+-# CONFIG_GAMEPORT is not set
+-CONFIG_SOUND_GAMEPORT=y
+-CONFIG_SERIO=y
+-# CONFIG_SERIO_I8042 is not set
+-# CONFIG_SERIO_SERPORT is not set
+-# CONFIG_SERIO_CT82C710 is not set
+-# CONFIG_SERIO_PCIPS2 is not set
+-CONFIG_SERIO_LIBPS2=y
+-# CONFIG_SERIO_RAW is not set
+-
+-#
+ # Input Device Drivers
+ #
+ CONFIG_INPUT_KEYBOARD=y
+@@ -478,17 +551,26 @@
+ # CONFIG_KEYBOARD_LKKBD is not set
+ # CONFIG_KEYBOARD_XTKBD is not set
+ # CONFIG_KEYBOARD_NEWTON is not set
+-# CONFIG_KEYBOARD_MAPLE is not set
+ CONFIG_INPUT_MOUSE=y
+ CONFIG_MOUSE_PS2=y
+ # CONFIG_MOUSE_SERIAL is not set
+-# CONFIG_MOUSE_MAPLE 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_I8042 is not set
++# CONFIG_SERIO_SERPORT is not set
++# CONFIG_SERIO_PCIPS2 is not set
++CONFIG_SERIO_LIBPS2=y
++# CONFIG_SERIO_RAW is not set
++# CONFIG_GAMEPORT is not set
++
++#
+ # Character devices
+ #
+ CONFIG_VT=y
+@@ -508,6 +590,7 @@
+ CONFIG_SERIAL_SH_SCI_CONSOLE=y
+ CONFIG_SERIAL_CORE=y
+ CONFIG_SERIAL_CORE_CONSOLE=y
++# CONFIG_SERIAL_JSM is not set
+ CONFIG_UNIX98_PTYS=y
+ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=256
+@@ -547,6 +630,12 @@
+ # CONFIG_RAW_DRIVER is not set
+
+ #
++# TPM devices
++#
++# CONFIG_TCG_TPM is not set
++# CONFIG_TELCLOCK is not set
++
++#
+ # I2C support
+ #
+ # CONFIG_I2C is not set
+@@ -557,10 +646,21 @@
+ # CONFIG_W1 is not set
+
+ #
++# Hardware Monitoring support
++#
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++# CONFIG_HWMON_DEBUG_CHIP is not set
++
++#
+ # Misc devices
+ #
+
+ #
++# Multimedia Capabilities Port drivers
++#
++
++#
+ # Multimedia devices
+ #
+ # CONFIG_VIDEO_DEV is not set
+@@ -574,6 +674,10 @@
+ # Graphics support
+ #
+ CONFIG_FB=y
++CONFIG_FB_CFB_FILLRECT=y
++CONFIG_FB_CFB_COPYAREA=y
++CONFIG_FB_CFB_IMAGEBLIT=y
++# CONFIG_FB_MACMODES is not set
+ # CONFIG_FB_MODE_HELPERS is not set
+ # CONFIG_FB_TILEBLITTING is not set
+ # CONFIG_FB_CIRRUS is not set
+@@ -583,6 +687,8 @@
+ # CONFIG_FB_IMSTT is not set
+ CONFIG_FB_PVR2=y
+ # CONFIG_FB_EPSON1355 is not set
++# CONFIG_FB_S1D13XXX is not set
++# CONFIG_FB_NVIDIA is not set
+ # CONFIG_FB_RIVA is not set
+ # CONFIG_FB_MATROX is not set
+ # CONFIG_FB_RADEON_OLD is not set
+@@ -595,24 +701,27 @@
+ # CONFIG_FB_KYRO is not set
+ # CONFIG_FB_3DFX is not set
+ # CONFIG_FB_VOODOO1 is not set
++# CONFIG_FB_CYBLA is not set
+ # CONFIG_FB_TRIDENT is not set
+ # CONFIG_FB_VIRTUAL is not set
+
+ #
+ # Console display driver support
+ #
+-# CONFIG_VGA_CONSOLE is not set
+ CONFIG_DUMMY_CONSOLE=y
+ CONFIG_FRAMEBUFFER_CONSOLE=y
++# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+ CONFIG_FONTS=y
+ CONFIG_FONT_8x8=y
+ CONFIG_FONT_8x16=y
+ # CONFIG_FONT_6x11 is not set
++# CONFIG_FONT_7x14 is not set
+ # CONFIG_FONT_PEARL_8x8 is not set
+ # CONFIG_FONT_ACORN_8x8 is not set
+ # CONFIG_FONT_MINI_4x6 is not set
+ # CONFIG_FONT_SUN8x16 is not set
+ # CONFIG_FONT_SUN12x22 is not set
++# CONFIG_FONT_10x18 is not set
+
+ #
+ # Logo configuration
+@@ -634,12 +743,12 @@
+ #
+ # USB support
+ #
+-# CONFIG_USB is not set
+ CONFIG_USB_ARCH_HAS_HCD=y
+ CONFIG_USB_ARCH_HAS_OHCI=y
++# CONFIG_USB is not set
+
+ #
+-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+@@ -658,6 +767,10 @@
+ # CONFIG_INFINIBAND is not set
+
+ #
++# SN Devices
++#
++
++#
+ # File systems
+ #
+ # CONFIG_EXT2_FS is not set
+@@ -665,17 +778,16 @@
+ # CONFIG_JBD is not set
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+-
+-#
+-# XFS support
+-#
++# CONFIG_FS_POSIX_ACL is not set
+ # CONFIG_XFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+-CONFIG_ROMFS_FS=y
++# CONFIG_ROMFS_FS is not set
++CONFIG_INOTIFY=y
+ # CONFIG_QUOTA is not set
+-CONFIG_DNOTIFY=y
++# CONFIG_DNOTIFY is not set
+ # CONFIG_AUTOFS_FS is not set
+ # CONFIG_AUTOFS4_FS is not set
++# CONFIG_FUSE_FS is not set
+
+ #
+ # CD-ROM/DVD Filesystems
+@@ -696,15 +808,11 @@
+ CONFIG_PROC_FS=y
+ CONFIG_PROC_KCORE=y
+ CONFIG_SYSFS=y
+-CONFIG_DEVFS_FS=y
+-CONFIG_DEVFS_MOUNT=y
+-# CONFIG_DEVFS_DEBUG is not set
+-# CONFIG_DEVPTS_FS_XATTR is not set
+ CONFIG_TMPFS=y
+-# CONFIG_TMPFS_XATTR is not set
+ CONFIG_HUGETLBFS=y
+ CONFIG_HUGETLB_PAGE=y
+ CONFIG_RAMFS=y
++# CONFIG_RELAYFS_FS is not set
+
+ #
+ # Miscellaneous filesystems
+@@ -716,7 +824,7 @@
+ # CONFIG_BEFS_FS is not set
+ # CONFIG_BFS_FS is not set
+ # CONFIG_EFS_FS is not set
+-CONFIG_CRAMFS=y
++# CONFIG_CRAMFS is not set
+ # CONFIG_VXFS_FS is not set
+ # CONFIG_HPFS_FS is not set
+ # CONFIG_QNX4FS_FS is not set
+@@ -726,22 +834,14 @@
+ #
+ # Network File Systems
+ #
+-CONFIG_NFS_FS=y
+-CONFIG_NFS_V3=y
+-# CONFIG_NFS_V4 is not set
+-# CONFIG_NFS_DIRECTIO is not set
++# CONFIG_NFS_FS is not set
+ # CONFIG_NFSD is not set
+-CONFIG_ROOT_NFS=y
+-CONFIG_LOCKD=y
+-CONFIG_LOCKD_V4=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
+@@ -758,13 +858,14 @@
+ # Profiling support
+ #
+ CONFIG_PROFILING=y
+-CONFIG_OPROFILE=y
++# CONFIG_OPROFILE is not set
+
+ #
+ # Kernel hacking
+ #
++# CONFIG_PRINTK_TIME is not set
+ # CONFIG_DEBUG_KERNEL is not set
+-CONFIG_DEBUG_PREEMPT=y
++CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_FRAME_POINTER is not set
+ # CONFIG_SH_STANDARD_BIOS is not set
+ # CONFIG_EARLY_SCIF_CONSOLE is not set
+@@ -789,6 +890,6 @@
+ # 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
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/hp6xx_defconfig linux-2.6.17/arch/sh/configs/hp6xx_defconfig
+--- linux-2.6.17-vanilla/arch/sh/configs/hp6xx_defconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/hp6xx_defconfig 2006-07-12 16:54:21.000000000 +0000
+@@ -1,11 +1,12 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.15-sh
+-# Wed Jan 4 15:32:56 2006
++# Linux kernel version: 2.6.17
++# Thu Jul 6 09:58:22 2006
+ #
+ CONFIG_SUPERH=y
+-CONFIG_UID16=y
+ CONFIG_RWSEM_GENERIC_SPINLOCK=y
++CONFIG_GENERIC_FIND_NEXT_BIT=y
++CONFIG_GENERIC_HWEIGHT=y
+ CONFIG_GENERIC_HARDIRQS=y
+ CONFIG_GENERIC_IRQ_PROBE=y
+ CONFIG_GENERIC_CALIBRATE_DELAY=y
+@@ -14,8 +15,6 @@
+ # Code maturity level options
+ #
+ CONFIG_EXPERIMENTAL=y
+-# CONFIG_CLEAN_COMPILE is not set
+-CONFIG_BROKEN=y
+ CONFIG_BROKEN_ON_SMP=y
+ CONFIG_INIT_ENV_ARG_LIMIT=32
+
+@@ -28,25 +27,26 @@
+ # CONFIG_SYSVIPC is not set
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_SYSCTL is not set
+-CONFIG_HOTPLUG=y
+ # CONFIG_IKCONFIG is not set
++# CONFIG_RELAY is not set
+ CONFIG_INITRAMFS_SOURCE=""
++CONFIG_UID16=y
+ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+ # CONFIG_EMBEDDED is not set
+ CONFIG_KALLSYMS=y
+ # 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_CC_ALIGN_FUNCTIONS=0
+-CONFIG_CC_ALIGN_LABELS=0
+-CONFIG_CC_ALIGN_LOOPS=0
+-CONFIG_CC_ALIGN_JUMPS=0
++CONFIG_SLAB=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
++# CONFIG_SLOB is not set
+
+ #
+ # Loadable module support
+@@ -57,6 +57,8 @@
+ # Block layer
+ #
+ # CONFIG_LBD is not set
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
+
+ #
+ # IO Schedulers
+@@ -96,6 +98,7 @@
+ # CONFIG_SH_SECUREEDGE5410 is not set
+ # CONFIG_SH_HS7751RVOIP is not set
+ # CONFIG_SH_RTS7751R2D is not set
++# CONFIG_SH_R7780RP is not set
+ # CONFIG_SH_EDOSK7705 is not set
+ # CONFIG_SH_SH4202_MICRODEV is not set
+ # CONFIG_SH_LANDISK is not set
+@@ -175,12 +178,14 @@
+ CONFIG_SH_RTC=y
+ # CONFIG_SH_DSP is not set
+ CONFIG_SH_ADC=y
++CONFIG_CPU_HAS_INTEVT=y
++CONFIG_CPU_HAS_PINT_IRQ=y
++CONFIG_CPU_HAS_SR_RB=y
+
+ #
+ # Timer support
+ #
+ CONFIG_SH_TMU=y
+-CONFIG_SH_PCLK_FREQ_BOOL=y
+ CONFIG_SH_PCLK_FREQ=22110000
+
+ #
+@@ -194,7 +199,6 @@
+ CONFIG_SH_DMA=y
+ CONFIG_NR_ONCHIP_DMA_CHANNELS=4
+ # CONFIG_NR_DMA_CHANNELS_BOOL is not set
+-# CONFIG_DMA_PAGE_OPS is not set
+
+ #
+ # Companion Chips
+@@ -257,6 +261,14 @@
+ # CONFIG_BINFMT_MISC is not set
+
+ #
++# Power management options (EXPERIMENTAL)
++#
++CONFIG_PM=y
++CONFIG_PM_LEGACY=y
++# CONFIG_PM_DEBUG is not set
++CONFIG_APM=y
++
++#
+ # Networking
+ #
+ # CONFIG_NET is not set
+@@ -315,7 +327,7 @@
+ # CONFIG_BLK_DEV_IDE_SATA is not set
+ CONFIG_BLK_DEV_IDEDISK=y
+ # CONFIG_IDEDISK_MULTI_MODE is not set
+-# CONFIG_BLK_DEV_IDECS is not set
++CONFIG_BLK_DEV_IDECS=y
+ # CONFIG_BLK_DEV_IDECD is not set
+ # CONFIG_BLK_DEV_IDETAPE is not set
+ # CONFIG_BLK_DEV_IDEFLOPPY is not set
+@@ -356,19 +368,12 @@
+ #
+ # IEEE 1394 (FireWire) support
+ #
+-# CONFIG_IEEE1394 is not set
+
+ #
+ # I2O device support
+ #
+
+ #
+-# Network device support
+-#
+-# CONFIG_NETPOLL is not set
+-# CONFIG_NET_POLL_CONTROLLER is not set
+-
+-#
+ # ISDN subsystem
+ #
+
+@@ -390,17 +395,31 @@
+ 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_TSDEV=y
++CONFIG_INPUT_TSDEV_SCREEN_X=240
++CONFIG_INPUT_TSDEV_SCREEN_Y=320
+ # CONFIG_INPUT_EVDEV is not set
+ # CONFIG_INPUT_EVBUG is not set
+
+ #
+ # Input Device Drivers
+ #
+-# CONFIG_INPUT_KEYBOARD is not set
++CONFIG_INPUT_KEYBOARD=y
++# CONFIG_KEYBOARD_ATKBD is not set
++# 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_HP620 is not set
++CONFIG_KEYBOARD_HP680=y
+ # CONFIG_INPUT_MOUSE is not set
+ # CONFIG_INPUT_JOYSTICK is not set
+-# CONFIG_INPUT_TOUCHSCREEN is not set
++CONFIG_INPUT_TOUCHSCREEN=y
++# CONFIG_TOUCHSCREEN_GUNZE is not set
++# CONFIG_TOUCHSCREEN_ELO is not set
++# CONFIG_TOUCHSCREEN_MTOUCH is not set
++# CONFIG_TOUCHSCREEN_MK712 is not set
++CONFIG_TOUCHSCREEN_HP600=y
+ # CONFIG_INPUT_MISC is not set
+
+ #
+@@ -471,6 +490,12 @@
+ # CONFIG_I2C is not set
+
+ #
++# SPI support
++#
++# CONFIG_SPI is not set
++# CONFIG_SPI_MASTER is not set
++
++#
+ # Dallas's 1-wire bus
+ #
+ # CONFIG_W1 is not set
+@@ -480,6 +505,7 @@
+ #
+ CONFIG_HWMON=y
+ # CONFIG_HWMON_VID is not set
++# CONFIG_SENSORS_F71805F is not set
+ # CONFIG_HWMON_DEBUG_CHIP is not set
+
+ #
+@@ -487,13 +513,10 @@
+ #
+
+ #
+-# Multimedia Capabilities Port drivers
+-#
+-
+-#
+ # Multimedia devices
+ #
+ # CONFIG_VIDEO_DEV is not set
++CONFIG_VIDEO_V4L2=y
+
+ #
+ # Digital Video Broadcasting Devices
+@@ -507,6 +530,7 @@
+ CONFIG_FB_CFB_COPYAREA=y
+ CONFIG_FB_CFB_IMAGEBLIT=y
+ # CONFIG_FB_MACMODES is not set
++CONFIG_FB_FIRMWARE_EDID=y
+ # CONFIG_FB_MODE_HELPERS is not set
+ # CONFIG_FB_TILEBLITTING is not set
+ # CONFIG_FB_EPSON1355 is not set
+@@ -553,7 +577,6 @@
+ # Open Sound System
+ #
+ CONFIG_SOUND_PRIME=y
+-# CONFIG_OBSOLETE_OSS_DRIVER is not set
+ # CONFIG_SOUND_MSNDCLAS is not set
+ # CONFIG_SOUND_MSNDPIN is not set
+ CONFIG_SOUND_SH_DAC_AUDIO=y
+@@ -564,6 +587,7 @@
+ #
+ # CONFIG_USB_ARCH_HAS_HCD is not set
+ # CONFIG_USB_ARCH_HAS_OHCI is not set
++# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+ #
+ # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+@@ -580,13 +604,30 @@
+ # CONFIG_MMC is not set
+
+ #
++# LED devices
++#
++# CONFIG_NEW_LEDS is not set
++
++#
++# LED drivers
++#
++
++#
++# LED Triggers
++#
++
++#
+ # InfiniBand support
+ #
+-# CONFIG_INFINIBAND is not set
+
+ #
+-# SN Devices
++# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
++#
++
++#
++# Real Time Clock
+ #
++# CONFIG_RTC_CLASS is not set
+
+ #
+ # File systems
+@@ -595,7 +636,6 @@
+ # CONFIG_EXT2_FS_XATTR is not set
+ # CONFIG_EXT2_FS_XIP is not set
+ # CONFIG_EXT3_FS is not set
+-# CONFIG_JBD is not set
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+ # CONFIG_FS_POSIX_ACL is not set
+@@ -635,7 +675,7 @@
+ # CONFIG_HUGETLBFS is not set
+ # CONFIG_HUGETLB_PAGE is not set
+ CONFIG_RAMFS=y
+-# CONFIG_RELAYFS_FS is not set
++# CONFIG_CONFIGFS_FS is not set
+
+ #
+ # Miscellaneous filesystems
+@@ -713,9 +753,11 @@
+ # Kernel hacking
+ #
+ # CONFIG_PRINTK_TIME is not set
++# CONFIG_MAGIC_SYSRQ is not set
+ # CONFIG_DEBUG_KERNEL is not set
+ CONFIG_LOG_BUF_SHIFT=14
+-# CONFIG_FRAME_POINTER is not set
++# CONFIG_DEBUG_FS is not set
++# CONFIG_UNWIND_INFO is not set
+ # CONFIG_SH_STANDARD_BIOS is not set
+ # CONFIG_KGDB is not set
+
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/hs7751rvoip_defconfig linux-2.6.17/arch/sh/configs/hs7751rvoip_defconfig
+--- linux-2.6.17-vanilla/arch/sh/configs/hs7751rvoip_defconfig 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/hs7751rvoip_defconfig 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,884 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.15-sh
++# Wed Jan 4 17:02:02 2006
++#
++CONFIG_SUPERH=y
++CONFIG_UID16=y
++CONFIG_RWSEM_GENERIC_SPINLOCK=y
++CONFIG_GENERIC_HARDIRQS=y
++CONFIG_GENERIC_IRQ_PROBE=y
++CONFIG_GENERIC_CALIBRATE_DELAY=y
++
++#
++# Code maturity level options
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_CLEAN_COMPILE=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_LOCK_KERNEL=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++
++#
++# General setup
++#
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++CONFIG_SWAP=y
++CONFIG_SYSVIPC=y
++CONFIG_POSIX_MQUEUE=y
++CONFIG_BSD_PROCESS_ACCT=y
++# CONFIG_BSD_PROCESS_ACCT_V3 is not set
++CONFIG_SYSCTL=y
++# CONFIG_AUDIT is not set
++CONFIG_HOTPLUG=y
++CONFIG_KOBJECT_UEVENT=y
++# CONFIG_IKCONFIG is not set
++CONFIG_INITRAMFS_SOURCE=""
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_EMBEDDED=y
++# CONFIG_KALLSYMS is not set
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_BASE_FULL=y
++CONFIG_FUTEX=y
++CONFIG_EPOLL=y
++CONFIG_SHMEM=y
++CONFIG_CC_ALIGN_FUNCTIONS=0
++CONFIG_CC_ALIGN_LABELS=0
++CONFIG_CC_ALIGN_LOOPS=0
++CONFIG_CC_ALIGN_JUMPS=0
++# CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
++
++#
++# Loadable module support
++#
++CONFIG_MODULES=y
++CONFIG_MODULE_UNLOAD=y
++# CONFIG_MODULE_FORCE_UNLOAD is not set
++CONFIG_OBSOLETE_MODPARM=y
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_KMOD=y
++
++#
++# Block layer
++#
++# CONFIG_LBD 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_SH_SOLUTION_ENGINE is not set
++# CONFIG_SH_7751_SOLUTION_ENGINE is not set
++# CONFIG_SH_7300_SOLUTION_ENGINE is not set
++# CONFIG_SH_73180_SOLUTION_ENGINE is not set
++# CONFIG_SH_7751_SYSTEMH is not set
++# CONFIG_SH_STB1_HARP is not set
++# CONFIG_SH_STB1_OVERDRIVE is not set
++# CONFIG_SH_HP6XX is not set
++# CONFIG_SH_CQREEK is not set
++# CONFIG_SH_DMIDA is not set
++# CONFIG_SH_EC3104 is not set
++# CONFIG_SH_SATURN is not set
++# CONFIG_SH_DREAMCAST is not set
++# CONFIG_SH_CAT68701 is not set
++# CONFIG_SH_BIGSUR is not set
++# CONFIG_SH_SH2000 is not set
++# CONFIG_SH_ADX is not set
++# CONFIG_SH_MPC1211 is not set
++# CONFIG_SH_SH03 is not set
++# CONFIG_SH_SECUREEDGE5410 is not set
++CONFIG_SH_HS7751RVOIP=y
++# CONFIG_SH_RTS7751R2D is not set
++# CONFIG_SH_EDOSK7705 is not set
++# CONFIG_SH_SH4202_MICRODEV is not set
++# CONFIG_SH_LANDISK is not set
++# CONFIG_SH_TITAN is not set
++# CONFIG_SH_UNKNOWN is not set
++
++#
++# Processor selection
++#
++CONFIG_CPU_SH4=y
++
++#
++# SH-2 Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH7604 is not set
++
++#
++# SH-3 Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH7300 is not set
++# CONFIG_CPU_SUBTYPE_SH7705 is not set
++# CONFIG_CPU_SUBTYPE_SH7707 is not set
++# CONFIG_CPU_SUBTYPE_SH7708 is not set
++# CONFIG_CPU_SUBTYPE_SH7709 is not set
++
++#
++# SH-4 Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH7750 is not set
++# CONFIG_CPU_SUBTYPE_SH7091 is not set
++# CONFIG_CPU_SUBTYPE_SH7750R is not set
++# CONFIG_CPU_SUBTYPE_SH7750S is not set
++CONFIG_CPU_SUBTYPE_SH7751=y
++CONFIG_CPU_SUBTYPE_SH7751R=y
++# CONFIG_CPU_SUBTYPE_SH7760 is not set
++# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# ST40 Processor Support
++#
++# CONFIG_CPU_SUBTYPE_ST40STB1 is not set
++# CONFIG_CPU_SUBTYPE_ST40GX1 is not set
++
++#
++# SH-4A Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH7770 is not set
++# CONFIG_CPU_SUBTYPE_SH7780 is not set
++
++#
++# Memory management options
++#
++CONFIG_MMU=y
++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=4
++
++#
++# Cache configuration
++#
++# CONFIG_SH_DIRECT_MAPPED is not set
++# CONFIG_SH_WRITETHROUGH is not set
++# CONFIG_SH_OCRAM is not set
++CONFIG_MEMORY_START=0x0c000000
++CONFIG_MEMORY_SIZE=0x04000000
++
++#
++# Processor features
++#
++CONFIG_CPU_LITTLE_ENDIAN=y
++CONFIG_SH_RTC=y
++CONFIG_SH_FPU=y
++# CONFIG_SH_STORE_QUEUES is not set
++
++#
++# Timer support
++#
++CONFIG_SH_TMU=y
++
++#
++# HS7751RVoIP options
++#
++CONFIG_HS7751RVOIP_CODEC=y
++# CONFIG_SH_PCLK_FREQ_BOOL is not set
++
++#
++# CPU Frequency scaling
++#
++# CONFIG_CPU_FREQ is not set
++
++#
++# DMA support
++#
++# CONFIG_SH_DMA is not set
++
++#
++# Companion Chips
++#
++# CONFIG_HD6446X_SERIES is not set
++
++#
++# Kernel features
++#
++# CONFIG_KEXEC is not set
++CONFIG_PREEMPT=y
++# CONFIG_SMP is not set
++
++#
++# Boot options
++#
++CONFIG_ZERO_PAGE_OFFSET=0x00001000
++CONFIG_BOOT_LINK_OFFSET=0x00800000
++# CONFIG_UBC_WAKEUP is not set
++CONFIG_CMDLINE_BOOL=y
++CONFIG_CMDLINE="mem=64M console=ttySC1,115200 root=/dev/hda1"
++
++#
++# Bus options
++#
++CONFIG_PCI=y
++CONFIG_SH_PCIDMA_NONCOHERENT=y
++CONFIG_PCI_AUTO=y
++CONFIG_PCI_AUTO_UPDATE_RESOURCES=y
++CONFIG_PCI_LEGACY_PROC=y
++
++#
++# PCCARD (PCMCIA/CardBus) support
++#
++# CONFIG_PCCARD is not set
++
++#
++# PCI Hotplug Support
++#
++# CONFIG_HOTPLUG_PCI is not set
++
++#
++# Executable file formats
++#
++CONFIG_BINFMT_ELF=y
++# CONFIG_BINFMT_FLAT is not set
++# CONFIG_BINFMT_MISC is not set
++
++#
++# Networking
++#
++CONFIG_NET=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++CONFIG_PACKET_MMAP=y
++CONFIG_UNIX=y
++# CONFIG_NET_KEY is not set
++CONFIG_INET=y
++CONFIG_IP_MULTICAST=y
++CONFIG_IP_ADVANCED_ROUTER=y
++CONFIG_ASK_IP_FIB_HASH=y
++# CONFIG_IP_FIB_TRIE is not set
++CONFIG_IP_FIB_HASH=y
++# CONFIG_IP_MULTIPLE_TABLES is not set
++# CONFIG_IP_ROUTE_MULTIPATH is not set
++# CONFIG_IP_ROUTE_VERBOSE is not set
++# CONFIG_IP_PNP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE is not set
++# CONFIG_IP_MROUTE 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_TUNNEL is not set
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_BIC=y
++# CONFIG_IPV6 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
++# 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_NET_DIVERT 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=m
++
++#
++# Connector - unified userspace <-> kernelspace linker
++#
++# CONFIG_CONNECTOR is not set
++
++#
++# Memory Technology Devices (MTD)
++#
++# CONFIG_MTD is not set
++
++#
++# Parallel port support
++#
++# CONFIG_PARPORT is not set
++
++#
++# Plug and Play support
++#
++
++#
++# Block devices
++#
++# CONFIG_BLK_CPQ_DA is not set
++# CONFIG_BLK_CPQ_CISS_DA is not set
++# CONFIG_BLK_DEV_DAC960 is not set
++# CONFIG_BLK_DEV_UMEM is not set
++# CONFIG_BLK_DEV_COW_COMMON is not set
++# CONFIG_BLK_DEV_LOOP is not set
++# CONFIG_BLK_DEV_NBD is not set
++# CONFIG_BLK_DEV_SX8 is not set
++# CONFIG_BLK_DEV_RAM is not set
++CONFIG_BLK_DEV_RAM_COUNT=16
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++
++#
++# ATA/ATAPI/MFM/RLL support
++#
++CONFIG_IDE=y
++CONFIG_IDE_MAX_HWIFS=1
++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 is not set
++# CONFIG_BLK_DEV_IDETAPE is not set
++# CONFIG_BLK_DEV_IDEFLOPPY is not set
++# CONFIG_IDE_TASK_IOCTL is not set
++
++#
++# IDE chipset support/bugfixes
++#
++CONFIG_IDE_GENERIC=y
++CONFIG_BLK_DEV_IDEPCI=y
++CONFIG_IDEPCI_SHARE_IRQ=y
++# CONFIG_BLK_DEV_OFFBOARD is not set
++CONFIG_BLK_DEV_GENERIC=y
++# CONFIG_BLK_DEV_OPTI621 is not set
++# CONFIG_BLK_DEV_IDEDMA_PCI is not set
++CONFIG_IDE_SH=y
++# CONFIG_IDE_ARM 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
++
++#
++# Multi-device support (RAID and LVM)
++#
++# CONFIG_MD is not set
++
++#
++# Fusion MPT device support
++#
++# CONFIG_FUSION is not set
++
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_IEEE1394 is not set
++
++#
++# I2O device support
++#
++# CONFIG_I2O is not set
++
++#
++# 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_STNIC is not set
++# CONFIG_HAPPYMEAL is not set
++# CONFIG_SUNGEM is not set
++# CONFIG_CASSINI is not set
++# CONFIG_NET_VENDOR_3COM is not set
++# CONFIG_SMC91X is not set
++
++#
++# Tulip family network device support
++#
++# CONFIG_NET_TULIP is not set
++# CONFIG_HP100 is not set
++# CONFIG_NE2000 is not set
++CONFIG_NET_PCI=y
++# CONFIG_PCNET32 is not set
++# CONFIG_AMD8111_ETH is not set
++# CONFIG_ADAPTEC_STARFIRE is not set
++# CONFIG_B44 is not set
++# CONFIG_FORCEDETH is not set
++# CONFIG_DGRS is not set
++# CONFIG_EEPRO100 is not set
++# CONFIG_E100 is not set
++# CONFIG_FEALNX is not set
++# CONFIG_NATSEMI is not set
++# CONFIG_NE2K_PCI is not set
++# CONFIG_8139CP is not set
++CONFIG_8139TOO=y
++# CONFIG_8139TOO_PIO is not set
++# CONFIG_8139TOO_TUNE_TWISTER is not set
++# CONFIG_8139TOO_8129 is not set
++# CONFIG_8139_OLD_RX_RESET is not set
++# CONFIG_SIS900 is not set
++# CONFIG_EPIC100 is not set
++# CONFIG_SUNDANCE is not set
++# CONFIG_TLAN is not set
++# CONFIG_VIA_RHINE is not set
++
++#
++# Ethernet (1000 Mbit)
++#
++# CONFIG_ACENIC is not set
++# CONFIG_DL2K is not set
++# CONFIG_E1000 is not set
++# CONFIG_NS83820 is not set
++# CONFIG_HAMACHI is not set
++# CONFIG_YELLOWFIN is not set
++# CONFIG_R8169 is not set
++# CONFIG_SIS190 is not set
++# CONFIG_SKGE is not set
++# CONFIG_SK98LIN is not set
++# CONFIG_VIA_VELOCITY is not set
++# CONFIG_TIGON3 is not set
++# CONFIG_BNX2 is not set
++
++#
++# Ethernet (10000 Mbit)
++#
++# CONFIG_CHELSIO_T1 is not set
++# CONFIG_IXGB is not set
++# CONFIG_S2IO is not set
++
++#
++# 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_FDDI is not set
++# CONFIG_HIPPI 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
++
++#
++# Telephony Support
++#
++# CONFIG_PHONE is not set
++
++#
++# Input device support
++#
++CONFIG_INPUT=y
++
++#
++# Userland interfaces
++#
++# CONFIG_INPUT_MOUSEDEV is not set
++# 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 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_I8042=y
++CONFIG_SERIO_SERPORT=y
++# CONFIG_SERIO_PCIPS2 is not set
++# CONFIG_SERIO_LIBPS2 is not set
++# CONFIG_SERIO_RAW is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++# CONFIG_VT is not set
++# CONFIG_SERIAL_NONSTANDARD is not set
++
++#
++# Serial drivers
++#
++# CONFIG_SERIAL_8250 is not set
++
++#
++# Non-8250 serial port support
++#
++CONFIG_SERIAL_SH_SCI=y
++CONFIG_SERIAL_SH_SCI_CONSOLE=y
++CONFIG_SERIAL_CORE=y
++CONFIG_SERIAL_CORE_CONSOLE=y
++# CONFIG_SERIAL_JSM is not set
++CONFIG_UNIX98_PTYS=y
++# CONFIG_LEGACY_PTYS is not set
++
++#
++# IPMI
++#
++# CONFIG_IPMI_HANDLER is not set
++
++#
++# Watchdog Cards
++#
++# CONFIG_WATCHDOG is not set
++# CONFIG_RTC is not set
++# CONFIG_GEN_RTC is not set
++# CONFIG_DTLK is not set
++# CONFIG_R3964 is not set
++# CONFIG_APPLICOM is not set
++
++#
++# Ftape, the floppy tape device driver
++#
++# CONFIG_DRM is not set
++# CONFIG_RAW_DRIVER is not set
++
++#
++# TPM devices
++#
++# CONFIG_TCG_TPM is not set
++# CONFIG_TELCLOCK is not set
++
++#
++# I2C support
++#
++# CONFIG_I2C is not set
++
++#
++# Dallas's 1-wire bus
++#
++# CONFIG_W1 is not set
++
++#
++# Hardware Monitoring support
++#
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++# CONFIG_HWMON_DEBUG_CHIP is not set
++
++#
++# Misc devices
++#
++
++#
++# Multimedia Capabilities Port drivers
++#
++
++#
++# Multimedia devices
++#
++# CONFIG_VIDEO_DEV is not set
++
++#
++# Digital Video Broadcasting Devices
++#
++# CONFIG_DVB is not set
++
++#
++# Graphics support
++#
++# CONFIG_FB 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 is not set
++
++#
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
++#
++
++#
++# USB Gadget Support
++#
++# CONFIG_USB_GADGET is not set
++
++#
++# MMC/SD Card support
++#
++# CONFIG_MMC is not set
++
++#
++# InfiniBand support
++#
++# CONFIG_INFINIBAND is not set
++
++#
++# SN Devices
++#
++
++#
++# File systems
++#
++CONFIG_EXT2_FS=y
++# CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
++# CONFIG_EXT3_FS is not set
++# CONFIG_JBD is not set
++# 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_MINIX_FS is not set
++# CONFIG_ROMFS_FS is not set
++CONFIG_INOTIFY=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_MSDOS_FS is not set
++# CONFIG_VFAT_FS is not set
++# CONFIG_NTFS_FS is not set
++
++#
++# Pseudo filesystems
++#
++CONFIG_PROC_FS=y
++CONFIG_PROC_KCORE=y
++CONFIG_SYSFS=y
++CONFIG_TMPFS=y
++# CONFIG_HUGETLBFS is not set
++# CONFIG_HUGETLB_PAGE is not set
++CONFIG_RAMFS=y
++# CONFIG_RELAYFS_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_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=y
++# CONFIG_NFS_V3_ACL is not set
++CONFIG_NFS_V4=y
++CONFIG_NFS_DIRECTIO=y
++# CONFIG_NFSD is not set
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++CONFIG_SUNRPC_GSS=y
++CONFIG_RPCSEC_GSS_KRB5=y
++# 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 is not set
++# CONFIG_MINIX_SUBPARTITION is not set
++# CONFIG_SOLARIS_X86_PARTITION is not set
++# 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_EFI_PARTITION is not set
++
++#
++# Native Language Support
++#
++# CONFIG_NLS is not set
++
++#
++# Profiling support
++#
++# CONFIG_PROFILING is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++# CONFIG_DEBUG_KERNEL is not set
++CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_FRAME_POINTER is not set
++# CONFIG_SH_STANDARD_BIOS is not set
++# CONFIG_EARLY_SCIF_CONSOLE is not set
++# CONFIG_KGDB is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++
++#
++# Cryptographic options
++#
++CONFIG_CRYPTO=y
++# CONFIG_CRYPTO_HMAC is not set
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_MD4 is not set
++CONFIG_CRYPTO_MD5=y
++# CONFIG_CRYPTO_SHA1 is not set
++# 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_DES=y
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_DEFLATE is not set
++# 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_CRC16 is not set
++CONFIG_CRC32=y
++# CONFIG_LIBCRC32C is not set
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/landisk_defconfig linux-2.6.17/arch/sh/configs/landisk_defconfig
+--- linux-2.6.17-vanilla/arch/sh/configs/landisk_defconfig 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/landisk_defconfig 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,1372 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.14-sh
++# Sun Dec 18 01:38:13 2005
++#
++CONFIG_SUPERH=y
++CONFIG_UID16=y
++CONFIG_RWSEM_GENERIC_SPINLOCK=y
++CONFIG_GENERIC_HARDIRQS=y
++CONFIG_GENERIC_IRQ_PROBE=y
++CONFIG_GENERIC_CALIBRATE_DELAY=y
++
++#
++# Code maturity level options
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_CLEAN_COMPILE=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_POSIX_MQUEUE is not set
++# CONFIG_BSD_PROCESS_ACCT is not set
++CONFIG_SYSCTL=y
++# CONFIG_AUDIT is not set
++CONFIG_HOTPLUG=y
++CONFIG_KOBJECT_UEVENT=y
++# CONFIG_IKCONFIG is not set
++CONFIG_INITRAMFS_SOURCE=""
++# CONFIG_EMBEDDED is not set
++CONFIG_KALLSYMS=y
++CONFIG_KALLSYMS_EXTRA_PASS=y
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_BASE_FULL=y
++CONFIG_FUTEX=y
++CONFIG_EPOLL=y
++CONFIG_SHMEM=y
++CONFIG_CC_ALIGN_FUNCTIONS=0
++CONFIG_CC_ALIGN_LABELS=0
++CONFIG_CC_ALIGN_LOOPS=0
++CONFIG_CC_ALIGN_JUMPS=0
++# CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
++
++#
++# Loadable module support
++#
++CONFIG_MODULES=y
++CONFIG_MODULE_UNLOAD=y
++CONFIG_MODULE_FORCE_UNLOAD=y
++CONFIG_OBSOLETE_MODPARM=y
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_KMOD=y
++
++#
++# System type
++#
++# CONFIG_SH_SOLUTION_ENGINE is not set
++# CONFIG_SH_7751_SOLUTION_ENGINE is not set
++# CONFIG_SH_7300_SOLUTION_ENGINE is not set
++# CONFIG_SH_73180_SOLUTION_ENGINE is not set
++# CONFIG_SH_7751_SYSTEMH is not set
++# CONFIG_SH_STB1_HARP is not set
++# CONFIG_SH_STB1_OVERDRIVE is not set
++# CONFIG_SH_HP6XX is not set
++# CONFIG_SH_CQREEK is not set
++# CONFIG_SH_DMIDA is not set
++# CONFIG_SH_EC3104 is not set
++# CONFIG_SH_SATURN is not set
++# CONFIG_SH_DREAMCAST is not set
++# CONFIG_SH_CAT68701 is not set
++# CONFIG_SH_BIGSUR is not set
++# CONFIG_SH_SH2000 is not set
++# CONFIG_SH_ADX is not set
++# CONFIG_SH_MPC1211 is not set
++# CONFIG_SH_SH03 is not set
++# CONFIG_SH_SECUREEDGE5410 is not set
++# CONFIG_SH_HS7751RVOIP is not set
++# CONFIG_SH_RTS7751R2D is not set
++# CONFIG_SH_EDOSK7705 is not set
++# CONFIG_SH_SH4202_MICRODEV is not set
++CONFIG_SH_LANDISK=y
++# CONFIG_SH_TITAN is not set
++# CONFIG_SH_UNKNOWN is not set
++
++#
++# Processor selection
++#
++CONFIG_CPU_SH4=y
++
++#
++# SH-2 Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH7604 is not set
++
++#
++# SH-3 Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH7300 is not set
++# CONFIG_CPU_SUBTYPE_SH7705 is not set
++# CONFIG_CPU_SUBTYPE_SH7707 is not set
++# CONFIG_CPU_SUBTYPE_SH7708 is not set
++# CONFIG_CPU_SUBTYPE_SH7709 is not set
++
++#
++# SH-4 Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH7750 is not set
++# CONFIG_CPU_SUBTYPE_SH7091 is not set
++# CONFIG_CPU_SUBTYPE_SH7750R is not set
++# CONFIG_CPU_SUBTYPE_SH7750S is not set
++CONFIG_CPU_SUBTYPE_SH7751=y
++CONFIG_CPU_SUBTYPE_SH7751R=y
++# CONFIG_CPU_SUBTYPE_SH7760 is not set
++# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# ST40 Processor Support
++#
++# CONFIG_CPU_SUBTYPE_ST40STB1 is not set
++# CONFIG_CPU_SUBTYPE_ST40GX1 is not set
++
++#
++# SH-4A Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH7770 is not set
++# CONFIG_CPU_SUBTYPE_SH7780 is not set
++
++#
++# Memory management options
++#
++CONFIG_MMU=y
++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
++
++#
++# Cache configuration
++#
++# CONFIG_SH_DIRECT_MAPPED is not set
++# CONFIG_SH_WRITETHROUGH is not set
++# CONFIG_SH_OCRAM is not set
++CONFIG_MEMORY_START=0x0c000000
++CONFIG_MEMORY_SIZE=0x04000000
++
++#
++# Processor features
++#
++CONFIG_CPU_LITTLE_ENDIAN=y
++CONFIG_SH_FPU=y
++# CONFIG_SH_STORE_QUEUES is not set
++
++#
++# Timer support
++#
++CONFIG_SH_TMU=y
++CONFIG_SH_PCLK_FREQ_BOOL=y
++CONFIG_SH_PCLK_FREQ=33333333
++
++#
++# CPU Frequency scaling
++#
++# CONFIG_CPU_FREQ is not set
++
++#
++# DMA support
++#
++CONFIG_SH_DMA=y
++CONFIG_NR_ONCHIP_DMA_CHANNELS=4
++# CONFIG_NR_DMA_CHANNELS_BOOL is not set
++
++#
++# Companion Chips
++#
++# CONFIG_HD6446X_SERIES is not set
++CONFIG_HEARTBEAT=y
++
++#
++# Kernel features
++#
++CONFIG_KEXEC=y
++# CONFIG_PREEMPT is not set
++# CONFIG_SMP is not set
++
++#
++# Boot options
++#
++CONFIG_ZERO_PAGE_OFFSET=0x00001000
++CONFIG_BOOT_LINK_OFFSET=0x00800000
++# CONFIG_UBC_WAKEUP is not set
++# CONFIG_CMDLINE_BOOL is not set
++
++#
++# Bus options
++#
++CONFIG_ISA=y
++CONFIG_PCI=y
++CONFIG_SH_PCIDMA_NONCOHERENT=y
++CONFIG_PCI_AUTO=y
++CONFIG_PCI_AUTO_UPDATE_RESOURCES=y
++CONFIG_PCI_LEGACY_PROC=y
++
++#
++# PCCARD (PCMCIA/CardBus) support
++#
++CONFIG_PCCARD=y
++# CONFIG_PCMCIA_DEBUG is not set
++CONFIG_PCMCIA=y
++CONFIG_PCMCIA_LOAD_CIS=y
++CONFIG_PCMCIA_IOCTL=y
++CONFIG_CARDBUS=y
++
++#
++# PC-card bridges
++#
++CONFIG_YENTA=y
++# CONFIG_PD6729 is not set
++# CONFIG_I82092 is not set
++# CONFIG_I82365 is not set
++# CONFIG_TCIC is not set
++CONFIG_PCMCIA_PROBE=y
++CONFIG_PCCARD_NONSTATIC=y
++
++#
++# PCI Hotplug Support
++#
++# CONFIG_HOTPLUG_PCI is not set
++
++#
++# Executable file formats
++#
++CONFIG_BINFMT_ELF=y
++# CONFIG_BINFMT_FLAT is not set
++# CONFIG_BINFMT_MISC is not set
++
++#
++# Networking
++#
++CONFIG_NET=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++# CONFIG_PACKET_MMAP is not set
++CONFIG_UNIX=y
++# CONFIG_NET_KEY is not set
++CONFIG_INET=y
++# CONFIG_IP_MULTICAST is not set
++CONFIG_IP_ADVANCED_ROUTER=y
++CONFIG_ASK_IP_FIB_HASH=y
++# CONFIG_IP_FIB_TRIE is not set
++CONFIG_IP_FIB_HASH=y
++# CONFIG_IP_MULTIPLE_TABLES is not set
++# CONFIG_IP_ROUTE_MULTIPATH is not set
++# CONFIG_IP_ROUTE_VERBOSE is not set
++CONFIG_IP_PNP=y
++# CONFIG_IP_PNP_DHCP is not set
++# CONFIG_IP_PNP_BOOTP is not set
++# 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_TUNNEL is not set
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_BIC=y
++
++#
++# IP: Virtual Server Configuration
++#
++# CONFIG_IP_VS is not set
++# CONFIG_IPV6 is not set
++CONFIG_NETFILTER=y
++# CONFIG_NETFILTER_DEBUG is not set
++# CONFIG_NETFILTER_NETLINK is not set
++
++#
++# IP: Netfilter Configuration
++#
++CONFIG_IP_NF_CONNTRACK=m
++CONFIG_IP_NF_CT_ACCT=y
++CONFIG_IP_NF_CONNTRACK_MARK=y
++# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
++# CONFIG_IP_NF_CT_PROTO_SCTP is not set
++CONFIG_IP_NF_FTP=m
++CONFIG_IP_NF_IRC=m
++# CONFIG_IP_NF_NETBIOS_NS is not set
++CONFIG_IP_NF_TFTP=m
++CONFIG_IP_NF_AMANDA=m
++# CONFIG_IP_NF_PPTP is not set
++CONFIG_IP_NF_QUEUE=m
++CONFIG_IP_NF_IPTABLES=m
++CONFIG_IP_NF_MATCH_LIMIT=m
++CONFIG_IP_NF_MATCH_IPRANGE=m
++CONFIG_IP_NF_MATCH_MAC=m
++CONFIG_IP_NF_MATCH_PKTTYPE=m
++CONFIG_IP_NF_MATCH_MARK=m
++CONFIG_IP_NF_MATCH_MULTIPORT=m
++CONFIG_IP_NF_MATCH_TOS=m
++CONFIG_IP_NF_MATCH_RECENT=m
++CONFIG_IP_NF_MATCH_ECN=m
++CONFIG_IP_NF_MATCH_DSCP=m
++CONFIG_IP_NF_MATCH_AH_ESP=m
++CONFIG_IP_NF_MATCH_LENGTH=m
++CONFIG_IP_NF_MATCH_TTL=m
++CONFIG_IP_NF_MATCH_TCPMSS=m
++CONFIG_IP_NF_MATCH_HELPER=m
++CONFIG_IP_NF_MATCH_STATE=m
++CONFIG_IP_NF_MATCH_CONNTRACK=m
++CONFIG_IP_NF_MATCH_OWNER=m
++CONFIG_IP_NF_MATCH_ADDRTYPE=m
++CONFIG_IP_NF_MATCH_REALM=m
++CONFIG_IP_NF_MATCH_SCTP=m
++# CONFIG_IP_NF_MATCH_DCCP is not set
++CONFIG_IP_NF_MATCH_COMMENT=m
++CONFIG_IP_NF_MATCH_CONNMARK=m
++# CONFIG_IP_NF_MATCH_CONNBYTES is not set
++CONFIG_IP_NF_MATCH_HASHLIMIT=m
++# CONFIG_IP_NF_MATCH_STRING is not set
++CONFIG_IP_NF_FILTER=m
++CONFIG_IP_NF_TARGET_REJECT=m
++CONFIG_IP_NF_TARGET_LOG=m
++CONFIG_IP_NF_TARGET_ULOG=m
++CONFIG_IP_NF_TARGET_TCPMSS=m
++# CONFIG_IP_NF_TARGET_NFQUEUE is not set
++CONFIG_IP_NF_NAT=m
++CONFIG_IP_NF_NAT_NEEDED=y
++CONFIG_IP_NF_TARGET_MASQUERADE=m
++CONFIG_IP_NF_TARGET_REDIRECT=m
++CONFIG_IP_NF_TARGET_NETMAP=m
++CONFIG_IP_NF_TARGET_SAME=m
++# CONFIG_IP_NF_NAT_SNMP_BASIC is not set
++CONFIG_IP_NF_NAT_IRC=m
++CONFIG_IP_NF_NAT_FTP=m
++CONFIG_IP_NF_NAT_TFTP=m
++CONFIG_IP_NF_NAT_AMANDA=m
++CONFIG_IP_NF_MANGLE=m
++CONFIG_IP_NF_TARGET_TOS=m
++CONFIG_IP_NF_TARGET_ECN=m
++CONFIG_IP_NF_TARGET_DSCP=m
++CONFIG_IP_NF_TARGET_MARK=m
++CONFIG_IP_NF_TARGET_CLASSIFY=m
++# CONFIG_IP_NF_TARGET_TTL is not set
++CONFIG_IP_NF_TARGET_CONNMARK=m
++# CONFIG_IP_NF_TARGET_CLUSTERIP is not set
++CONFIG_IP_NF_RAW=m
++CONFIG_IP_NF_TARGET_NOTRACK=m
++CONFIG_IP_NF_ARPTABLES=m
++CONFIG_IP_NF_ARPFILTER=m
++CONFIG_IP_NF_ARP_MANGLE=m
++
++#
++# DCCP Configuration (EXPERIMENTAL)
++#
++# CONFIG_IP_DCCP is not set
++
++#
++# SCTP Configuration (EXPERIMENTAL)
++#
++# CONFIG_IP_SCTP 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_LLC=m
++# CONFIG_LLC2 is not set
++# CONFIG_IPX is not set
++CONFIG_ATALK=m
++# CONFIG_DEV_APPLETALK is not set
++# CONFIG_X25 is not set
++# CONFIG_LAPB is not set
++# CONFIG_NET_DIVERT is not set
++# CONFIG_ECONET is not set
++# CONFIG_WAN_ROUTER is not set
++# CONFIG_NET_SCHED is not set
++CONFIG_NET_CLS_ROUTE=y
++
++#
++# 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=y
++
++#
++# Connector - unified userspace <-> kernelspace linker
++#
++# CONFIG_CONNECTOR is not set
++
++#
++# Memory Technology Devices (MTD)
++#
++# CONFIG_MTD is not set
++
++#
++# Parallel port support
++#
++# CONFIG_PARPORT is not set
++
++#
++# Plug and Play support
++#
++# CONFIG_PNP is not set
++
++#
++# Block devices
++#
++# CONFIG_BLK_CPQ_DA is not set
++# CONFIG_BLK_CPQ_CISS_DA is not set
++# CONFIG_BLK_DEV_DAC960 is not set
++# CONFIG_BLK_DEV_UMEM 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 is not set
++# CONFIG_BLK_DEV_SX8 is not set
++# 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_INITRD is not set
++# CONFIG_LBD is not set
++# CONFIG_CDROM_PKTCDVD is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_AS=y
++CONFIG_IOSCHED_DEADLINE=y
++CONFIG_IOSCHED_CFQ=y
++# CONFIG_ATA_OVER_ETH is not set
++
++#
++# ATA/ATAPI/MFM/RLL support
++#
++CONFIG_IDE=y
++CONFIG_IDE_MAX_HWIFS=4
++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_IDECS is not set
++CONFIG_BLK_DEV_IDECD=y
++# CONFIG_BLK_DEV_IDETAPE is not set
++# CONFIG_BLK_DEV_IDEFLOPPY is not set
++CONFIG_BLK_DEV_IDESCSI=y
++# CONFIG_IDE_TASK_IOCTL is not set
++
++#
++# IDE chipset support/bugfixes
++#
++CONFIG_IDE_GENERIC=y
++CONFIG_BLK_DEV_IDEPCI=y
++CONFIG_IDEPCI_SHARE_IRQ=y
++CONFIG_BLK_DEV_OFFBOARD=y
++CONFIG_BLK_DEV_GENERIC=y
++# CONFIG_BLK_DEV_OPTI621 is not set
++CONFIG_BLK_DEV_IDEDMA_PCI=y
++# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
++CONFIG_IDEDMA_PCI_AUTO=y
++CONFIG_IDEDMA_ONLYDISK=y
++CONFIG_BLK_DEV_AEC62XX=y
++# CONFIG_BLK_DEV_ALI15X3 is not set
++# CONFIG_BLK_DEV_AMD74XX is not set
++# CONFIG_BLK_DEV_CMD64X is not set
++# CONFIG_BLK_DEV_TRIFLEX is not set
++# CONFIG_BLK_DEV_CY82C693 is not set
++# CONFIG_BLK_DEV_CS5520 is not set
++# CONFIG_BLK_DEV_CS5530 is not set
++# CONFIG_BLK_DEV_HPT34X is not set
++# CONFIG_BLK_DEV_HPT366 is not set
++# CONFIG_BLK_DEV_SC1200 is not set
++# CONFIG_BLK_DEV_PIIX is not set
++# CONFIG_BLK_DEV_IT821X is not set
++# CONFIG_BLK_DEV_NS87415 is not set
++# CONFIG_BLK_DEV_PDC202XX_OLD is not set
++# CONFIG_BLK_DEV_PDC202XX_NEW is not set
++# CONFIG_BLK_DEV_SVWKS is not set
++# CONFIG_BLK_DEV_SIIMAGE is not set
++# CONFIG_BLK_DEV_SLC90E66 is not set
++# CONFIG_BLK_DEV_TRM290 is not set
++# CONFIG_BLK_DEV_VIA82CXXX is not set
++CONFIG_IDE_SH=y
++# CONFIG_IDE_ARM is not set
++# CONFIG_IDE_CHIPSETS is not set
++CONFIG_BLK_DEV_IDEDMA=y
++# CONFIG_IDEDMA_IVB is not set
++CONFIG_IDEDMA_AUTO=y
++# CONFIG_BLK_DEV_HD is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++CONFIG_SCSI=y
++CONFIG_SCSI_PROC_FS=y
++
++#
++# SCSI support type (disk, tape, CD-ROM)
++#
++CONFIG_BLK_DEV_SD=y
++# CONFIG_CHR_DEV_ST is not set
++# CONFIG_CHR_DEV_OSST is not set
++# CONFIG_BLK_DEV_SR is not set
++# CONFIG_CHR_DEV_SG is not set
++# CONFIG_CHR_DEV_SCH is not set
++
++#
++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
++#
++CONFIG_SCSI_MULTI_LUN=y
++# CONFIG_SCSI_CONSTANTS is not set
++# CONFIG_SCSI_LOGGING is not set
++
++#
++# SCSI Transport Attributes
++#
++# 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
++
++#
++# SCSI low-level drivers
++#
++# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
++# CONFIG_SCSI_3W_9XXX is not set
++# CONFIG_SCSI_ACARD is not set
++# CONFIG_SCSI_AHA152X is not set
++# CONFIG_SCSI_AACRAID is not set
++# CONFIG_SCSI_AIC7XXX is not set
++# CONFIG_SCSI_AIC7XXX_OLD is not set
++# CONFIG_SCSI_AIC79XX is not set
++# CONFIG_SCSI_DPT_I2O is not set
++# CONFIG_SCSI_IN2000 is not set
++# CONFIG_MEGARAID_NEWGEN is not set
++# CONFIG_MEGARAID_LEGACY is not set
++# CONFIG_MEGARAID_SAS is not set
++# CONFIG_SCSI_SATA is not set
++# CONFIG_SCSI_DMX3191D 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_IPS is not set
++# CONFIG_SCSI_INITIO is not set
++# CONFIG_SCSI_INIA100 is not set
++# CONFIG_SCSI_NCR53C406A is not set
++# CONFIG_SCSI_SYM53C8XX_2 is not set
++# CONFIG_SCSI_IPR is not set
++# CONFIG_SCSI_PAS16 is not set
++# CONFIG_SCSI_PSI240I is not set
++# CONFIG_SCSI_QLOGIC_FAS is not set
++# CONFIG_SCSI_QLOGIC_FC is not set
++# CONFIG_SCSI_QLOGIC_1280 is not set
++CONFIG_SCSI_QLA2XXX=y
++# CONFIG_SCSI_QLA21XX is not set
++# CONFIG_SCSI_QLA22XX is not set
++# CONFIG_SCSI_QLA2300 is not set
++# CONFIG_SCSI_QLA2322 is not set
++# CONFIG_SCSI_QLA6312 is not set
++# CONFIG_SCSI_QLA24XX is not set
++# CONFIG_SCSI_LPFC is not set
++# CONFIG_SCSI_SYM53C416 is not set
++# CONFIG_SCSI_DC395x is not set
++# CONFIG_SCSI_DC390T is not set
++# CONFIG_SCSI_T128 is not set
++# CONFIG_SCSI_NSP32 is not set
++# CONFIG_SCSI_DEBUG is not set
++
++#
++# PCMCIA SCSI adapter support
++#
++# CONFIG_PCMCIA_AHA152X is not set
++# CONFIG_PCMCIA_FDOMAIN is not set
++# CONFIG_PCMCIA_NINJA_SCSI is not set
++# CONFIG_PCMCIA_QLOGIC is not set
++# CONFIG_PCMCIA_SYM53C500 is not set
++
++#
++# Old CD-ROM drivers (not SCSI, not IDE)
++#
++# CONFIG_CD_NO_IDESCSI is not set
++
++#
++# Multi-device support (RAID and LVM)
++#
++CONFIG_MD=y
++CONFIG_BLK_DEV_MD=m
++CONFIG_MD_LINEAR=m
++CONFIG_MD_RAID0=m
++CONFIG_MD_RAID1=m
++# CONFIG_MD_RAID10 is not set
++# CONFIG_MD_RAID5 is not set
++# CONFIG_MD_RAID6 is not set
++# CONFIG_MD_MULTIPATH is not set
++# CONFIG_MD_FAULTY is not set
++# CONFIG_BLK_DEV_DM is not set
++
++#
++# Fusion MPT device support
++#
++# CONFIG_FUSION is not set
++# CONFIG_FUSION_SPI is not set
++# CONFIG_FUSION_FC is not set
++# CONFIG_FUSION_SAS is not set
++
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_IEEE1394 is not set
++
++#
++# I2O device support
++#
++# CONFIG_I2O is not set
++
++#
++# Network device support
++#
++CONFIG_NETDEVICES=y
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_EQUALIZER is not set
++CONFIG_TUN=m
++
++#
++# 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_STNIC is not set
++# CONFIG_HAPPYMEAL is not set
++# CONFIG_SUNGEM is not set
++# CONFIG_CASSINI is not set
++# CONFIG_NET_VENDOR_3COM is not set
++# CONFIG_NET_VENDOR_SMC is not set
++# CONFIG_SMC91X is not set
++# CONFIG_NET_VENDOR_RACAL is not set
++
++#
++# Tulip family network device support
++#
++# CONFIG_NET_TULIP 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_NE2000 is not set
++CONFIG_NET_PCI=y
++# CONFIG_PCNET32 is not set
++# CONFIG_AMD8111_ETH is not set
++# CONFIG_ADAPTEC_STARFIRE is not set
++# CONFIG_AC3200 is not set
++# CONFIG_APRICOT is not set
++# CONFIG_B44 is not set
++# CONFIG_FORCEDETH is not set
++# CONFIG_CS89x0 is not set
++# CONFIG_DGRS is not set
++# CONFIG_EEPRO100 is not set
++# CONFIG_E100 is not set
++# CONFIG_FEALNX is not set
++# CONFIG_NATSEMI is not set
++# CONFIG_NE2K_PCI is not set
++CONFIG_8139CP=y
++# CONFIG_8139TOO is not set
++# CONFIG_SIS900 is not set
++# CONFIG_EPIC100 is not set
++# CONFIG_SUNDANCE is not set
++# CONFIG_TLAN is not set
++# CONFIG_VIA_RHINE is not set
++
++#
++# Ethernet (1000 Mbit)
++#
++# CONFIG_ACENIC is not set
++# CONFIG_DL2K is not set
++# CONFIG_E1000 is not set
++# CONFIG_NS83820 is not set
++# CONFIG_HAMACHI is not set
++# CONFIG_YELLOWFIN is not set
++# CONFIG_R8169 is not set
++# CONFIG_SIS190 is not set
++# CONFIG_SKGE is not set
++# CONFIG_SK98LIN is not set
++# CONFIG_VIA_VELOCITY is not set
++# CONFIG_TIGON3 is not set
++# CONFIG_BNX2 is not set
++
++#
++# Ethernet (10000 Mbit)
++#
++# CONFIG_CHELSIO_T1 is not set
++# CONFIG_IXGB is not set
++# CONFIG_S2IO is not set
++
++#
++# Token Ring devices
++#
++# CONFIG_TR is not set
++
++#
++# Wireless LAN (non-hamradio)
++#
++# CONFIG_NET_RADIO is not set
++
++#
++# PCMCIA network device support
++#
++# CONFIG_NET_PCMCIA is not set
++
++#
++# Wan interfaces
++#
++# CONFIG_WAN is not set
++# CONFIG_FDDI is not set
++# CONFIG_HIPPI is not set
++# CONFIG_PPP is not set
++# CONFIG_SLIP is not set
++# CONFIG_NET_FC 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
++
++#
++# Telephony Support
++#
++# CONFIG_PHONE is not set
++
++#
++# Input device support
++#
++CONFIG_INPUT=y
++
++#
++# 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 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 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 is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++CONFIG_VT=y
++CONFIG_VT_CONSOLE=y
++CONFIG_HW_CONSOLE=y
++# CONFIG_SERIAL_NONSTANDARD is not set
++
++#
++# Serial drivers
++#
++# CONFIG_SERIAL_8250 is not set
++
++#
++# Non-8250 serial port support
++#
++CONFIG_SERIAL_SH_SCI=y
++CONFIG_SERIAL_SH_SCI_CONSOLE=y
++CONFIG_SERIAL_CORE=y
++CONFIG_SERIAL_CORE_CONSOLE=y
++# CONFIG_SERIAL_JSM is not set
++CONFIG_UNIX98_PTYS=y
++CONFIG_LEGACY_PTYS=y
++CONFIG_LEGACY_PTY_COUNT=256
++
++#
++# IPMI
++#
++# CONFIG_IPMI_HANDLER is not set
++
++#
++# Watchdog Cards
++#
++# CONFIG_WATCHDOG is not set
++# CONFIG_RTC is not set
++CONFIG_RS5C313_RTC=y
++# CONFIG_GEN_RTC is not set
++# CONFIG_DTLK is not set
++# CONFIG_R3964 is not set
++# CONFIG_APPLICOM is not set
++
++#
++# Ftape, the floppy tape device driver
++#
++# CONFIG_DRM is not set
++
++#
++# PCMCIA character devices
++#
++# CONFIG_SYNCLINK_CS is not set
++# CONFIG_RAW_DRIVER is not set
++
++#
++# TPM devices
++#
++# CONFIG_TCG_TPM is not set
++
++#
++# I2C support
++#
++# CONFIG_I2C is not set
++
++#
++# Dallas's 1-wire bus
++#
++# CONFIG_W1 is not set
++
++#
++# Hardware Monitoring support
++#
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++# CONFIG_HWMON_DEBUG_CHIP is not set
++
++#
++# Misc devices
++#
++
++#
++# Multimedia Capabilities Port drivers
++#
++
++#
++# Multimedia devices
++#
++CONFIG_VIDEO_DEV=m
++
++#
++# Video For Linux
++#
++
++#
++# Video Adapters
++#
++# CONFIG_VIDEO_PMS is not set
++# CONFIG_VIDEO_CPIA is not set
++# CONFIG_VIDEO_STRADIS is not set
++# CONFIG_VIDEO_MXB is not set
++# CONFIG_VIDEO_DPC is not set
++# CONFIG_VIDEO_HEXIUM_ORION is not set
++# CONFIG_VIDEO_HEXIUM_GEMINI 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_GEMTEK_PCI is not set
++# CONFIG_RADIO_MAXIRADIO is not set
++# CONFIG_RADIO_MAESTRO 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
++
++#
++# Digital Video Broadcasting Devices
++#
++# CONFIG_DVB is not set
++
++#
++# Graphics support
++#
++# CONFIG_FB is not set
++
++#
++# Console display driver support
++#
++# CONFIG_MDA_CONSOLE is not set
++CONFIG_DUMMY_CONSOLE=y
++CONFIG_FONT_8x16=y
++
++#
++# Sound
++#
++CONFIG_SOUND=m
++
++#
++# Advanced Linux Sound Architecture
++#
++# CONFIG_SND is not set
++
++#
++# Open Sound System
++#
++CONFIG_SOUND_PRIME=m
++# CONFIG_SOUND_BT878 is not set
++# CONFIG_SOUND_CMPCI is not set
++# CONFIG_SOUND_EMU10K1 is not set
++# CONFIG_SOUND_FUSION is not set
++# CONFIG_SOUND_CS4281 is not set
++# CONFIG_SOUND_ES1370 is not set
++# CONFIG_SOUND_ES1371 is not set
++# CONFIG_SOUND_ESSSOLO1 is not set
++# CONFIG_SOUND_MAESTRO is not set
++# CONFIG_SOUND_MAESTRO3 is not set
++# CONFIG_SOUND_ICH is not set
++# CONFIG_SOUND_SONICVIBES is not set
++# CONFIG_SOUND_TRIDENT is not set
++# CONFIG_SOUND_MSNDCLAS is not set
++# CONFIG_SOUND_MSNDPIN is not set
++# CONFIG_SOUND_VIA82CXXX is not set
++# CONFIG_SOUND_ALI5455 is not set
++# CONFIG_SOUND_FORTE is not set
++# CONFIG_SOUND_RME96XX is not set
++# CONFIG_SOUND_AD1980 is not set
++
++#
++# USB support
++#
++CONFIG_USB_ARCH_HAS_HCD=y
++CONFIG_USB_ARCH_HAS_OHCI=y
++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_OTG is not set
++
++#
++# USB Host Controller Drivers
++#
++CONFIG_USB_EHCI_HCD=y
++# CONFIG_USB_EHCI_SPLIT_ISO is not set
++# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
++# 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_UHCI_HCD is not set
++# CONFIG_USB_SL811_HCD is not set
++
++#
++# USB Device Class drivers
++#
++CONFIG_OBSOLETE_OSS_USB_DRIVER=y
++CONFIG_USB_AUDIO=m
++# CONFIG_USB_BLUETOOTH_TTY is not set
++CONFIG_USB_MIDI=m
++# CONFIG_USB_ACM is not set
++CONFIG_USB_PRINTER=m
++
++#
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
++#
++CONFIG_USB_STORAGE=m
++# CONFIG_USB_STORAGE_DEBUG is not set
++CONFIG_USB_STORAGE_DATAFAB=y
++CONFIG_USB_STORAGE_FREECOM=y
++CONFIG_USB_STORAGE_ISD200=y
++CONFIG_USB_STORAGE_DPCM=y
++# CONFIG_USB_STORAGE_USBAT is not set
++CONFIG_USB_STORAGE_SDDR09=y
++CONFIG_USB_STORAGE_SDDR55=y
++CONFIG_USB_STORAGE_JUMPSHOT=y
++
++#
++# USB Input Devices
++#
++CONFIG_USB_HID=m
++CONFIG_USB_HIDINPUT=y
++# CONFIG_HID_FF is not set
++# CONFIG_USB_HIDDEV 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_MTOUCH is not set
++# CONFIG_USB_ITMTOUCH is not set
++# CONFIG_USB_EGALAX is not set
++# CONFIG_USB_YEALINK is not set
++# CONFIG_USB_XPAD is not set
++# CONFIG_USB_ATI_REMOTE 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 Multimedia devices
++#
++CONFIG_USB_DABUSB=m
++CONFIG_USB_VICAM=m
++CONFIG_USB_DSBR=m
++CONFIG_USB_IBMCAM=m
++CONFIG_USB_KONICAWC=m
++CONFIG_USB_OV511=m
++CONFIG_USB_SE401=m
++CONFIG_USB_SN9C102=m
++CONFIG_USB_STV680=m
++CONFIG_USB_PWC=m
++
++#
++# USB Network Adapters
++#
++# CONFIG_USB_CATC is not set
++# CONFIG_USB_KAWETH is not set
++CONFIG_USB_PEGASUS=m
++CONFIG_USB_RTL8150=m
++# CONFIG_USB_USBNET is not set
++CONFIG_USB_MON=y
++
++#
++# USB port drivers
++#
++
++#
++# USB Serial Converter support
++#
++CONFIG_USB_SERIAL=m
++# CONFIG_USB_SERIAL_GENERIC is not set
++# CONFIG_USB_SERIAL_AIRPRIME is not set
++# CONFIG_USB_SERIAL_BELKIN is not set
++# CONFIG_USB_SERIAL_WHITEHEAT is not set
++# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
++# CONFIG_USB_SERIAL_CP2101 is not set
++# CONFIG_USB_SERIAL_CYPRESS_M8 is not set
++# CONFIG_USB_SERIAL_EMPEG is not set
++CONFIG_USB_SERIAL_FTDI_SIO=m
++# CONFIG_USB_SERIAL_VISOR is not set
++# CONFIG_USB_SERIAL_IPAQ is not set
++# CONFIG_USB_SERIAL_IR is not set
++# CONFIG_USB_SERIAL_EDGEPORT is not set
++# CONFIG_USB_SERIAL_EDGEPORT_TI is not set
++# CONFIG_USB_SERIAL_GARMIN is not set
++# CONFIG_USB_SERIAL_IPW is not set
++# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
++# CONFIG_USB_SERIAL_KEYSPAN is not set
++# CONFIG_USB_SERIAL_KLSI is not set
++# CONFIG_USB_SERIAL_KOBIL_SCT is not set
++# CONFIG_USB_SERIAL_MCT_U232 is not set
++CONFIG_USB_SERIAL_PL2303=m
++# CONFIG_USB_SERIAL_HP4X is not set
++# CONFIG_USB_SERIAL_SAFE is not set
++# CONFIG_USB_SERIAL_TI is not set
++# CONFIG_USB_SERIAL_CYBERJACK is not set
++# CONFIG_USB_SERIAL_XIRCOM is not set
++# CONFIG_USB_SERIAL_OPTION is not set
++# CONFIG_USB_SERIAL_OMNINET is not set
++
++#
++# USB Miscellaneous drivers
++#
++CONFIG_USB_EMI62=m
++CONFIG_USB_EMI26=m
++# 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_CYTHERM is not set
++# CONFIG_USB_PHIDGETKIT is not set
++# CONFIG_USB_PHIDGETSERVO is not set
++# CONFIG_USB_IDMOUSE is not set
++CONFIG_USB_SISUSBVGA=m
++CONFIG_USB_SISUSBVGA_CON=y
++# CONFIG_USB_LD 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
++
++#
++# InfiniBand support
++#
++# CONFIG_INFINIBAND is not set
++
++#
++# SN Devices
++#
++
++#
++# 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_JBD=y
++# CONFIG_JBD_DEBUG is not set
++CONFIG_FS_MBCACHE=y
++CONFIG_REISERFS_FS=y
++# CONFIG_REISERFS_CHECK is not set
++# CONFIG_REISERFS_PROC_INFO is not set
++# CONFIG_REISERFS_FS_XATTR is not set
++# CONFIG_JFS_FS is not set
++# CONFIG_FS_POSIX_ACL is not set
++# CONFIG_XFS_FS is not set
++# CONFIG_MINIX_FS is not set
++CONFIG_ROMFS_FS=y
++CONFIG_INOTIFY=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=m
++# CONFIG_JOLIET is not set
++# CONFIG_ZISOFS 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=m
++# CONFIG_NTFS_DEBUG is not set
++CONFIG_NTFS_RW=y
++
++#
++# Pseudo filesystems
++#
++CONFIG_PROC_FS=y
++# CONFIG_PROC_KCORE is not set
++CONFIG_SYSFS=y
++CONFIG_TMPFS=y
++# CONFIG_HUGETLBFS is not set
++# CONFIG_HUGETLB_PAGE is not set
++CONFIG_RAMFS=y
++# CONFIG_RELAYFS_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_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=m
++CONFIG_UFS_FS_WRITE=y
++
++#
++# Network File Systems
++#
++CONFIG_NFS_FS=m
++CONFIG_NFS_V3=y
++# CONFIG_NFS_V3_ACL is not set
++# CONFIG_NFS_V4 is not set
++# CONFIG_NFS_DIRECTIO is not set
++CONFIG_NFSD=m
++CONFIG_NFSD_V3=y
++# CONFIG_NFSD_V3_ACL is not set
++# CONFIG_NFSD_V4 is not set
++CONFIG_NFSD_TCP=y
++CONFIG_LOCKD=m
++CONFIG_LOCKD_V4=y
++CONFIG_EXPORTFS=m
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=m
++# CONFIG_RPCSEC_GSS_KRB5 is not set
++# CONFIG_RPCSEC_GSS_SPKM3 is not set
++CONFIG_SMB_FS=m
++# CONFIG_SMB_NLS_DEFAULT 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 is not set
++CONFIG_MSDOS_PARTITION=y
++
++#
++# 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 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=y
++# 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_DEBUG_KERNEL is not set
++CONFIG_LOG_BUF_SHIFT=14
++# CONFIG_FRAME_POINTER is not set
++CONFIG_SH_STANDARD_BIOS=y
++# CONFIG_EARLY_SCIF_CONSOLE is not set
++# CONFIG_EARLY_PRINTK is not set
++# CONFIG_KGDB is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++
++#
++# Cryptographic options
++#
++# CONFIG_CRYPTO is not set
++
++#
++# Hardware crypto devices
++#
++
++#
++# Library routines
++#
++# CONFIG_CRC_CCITT is not set
++# CONFIG_CRC16 is not set
++CONFIG_CRC32=y
++# CONFIG_LIBCRC32C is not set
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/microdev_defconfig linux-2.6.17/arch/sh/configs/microdev_defconfig
+--- linux-2.6.17-vanilla/arch/sh/configs/microdev_defconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/microdev_defconfig 2006-07-12 16:54:21.000000000 +0000
+@@ -1,9 +1,10 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.16-rc1
+-# Fri Jan 27 19:43:20 2006
++# Linux kernel version: 2.6.15-sh
++# Wed Jan 4 18:41:51 2006
+ #
+ CONFIG_SUPERH=y
++CONFIG_UID16=y
+ CONFIG_RWSEM_GENERIC_SPINLOCK=y
+ CONFIG_GENERIC_HARDIRQS=y
+ CONFIG_GENERIC_IRQ_PROBE=y
+@@ -30,17 +31,16 @@
+ # CONFIG_BSD_PROCESS_ACCT_V3 is not set
+ CONFIG_SYSCTL=y
+ # CONFIG_AUDIT is not set
++CONFIG_HOTPLUG=y
++CONFIG_KOBJECT_UEVENT=y
+ # CONFIG_IKCONFIG is not set
+ CONFIG_INITRAMFS_SOURCE=""
+-CONFIG_UID16=y
+ # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_EMBEDDED=y
+ CONFIG_KALLSYMS=y
+ # 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
+@@ -49,10 +49,8 @@
+ CONFIG_CC_ALIGN_LABELS=0
+ CONFIG_CC_ALIGN_LOOPS=0
+ CONFIG_CC_ALIGN_JUMPS=0
+-CONFIG_SLAB=y
+ # CONFIG_TINY_SHMEM is not set
+ CONFIG_BASE_SMALL=0
+-# CONFIG_SLOB is not set
+
+ #
+ # Loadable module support
+@@ -102,7 +100,6 @@
+ # CONFIG_SH_SECUREEDGE5410 is not set
+ # CONFIG_SH_HS7751RVOIP is not set
+ # CONFIG_SH_RTS7751R2D is not set
+-# CONFIG_SH_R7780RP is not set
+ # CONFIG_SH_EDOSK7705 is not set
+ CONFIG_SH_SH4202_MICRODEV=y
+ # CONFIG_SH_LANDISK is not set
+@@ -157,6 +154,8 @@
+ # Memory management options
+ #
+ CONFIG_MMU=y
++CONFIG_HUGETLB_PAGE_SIZE_64K=y
++# CONFIG_HUGETLB_PAGE_SIZE_1MB is not set
+ CONFIG_SELECT_MEMORY_MODEL=y
+ CONFIG_FLATMEM_MANUAL=y
+ # CONFIG_DISCONTIGMEM_MANUAL is not set
+@@ -170,7 +169,7 @@
+ # Cache configuration
+ #
+ # CONFIG_SH_DIRECT_MAPPED is not set
+-# CONFIG_SH_WRITETHROUGH is not set
++CONFIG_SH_WRITETHROUGH=y
+ # CONFIG_SH_OCRAM is not set
+ CONFIG_MEMORY_START=0x08000000
+ CONFIG_MEMORY_SIZE=0x04000000
+@@ -182,13 +181,12 @@
+ CONFIG_SH_RTC=y
+ CONFIG_SH_FPU=y
+ # CONFIG_SH_STORE_QUEUES is not set
+-CONFIG_CPU_HAS_INTEVT=y
+-CONFIG_CPU_HAS_SR_RB=y
+
+ #
+ # Timer support
+ #
+ CONFIG_SH_TMU=y
++CONFIG_SH_PCLK_FREQ_BOOL=y
+ CONFIG_SH_PCLK_FREQ=66000000
+
+ #
+@@ -223,12 +221,12 @@
+ CONFIG_BOOT_LINK_OFFSET=0x00800000
+ # CONFIG_UBC_WAKEUP is not set
+ CONFIG_CMDLINE_BOOL=y
+-CONFIG_CMDLINE="console=ttySC0,115200"
++CONFIG_CMDLINE="console=ttySC0,115200 root=/dev/hda1"
+
+ #
+ # Bus options
+ #
+-# CONFIG_SUPERHYWAY is not set
++CONFIG_SUPERHYWAY=y
+ # CONFIG_PCI is not set
+
+ #
+@@ -263,7 +261,7 @@
+ # CONFIG_IP_ADVANCED_ROUTER is not set
+ CONFIG_IP_FIB_HASH=y
+ CONFIG_IP_PNP=y
+-CONFIG_IP_PNP_DHCP=y
++# CONFIG_IP_PNP_DHCP is not set
+ # CONFIG_IP_PNP_BOOTP is not set
+ # CONFIG_IP_PNP_RARP is not set
+ # CONFIG_NET_IPIP is not set
+@@ -290,11 +288,6 @@
+ # 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
+@@ -387,6 +380,7 @@
+ # IDE chipset support/bugfixes
+ #
+ CONFIG_IDE_GENERIC=y
++CONFIG_IDE_SH=y
+ # CONFIG_IDE_ARM is not set
+ # CONFIG_BLK_DEV_IDEDMA is not set
+ # CONFIG_IDEDMA_AUTO is not set
+@@ -437,6 +431,7 @@
+ CONFIG_MII=y
+ # CONFIG_STNIC is not set
+ CONFIG_SMC91X=y
++# CONFIG_NE2000 is not set
+
+ #
+ # Ethernet (1000 Mbit)
+@@ -539,12 +534,6 @@
+ # CONFIG_I2C is not set
+
+ #
+-# SPI support
+-#
+-# CONFIG_SPI is not set
+-# CONFIG_SPI_MASTER is not set
+-
+-#
+ # Dallas's 1-wire bus
+ #
+ # CONFIG_W1 is not set
+@@ -613,10 +602,6 @@
+ #
+
+ #
+-# EDAC - error detection and reporting (RAS)
+-#
+-
+-#
+ # File systems
+ #
+ CONFIG_EXT2_FS=y
+@@ -633,7 +618,6 @@
+ # CONFIG_JFS_FS is not set
+ # CONFIG_FS_POSIX_ACL is not set
+ # CONFIG_XFS_FS is not set
+-# CONFIG_OCFS2_FS is not set
+ # CONFIG_MINIX_FS is not set
+ # CONFIG_ROMFS_FS is not set
+ CONFIG_INOTIFY=y
+@@ -666,11 +650,10 @@
+ CONFIG_PROC_KCORE=y
+ CONFIG_SYSFS=y
+ CONFIG_TMPFS=y
+-# CONFIG_HUGETLBFS is not set
+-# CONFIG_HUGETLB_PAGE is not set
++CONFIG_HUGETLBFS=y
++CONFIG_HUGETLB_PAGE=y
+ CONFIG_RAMFS=y
+ # CONFIG_RELAYFS_FS is not set
+-# CONFIG_CONFIGFS_FS is not set
+
+ #
+ # Miscellaneous filesystems
+@@ -772,10 +755,9 @@
+ # Kernel hacking
+ #
+ # CONFIG_PRINTK_TIME is not set
+-# CONFIG_MAGIC_SYSRQ is not set
+ # CONFIG_DEBUG_KERNEL is not set
+ CONFIG_LOG_BUF_SHIFT=14
+-# CONFIG_FRAME_POINTER is not set
++CONFIG_FRAME_POINTER=y
+ # CONFIG_SH_STANDARD_BIOS is not set
+ # CONFIG_EARLY_SCIF_CONSOLE is not set
+ # CONFIG_KGDB is not set
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/r7780rp_defconfig linux-2.6.17/arch/sh/configs/r7780rp_defconfig
+--- linux-2.6.17-vanilla/arch/sh/configs/r7780rp_defconfig 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/r7780rp_defconfig 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,1140 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.17
++# Wed Jul 5 17:40:33 2006
++#
++CONFIG_SUPERH=y
++CONFIG_RWSEM_GENERIC_SPINLOCK=y
++CONFIG_GENERIC_FIND_NEXT_BIT=y
++CONFIG_GENERIC_HWEIGHT=y
++CONFIG_GENERIC_HARDIRQS=y
++CONFIG_GENERIC_IRQ_PROBE=y
++CONFIG_GENERIC_CALIBRATE_DELAY=y
++
++#
++# Code maturity level options
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_LOCK_KERNEL=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++
++#
++# General setup
++#
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++CONFIG_SWAP=y
++CONFIG_SYSVIPC=y
++# CONFIG_POSIX_MQUEUE is not set
++CONFIG_BSD_PROCESS_ACCT=y
++# CONFIG_BSD_PROCESS_ACCT_V3 is not set
++CONFIG_SYSCTL=y
++# CONFIG_AUDIT is not set
++CONFIG_IKCONFIG=y
++CONFIG_IKCONFIG_PROC=y
++# CONFIG_RELAY is not set
++CONFIG_INITRAMFS_SOURCE=""
++CONFIG_UID16=y
++CONFIG_CC_OPTIMIZE_FOR_SIZE=y
++CONFIG_EMBEDDED=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 is not set
++# CONFIG_EPOLL is not set
++CONFIG_SHMEM=y
++CONFIG_SLAB=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_LBD is not set
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++# CONFIG_IOSCHED_AS is not set
++# CONFIG_IOSCHED_DEADLINE is not set
++# CONFIG_IOSCHED_CFQ is not set
++# CONFIG_DEFAULT_AS is not set
++# CONFIG_DEFAULT_DEADLINE is not set
++# CONFIG_DEFAULT_CFQ is not set
++CONFIG_DEFAULT_NOOP=y
++CONFIG_DEFAULT_IOSCHED="noop"
++
++#
++# System type
++#
++# CONFIG_SH_SOLUTION_ENGINE is not set
++# CONFIG_SH_7751_SOLUTION_ENGINE is not set
++# CONFIG_SH_7300_SOLUTION_ENGINE is not set
++# CONFIG_SH_73180_SOLUTION_ENGINE is not set
++# CONFIG_SH_7751_SYSTEMH is not set
++# CONFIG_SH_STB1_HARP is not set
++# CONFIG_SH_STB1_OVERDRIVE is not set
++# CONFIG_SH_HP6XX is not set
++# CONFIG_SH_CQREEK is not set
++# CONFIG_SH_DMIDA is not set
++# CONFIG_SH_EC3104 is not set
++# CONFIG_SH_SATURN is not set
++# CONFIG_SH_DREAMCAST is not set
++# CONFIG_SH_CAT68701 is not set
++# CONFIG_SH_BIGSUR is not set
++# CONFIG_SH_SH2000 is not set
++# CONFIG_SH_ADX is not set
++# CONFIG_SH_MPC1211 is not set
++# CONFIG_SH_SH03 is not set
++# CONFIG_SH_SECUREEDGE5410 is not set
++# CONFIG_SH_HS7751RVOIP is not set
++# CONFIG_SH_RTS7751R2D is not set
++CONFIG_SH_R7780RP=y
++# CONFIG_SH_EDOSK7705 is not set
++# CONFIG_SH_SH4202_MICRODEV is not set
++# CONFIG_SH_LANDISK is not set
++# CONFIG_SH_TITAN is not set
++# CONFIG_SH_UNKNOWN is not set
++
++#
++# Processor selection
++#
++CONFIG_CPU_SH4=y
++CONFIG_CPU_SH4A=y
++
++#
++# SH-2 Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH7604 is not set
++
++#
++# SH-3 Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH7300 is not set
++# CONFIG_CPU_SUBTYPE_SH7705 is not set
++# CONFIG_CPU_SUBTYPE_SH7707 is not set
++# CONFIG_CPU_SUBTYPE_SH7708 is not set
++# CONFIG_CPU_SUBTYPE_SH7709 is not set
++
++#
++# SH-4 Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH7750 is not set
++# CONFIG_CPU_SUBTYPE_SH7091 is not set
++# CONFIG_CPU_SUBTYPE_SH7750R is not set
++# CONFIG_CPU_SUBTYPE_SH7750S is not set
++# CONFIG_CPU_SUBTYPE_SH7751 is not set
++# CONFIG_CPU_SUBTYPE_SH7751R is not set
++# CONFIG_CPU_SUBTYPE_SH7760 is not set
++# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# ST40 Processor Support
++#
++# CONFIG_CPU_SUBTYPE_ST40STB1 is not set
++# CONFIG_CPU_SUBTYPE_ST40GX1 is not set
++
++#
++# SH-4A Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH7770 is not set
++CONFIG_CPU_SUBTYPE_SH7780=y
++
++#
++# Memory management options
++#
++CONFIG_MMU=y
++CONFIG_32BIT=y
++CONFIG_HUGETLB_PAGE_SIZE_64K=y
++# CONFIG_HUGETLB_PAGE_SIZE_1MB 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=4
++
++#
++# Cache configuration
++#
++# CONFIG_SH_DIRECT_MAPPED is not set
++# CONFIG_SH_WRITETHROUGH is not set
++# CONFIG_SH_OCRAM is not set
++CONFIG_MEMORY_START=0x08000000
++CONFIG_MEMORY_SIZE=0x08000000
++
++#
++# Processor features
++#
++CONFIG_CPU_LITTLE_ENDIAN=y
++CONFIG_SH_FPU=y
++CONFIG_SH_STORE_QUEUES=y
++CONFIG_CPU_HAS_INTEVT=y
++CONFIG_CPU_HAS_INTC2_IRQ=y
++CONFIG_CPU_HAS_SR_RB=y
++
++#
++# Timer support
++#
++CONFIG_SH_TMU=y
++CONFIG_SH_PCLK_FREQ=32000000
++
++#
++# CPU Frequency scaling
++#
++# CONFIG_CPU_FREQ is not set
++
++#
++# DMA support
++#
++CONFIG_SH_DMA=y
++CONFIG_NR_ONCHIP_DMA_CHANNELS=6
++# CONFIG_NR_DMA_CHANNELS_BOOL is not set
++
++#
++# Companion Chips
++#
++# CONFIG_HD6446X_SERIES is not set
++
++#
++# Kernel features
++#
++# CONFIG_KEXEC is not set
++CONFIG_PREEMPT=y
++# CONFIG_SMP is not set
++
++#
++# Boot options
++#
++CONFIG_ZERO_PAGE_OFFSET=0x00001000
++CONFIG_BOOT_LINK_OFFSET=0x00800000
++# CONFIG_UBC_WAKEUP is not set
++CONFIG_CMDLINE_BOOL=y
++CONFIG_CMDLINE="mem=128M console=ttySC0,115200 root=/dev/hda1"
++
++#
++# Bus options
++#
++CONFIG_PCI=y
++CONFIG_SH_PCIDMA_NONCOHERENT=y
++CONFIG_PCI_AUTO=y
++CONFIG_PCI_AUTO_UPDATE_RESOURCES=y
++# CONFIG_PCI_DEBUG is not set
++
++#
++# PCCARD (PCMCIA/CardBus) support
++#
++# CONFIG_PCCARD is not set
++
++#
++# PCI Hotplug Support
++#
++CONFIG_HOTPLUG_PCI=y
++# CONFIG_HOTPLUG_PCI_FAKE is not set
++# CONFIG_HOTPLUG_PCI_CPCI is not set
++# CONFIG_HOTPLUG_PCI_SHPC is not set
++
++#
++# Executable file formats
++#
++CONFIG_BINFMT_ELF=y
++# CONFIG_BINFMT_FLAT is not set
++# CONFIG_BINFMT_MISC is not set
++
++#
++# Power management options (EXPERIMENTAL)
++#
++# CONFIG_PM is not set
++
++#
++# Networking
++#
++CONFIG_NET=y
++
++#
++# Networking options
++#
++# CONFIG_NETDEBUG is not set
++CONFIG_PACKET=y
++# CONFIG_PACKET_MMAP is not set
++CONFIG_UNIX=y
++# CONFIG_NET_KEY is not set
++CONFIG_INET=y
++# CONFIG_IP_MULTICAST is not set
++CONFIG_IP_ADVANCED_ROUTER=y
++CONFIG_ASK_IP_FIB_HASH=y
++# CONFIG_IP_FIB_TRIE is not set
++CONFIG_IP_FIB_HASH=y
++# CONFIG_IP_MULTIPLE_TABLES is not set
++# CONFIG_IP_ROUTE_MULTIPATH is not set
++# CONFIG_IP_ROUTE_VERBOSE is not set
++CONFIG_IP_PNP=y
++CONFIG_IP_PNP_DHCP=y
++# CONFIG_IP_PNP_BOOTP is not set
++# 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_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_BIC=y
++# CONFIG_IPV6 is not set
++# CONFIG_INET6_XFRM_TUNNEL is not set
++# CONFIG_INET6_TUNNEL 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=m
++# CONFIG_VLAN_8021Q is not set
++# CONFIG_DECNET is not set
++CONFIG_LLC=m
++# 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_NET_DIVERT 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
++CONFIG_WIRELESS_EXT=y
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_STANDALONE=y
++CONFIG_PREVENT_FIRMWARE_BUILD=y
++CONFIG_FW_LOADER=m
++# CONFIG_DEBUG_DRIVER is not set
++
++#
++# Connector - unified userspace <-> kernelspace linker
++#
++# CONFIG_CONNECTOR is not set
++
++#
++# Memory Technology Devices (MTD)
++#
++# CONFIG_MTD is not set
++
++#
++# Parallel port support
++#
++# CONFIG_PARPORT is not set
++
++#
++# Plug and Play support
++#
++
++#
++# Block devices
++#
++# CONFIG_BLK_CPQ_DA is not set
++# CONFIG_BLK_CPQ_CISS_DA is not set
++# CONFIG_BLK_DEV_DAC960 is not set
++# CONFIG_BLK_DEV_UMEM is not set
++# CONFIG_BLK_DEV_COW_COMMON is not set
++# CONFIG_BLK_DEV_LOOP is not set
++# CONFIG_BLK_DEV_NBD is not set
++# CONFIG_BLK_DEV_SX8 is not set
++CONFIG_BLK_DEV_RAM=y
++CONFIG_BLK_DEV_RAM_COUNT=16
++CONFIG_BLK_DEV_RAM_SIZE=4096
++# CONFIG_BLK_DEV_INITRD is not set
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++
++#
++# ATA/ATAPI/MFM/RLL support
++#
++CONFIG_IDE=m
++CONFIG_IDE_MAX_HWIFS=4
++CONFIG_BLK_DEV_IDE=m
++
++#
++# Please see Documentation/ide.txt for help/info on IDE drives
++#
++CONFIG_BLK_DEV_IDE_SATA=y
++CONFIG_BLK_DEV_IDEDISK=m
++CONFIG_IDEDISK_MULTI_MODE=y
++# CONFIG_BLK_DEV_IDECD is not set
++# CONFIG_BLK_DEV_IDETAPE is not set
++# CONFIG_BLK_DEV_IDEFLOPPY is not set
++CONFIG_BLK_DEV_IDESCSI=m
++# CONFIG_IDE_TASK_IOCTL is not set
++
++#
++# IDE chipset support/bugfixes
++#
++CONFIG_IDE_GENERIC=m
++CONFIG_BLK_DEV_IDEPCI=y
++CONFIG_IDEPCI_SHARE_IRQ=y
++# CONFIG_BLK_DEV_OFFBOARD is not set
++CONFIG_BLK_DEV_GENERIC=m
++# CONFIG_BLK_DEV_OPTI621 is not set
++CONFIG_BLK_DEV_IDEDMA_PCI=y
++# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
++CONFIG_IDEDMA_PCI_AUTO=y
++# CONFIG_IDEDMA_ONLYDISK is not set
++CONFIG_BLK_DEV_AEC62XX=m
++# CONFIG_BLK_DEV_ALI15X3 is not set
++# CONFIG_BLK_DEV_AMD74XX is not set
++# CONFIG_BLK_DEV_CMD64X is not set
++# CONFIG_BLK_DEV_TRIFLEX is not set
++# CONFIG_BLK_DEV_CY82C693 is not set
++# CONFIG_BLK_DEV_CS5520 is not set
++# CONFIG_BLK_DEV_CS5530 is not set
++# CONFIG_BLK_DEV_HPT34X is not set
++# CONFIG_BLK_DEV_HPT366 is not set
++# CONFIG_BLK_DEV_SC1200 is not set
++# CONFIG_BLK_DEV_PIIX is not set
++# CONFIG_BLK_DEV_IT821X is not set
++# CONFIG_BLK_DEV_NS87415 is not set
++# CONFIG_BLK_DEV_PDC202XX_OLD is not set
++CONFIG_BLK_DEV_PDC202XX_NEW=m
++# CONFIG_BLK_DEV_SVWKS is not set
++CONFIG_BLK_DEV_SIIMAGE=m
++# CONFIG_BLK_DEV_SLC90E66 is not set
++# CONFIG_BLK_DEV_TRM290 is not set
++# CONFIG_BLK_DEV_VIA82CXXX is not set
++CONFIG_IDE_SH=y
++# CONFIG_IDE_ARM is not set
++CONFIG_BLK_DEV_IDEDMA=y
++# CONFIG_IDEDMA_IVB is not set
++CONFIG_IDEDMA_AUTO=y
++# CONFIG_BLK_DEV_HD is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++CONFIG_SCSI=m
++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 is not set
++CONFIG_CHR_DEV_SG=m
++# CONFIG_CHR_DEV_SCH is not set
++
++#
++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
++#
++# CONFIG_SCSI_MULTI_LUN is not set
++# CONFIG_SCSI_CONSTANTS is not set
++# CONFIG_SCSI_LOGGING is not set
++
++#
++# SCSI Transport Attributes
++#
++# 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
++
++#
++# SCSI low-level drivers
++#
++# CONFIG_ISCSI_TCP is not set
++# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
++# CONFIG_SCSI_3W_9XXX is not set
++# CONFIG_SCSI_ACARD is not set
++# CONFIG_SCSI_AACRAID is not set
++# CONFIG_SCSI_AIC7XXX is not set
++# CONFIG_SCSI_AIC7XXX_OLD is not set
++# CONFIG_SCSI_AIC79XX is not set
++# CONFIG_SCSI_DPT_I2O is not set
++# CONFIG_MEGARAID_NEWGEN is not set
++# CONFIG_MEGARAID_LEGACY is not set
++# CONFIG_MEGARAID_SAS is not set
++# CONFIG_SCSI_SATA is not set
++# CONFIG_SCSI_DMX3191D is not set
++# CONFIG_SCSI_FUTURE_DOMAIN is not set
++# CONFIG_SCSI_IPS is not set
++# CONFIG_SCSI_INITIO is not set
++# CONFIG_SCSI_INIA100 is not set
++# CONFIG_SCSI_SYM53C8XX_2 is not set
++# CONFIG_SCSI_IPR is not set
++# CONFIG_SCSI_QLOGIC_1280 is not set
++# CONFIG_SCSI_QLA_FC is not set
++# CONFIG_SCSI_LPFC is not set
++# CONFIG_SCSI_DC395x is not set
++# CONFIG_SCSI_DC390T is not set
++# CONFIG_SCSI_NSP32 is not set
++# CONFIG_SCSI_DEBUG is not set
++
++#
++# Multi-device support (RAID and LVM)
++#
++# CONFIG_MD is not set
++
++#
++# Fusion MPT device support
++#
++# CONFIG_FUSION is not set
++# CONFIG_FUSION_SPI is not set
++# CONFIG_FUSION_FC is not set
++# CONFIG_FUSION_SAS is not set
++
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_IEEE1394 is not set
++
++#
++# I2O device support
++#
++# CONFIG_I2O is not set
++
++#
++# 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_STNIC is not set
++# CONFIG_HAPPYMEAL is not set
++# CONFIG_SUNGEM is not set
++# CONFIG_CASSINI is not set
++# CONFIG_NET_VENDOR_3COM is not set
++# CONFIG_SMC91X is not set
++
++#
++# Tulip family network device support
++#
++# CONFIG_NET_TULIP is not set
++# CONFIG_HP100 is not set
++CONFIG_NE2000=y
++CONFIG_NET_PCI=y
++CONFIG_PCNET32=m
++# CONFIG_AMD8111_ETH is not set
++# CONFIG_ADAPTEC_STARFIRE is not set
++# CONFIG_B44 is not set
++# CONFIG_FORCEDETH is not set
++# CONFIG_DGRS is not set
++# CONFIG_EEPRO100 is not set
++# CONFIG_E100 is not set
++# CONFIG_FEALNX is not set
++# CONFIG_NATSEMI is not set
++# CONFIG_NE2K_PCI is not set
++CONFIG_8139CP=m
++CONFIG_8139TOO=m
++# CONFIG_8139TOO_PIO is not set
++# CONFIG_8139TOO_TUNE_TWISTER is not set
++CONFIG_8139TOO_8129=y
++# CONFIG_8139_OLD_RX_RESET is not set
++# CONFIG_SIS900 is not set
++# CONFIG_EPIC100 is not set
++# CONFIG_SUNDANCE is not set
++# CONFIG_TLAN is not set
++CONFIG_VIA_RHINE=m
++CONFIG_VIA_RHINE_MMIO=y
++
++#
++# Ethernet (1000 Mbit)
++#
++# CONFIG_ACENIC is not set
++# CONFIG_DL2K is not set
++CONFIG_E1000=m
++# CONFIG_E1000_NAPI is not set
++# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
++# CONFIG_NS83820 is not set
++# CONFIG_HAMACHI is not set
++# CONFIG_YELLOWFIN is not set
++CONFIG_R8169=y
++# CONFIG_R8169_NAPI is not set
++# CONFIG_SIS190 is not set
++# CONFIG_SKGE is not set
++# CONFIG_SKY2 is not set
++# CONFIG_SK98LIN is not set
++# CONFIG_VIA_VELOCITY is not set
++# CONFIG_TIGON3 is not set
++# CONFIG_BNX2 is not set
++
++#
++# Ethernet (10000 Mbit)
++#
++# CONFIG_CHELSIO_T1 is not set
++# CONFIG_IXGB is not set
++# CONFIG_S2IO is not set
++
++#
++# 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
++
++#
++# Wireless 802.11b ISA/PCI cards support
++#
++# CONFIG_IPW2100 is not set
++# CONFIG_IPW2200 is not set
++CONFIG_HERMES=m
++# CONFIG_PLX_HERMES is not set
++# CONFIG_TMD_HERMES is not set
++# CONFIG_NORTEL_HERMES is not set
++# CONFIG_PCI_HERMES is not set
++# CONFIG_ATMEL is not set
++
++#
++# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
++#
++CONFIG_PRISM54=m
++# CONFIG_HOSTAP is not set
++CONFIG_NET_WIRELESS=y
++
++#
++# Wan interfaces
++#
++# CONFIG_WAN is not set
++# CONFIG_FDDI is not set
++# CONFIG_HIPPI is not set
++# CONFIG_PPP is not set
++# CONFIG_SLIP is not set
++# CONFIG_NET_FC 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
++
++#
++# Telephony Support
++#
++# CONFIG_PHONE is not set
++
++#
++# Input device support
++#
++CONFIG_INPUT=y
++
++#
++# 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 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_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_I8042 is not set
++# CONFIG_SERIO_SERPORT is not set
++# CONFIG_SERIO_PCIPS2 is not set
++CONFIG_SERIO_LIBPS2=y
++# CONFIG_SERIO_RAW is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++# CONFIG_VT is not set
++# CONFIG_SERIAL_NONSTANDARD is not set
++
++#
++# Serial drivers
++#
++# CONFIG_SERIAL_8250 is not set
++
++#
++# Non-8250 serial port support
++#
++CONFIG_SERIAL_SH_SCI=y
++CONFIG_SERIAL_SH_SCI_CONSOLE=y
++CONFIG_SERIAL_CORE=y
++CONFIG_SERIAL_CORE_CONSOLE=y
++# CONFIG_SERIAL_JSM is not set
++CONFIG_UNIX98_PTYS=y
++CONFIG_LEGACY_PTYS=y
++CONFIG_LEGACY_PTY_COUNT=256
++
++#
++# IPMI
++#
++# CONFIG_IPMI_HANDLER is not set
++
++#
++# Watchdog Cards
++#
++# CONFIG_WATCHDOG is not set
++# CONFIG_RTC is not set
++# CONFIG_GEN_RTC is not set
++# CONFIG_DTLK is not set
++# CONFIG_R3964 is not set
++# CONFIG_APPLICOM is not set
++
++#
++# Ftape, the floppy tape device driver
++#
++# CONFIG_DRM is not set
++# CONFIG_RAW_DRIVER is not set
++
++#
++# TPM devices
++#
++# CONFIG_TCG_TPM is not set
++# CONFIG_TELCLOCK is not set
++
++#
++# I2C support
++#
++# CONFIG_I2C is not set
++
++#
++# SPI support
++#
++# CONFIG_SPI is not set
++# CONFIG_SPI_MASTER is not set
++
++#
++# Dallas's 1-wire bus
++#
++# CONFIG_W1 is not set
++
++#
++# Hardware Monitoring support
++#
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++# CONFIG_SENSORS_F71805F is not set
++# CONFIG_HWMON_DEBUG_CHIP is not set
++
++#
++# Misc devices
++#
++
++#
++# Multimedia devices
++#
++# CONFIG_VIDEO_DEV is not set
++CONFIG_VIDEO_V4L2=y
++
++#
++# Digital Video Broadcasting Devices
++#
++# CONFIG_DVB is not set
++
++#
++# Graphics support
++#
++# CONFIG_FB is not set
++
++#
++# Sound
++#
++CONFIG_SOUND=m
++
++#
++# Advanced Linux Sound Architecture
++#
++# CONFIG_SND is not set
++
++#
++# Open Sound System
++#
++CONFIG_SOUND_PRIME=m
++# CONFIG_SOUND_BT878 is not set
++# CONFIG_SOUND_EMU10K1 is not set
++# CONFIG_SOUND_FUSION is not set
++# CONFIG_SOUND_ES1371 is not set
++# CONFIG_SOUND_ICH is not set
++# CONFIG_SOUND_TRIDENT is not set
++# CONFIG_SOUND_MSNDCLAS is not set
++# CONFIG_SOUND_MSNDPIN is not set
++# CONFIG_SOUND_VIA82CXXX is not set
++
++#
++# USB support
++#
++CONFIG_USB_ARCH_HAS_HCD=y
++CONFIG_USB_ARCH_HAS_OHCI=y
++CONFIG_USB_ARCH_HAS_EHCI=y
++# CONFIG_USB is not set
++
++#
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
++#
++
++#
++# USB Gadget Support
++#
++# CONFIG_USB_GADGET is not set
++
++#
++# MMC/SD Card support
++#
++# CONFIG_MMC is not set
++
++#
++# LED devices
++#
++# CONFIG_NEW_LEDS is not set
++
++#
++# LED drivers
++#
++
++#
++# LED Triggers
++#
++
++#
++# InfiniBand support
++#
++# CONFIG_INFINIBAND is not set
++
++#
++# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
++#
++
++#
++# Real Time Clock
++#
++# CONFIG_RTC_CLASS 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_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=y
++# CONFIG_XFS_FS is not set
++# CONFIG_OCFS2_FS is not set
++CONFIG_MINIX_FS=y
++# CONFIG_ROMFS_FS is not set
++CONFIG_INOTIFY=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=y
++# CONFIG_NTFS_DEBUG is not set
++CONFIG_NTFS_RW=y
++
++#
++# Pseudo filesystems
++#
++CONFIG_PROC_FS=y
++CONFIG_PROC_KCORE=y
++CONFIG_SYSFS=y
++# CONFIG_TMPFS is not set
++CONFIG_HUGETLBFS=y
++CONFIG_HUGETLB_PAGE=y
++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_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=y
++# CONFIG_NFS_V3_ACL is not set
++CONFIG_NFS_V4=y
++# CONFIG_NFS_DIRECTIO is not set
++CONFIG_NFSD=y
++CONFIG_NFSD_V3=y
++# CONFIG_NFSD_V3_ACL is not set
++CONFIG_NFSD_V4=y
++CONFIG_NFSD_TCP=y
++CONFIG_ROOT_NFS=y
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_EXPORTFS=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++CONFIG_SUNRPC_GSS=y
++CONFIG_RPCSEC_GSS_KRB5=y
++# 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 is not set
++CONFIG_MSDOS_PARTITION=y
++
++#
++# 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 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=y
++# 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_MAGIC_SYSRQ is not set
++CONFIG_DEBUG_KERNEL=y
++CONFIG_LOG_BUF_SHIFT=14
++CONFIG_DETECT_SOFTLOCKUP=y
++# CONFIG_SCHEDSTATS is not set
++# CONFIG_DEBUG_SLAB is not set
++CONFIG_DEBUG_PREEMPT=y
++# CONFIG_DEBUG_MUTEXES is not set
++CONFIG_DEBUG_SPINLOCK=y
++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
++# CONFIG_DEBUG_KOBJECT is not set
++# CONFIG_DEBUG_INFO is not set
++CONFIG_DEBUG_FS=y
++# CONFIG_DEBUG_VM is not set
++CONFIG_FRAME_POINTER=y
++CONFIG_FORCED_INLINING=y
++# CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_SH_STANDARD_BIOS is not set
++# CONFIG_EARLY_SCIF_CONSOLE is not set
++# CONFIG_KGDB is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++
++#
++# Cryptographic options
++#
++CONFIG_CRYPTO=y
++CONFIG_CRYPTO_HMAC=y
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_MD4 is not set
++CONFIG_CRYPTO_MD5=y
++# CONFIG_CRYPTO_SHA1 is not set
++# 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_DES=y
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_DEFLATE is not set
++# 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_CRC16 is not set
++CONFIG_CRC32=y
++# CONFIG_LIBCRC32C is not set
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/rts7751r2d_defconfig linux-2.6.17/arch/sh/configs/rts7751r2d_defconfig
+--- linux-2.6.17-vanilla/arch/sh/configs/rts7751r2d_defconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/rts7751r2d_defconfig 2006-07-12 16:54:21.000000000 +0000
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.11-sh
+-# Wed Mar 2 15:09:42 2005
++# Linux kernel version: 2.6.15-sh
++# Wed Jan 4 19:00:01 2006
+ #
+ CONFIG_SUPERH=y
+ CONFIG_UID16=y
+@@ -16,33 +16,39 @@
+ CONFIG_EXPERIMENTAL=y
+ CONFIG_CLEAN_COMPILE=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_POSIX_MQUEUE is not set
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ CONFIG_SYSCTL=y
+ # CONFIG_AUDIT is not set
+-CONFIG_LOG_BUF_SHIFT=14
+ CONFIG_HOTPLUG=y
+ CONFIG_KOBJECT_UEVENT=y
+ # CONFIG_IKCONFIG is not set
++CONFIG_INITRAMFS_SOURCE=""
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_EMBEDDED=y
+ CONFIG_KALLSYMS=y
+ # CONFIG_KALLSYMS_EXTRA_PASS is not set
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_EPOLL=y
+-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_SHMEM=y
+ CONFIG_CC_ALIGN_FUNCTIONS=0
+ CONFIG_CC_ALIGN_LABELS=0
+ CONFIG_CC_ALIGN_LOOPS=0
+ CONFIG_CC_ALIGN_JUMPS=0
+ # CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
+
+ #
+ # Loadable module support
+@@ -55,6 +61,24 @@
+ # CONFIG_KMOD is not set
+
+ #
++# Block layer
++#
++# CONFIG_LBD 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_SH_SOLUTION_ENGINE is not set
+@@ -64,9 +88,7 @@
+ # CONFIG_SH_7751_SYSTEMH is not set
+ # CONFIG_SH_STB1_HARP is not set
+ # CONFIG_SH_STB1_OVERDRIVE is not set
+-# CONFIG_SH_HP620 is not set
+-# CONFIG_SH_HP680 is not set
+-# CONFIG_SH_HP690 is not set
++# CONFIG_SH_HP6XX is not set
+ # CONFIG_SH_CQREEK is not set
+ # CONFIG_SH_DMIDA is not set
+ # CONFIG_SH_EC3104 is not set
+@@ -83,44 +105,94 @@
+ CONFIG_SH_RTS7751R2D=y
+ # CONFIG_SH_EDOSK7705 is not set
+ # CONFIG_SH_SH4202_MICRODEV is not set
++# CONFIG_SH_LANDISK is not set
++# CONFIG_SH_TITAN is not set
+ # CONFIG_SH_UNKNOWN is not set
+-# CONFIG_CPU_SH2 is not set
+-# CONFIG_CPU_SH3 is not set
++
++#
++# Processor selection
++#
+ CONFIG_CPU_SH4=y
++
++#
++# SH-2 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7604 is not set
++
++#
++# SH-3 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7300 is not set
+ # CONFIG_CPU_SUBTYPE_SH7705 is not set
+ # CONFIG_CPU_SUBTYPE_SH7707 is not set
+ # CONFIG_CPU_SUBTYPE_SH7708 is not set
+ # CONFIG_CPU_SUBTYPE_SH7709 is not set
++
++#
++# SH-4 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7750 is not set
++# CONFIG_CPU_SUBTYPE_SH7091 is not set
++# CONFIG_CPU_SUBTYPE_SH7750R is not set
++# CONFIG_CPU_SUBTYPE_SH7750S is not set
+ CONFIG_CPU_SUBTYPE_SH7751=y
++CONFIG_CPU_SUBTYPE_SH7751R=y
+ # CONFIG_CPU_SUBTYPE_SH7760 is not set
+-# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# ST40 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_ST40STB1 is not set
+ # CONFIG_CPU_SUBTYPE_ST40GX1 is not set
+-# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# SH-4A Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH7770 is not set
++# CONFIG_CPU_SUBTYPE_SH7780 is not set
++
++#
++# Memory management options
++#
+ CONFIG_MMU=y
+-CONFIG_CMDLINE_BOOL=y
+-CONFIG_CMDLINE="mem=64M console=ttySC0,115200 root=/dev/hda1"
++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=4
++
++#
++# Cache configuration
++#
++# CONFIG_SH_DIRECT_MAPPED is not set
++# CONFIG_SH_WRITETHROUGH is not set
++# CONFIG_SH_OCRAM is not set
+ CONFIG_MEMORY_START=0x0c000000
+ CONFIG_MEMORY_SIZE=0x04000000
+-CONFIG_MEMORY_SET=y
+-# CONFIG_MEMORY_OVERRIDE is not set
++
++#
++# Processor features
++#
++CONFIG_CPU_LITTLE_ENDIAN=y
+ CONFIG_SH_RTC=y
+ CONFIG_SH_FPU=y
+-CONFIG_ZERO_PAGE_OFFSET=0x00010000
+-CONFIG_BOOT_LINK_OFFSET=0x00800000
+-CONFIG_CPU_LITTLE_ENDIAN=y
+-# CONFIG_PREEMPT is not set
+-# CONFIG_UBC_WAKEUP is not set
+-# CONFIG_SH_WRITETHROUGH is not set
+-# CONFIG_SH_OCRAM is not set
+ # CONFIG_SH_STORE_QUEUES is not set
+-# CONFIG_SMP is not set
++
++#
++# Timer support
++#
++CONFIG_SH_TMU=y
++
++#
++# RTS7751R2D options
++#
+ CONFIG_RTS7751R2D_REV11=y
+-CONFIG_SH_PCLK_CALC=y
+-CONFIG_SH_PCLK_FREQ=60000000
++# CONFIG_SH_PCLK_FREQ_BOOL is not set
+
+ #
+ # CPU Frequency scaling
+@@ -140,17 +212,31 @@
+ CONFIG_VOYAGERGX=y
+ # CONFIG_HD6446X_SERIES is not set
+ CONFIG_HEARTBEAT=y
+-CONFIG_RTC_9701JE=y
+
+ #
+-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
++# Kernel features
++#
++# CONFIG_KEXEC is not set
++# CONFIG_PREEMPT is not set
++# CONFIG_SMP is not set
++
++#
++# Boot options
++#
++CONFIG_ZERO_PAGE_OFFSET=0x00010000
++CONFIG_BOOT_LINK_OFFSET=0x00800000
++# CONFIG_UBC_WAKEUP is not set
++CONFIG_CMDLINE_BOOL=y
++CONFIG_CMDLINE="mem=64M console=ttySC0,115200 root=/dev/hda1"
++
++#
++# Bus options
+ #
+ CONFIG_PCI=y
+ CONFIG_SH_PCIDMA_NONCOHERENT=y
+ CONFIG_PCI_AUTO=y
+ CONFIG_PCI_AUTO_UPDATE_RESOURCES=y
+ # CONFIG_PCI_LEGACY_PROC is not set
+-CONFIG_PCI_NAMES=y
+
+ #
+ # PCCARD (PCMCIA/CardBus) support
+@@ -158,10 +244,6 @@
+ # CONFIG_PCCARD is not set
+
+ #
+-# PC-card bridges
+-#
+-
+-#
+ # PCI Hotplug Support
+ #
+ CONFIG_HOTPLUG_PCI=y
+@@ -177,6 +259,74 @@
+ # CONFIG_BINFMT_MISC is not set
+
+ #
++# Networking
++#
++CONFIG_NET=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++# CONFIG_PACKET_MMAP is not set
++CONFIG_UNIX=y
++# 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 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_TUNNEL is not set
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_BIC=y
++# CONFIG_IPV6 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
++# 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_NET_DIVERT 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
+ #
+
+@@ -188,6 +338,11 @@
+ # CONFIG_FW_LOADER is not set
+
+ #
++# Connector - unified userspace <-> kernelspace linker
++#
++# CONFIG_CONNECTOR is not set
++
++#
+ # Memory Technology Devices (MTD)
+ #
+ # CONFIG_MTD is not set
+@@ -204,7 +359,6 @@
+ #
+ # Block devices
+ #
+-# CONFIG_BLK_DEV_FD is not set
+ # CONFIG_BLK_CPQ_DA is not set
+ # CONFIG_BLK_CPQ_CISS_DA is not set
+ # CONFIG_BLK_DEV_DAC960 is not set
+@@ -217,17 +371,7 @@
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=4096
+ # CONFIG_BLK_DEV_INITRD is not set
+-CONFIG_INITRAMFS_SOURCE=""
+-# CONFIG_LBD is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+-
+-#
+-# IO Schedulers
+-#
+-CONFIG_IOSCHED_NOOP=y
+-CONFIG_IOSCHED_AS=y
+-CONFIG_IOSCHED_DEADLINE=y
+-CONFIG_IOSCHED_CFQ=y
+ # CONFIG_ATA_OVER_ETH is not set
+
+ #
+@@ -262,6 +406,7 @@
+ #
+ # SCSI device support
+ #
++# CONFIG_RAID_ATTRS is not set
+ # CONFIG_SCSI is not set
+
+ #
+@@ -272,6 +417,7 @@
+ #
+ # Fusion MPT device support
+ #
++# CONFIG_FUSION is not set
+
+ #
+ # IEEE 1394 (FireWire) support
+@@ -284,67 +430,8 @@
+ # CONFIG_I2O is not set
+
+ #
+-# Networking support
+-#
+-CONFIG_NET=y
+-
+-#
+-# Networking options
+-#
+-CONFIG_PACKET=y
+-# CONFIG_PACKET_MMAP is not set
+-# CONFIG_NETLINK_DEV is not set
+-CONFIG_UNIX=y
+-# CONFIG_NET_KEY is not set
+-CONFIG_INET=y
+-# CONFIG_IP_MULTICAST is not set
+-# CONFIG_IP_ADVANCED_ROUTER is not set
+-# CONFIG_IP_PNP 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_TUNNEL is not set
+-CONFIG_IP_TCPDIAG=y
+-# CONFIG_IP_TCPDIAG_IPV6 is not set
+-# CONFIG_IPV6 is not set
+-# CONFIG_NETFILTER is not set
+-
+-#
+-# SCTP Configuration (EXPERIMENTAL)
+-#
+-# CONFIG_IP_SCTP 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_NET_DIVERT is not set
+-# CONFIG_ECONET is not set
+-# CONFIG_WAN_ROUTER is not set
+-
+-#
+-# QoS and/or fair queueing
++# Network device support
+ #
+-# CONFIG_NET_SCHED is not set
+-# CONFIG_NET_CLS_ROUTE is not set
+-
+-#
+-# Network testing
+-#
+-# CONFIG_NET_PKTGEN is not set
+-# CONFIG_NETPOLL is not set
+-# CONFIG_NET_POLL_CONTROLLER is not set
+-# CONFIG_HAMRADIO is not set
+-# CONFIG_IRDA is not set
+-# CONFIG_BT is not set
+ CONFIG_NETDEVICES=y
+ # CONFIG_DUMMY is not set
+ # CONFIG_BONDING is not set
+@@ -357,6 +444,11 @@
+ # CONFIG_ARCNET is not set
+
+ #
++# PHY device support
++#
++# CONFIG_PHYLIB is not set
++
++#
+ # Ethernet (10 or 100Mbit)
+ #
+ CONFIG_NET_ETHERNET=y
+@@ -364,6 +456,7 @@
+ # CONFIG_STNIC is not set
+ # CONFIG_HAPPYMEAL is not set
+ # CONFIG_SUNGEM is not set
++# CONFIG_CASSINI is not set
+ # CONFIG_NET_VENDOR_3COM is not set
+ # CONFIG_SMC91X is not set
+
+@@ -372,6 +465,7 @@
+ #
+ # CONFIG_NET_TULIP is not set
+ # CONFIG_HP100 is not set
++# CONFIG_NE2000 is not set
+ CONFIG_NET_PCI=y
+ # CONFIG_PCNET32 is not set
+ # CONFIG_AMD8111_ETH is not set
+@@ -406,13 +500,17 @@
+ # CONFIG_HAMACHI is not set
+ # CONFIG_YELLOWFIN is not set
+ # CONFIG_R8169 is not set
++# CONFIG_SIS190 is not set
++# CONFIG_SKGE is not set
+ # CONFIG_SK98LIN is not set
+ # CONFIG_VIA_VELOCITY is not set
+ # CONFIG_TIGON3 is not set
++# CONFIG_BNX2 is not set
+
+ #
+ # Ethernet (10000 Mbit)
+ #
++# CONFIG_CHELSIO_T1 is not set
+ # CONFIG_IXGB is not set
+ # CONFIG_S2IO is not set
+
+@@ -437,6 +535,7 @@
+ CONFIG_HERMES=m
+ # CONFIG_PLX_HERMES is not set
+ # CONFIG_TMD_HERMES is not set
++# CONFIG_NORTEL_HERMES is not set
+ # CONFIG_PCI_HERMES is not set
+ # CONFIG_ATMEL is not set
+
+@@ -444,6 +543,7 @@
+ # Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
+ #
+ # CONFIG_PRISM54 is not set
++# CONFIG_HOSTAP is not set
+ CONFIG_NET_WIRELESS=y
+
+ #
+@@ -456,6 +556,8 @@
+ # 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
+@@ -473,20 +575,10 @@
+ # CONFIG_INPUT is not set
+
+ #
+-# Userland interfaces
+-#
+-
+-#
+-# Input I/O drivers
++# Hardware I/O ports
+ #
+-# CONFIG_GAMEPORT is not set
+-CONFIG_SOUND_GAMEPORT=y
+ # CONFIG_SERIO is not set
+-# CONFIG_SERIO_I8042 is not set
+-
+-#
+-# Input Device Drivers
+-#
++# CONFIG_GAMEPORT is not set
+
+ #
+ # Character devices
+@@ -503,6 +595,7 @@
+ # Non-8250 serial port support
+ #
+ # CONFIG_SERIAL_SH_SCI is not set
++# CONFIG_SERIAL_JSM is not set
+ # CONFIG_UNIX98_PTYS is not set
+ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=256
+@@ -517,6 +610,7 @@
+ #
+ # CONFIG_WATCHDOG is not set
+ # CONFIG_RTC is not set
++CONFIG_RTC_9701JE=y
+ # CONFIG_GEN_RTC is not set
+ # CONFIG_DTLK is not set
+ # CONFIG_R3964 is not set
+@@ -529,6 +623,12 @@
+ # CONFIG_RAW_DRIVER is not set
+
+ #
++# TPM devices
++#
++# CONFIG_TCG_TPM is not set
++# CONFIG_TELCLOCK is not set
++
++#
+ # I2C support
+ #
+ # CONFIG_I2C is not set
+@@ -539,10 +639,21 @@
+ # CONFIG_W1 is not set
+
+ #
++# Hardware Monitoring support
++#
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++# CONFIG_HWMON_DEBUG_CHIP is not set
++
++#
+ # Misc devices
+ #
+
+ #
++# Multimedia Capabilities Port drivers
++#
++
++#
+ # Multimedia devices
+ #
+ # CONFIG_VIDEO_DEV is not set
+@@ -566,6 +677,8 @@
+ # Advanced Linux Sound Architecture
+ #
+ CONFIG_SND=m
++CONFIG_SND_AC97_CODEC=m
++CONFIG_SND_AC97_BUS=m
+ CONFIG_SND_TIMER=m
+ CONFIG_SND_PCM=m
+ CONFIG_SND_HWDEP=m
+@@ -589,7 +702,6 @@
+ #
+ # PCI devices
+ #
+-CONFIG_SND_AC97_CODEC=m
+ # CONFIG_SND_ALI5451 is not set
+ # CONFIG_SND_ATIIXP is not set
+ # CONFIG_SND_ATIIXP_MODEM is not set
+@@ -610,9 +722,10 @@
+ # CONFIG_SND_RME96 is not set
+ # CONFIG_SND_RME9652 is not set
+ # CONFIG_SND_HDSP is not set
++# CONFIG_SND_HDSPM is not set
+ # CONFIG_SND_TRIDENT is not set
+ CONFIG_SND_YMFPCI=m
+-# CONFIG_SND_ALS4000 is not set
++# CONFIG_SND_AD1889 is not set
+ # CONFIG_SND_CMIPCI is not set
+ # CONFIG_SND_ENS1370 is not set
+ # CONFIG_SND_ENS1371 is not set
+@@ -628,43 +741,29 @@
+ # CONFIG_SND_VIA82XX is not set
+ # CONFIG_SND_VIA82XX_MODEM is not set
+ # CONFIG_SND_VX222 is not set
++# CONFIG_SND_HDA_INTEL is not set
+
+ #
+ # Open Sound System
+ #
+ CONFIG_SOUND_PRIME=m
+-# CONFIG_SOUND_BT878 is not set
+-CONFIG_SOUND_CMPCI=m
+-# CONFIG_SOUND_EMU10K1 is not set
++# CONFIG_OBSOLETE_OSS_DRIVER is not set
+ # CONFIG_SOUND_FUSION is not set
+-# CONFIG_SOUND_CS4281 is not set
+-# CONFIG_SOUND_ES1370 is not set
+-# CONFIG_SOUND_ES1371 is not set
+-# CONFIG_SOUND_ESSSOLO1 is not set
+-# CONFIG_SOUND_MAESTRO is not set
+-# CONFIG_SOUND_MAESTRO3 is not set
+ # CONFIG_SOUND_ICH is not set
+-# CONFIG_SOUND_SONICVIBES is not set
+ # CONFIG_SOUND_TRIDENT is not set
+ # CONFIG_SOUND_MSNDCLAS is not set
+ # CONFIG_SOUND_MSNDPIN is not set
+-# CONFIG_SOUND_VIA82CXXX is not set
+-# CONFIG_SOUND_OSS is not set
+-# CONFIG_SOUND_ALI5455 is not set
+-# CONFIG_SOUND_FORTE is not set
+-# CONFIG_SOUND_RME96XX is not set
+-# CONFIG_SOUND_AD1980 is not set
+ CONFIG_SOUND_VOYAGERGX=m
+
+ #
+ # USB support
+ #
+-# CONFIG_USB is not set
+ CONFIG_USB_ARCH_HAS_HCD=y
+ CONFIG_USB_ARCH_HAS_OHCI=y
++# CONFIG_USB is not set
+
+ #
+-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+@@ -683,25 +782,29 @@
+ # CONFIG_INFINIBAND is not set
+
+ #
++# SN Devices
++#
++
++#
+ # File systems
+ #
+ CONFIG_EXT2_FS=y
+ # CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
+ # CONFIG_EXT3_FS is not set
+ # CONFIG_JBD is not set
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+-
+-#
+-# XFS support
+-#
++# CONFIG_FS_POSIX_ACL is not set
+ # CONFIG_XFS_FS is not set
+ CONFIG_MINIX_FS=y
+ # CONFIG_ROMFS_FS is not set
++CONFIG_INOTIFY=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
+@@ -725,11 +828,11 @@
+ CONFIG_PROC_FS=y
+ CONFIG_PROC_KCORE=y
+ CONFIG_SYSFS=y
+-# CONFIG_DEVFS_FS is not set
+ # CONFIG_TMPFS is not set
+ # CONFIG_HUGETLBFS is not set
+ # CONFIG_HUGETLB_PAGE is not set
+ CONFIG_RAMFS=y
++# CONFIG_RELAYFS_FS is not set
+
+ #
+ # Miscellaneous filesystems
+@@ -758,6 +861,7 @@
+ # 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
+@@ -818,7 +922,9 @@
+ #
+ # Kernel hacking
+ #
++# CONFIG_PRINTK_TIME is not set
+ # CONFIG_DEBUG_KERNEL is not set
++CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_FRAME_POINTER is not set
+ # CONFIG_SH_STANDARD_BIOS is not set
+ # CONFIG_EARLY_SCIF_CONSOLE is not set
+@@ -843,5 +949,6 @@
+ # Library routines
+ #
+ # CONFIG_CRC_CCITT is not set
++# CONFIG_CRC16 is not set
+ CONFIG_CRC32=y
+ # CONFIG_LIBCRC32C is not set
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/se7300_defconfig linux-2.6.17/arch/sh/configs/se7300_defconfig
+--- linux-2.6.17-vanilla/arch/sh/configs/se7300_defconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/se7300_defconfig 2006-07-12 16:54:21.000000000 +0000
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.11-sh
+-# Wed Mar 2 15:09:43 2005
++# Linux kernel version: 2.6.15-sh
++# Wed Jan 4 19:07:24 2006
+ #
+ CONFIG_SUPERH=y
+ CONFIG_UID16=y
+@@ -16,30 +16,35 @@
+ CONFIG_EXPERIMENTAL=y
+ CONFIG_CLEAN_COMPILE=y
+ CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
+
+ #
+ # General setup
+ #
+ CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
+ # CONFIG_SWAP is not set
+ # CONFIG_SYSVIPC is not set
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ CONFIG_SYSCTL=y
+-# CONFIG_AUDIT is not set
+-CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_HOTPLUG is not set
+ # CONFIG_IKCONFIG is not set
++CONFIG_INITRAMFS_SOURCE=""
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_EMBEDDED=y
+ # CONFIG_KALLSYMS is not set
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_BASE_FULL=y
+ # CONFIG_FUTEX is not set
+ # CONFIG_EPOLL is not set
+-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_SHMEM=y
+ CONFIG_CC_ALIGN_FUNCTIONS=0
+ CONFIG_CC_ALIGN_LABELS=0
+ CONFIG_CC_ALIGN_LOOPS=0
+ CONFIG_CC_ALIGN_JUMPS=0
+ # CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
+
+ #
+ # Loadable module support
+@@ -47,6 +52,24 @@
+ # CONFIG_MODULES is not set
+
+ #
++# Block layer
++#
++# CONFIG_LBD is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++# CONFIG_IOSCHED_AS is not set
++# CONFIG_IOSCHED_DEADLINE is not set
++# CONFIG_IOSCHED_CFQ is not set
++# CONFIG_DEFAULT_AS is not set
++# CONFIG_DEFAULT_DEADLINE is not set
++# CONFIG_DEFAULT_CFQ is not set
++CONFIG_DEFAULT_NOOP=y
++CONFIG_DEFAULT_IOSCHED="noop"
++
++#
+ # System type
+ #
+ # CONFIG_SH_SOLUTION_ENGINE is not set
+@@ -56,9 +79,7 @@
+ # CONFIG_SH_7751_SYSTEMH is not set
+ # CONFIG_SH_STB1_HARP is not set
+ # CONFIG_SH_STB1_OVERDRIVE is not set
+-# CONFIG_SH_HP620 is not set
+-# CONFIG_SH_HP680 is not set
+-# CONFIG_SH_HP690 is not set
++# CONFIG_SH_HP6XX is not set
+ # CONFIG_SH_CQREEK is not set
+ # CONFIG_SH_DMIDA is not set
+ # CONFIG_SH_EC3104 is not set
+@@ -75,40 +96,88 @@
+ # CONFIG_SH_RTS7751R2D is not set
+ # CONFIG_SH_EDOSK7705 is not set
+ # CONFIG_SH_SH4202_MICRODEV is not set
++# CONFIG_SH_LANDISK is not set
++# CONFIG_SH_TITAN is not set
+ # CONFIG_SH_UNKNOWN is not set
+-# CONFIG_CPU_SH2 is not set
++
++#
++# Processor selection
++#
+ CONFIG_CPU_SH3=y
+-# CONFIG_CPU_SH4 is not set
++
++#
++# SH-2 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7604 is not set
++
++#
++# SH-3 Processor Support
++#
+ CONFIG_CPU_SUBTYPE_SH7300=y
+ # CONFIG_CPU_SUBTYPE_SH7705 is not set
+ # CONFIG_CPU_SUBTYPE_SH7707 is not set
+ # CONFIG_CPU_SUBTYPE_SH7708 is not set
+ # CONFIG_CPU_SUBTYPE_SH7709 is not set
++
++#
++# SH-4 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7750 is not set
++# CONFIG_CPU_SUBTYPE_SH7091 is not set
++# CONFIG_CPU_SUBTYPE_SH7750R is not set
++# CONFIG_CPU_SUBTYPE_SH7750S is not set
+ # CONFIG_CPU_SUBTYPE_SH7751 is not set
++# CONFIG_CPU_SUBTYPE_SH7751R is not set
+ # CONFIG_CPU_SUBTYPE_SH7760 is not set
+-# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# ST40 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_ST40STB1 is not set
+ # CONFIG_CPU_SUBTYPE_ST40GX1 is not set
+-# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# SH-4A Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH7770 is not set
++# CONFIG_CPU_SUBTYPE_SH7780 is not set
++
++#
++# Memory management options
++#
+ CONFIG_MMU=y
+-CONFIG_CMDLINE_BOOL=y
+-CONFIG_CMDLINE="console=ttySC0,38400 root=/dev/ram0"
++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=4
++
++#
++# Cache configuration
++#
++# CONFIG_SH_DIRECT_MAPPED is not set
++# CONFIG_SH_WRITETHROUGH is not set
++# CONFIG_SH_OCRAM is not set
+ CONFIG_MEMORY_START=0x0c000000
+ CONFIG_MEMORY_SIZE=0x04000000
+-# CONFIG_MEMORY_OVERRIDE is not set
++
++#
++# Processor features
++#
++CONFIG_CPU_LITTLE_ENDIAN=y
+ CONFIG_SH_DSP=y
+ # CONFIG_SH_ADC is not set
+-CONFIG_ZERO_PAGE_OFFSET=0x00001000
+-CONFIG_BOOT_LINK_OFFSET=0x00210000
+-CONFIG_CPU_LITTLE_ENDIAN=y
+-# CONFIG_PREEMPT is not set
+-# CONFIG_UBC_WAKEUP is not set
+-# CONFIG_SH_WRITETHROUGH is not set
+-# CONFIG_SH_OCRAM is not set
+-# CONFIG_SMP is not set
+-# CONFIG_SH_PCLK_CALC is not set
++
++#
++# Timer support
++#
++CONFIG_SH_TMU=y
++CONFIG_SH_PCLK_FREQ_BOOL=y
+ CONFIG_SH_PCLK_FREQ=33333333
+
+ #
+@@ -128,18 +197,30 @@
+ CONFIG_HEARTBEAT=y
+
+ #
+-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
++# Kernel features
+ #
+-# CONFIG_PCI is not set
++# CONFIG_KEXEC is not set
++# CONFIG_PREEMPT is not set
++# CONFIG_SMP is not set
+
+ #
+-# PCCARD (PCMCIA/CardBus) support
++# Boot options
+ #
+-# CONFIG_PCCARD is not set
++CONFIG_ZERO_PAGE_OFFSET=0x00001000
++CONFIG_BOOT_LINK_OFFSET=0x00210000
++# CONFIG_UBC_WAKEUP is not set
++CONFIG_CMDLINE_BOOL=y
++CONFIG_CMDLINE="console=ttySC0,38400 root=/dev/ram0"
++
++#
++# Bus options
++#
++# CONFIG_PCI is not set
+
+ #
+-# PC-card bridges
++# PCCARD (PCMCIA/CardBus) support
+ #
++# CONFIG_PCCARD is not set
+
+ #
+ # PCI Hotplug Support
+@@ -153,10 +234,9 @@
+ # CONFIG_BINFMT_MISC is not set
+
+ #
+-# SH initrd options
++# Networking
+ #
+-CONFIG_EMBEDDED_RAMDISK=y
+-CONFIG_EMBEDDED_RAMDISK_IMAGE="ramdisk.gz"
++# CONFIG_NET is not set
+
+ #
+ # Device Drivers
+@@ -170,6 +250,10 @@
+ # CONFIG_FW_LOADER is not set
+
+ #
++# Connector - unified userspace <-> kernelspace linker
++#
++
++#
+ # Memory Technology Devices (MTD)
+ #
+ # CONFIG_MTD is not set
+@@ -186,26 +270,15 @@
+ #
+ # Block devices
+ #
+-# CONFIG_BLK_DEV_FD is not set
+ # CONFIG_BLK_DEV_COW_COMMON is not set
+ # CONFIG_BLK_DEV_LOOP is not set
+ CONFIG_BLK_DEV_RAM=y
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=4096
+ CONFIG_BLK_DEV_INITRD=y
+-CONFIG_INITRAMFS_SOURCE=""
+-# CONFIG_LBD is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+
+ #
+-# IO Schedulers
+-#
+-CONFIG_IOSCHED_NOOP=y
+-# CONFIG_IOSCHED_AS is not set
+-# CONFIG_IOSCHED_DEADLINE is not set
+-# CONFIG_IOSCHED_CFQ is not set
+-
+-#
+ # ATA/ATAPI/MFM/RLL support
+ #
+ # CONFIG_IDE is not set
+@@ -213,6 +286,7 @@
+ #
+ # SCSI device support
+ #
++# CONFIG_RAID_ATTRS is not set
+ # CONFIG_SCSI is not set
+
+ #
+@@ -223,6 +297,7 @@
+ #
+ # Fusion MPT device support
+ #
++# CONFIG_FUSION is not set
+
+ #
+ # IEEE 1394 (FireWire) support
+@@ -233,9 +308,8 @@
+ #
+
+ #
+-# Networking support
++# Network device support
+ #
+-# CONFIG_NET is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+
+@@ -266,18 +340,6 @@
+ # CONFIG_INPUT_EVBUG is not set
+
+ #
+-# Input I/O drivers
+-#
+-# CONFIG_GAMEPORT is not set
+-CONFIG_SOUND_GAMEPORT=y
+-CONFIG_SERIO=y
+-# CONFIG_SERIO_I8042 is not set
+-# CONFIG_SERIO_SERPORT is not set
+-# CONFIG_SERIO_CT82C710 is not set
+-# CONFIG_SERIO_LIBPS2 is not set
+-# CONFIG_SERIO_RAW is not set
+-
+-#
+ # Input Device Drivers
+ #
+ # CONFIG_INPUT_KEYBOARD is not set
+@@ -287,6 +349,16 @@
+ # CONFIG_INPUT_MISC is not set
+
+ #
++# Hardware I/O ports
++#
++CONFIG_SERIO=y
++# CONFIG_SERIO_I8042 is not set
++# CONFIG_SERIO_SERPORT is not set
++# CONFIG_SERIO_LIBPS2 is not set
++# CONFIG_SERIO_RAW is not set
++# CONFIG_GAMEPORT is not set
++
++#
+ # Character devices
+ #
+ # CONFIG_VT is not set
+@@ -336,10 +408,15 @@
+ #
+ # Ftape, the floppy tape device driver
+ #
+-# CONFIG_DRM is not set
+ # CONFIG_RAW_DRIVER is not set
+
+ #
++# TPM devices
++#
++# CONFIG_TCG_TPM is not set
++# CONFIG_TELCLOCK is not set
++
++#
+ # I2C support
+ #
+ # CONFIG_I2C is not set
+@@ -350,10 +427,21 @@
+ # CONFIG_W1 is not set
+
+ #
++# Hardware Monitoring support
++#
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++# CONFIG_HWMON_DEBUG_CHIP is not set
++
++#
+ # Misc devices
+ #
+
+ #
++# Multimedia Capabilities Port drivers
++#
++
++#
+ # Multimedia devices
+ #
+ # CONFIG_VIDEO_DEV is not set
+@@ -379,7 +467,7 @@
+ # CONFIG_USB_ARCH_HAS_OHCI is not set
+
+ #
+-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+@@ -395,28 +483,31 @@
+ #
+ # InfiniBand support
+ #
+-# CONFIG_INFINIBAND is not set
++
++#
++# SN Devices
++#
+
+ #
+ # File systems
+ #
+ CONFIG_EXT2_FS=y
+ # CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
+ # CONFIG_EXT3_FS is not set
+ # CONFIG_JBD is not set
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+-
+-#
+-# XFS support
+-#
++# CONFIG_FS_POSIX_ACL is not set
+ # CONFIG_XFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+ # CONFIG_ROMFS_FS is not set
++CONFIG_INOTIFY=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
+@@ -437,13 +528,11 @@
+ CONFIG_PROC_FS=y
+ CONFIG_PROC_KCORE=y
+ CONFIG_SYSFS=y
+-CONFIG_DEVFS_FS=y
+-CONFIG_DEVFS_MOUNT=y
+-# CONFIG_DEVFS_DEBUG is not set
+ # CONFIG_TMPFS is not set
+ # CONFIG_HUGETLBFS is not set
+ # CONFIG_HUGETLB_PAGE is not set
+ CONFIG_RAMFS=y
++# CONFIG_RELAYFS_FS is not set
+
+ #
+ # Miscellaneous filesystems
+@@ -481,7 +570,9 @@
+ #
+ # Kernel hacking
+ #
++# CONFIG_PRINTK_TIME is not set
+ # CONFIG_DEBUG_KERNEL is not set
++CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_FRAME_POINTER is not set
+ CONFIG_SH_STANDARD_BIOS=y
+ CONFIG_EARLY_PRINTK=y
+@@ -527,5 +618,6 @@
+ # Library routines
+ #
+ # CONFIG_CRC_CCITT is not set
++# CONFIG_CRC16 is not set
+ CONFIG_CRC32=y
+ # CONFIG_LIBCRC32C is not set
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/se73180_defconfig linux-2.6.17/arch/sh/configs/se73180_defconfig
+--- linux-2.6.17-vanilla/arch/sh/configs/se73180_defconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/se73180_defconfig 2006-07-12 16:54:21.000000000 +0000
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.11-sh
+-# Wed Mar 2 15:09:44 2005
++# Linux kernel version: 2.6.15-sh
++# Sun Jan 8 13:54:18 2006
+ #
+ CONFIG_SUPERH=y
+ CONFIG_UID16=y
+@@ -16,30 +16,35 @@
+ CONFIG_EXPERIMENTAL=y
+ CONFIG_CLEAN_COMPILE=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 is not set
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_SYSCTL is not set
+-# CONFIG_AUDIT is not set
+-CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_HOTPLUG is not set
+ # CONFIG_IKCONFIG is not set
++CONFIG_INITRAMFS_SOURCE=""
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_EMBEDDED=y
+ # CONFIG_KALLSYMS is not set
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_BASE_FULL=y
+ # CONFIG_FUTEX is not set
+ # CONFIG_EPOLL is not set
+-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_SHMEM=y
+ CONFIG_CC_ALIGN_FUNCTIONS=0
+ CONFIG_CC_ALIGN_LABELS=0
+ CONFIG_CC_ALIGN_LOOPS=0
+ CONFIG_CC_ALIGN_JUMPS=0
+ # CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
+
+ #
+ # Loadable module support
+@@ -52,6 +57,24 @@
+ # CONFIG_KMOD is not set
+
+ #
++# Block layer
++#
++# CONFIG_LBD is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++# CONFIG_IOSCHED_AS is not set
++# CONFIG_IOSCHED_DEADLINE is not set
++# CONFIG_IOSCHED_CFQ is not set
++# CONFIG_DEFAULT_AS is not set
++# CONFIG_DEFAULT_DEADLINE is not set
++# CONFIG_DEFAULT_CFQ is not set
++CONFIG_DEFAULT_NOOP=y
++CONFIG_DEFAULT_IOSCHED="noop"
++
++#
+ # System type
+ #
+ # CONFIG_SH_SOLUTION_ENGINE is not set
+@@ -61,9 +84,7 @@
+ # CONFIG_SH_7751_SYSTEMH is not set
+ # CONFIG_SH_STB1_HARP is not set
+ # CONFIG_SH_STB1_OVERDRIVE is not set
+-# CONFIG_SH_HP620 is not set
+-# CONFIG_SH_HP680 is not set
+-# CONFIG_SH_HP690 is not set
++# CONFIG_SH_HP6XX is not set
+ # CONFIG_SH_CQREEK is not set
+ # CONFIG_SH_DMIDA is not set
+ # CONFIG_SH_EC3104 is not set
+@@ -78,42 +99,95 @@
+ # CONFIG_SH_SECUREEDGE5410 is not set
+ # CONFIG_SH_HS7751RVOIP is not set
+ # CONFIG_SH_RTS7751R2D is not set
++# CONFIG_SH_R7780RP is not set
+ # CONFIG_SH_EDOSK7705 is not set
+ # CONFIG_SH_SH4202_MICRODEV is not set
++# CONFIG_SH_LANDISK is not set
++# CONFIG_SH_TITAN is not set
+ # CONFIG_SH_UNKNOWN is not set
+-# CONFIG_CPU_SH2 is not set
+-# CONFIG_CPU_SH3 is not set
++
++#
++# Processor selection
++#
+ CONFIG_CPU_SH4=y
++CONFIG_CPU_SH4A=y
++
++#
++# SH-2 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7604 is not set
++
++#
++# SH-3 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7300 is not set
+ # CONFIG_CPU_SUBTYPE_SH7705 is not set
+ # CONFIG_CPU_SUBTYPE_SH7707 is not set
+ # CONFIG_CPU_SUBTYPE_SH7708 is not set
+ # CONFIG_CPU_SUBTYPE_SH7709 is not set
++
++#
++# SH-4 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7750 is not set
++# CONFIG_CPU_SUBTYPE_SH7091 is not set
++# CONFIG_CPU_SUBTYPE_SH7750R is not set
++# CONFIG_CPU_SUBTYPE_SH7750S is not set
+ # CONFIG_CPU_SUBTYPE_SH7751 is not set
++# CONFIG_CPU_SUBTYPE_SH7751R is not set
+ # CONFIG_CPU_SUBTYPE_SH7760 is not set
+-CONFIG_CPU_SUBTYPE_SH73180=y
++# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# ST40 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_ST40STB1 is not set
+ # CONFIG_CPU_SUBTYPE_ST40GX1 is not set
+-# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# SH-4A Processor Support
++#
++CONFIG_CPU_SUBTYPE_SH73180=y
++# CONFIG_CPU_SUBTYPE_SH7770 is not set
++# CONFIG_CPU_SUBTYPE_SH7780 is not set
++
++#
++# Memory management options
++#
+ CONFIG_MMU=y
+-CONFIG_CMDLINE_BOOL=y
+-CONFIG_CMDLINE="console=ttySC0,38400 root=/dev/ram"
++CONFIG_32BIT=y
++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=4
++
++#
++# Cache configuration
++#
++# CONFIG_SH_DIRECT_MAPPED is not set
++# CONFIG_SH_WRITETHROUGH is not set
++# CONFIG_SH_OCRAM is not set
+ CONFIG_MEMORY_START=0x0c000000
+ CONFIG_MEMORY_SIZE=0x02000000
+-# CONFIG_MEMORY_OVERRIDE is not set
+-# CONFIG_SH_FPU is not set
+-CONFIG_ZERO_PAGE_OFFSET=0x00010000
+-CONFIG_BOOT_LINK_OFFSET=0x00800000
++
++#
++# Processor features
++#
+ CONFIG_CPU_LITTLE_ENDIAN=y
+-# CONFIG_PREEMPT is not set
+-# CONFIG_UBC_WAKEUP is not set
+-# CONFIG_SH_WRITETHROUGH is not set
+-# CONFIG_SH_OCRAM is not set
++# CONFIG_SH_FPU is not set
+ # CONFIG_SH_STORE_QUEUES is not set
+-# CONFIG_SMP is not set
+-# CONFIG_SH_PCLK_CALC is not set
++CONFIG_CPU_HAS_INTEVT=y
++CONFIG_CPU_HAS_SR_RB=y
++
++#
++# Timer support
++#
++CONFIG_SH_TMU=y
++CONFIG_SH_PCLK_FREQ_BOOL=y
+ CONFIG_SH_PCLK_FREQ=27000000
+
+ #
+@@ -133,18 +207,30 @@
+ CONFIG_HEARTBEAT=y
+
+ #
+-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
++# Kernel features
+ #
+-# CONFIG_PCI is not set
++# CONFIG_KEXEC is not set
++# CONFIG_PREEMPT is not set
++# CONFIG_SMP is not set
+
+ #
+-# PCCARD (PCMCIA/CardBus) support
++# Boot options
+ #
+-# CONFIG_PCCARD is not set
++CONFIG_ZERO_PAGE_OFFSET=0x00010000
++CONFIG_BOOT_LINK_OFFSET=0x00800000
++# CONFIG_UBC_WAKEUP is not set
++CONFIG_CMDLINE_BOOL=y
++CONFIG_CMDLINE="console=ttySC0,38400 root=/dev/ram"
++
++#
++# Bus options
++#
++# CONFIG_PCI is not set
+
+ #
+-# PC-card bridges
++# PCCARD (PCMCIA/CardBus) support
+ #
++# CONFIG_PCCARD is not set
+
+ #
+ # PCI Hotplug Support
+@@ -158,10 +244,9 @@
+ # CONFIG_BINFMT_MISC is not set
+
+ #
+-# SH initrd options
++# Networking
+ #
+-CONFIG_EMBEDDED_RAMDISK=y
+-CONFIG_EMBEDDED_RAMDISK_IMAGE="ramdisk.gz"
++# CONFIG_NET is not set
+
+ #
+ # Device Drivers
+@@ -175,6 +260,10 @@
+ # CONFIG_FW_LOADER is not set
+
+ #
++# Connector - unified userspace <-> kernelspace linker
++#
++
++#
+ # Memory Technology Devices (MTD)
+ #
+ # CONFIG_MTD is not set
+@@ -191,7 +280,6 @@
+ #
+ # Block devices
+ #
+-# CONFIG_BLK_DEV_FD is not set
+ # CONFIG_BLK_DEV_COW_COMMON is not set
+ CONFIG_BLK_DEV_LOOP=y
+ # CONFIG_BLK_DEV_CRYPTOLOOP is not set
+@@ -199,19 +287,9 @@
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=4096
+ CONFIG_BLK_DEV_INITRD=y
+-CONFIG_INITRAMFS_SOURCE=""
+-# CONFIG_LBD is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+
+ #
+-# IO Schedulers
+-#
+-CONFIG_IOSCHED_NOOP=y
+-# CONFIG_IOSCHED_AS is not set
+-# CONFIG_IOSCHED_DEADLINE is not set
+-# CONFIG_IOSCHED_CFQ is not set
+-
+-#
+ # ATA/ATAPI/MFM/RLL support
+ #
+ # CONFIG_IDE is not set
+@@ -219,6 +297,7 @@
+ #
+ # SCSI device support
+ #
++# CONFIG_RAID_ATTRS is not set
+ # CONFIG_SCSI is not set
+
+ #
+@@ -229,6 +308,7 @@
+ #
+ # Fusion MPT device support
+ #
++# CONFIG_FUSION is not set
+
+ #
+ # IEEE 1394 (FireWire) support
+@@ -239,9 +319,8 @@
+ #
+
+ #
+-# Networking support
++# Network device support
+ #
+-# CONFIG_NET is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+
+@@ -260,20 +339,10 @@
+ # CONFIG_INPUT is not set
+
+ #
+-# Userland interfaces
+-#
+-
+-#
+-# Input I/O drivers
++# Hardware I/O ports
+ #
+-# CONFIG_GAMEPORT is not set
+-CONFIG_SOUND_GAMEPORT=y
+ # CONFIG_SERIO is not set
+-# CONFIG_SERIO_I8042 is not set
+-
+-#
+-# Input Device Drivers
+-#
++# CONFIG_GAMEPORT is not set
+
+ #
+ # Character devices
+@@ -320,10 +389,15 @@
+ #
+ # Ftape, the floppy tape device driver
+ #
+-# CONFIG_DRM is not set
+ # CONFIG_RAW_DRIVER is not set
+
+ #
++# TPM devices
++#
++# CONFIG_TCG_TPM is not set
++# CONFIG_TELCLOCK is not set
++
++#
+ # I2C support
+ #
+ # CONFIG_I2C is not set
+@@ -334,10 +408,21 @@
+ # CONFIG_W1 is not set
+
+ #
++# Hardware Monitoring support
++#
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++# CONFIG_HWMON_DEBUG_CHIP is not set
++
++#
+ # Misc devices
+ #
+
+ #
++# Multimedia Capabilities Port drivers
++#
++
++#
+ # Multimedia devices
+ #
+ # CONFIG_VIDEO_DEV is not set
+@@ -363,7 +448,7 @@
+ # CONFIG_USB_ARCH_HAS_OHCI is not set
+
+ #
+-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+@@ -379,28 +464,31 @@
+ #
+ # InfiniBand support
+ #
+-# CONFIG_INFINIBAND is not set
++
++#
++# SN Devices
++#
+
+ #
+ # File systems
+ #
+ CONFIG_EXT2_FS=y
+ # CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
+ # CONFIG_EXT3_FS is not set
+ # CONFIG_JBD is not set
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+-
+-#
+-# XFS support
+-#
++# CONFIG_FS_POSIX_ACL is not set
+ # CONFIG_XFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+ # CONFIG_ROMFS_FS is not set
++CONFIG_INOTIFY=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
+@@ -421,14 +509,11 @@
+ CONFIG_PROC_FS=y
+ CONFIG_PROC_KCORE=y
+ # CONFIG_SYSFS is not set
+-CONFIG_DEVFS_FS=y
+-CONFIG_DEVFS_MOUNT=y
+-# CONFIG_DEVFS_DEBUG is not set
+ CONFIG_TMPFS=y
+-# CONFIG_TMPFS_XATTR is not set
+ # CONFIG_HUGETLBFS is not set
+ # CONFIG_HUGETLB_PAGE is not set
+ CONFIG_RAMFS=y
++# CONFIG_RELAYFS_FS is not set
+
+ #
+ # Miscellaneous filesystems
+@@ -466,7 +551,9 @@
+ #
+ # Kernel hacking
+ #
++# CONFIG_PRINTK_TIME is not set
+ # CONFIG_DEBUG_KERNEL is not set
++CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_FRAME_POINTER is not set
+ CONFIG_SH_STANDARD_BIOS=y
+ # CONFIG_EARLY_SCIF_CONSOLE is not set
+@@ -477,7 +564,6 @@
+ # Security options
+ #
+ # CONFIG_KEYS is not set
+-# CONFIG_SECURITY is not set
+
+ #
+ # Cryptographic options
+@@ -492,5 +578,6 @@
+ # Library routines
+ #
+ # CONFIG_CRC_CCITT is not set
++# CONFIG_CRC16 is not set
+ CONFIG_CRC32=y
+ # CONFIG_LIBCRC32C is not set
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/se7705_defconfig linux-2.6.17/arch/sh/configs/se7705_defconfig
+--- linux-2.6.17-vanilla/arch/sh/configs/se7705_defconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/se7705_defconfig 2006-07-12 16:54:21.000000000 +0000
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.11-sh
+-# Wed Mar 2 15:09:45 2005
++# Linux kernel version: 2.6.15-sh
++# Wed Jan 4 19:35:13 2006
+ #
+ CONFIG_SUPERH=y
+ CONFIG_UID16=y
+@@ -17,32 +17,38 @@
+ CONFIG_CLEAN_COMPILE=y
+ CONFIG_BROKEN_ON_SMP=y
+ CONFIG_LOCK_KERNEL=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
+
+ #
+ # General setup
+ #
+ CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
+ # CONFIG_SWAP is not set
+ # CONFIG_SYSVIPC is not set
+ # CONFIG_POSIX_MQUEUE is not set
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_SYSCTL is not set
+ # CONFIG_AUDIT is not set
+-CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_HOTPLUG is not set
+ CONFIG_KOBJECT_UEVENT=y
+ # CONFIG_IKCONFIG is not set
++CONFIG_INITRAMFS_SOURCE=""
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_EMBEDDED=y
+ # CONFIG_KALLSYMS is not set
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_EPOLL=y
+-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_SHMEM=y
+ CONFIG_CC_ALIGN_FUNCTIONS=0
+ CONFIG_CC_ALIGN_LABELS=0
+ CONFIG_CC_ALIGN_LOOPS=0
+ CONFIG_CC_ALIGN_JUMPS=0
+ # CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
+
+ #
+ # Loadable module support
+@@ -55,6 +61,24 @@
+ CONFIG_KMOD=y
+
+ #
++# Block layer
++#
++# CONFIG_LBD is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_AS=y
++# CONFIG_IOSCHED_DEADLINE is not set
++# CONFIG_IOSCHED_CFQ is not set
++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_SH_SOLUTION_ENGINE=y
+@@ -64,9 +88,7 @@
+ # CONFIG_SH_7751_SYSTEMH is not set
+ # CONFIG_SH_STB1_HARP is not set
+ # CONFIG_SH_STB1_OVERDRIVE is not set
+-# CONFIG_SH_HP620 is not set
+-# CONFIG_SH_HP680 is not set
+-# CONFIG_SH_HP690 is not set
++# CONFIG_SH_HP6XX is not set
+ # CONFIG_SH_CQREEK is not set
+ # CONFIG_SH_DMIDA is not set
+ # CONFIG_SH_EC3104 is not set
+@@ -83,44 +105,91 @@
+ # CONFIG_SH_RTS7751R2D is not set
+ # CONFIG_SH_EDOSK7705 is not set
+ # CONFIG_SH_SH4202_MICRODEV is not set
++# CONFIG_SH_LANDISK is not set
++# CONFIG_SH_TITAN is not set
+ # CONFIG_SH_UNKNOWN is not set
+-# CONFIG_CPU_SH2 is not set
++
++#
++# Processor selection
++#
+ CONFIG_CPU_SH3=y
+-# CONFIG_CPU_SH4 is not set
++
++#
++# SH-2 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7604 is not set
++
++#
++# SH-3 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7300 is not set
+ CONFIG_CPU_SUBTYPE_SH7705=y
+ # CONFIG_CPU_SUBTYPE_SH7707 is not set
+ # CONFIG_CPU_SUBTYPE_SH7708 is not set
+ # CONFIG_CPU_SUBTYPE_SH7709 is not set
++
++#
++# SH-4 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7750 is not set
++# CONFIG_CPU_SUBTYPE_SH7091 is not set
++# CONFIG_CPU_SUBTYPE_SH7750R is not set
++# CONFIG_CPU_SUBTYPE_SH7750S is not set
+ # CONFIG_CPU_SUBTYPE_SH7751 is not set
++# CONFIG_CPU_SUBTYPE_SH7751R is not set
+ # CONFIG_CPU_SUBTYPE_SH7760 is not set
+-# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# ST40 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_ST40STB1 is not set
+ # CONFIG_CPU_SUBTYPE_ST40GX1 is not set
+-# CONFIG_CPU_SUBTYPE_SH4_202 is not set
+-CONFIG_SH7705_CACHE_32KB=y
++
++#
++# SH-4A Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH7770 is not set
++# CONFIG_CPU_SUBTYPE_SH7780 is not set
++
++#
++# Memory management options
++#
+ CONFIG_MMU=y
+-# CONFIG_CMDLINE_BOOL 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=4
++
++#
++# Cache configuration
++#
++CONFIG_SH7705_CACHE_32KB=y
++# CONFIG_SH_DIRECT_MAPPED is not set
++# CONFIG_SH_WRITETHROUGH is not set
++# CONFIG_SH_OCRAM is not set
+ CONFIG_MEMORY_START=0x0c000000
+ CONFIG_MEMORY_SIZE=0x02000000
+-CONFIG_MEMORY_SET=y
+-# CONFIG_MEMORY_OVERRIDE is not set
+ # CONFIG_CF_ENABLER is not set
++
++#
++# Processor features
++#
++CONFIG_CPU_LITTLE_ENDIAN=y
+ CONFIG_SH_RTC=y
+ # CONFIG_SH_DSP is not set
+ # CONFIG_SH_ADC is not set
+-CONFIG_ZERO_PAGE_OFFSET=0x00001000
+-CONFIG_BOOT_LINK_OFFSET=0x00800000
+-CONFIG_CPU_LITTLE_ENDIAN=y
+-CONFIG_PREEMPT=y
+-# CONFIG_UBC_WAKEUP is not set
+-# CONFIG_SH_WRITETHROUGH is not set
+-# CONFIG_SH_OCRAM is not set
+-# CONFIG_SMP is not set
+-CONFIG_SH_PCLK_CALC=y
+-CONFIG_SH_PCLK_FREQ=33333333
++
++#
++# Timer support
++#
++CONFIG_SH_TMU=y
++# CONFIG_SH_PCLK_FREQ_BOOL is not set
+
+ #
+ # CPU Frequency scaling
+@@ -139,18 +208,29 @@
+ CONFIG_HEARTBEAT=y
+
+ #
+-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
++# Kernel features
+ #
+-# CONFIG_PCI is not set
++# CONFIG_KEXEC is not set
++CONFIG_PREEMPT=y
++# CONFIG_SMP is not set
+
+ #
+-# PCCARD (PCMCIA/CardBus) support
++# Boot options
+ #
+-# CONFIG_PCCARD is not set
++CONFIG_ZERO_PAGE_OFFSET=0x00001000
++CONFIG_BOOT_LINK_OFFSET=0x00800000
++# CONFIG_UBC_WAKEUP is not set
++# CONFIG_CMDLINE_BOOL is not set
++
++#
++# Bus options
++#
++# CONFIG_PCI is not set
+
+ #
+-# PC-card bridges
++# PCCARD (PCMCIA/CardBus) support
+ #
++# CONFIG_PCCARD is not set
+
+ #
+ # PCI Hotplug Support
+@@ -164,9 +244,75 @@
+ # CONFIG_BINFMT_MISC is not set
+
+ #
+-# SH initrd options
++# Networking
+ #
+-# CONFIG_EMBEDDED_RAMDISK is not set
++CONFIG_NET=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++# CONFIG_PACKET_MMAP is not set
++CONFIG_UNIX=y
++# 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=y
++# 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_TUNNEL is not set
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_BIC=y
++# CONFIG_IPV6 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
++# 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_NET_DIVERT 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
+@@ -180,12 +326,17 @@
+ # CONFIG_FW_LOADER 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_PARTITIONS=y
+ # CONFIG_MTD_CONCAT is not set
++CONFIG_MTD_PARTITIONS=y
+ # CONFIG_MTD_REDBOOT_PARTS is not set
+ # CONFIG_MTD_CMDLINE_PARTS is not set
+
+@@ -197,6 +348,7 @@
+ # CONFIG_FTL is not set
+ # CONFIG_NFTL is not set
+ # CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
+
+ #
+ # RAM/ROM/Flash chip drivers
+@@ -231,8 +383,7 @@
+ # CONFIG_MTD_PHYSMAP is not set
+ CONFIG_MTD_SOLUTIONENGINE=y
+ CONFIG_MTD_SUPERH_RESERVE=0x300000
+-# CONFIG_MTD_MPC1211 is not set
+-# CONFIG_MTD_RTS7751R2D is not set
++# CONFIG_MTD_PLATRAM is not set
+
+ #
+ # Self-contained MTD device drivers
+@@ -256,6 +407,11 @@
+ # CONFIG_MTD_NAND is not set
+
+ #
++# OneNAND Flash Device Drivers
++#
++# CONFIG_MTD_ONENAND is not set
++
++#
+ # Parallel port support
+ #
+ # CONFIG_PARPORT is not set
+@@ -267,7 +423,6 @@
+ #
+ # Block devices
+ #
+-# CONFIG_BLK_DEV_FD is not set
+ # CONFIG_BLK_DEV_COW_COMMON is not set
+ # CONFIG_BLK_DEV_LOOP is not set
+ # CONFIG_BLK_DEV_NBD is not set
+@@ -275,17 +430,7 @@
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=8192
+ CONFIG_BLK_DEV_INITRD=y
+-CONFIG_INITRAMFS_SOURCE=""
+-# CONFIG_LBD is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+-
+-#
+-# IO Schedulers
+-#
+-CONFIG_IOSCHED_NOOP=y
+-CONFIG_IOSCHED_AS=y
+-# CONFIG_IOSCHED_DEADLINE is not set
+-# CONFIG_IOSCHED_CFQ is not set
+ # CONFIG_ATA_OVER_ETH is not set
+
+ #
+@@ -296,6 +441,7 @@
+ #
+ # SCSI device support
+ #
++# CONFIG_RAID_ATTRS is not set
+ # CONFIG_SCSI is not set
+
+ #
+@@ -306,6 +452,7 @@
+ #
+ # Fusion MPT device support
+ #
++# CONFIG_FUSION is not set
+
+ #
+ # IEEE 1394 (FireWire) support
+@@ -316,70 +463,8 @@
+ #
+
+ #
+-# Networking support
+-#
+-CONFIG_NET=y
+-
+-#
+-# Networking options
+-#
+-CONFIG_PACKET=y
+-# CONFIG_PACKET_MMAP is not set
+-# CONFIG_NETLINK_DEV is not set
+-CONFIG_UNIX=y
+-# CONFIG_NET_KEY is not set
+-CONFIG_INET=y
+-# CONFIG_IP_MULTICAST is not set
+-# CONFIG_IP_ADVANCED_ROUTER is not set
+-CONFIG_IP_PNP=y
+-CONFIG_IP_PNP_DHCP=y
+-CONFIG_IP_PNP_BOOTP=y
+-CONFIG_IP_PNP_RARP=y
+-# 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_TUNNEL is not set
+-CONFIG_IP_TCPDIAG=y
+-# CONFIG_IP_TCPDIAG_IPV6 is not set
+-# CONFIG_IPV6 is not set
+-# CONFIG_NETFILTER is not set
+-
+-#
+-# SCTP Configuration (EXPERIMENTAL)
+-#
+-# CONFIG_IP_SCTP 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_NET_DIVERT 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
+-# CONFIG_NET_CLS_ROUTE is not set
+-
+-#
+-# Network testing
++# Network device support
+ #
+-# CONFIG_NET_PKTGEN is not set
+-# CONFIG_NETPOLL is not set
+-# CONFIG_NET_POLL_CONTROLLER is not set
+-# CONFIG_HAMRADIO is not set
+-# CONFIG_IRDA is not set
+-# CONFIG_BT is not set
+ CONFIG_NETDEVICES=y
+ # CONFIG_DUMMY is not set
+ # CONFIG_BONDING is not set
+@@ -387,12 +472,18 @@
+ # CONFIG_TUN is not set
+
+ #
++# PHY device support
++#
++# CONFIG_PHYLIB is not set
++
++#
+ # Ethernet (10 or 100Mbit)
+ #
+ CONFIG_NET_ETHERNET=y
+ # CONFIG_MII is not set
+ CONFIG_STNIC=y
+ # CONFIG_SMC91X is not set
++# CONFIG_NE2000 is not set
+
+ #
+ # Ethernet (1000 Mbit)
+@@ -422,10 +513,13 @@
+ # CONFIG_PPP_SYNC_TTY is not set
+ CONFIG_PPP_DEFLATE=y
+ # CONFIG_PPP_BSDCOMP is not set
++# CONFIG_PPP_MPPE is not set
+ # CONFIG_PPPOE 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
+@@ -452,18 +546,6 @@
+ # CONFIG_INPUT_EVBUG is not set
+
+ #
+-# Input I/O drivers
+-#
+-# CONFIG_GAMEPORT is not set
+-CONFIG_SOUND_GAMEPORT=y
+-CONFIG_SERIO=y
+-# CONFIG_SERIO_I8042 is not set
+-# CONFIG_SERIO_SERPORT is not set
+-# CONFIG_SERIO_CT82C710 is not set
+-# CONFIG_SERIO_LIBPS2 is not set
+-# CONFIG_SERIO_RAW is not set
+-
+-#
+ # Input Device Drivers
+ #
+ # CONFIG_INPUT_KEYBOARD is not set
+@@ -473,6 +555,16 @@
+ # CONFIG_INPUT_MISC is not set
+
+ #
++# Hardware I/O ports
++#
++CONFIG_SERIO=y
++# CONFIG_SERIO_I8042 is not set
++# CONFIG_SERIO_SERPORT is not set
++# CONFIG_SERIO_LIBPS2 is not set
++# CONFIG_SERIO_RAW is not set
++# CONFIG_GAMEPORT is not set
++
++#
+ # Character devices
+ #
+ # CONFIG_VT is not set
+@@ -510,10 +602,15 @@
+ #
+ # Ftape, the floppy tape device driver
+ #
+-# CONFIG_DRM is not set
+ # CONFIG_RAW_DRIVER is not set
+
+ #
++# TPM devices
++#
++# CONFIG_TCG_TPM is not set
++# CONFIG_TELCLOCK is not set
++
++#
+ # I2C support
+ #
+ # CONFIG_I2C is not set
+@@ -524,10 +621,21 @@
+ # CONFIG_W1 is not set
+
+ #
++# Hardware Monitoring support
++#
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++# CONFIG_HWMON_DEBUG_CHIP is not set
++
++#
+ # Misc devices
+ #
+
+ #
++# Multimedia Capabilities Port drivers
++#
++
++#
+ # Multimedia devices
+ #
+ # CONFIG_VIDEO_DEV is not set
+@@ -554,7 +662,7 @@
+ # CONFIG_USB_ARCH_HAS_OHCI is not set
+
+ #
+-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+@@ -570,28 +678,31 @@
+ #
+ # InfiniBand support
+ #
+-# CONFIG_INFINIBAND is not set
++
++#
++# SN Devices
++#
+
+ #
+ # File systems
+ #
+ CONFIG_EXT2_FS=y
+ # CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
+ # CONFIG_EXT3_FS is not set
+ # CONFIG_JBD is not set
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+-
+-#
+-# XFS support
+-#
++# CONFIG_FS_POSIX_ACL is not set
+ # CONFIG_XFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+ # CONFIG_ROMFS_FS is not set
++CONFIG_INOTIFY=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
+@@ -612,12 +723,11 @@
+ CONFIG_PROC_FS=y
+ CONFIG_PROC_KCORE=y
+ # CONFIG_SYSFS is not set
+-# CONFIG_DEVFS_FS is not set
+-# CONFIG_DEVPTS_FS_XATTR is not set
+ # CONFIG_TMPFS is not set
+ # CONFIG_HUGETLBFS is not set
+ # CONFIG_HUGETLB_PAGE is not set
+ CONFIG_RAMFS=y
++# CONFIG_RELAYFS_FS is not set
+
+ #
+ # Miscellaneous filesystems
+@@ -632,8 +742,8 @@
+ # CONFIG_JFFS_FS is not set
+ CONFIG_JFFS2_FS=y
+ CONFIG_JFFS2_FS_DEBUG=0
+-# CONFIG_JFFS2_FS_NAND is not set
+-# CONFIG_JFFS2_FS_NOR_ECC is not set
++CONFIG_JFFS2_FS_WRITEBUFFER=y
++# CONFIG_JFFS2_SUMMARY is not set
+ # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+ CONFIG_JFFS2_ZLIB=y
+ CONFIG_JFFS2_RTIME=y
+@@ -655,6 +765,7 @@
+ # 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
+@@ -663,6 +774,7 @@
+ # 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
+@@ -683,8 +795,9 @@
+ #
+ # Kernel hacking
+ #
++# CONFIG_PRINTK_TIME is not set
+ # CONFIG_DEBUG_KERNEL is not set
+-CONFIG_DEBUG_PREEMPT=y
++CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_FRAME_POINTER is not set
+ # CONFIG_SH_STANDARD_BIOS is not set
+ # CONFIG_KGDB is not set
+@@ -693,7 +806,6 @@
+ # Security options
+ #
+ # CONFIG_KEYS is not set
+-# CONFIG_SECURITY is not set
+
+ #
+ # Cryptographic options
+@@ -708,6 +820,7 @@
+ # Library routines
+ #
+ CONFIG_CRC_CCITT=y
++# CONFIG_CRC16 is not set
+ CONFIG_CRC32=y
+ # CONFIG_LIBCRC32C is not set
+ CONFIG_ZLIB_INFLATE=y
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/se7750_defconfig linux-2.6.17/arch/sh/configs/se7750_defconfig
+--- linux-2.6.17-vanilla/arch/sh/configs/se7750_defconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/se7750_defconfig 2006-07-12 16:54:21.000000000 +0000
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.11-sh
+-# Wed Mar 2 15:09:46 2005
++# Linux kernel version: 2.6.15-sh
++# Wed Jan 4 19:57:15 2006
+ #
+ CONFIG_SUPERH=y
+ CONFIG_UID16=y
+@@ -16,11 +16,13 @@
+ CONFIG_EXPERIMENTAL=y
+ CONFIG_CLEAN_COMPILE=y
+ CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
+
+ #
+ # General setup
+ #
+ CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
+ # CONFIG_SWAP is not set
+ CONFIG_SYSVIPC=y
+ # CONFIG_POSIX_MQUEUE is not set
+@@ -28,23 +30,27 @@
+ # CONFIG_BSD_PROCESS_ACCT_V3 is not set
+ CONFIG_SYSCTL=y
+ # CONFIG_AUDIT is not set
+-CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_HOTPLUG is not set
+ CONFIG_KOBJECT_UEVENT=y
+ CONFIG_IKCONFIG=y
+ CONFIG_IKCONFIG_PROC=y
++CONFIG_INITRAMFS_SOURCE=""
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_EMBEDDED=y
+ CONFIG_KALLSYMS=y
+ # CONFIG_KALLSYMS_EXTRA_PASS is not set
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_EPOLL=y
+-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_SHMEM=y
+ CONFIG_CC_ALIGN_FUNCTIONS=0
+ CONFIG_CC_ALIGN_LABELS=0
+ CONFIG_CC_ALIGN_LOOPS=0
+ CONFIG_CC_ALIGN_JUMPS=0
+ # CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
+
+ #
+ # Loadable module support
+@@ -57,6 +63,24 @@
+ CONFIG_KMOD=y
+
+ #
++# Block layer
++#
++# CONFIG_LBD 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_SH_SOLUTION_ENGINE=y
+@@ -66,9 +90,7 @@
+ # CONFIG_SH_7751_SYSTEMH is not set
+ # CONFIG_SH_STB1_HARP is not set
+ # CONFIG_SH_STB1_OVERDRIVE is not set
+-# CONFIG_SH_HP620 is not set
+-# CONFIG_SH_HP680 is not set
+-# CONFIG_SH_HP690 is not set
++# CONFIG_SH_HP6XX is not set
+ # CONFIG_SH_CQREEK is not set
+ # CONFIG_SH_DMIDA is not set
+ # CONFIG_SH_EC3104 is not set
+@@ -85,47 +107,93 @@
+ # CONFIG_SH_RTS7751R2D is not set
+ # CONFIG_SH_EDOSK7705 is not set
+ # CONFIG_SH_SH4202_MICRODEV is not set
++# CONFIG_SH_LANDISK is not set
++# CONFIG_SH_TITAN is not set
+ # CONFIG_SH_UNKNOWN is not set
+-# CONFIG_CPU_SH2 is not set
+-# CONFIG_CPU_SH3 is not set
++
++#
++# Processor selection
++#
+ CONFIG_CPU_SH4=y
++
++#
++# SH-2 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7604 is not set
++
++#
++# SH-3 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7300 is not set
+ # CONFIG_CPU_SUBTYPE_SH7705 is not set
+ # CONFIG_CPU_SUBTYPE_SH7707 is not set
+ # CONFIG_CPU_SUBTYPE_SH7708 is not set
+ # CONFIG_CPU_SUBTYPE_SH7709 is not set
++
++#
++# SH-4 Processor Support
++#
+ CONFIG_CPU_SUBTYPE_SH7750=y
++# CONFIG_CPU_SUBTYPE_SH7091 is not set
++# CONFIG_CPU_SUBTYPE_SH7750R is not set
++# CONFIG_CPU_SUBTYPE_SH7750S is not set
+ # CONFIG_CPU_SUBTYPE_SH7751 is not set
++# CONFIG_CPU_SUBTYPE_SH7751R is not set
+ # CONFIG_CPU_SUBTYPE_SH7760 is not set
+-# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# ST40 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_ST40STB1 is not set
+ # CONFIG_CPU_SUBTYPE_ST40GX1 is not set
+-# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# SH-4A Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH7770 is not set
++# CONFIG_CPU_SUBTYPE_SH7780 is not set
++
++#
++# Memory management options
++#
+ CONFIG_MMU=y
+-CONFIG_CMDLINE_BOOL=y
+-CONFIG_CMDLINE="console=ttySC1,38400 root=/dev/nfs ip=bootp"
++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=4
++
++#
++# Cache configuration
++#
++# CONFIG_SH_DIRECT_MAPPED is not set
++# CONFIG_SH_WRITETHROUGH is not set
++# CONFIG_SH_OCRAM is not set
+ CONFIG_MEMORY_START=0x0c000000
+ CONFIG_MEMORY_SIZE=0x02000000
+-CONFIG_MEMORY_SET=y
+-# CONFIG_MEMORY_OVERRIDE is not set
+ CONFIG_CF_ENABLER=y
+ # CONFIG_CF_AREA5 is not set
+ CONFIG_CF_AREA6=y
+ CONFIG_CF_BASE_ADDR=0xb8000000
++
++#
++# Processor features
++#
++CONFIG_CPU_LITTLE_ENDIAN=y
+ CONFIG_SH_RTC=y
+ CONFIG_SH_FPU=y
+-CONFIG_ZERO_PAGE_OFFSET=0x00001000
+-CONFIG_BOOT_LINK_OFFSET=0x00800000
+-CONFIG_CPU_LITTLE_ENDIAN=y
+-# CONFIG_PREEMPT is not set
+-# CONFIG_UBC_WAKEUP is not set
+-# CONFIG_SH_WRITETHROUGH is not set
+-# CONFIG_SH_OCRAM is not set
+ # CONFIG_SH_STORE_QUEUES is not set
+-# CONFIG_SMP is not set
+-CONFIG_SH_PCLK_CALC=y
+-CONFIG_SH_PCLK_FREQ=49876504
++
++#
++# Timer support
++#
++CONFIG_SH_TMU=y
++# CONFIG_SH_PCLK_FREQ_BOOL is not set
+
+ #
+ # CPU Frequency scaling
+@@ -144,18 +212,30 @@
+ CONFIG_HEARTBEAT=y
+
+ #
+-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
++# Kernel features
+ #
+-# CONFIG_PCI is not set
++# CONFIG_KEXEC is not set
++# CONFIG_PREEMPT is not set
++# CONFIG_SMP is not set
+
+ #
+-# PCCARD (PCMCIA/CardBus) support
++# Boot options
+ #
+-# CONFIG_PCCARD is not set
++CONFIG_ZERO_PAGE_OFFSET=0x00001000
++CONFIG_BOOT_LINK_OFFSET=0x00800000
++# CONFIG_UBC_WAKEUP is not set
++CONFIG_CMDLINE_BOOL=y
++CONFIG_CMDLINE="console=ttySC1,38400 root=/dev/nfs ip=bootp"
+
+ #
+-# PC-card bridges
++# Bus options
+ #
++# CONFIG_PCI is not set
++
++#
++# PCCARD (PCMCIA/CardBus) support
++#
++# CONFIG_PCCARD is not set
+
+ #
+ # PCI Hotplug Support
+@@ -169,6 +249,78 @@
+ # CONFIG_BINFMT_MISC is not set
+
+ #
++# Networking
++#
++CONFIG_NET=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++# CONFIG_PACKET_MMAP is not set
++CONFIG_UNIX=y
++# CONFIG_NET_KEY is not set
++CONFIG_INET=y
++CONFIG_IP_MULTICAST=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_BOOTP=y
++# CONFIG_IP_PNP_RARP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE is not set
++# CONFIG_IP_MROUTE 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_TUNNEL is not set
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_BIC=y
++# CONFIG_IPV6 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
++# 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_NET_DIVERT 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
+ #
+
+@@ -180,12 +332,17 @@
+ # CONFIG_FW_LOADER 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_PARTITIONS=y
+ # CONFIG_MTD_CONCAT is not set
++CONFIG_MTD_PARTITIONS=y
+ # CONFIG_MTD_REDBOOT_PARTS is not set
+ # CONFIG_MTD_CMDLINE_PARTS is not set
+
+@@ -197,6 +354,7 @@
+ # CONFIG_FTL is not set
+ # CONFIG_NFTL is not set
+ # CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
+
+ #
+ # RAM/ROM/Flash chip drivers
+@@ -231,8 +389,7 @@
+ # CONFIG_MTD_PHYSMAP is not set
+ CONFIG_MTD_SOLUTIONENGINE=y
+ CONFIG_MTD_SUPERH_RESERVE=0x00010000
+-# CONFIG_MTD_MPC1211 is not set
+-# CONFIG_MTD_RTS7751R2D is not set
++# CONFIG_MTD_PLATRAM is not set
+
+ #
+ # Self-contained MTD device drivers
+@@ -256,6 +413,11 @@
+ # CONFIG_MTD_NAND is not set
+
+ #
++# OneNAND Flash Device Drivers
++#
++# CONFIG_MTD_ONENAND is not set
++
++#
+ # Parallel port support
+ #
+ # CONFIG_PARPORT is not set
+@@ -267,23 +429,12 @@
+ #
+ # Block devices
+ #
+-# CONFIG_BLK_DEV_FD is not set
+ # CONFIG_BLK_DEV_COW_COMMON is not set
+ # CONFIG_BLK_DEV_LOOP is not set
+ # CONFIG_BLK_DEV_NBD is not set
+ # CONFIG_BLK_DEV_RAM is not set
+ CONFIG_BLK_DEV_RAM_COUNT=16
+-CONFIG_INITRAMFS_SOURCE=""
+-# CONFIG_LBD is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+-
+-#
+-# IO Schedulers
+-#
+-CONFIG_IOSCHED_NOOP=y
+-CONFIG_IOSCHED_AS=y
+-CONFIG_IOSCHED_DEADLINE=y
+-CONFIG_IOSCHED_CFQ=y
+ # CONFIG_ATA_OVER_ETH is not set
+
+ #
+@@ -294,6 +445,7 @@
+ #
+ # SCSI device support
+ #
++# CONFIG_RAID_ATTRS is not set
+ # CONFIG_SCSI is not set
+
+ #
+@@ -304,6 +456,7 @@
+ #
+ # Fusion MPT device support
+ #
++# CONFIG_FUSION is not set
+
+ #
+ # IEEE 1394 (FireWire) support
+@@ -314,71 +467,8 @@
+ #
+
+ #
+-# Networking support
+-#
+-CONFIG_NET=y
+-
+-#
+-# Networking options
+-#
+-CONFIG_PACKET=y
+-# CONFIG_PACKET_MMAP is not set
+-# CONFIG_NETLINK_DEV is not set
+-CONFIG_UNIX=y
+-# CONFIG_NET_KEY is not set
+-CONFIG_INET=y
+-CONFIG_IP_MULTICAST=y
+-# CONFIG_IP_ADVANCED_ROUTER is not set
+-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_IP_MROUTE 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_TUNNEL is not set
+-CONFIG_IP_TCPDIAG=y
+-# CONFIG_IP_TCPDIAG_IPV6 is not set
+-# CONFIG_IPV6 is not set
+-# CONFIG_NETFILTER is not set
+-
+-#
+-# SCTP Configuration (EXPERIMENTAL)
+-#
+-# CONFIG_IP_SCTP 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_NET_DIVERT is not set
+-# CONFIG_ECONET is not set
+-# CONFIG_WAN_ROUTER is not set
+-
+-#
+-# QoS and/or fair queueing
++# Network device support
+ #
+-# CONFIG_NET_SCHED is not set
+-# CONFIG_NET_CLS_ROUTE is not set
+-
+-#
+-# Network testing
+-#
+-# CONFIG_NET_PKTGEN is not set
+-# CONFIG_NETPOLL is not set
+-# CONFIG_NET_POLL_CONTROLLER is not set
+-# CONFIG_HAMRADIO is not set
+-# CONFIG_IRDA is not set
+-# CONFIG_BT is not set
+ CONFIG_NETDEVICES=y
+ # CONFIG_DUMMY is not set
+ # CONFIG_BONDING is not set
+@@ -386,12 +476,18 @@
+ # CONFIG_TUN is not set
+
+ #
++# PHY device support
++#
++# CONFIG_PHYLIB is not set
++
++#
+ # Ethernet (10 or 100Mbit)
+ #
+ CONFIG_NET_ETHERNET=y
+ # CONFIG_MII is not set
+ CONFIG_STNIC=y
+ # CONFIG_SMC91X is not set
++# CONFIG_NE2000 is not set
+
+ #
+ # Ethernet (1000 Mbit)
+@@ -418,6 +514,8 @@
+ # 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
+@@ -435,20 +533,10 @@
+ # CONFIG_INPUT is not set
+
+ #
+-# Userland interfaces
+-#
+-
+-#
+-# Input I/O drivers
++# Hardware I/O ports
+ #
+-# CONFIG_GAMEPORT is not set
+-CONFIG_SOUND_GAMEPORT=y
+ # CONFIG_SERIO is not set
+-# CONFIG_SERIO_I8042 is not set
+-
+-#
+-# Input Device Drivers
+-#
++# CONFIG_GAMEPORT is not set
+
+ #
+ # Character devices
+@@ -499,10 +587,15 @@
+ #
+ # Ftape, the floppy tape device driver
+ #
+-# CONFIG_DRM is not set
+ # CONFIG_RAW_DRIVER is not set
+
+ #
++# TPM devices
++#
++# CONFIG_TCG_TPM is not set
++# CONFIG_TELCLOCK is not set
++
++#
+ # I2C support
+ #
+ # CONFIG_I2C is not set
+@@ -513,10 +606,21 @@
+ # CONFIG_W1 is not set
+
+ #
++# Hardware Monitoring support
++#
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++# CONFIG_HWMON_DEBUG_CHIP is not set
++
++#
+ # Misc devices
+ #
+
+ #
++# Multimedia Capabilities Port drivers
++#
++
++#
+ # Multimedia devices
+ #
+ # CONFIG_VIDEO_DEV is not set
+@@ -543,7 +647,7 @@
+ # CONFIG_USB_ARCH_HAS_OHCI is not set
+
+ #
+-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+@@ -559,7 +663,10 @@
+ #
+ # InfiniBand support
+ #
+-# CONFIG_INFINIBAND is not set
++
++#
++# SN Devices
++#
+
+ #
+ # File systems
+@@ -569,17 +676,16 @@
+ # CONFIG_JBD is not set
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+-
+-#
+-# XFS support
+-#
++# CONFIG_FS_POSIX_ACL is not set
+ # CONFIG_XFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+ # CONFIG_ROMFS_FS is not set
++CONFIG_INOTIFY=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
+@@ -600,13 +706,11 @@
+ CONFIG_PROC_FS=y
+ CONFIG_PROC_KCORE=y
+ CONFIG_SYSFS=y
+-# CONFIG_DEVFS_FS is not set
+-# CONFIG_DEVPTS_FS_XATTR is not set
+ CONFIG_TMPFS=y
+-# CONFIG_TMPFS_XATTR is not set
+ # CONFIG_HUGETLBFS is not set
+ # CONFIG_HUGETLB_PAGE is not set
+ CONFIG_RAMFS=y
++# CONFIG_RELAYFS_FS is not set
+
+ #
+ # Miscellaneous filesystems
+@@ -621,8 +725,8 @@
+ # CONFIG_JFFS_FS is not set
+ CONFIG_JFFS2_FS=y
+ CONFIG_JFFS2_FS_DEBUG=0
+-# CONFIG_JFFS2_FS_NAND is not set
+-# CONFIG_JFFS2_FS_NOR_ECC is not set
++CONFIG_JFFS2_FS_WRITEBUFFER=y
++# CONFIG_JFFS2_SUMMARY is not set
+ # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+ CONFIG_JFFS2_ZLIB=y
+ CONFIG_JFFS2_RTIME=y
+@@ -644,6 +748,7 @@
+ # 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
+@@ -652,6 +757,7 @@
+ # 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
+@@ -682,7 +788,9 @@
+ #
+ # Kernel hacking
+ #
++# CONFIG_PRINTK_TIME is not set
+ # CONFIG_DEBUG_KERNEL is not set
++CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_FRAME_POINTER is not set
+ # CONFIG_SH_STANDARD_BIOS is not set
+ # CONFIG_EARLY_SCIF_CONSOLE is not set
+@@ -707,6 +815,7 @@
+ # 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
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/se7751_defconfig linux-2.6.17/arch/sh/configs/se7751_defconfig
+--- linux-2.6.17-vanilla/arch/sh/configs/se7751_defconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/se7751_defconfig 2006-07-12 16:54:21.000000000 +0000
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.11-sh
+-# Wed Mar 2 15:09:48 2005
++# Linux kernel version: 2.6.15-sh
++# Wed Jan 4 20:02:38 2006
+ #
+ CONFIG_SUPERH=y
+ CONFIG_UID16=y
+@@ -16,11 +16,13 @@
+ CONFIG_EXPERIMENTAL=y
+ CONFIG_CLEAN_COMPILE=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_POSIX_MQUEUE is not set
+@@ -28,22 +30,26 @@
+ # CONFIG_BSD_PROCESS_ACCT_V3 is not set
+ CONFIG_SYSCTL=y
+ # CONFIG_AUDIT is not set
+-CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_HOTPLUG is not set
+ CONFIG_KOBJECT_UEVENT=y
+ # CONFIG_IKCONFIG is not set
++CONFIG_INITRAMFS_SOURCE=""
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_EMBEDDED=y
+ CONFIG_KALLSYMS=y
+ # CONFIG_KALLSYMS_EXTRA_PASS is not set
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_EPOLL=y
+-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_SHMEM=y
+ CONFIG_CC_ALIGN_FUNCTIONS=0
+ CONFIG_CC_ALIGN_LABELS=0
+ CONFIG_CC_ALIGN_LOOPS=0
+ CONFIG_CC_ALIGN_JUMPS=0
+ # CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
+
+ #
+ # Loadable module support
+@@ -56,6 +62,24 @@
+ # CONFIG_KMOD is not set
+
+ #
++# Block layer
++#
++# CONFIG_LBD 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_SH_SOLUTION_ENGINE is not set
+@@ -65,9 +89,7 @@
+ # CONFIG_SH_7751_SYSTEMH is not set
+ # CONFIG_SH_STB1_HARP is not set
+ # CONFIG_SH_STB1_OVERDRIVE is not set
+-# CONFIG_SH_HP620 is not set
+-# CONFIG_SH_HP680 is not set
+-# CONFIG_SH_HP690 is not set
++# CONFIG_SH_HP6XX is not set
+ # CONFIG_SH_CQREEK is not set
+ # CONFIG_SH_DMIDA is not set
+ # CONFIG_SH_EC3104 is not set
+@@ -84,43 +106,89 @@
+ # CONFIG_SH_RTS7751R2D is not set
+ # CONFIG_SH_EDOSK7705 is not set
+ # CONFIG_SH_SH4202_MICRODEV is not set
++# CONFIG_SH_LANDISK is not set
++# CONFIG_SH_TITAN is not set
+ # CONFIG_SH_UNKNOWN is not set
+-# CONFIG_CPU_SH2 is not set
+-# CONFIG_CPU_SH3 is not set
++
++#
++# Processor selection
++#
+ CONFIG_CPU_SH4=y
++
++#
++# SH-2 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7604 is not set
++
++#
++# SH-3 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7300 is not set
+ # CONFIG_CPU_SUBTYPE_SH7705 is not set
+ # CONFIG_CPU_SUBTYPE_SH7707 is not set
+ # CONFIG_CPU_SUBTYPE_SH7708 is not set
+ # CONFIG_CPU_SUBTYPE_SH7709 is not set
++
++#
++# SH-4 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7750 is not set
++# CONFIG_CPU_SUBTYPE_SH7091 is not set
++# CONFIG_CPU_SUBTYPE_SH7750R is not set
++# CONFIG_CPU_SUBTYPE_SH7750S is not set
+ CONFIG_CPU_SUBTYPE_SH7751=y
++# CONFIG_CPU_SUBTYPE_SH7751R is not set
+ # CONFIG_CPU_SUBTYPE_SH7760 is not set
+-# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# ST40 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_ST40STB1 is not set
+ # CONFIG_CPU_SUBTYPE_ST40GX1 is not set
+-# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# SH-4A Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH7770 is not set
++# CONFIG_CPU_SUBTYPE_SH7780 is not set
++
++#
++# Memory management options
++#
+ CONFIG_MMU=y
+-CONFIG_CMDLINE_BOOL=y
+-CONFIG_CMDLINE="console=ttySC1,38400"
++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=4
++
++#
++# Cache configuration
++#
++# CONFIG_SH_DIRECT_MAPPED is not set
++# CONFIG_SH_WRITETHROUGH is not set
++# CONFIG_SH_OCRAM is not set
+ CONFIG_MEMORY_START=0x0c000000
+ CONFIG_MEMORY_SIZE=0x04000000
+-CONFIG_MEMORY_SET=y
+-# CONFIG_MEMORY_OVERRIDE is not set
++
++#
++# Processor features
++#
++CONFIG_CPU_LITTLE_ENDIAN=y
+ CONFIG_SH_RTC=y
+ CONFIG_SH_FPU=y
+-CONFIG_ZERO_PAGE_OFFSET=0x00010000
+-CONFIG_BOOT_LINK_OFFSET=0x00800000
+-CONFIG_CPU_LITTLE_ENDIAN=y
+-# CONFIG_PREEMPT is not set
+-# CONFIG_UBC_WAKEUP is not set
+-# CONFIG_SH_WRITETHROUGH is not set
+-# CONFIG_SH_OCRAM is not set
+ # CONFIG_SH_STORE_QUEUES is not set
+-# CONFIG_SMP is not set
+-CONFIG_SH_PCLK_CALC=y
+-CONFIG_SH_PCLK_FREQ=60013568
++
++#
++# Timer support
++#
++CONFIG_SH_TMU=y
++# CONFIG_SH_PCLK_FREQ_BOOL is not set
+
+ #
+ # CPU Frequency scaling
+@@ -139,14 +207,29 @@
+ CONFIG_HEARTBEAT=y
+
+ #
+-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
++# Kernel features
++#
++# CONFIG_KEXEC is not set
++# CONFIG_PREEMPT is not set
++# CONFIG_SMP is not set
++
++#
++# Boot options
++#
++CONFIG_ZERO_PAGE_OFFSET=0x00010000
++CONFIG_BOOT_LINK_OFFSET=0x00800000
++# CONFIG_UBC_WAKEUP is not set
++CONFIG_CMDLINE_BOOL=y
++CONFIG_CMDLINE="console=ttySC1,38400"
++
++#
++# Bus options
+ #
+ CONFIG_PCI=y
+ # CONFIG_SH_PCIDMA_NONCOHERENT is not set
+ CONFIG_PCI_AUTO=y
+ CONFIG_PCI_AUTO_UPDATE_RESOURCES=y
+ # CONFIG_PCI_LEGACY_PROC is not set
+-# CONFIG_PCI_NAMES is not set
+
+ #
+ # PCCARD (PCMCIA/CardBus) support
+@@ -154,10 +237,6 @@
+ # CONFIG_PCCARD is not set
+
+ #
+-# PC-card bridges
+-#
+-
+-#
+ # PCI Hotplug Support
+ #
+ # CONFIG_HOTPLUG_PCI is not set
+@@ -170,9 +249,96 @@
+ # CONFIG_BINFMT_MISC is not set
+
+ #
+-# SH initrd options
++# Networking
++#
++CONFIG_NET=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++# CONFIG_PACKET_MMAP is not set
++CONFIG_UNIX=y
++# CONFIG_NET_KEY is not set
++CONFIG_INET=y
++CONFIG_IP_MULTICAST=y
++# 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=y
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE is not set
++# CONFIG_IP_MROUTE 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_TUNNEL is not set
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_BIC=y
++
++#
++# IP: Virtual Server Configuration
++#
++# CONFIG_IP_VS is not set
++# CONFIG_IPV6 is not set
++CONFIG_NETFILTER=y
++CONFIG_NETFILTER_DEBUG=y
++
++#
++# Core Netfilter Configuration
++#
++# CONFIG_NETFILTER_NETLINK is not set
++# CONFIG_NF_CONNTRACK is not set
++
++#
++# IP: Netfilter Configuration
++#
++# CONFIG_IP_NF_CONNTRACK is not set
++CONFIG_IP_NF_QUEUE=y
++# CONFIG_IP_NF_IPTABLES is not set
++# CONFIG_IP_NF_ARPTABLES is not set
++
++#
++# DCCP Configuration (EXPERIMENTAL)
++#
++# CONFIG_IP_DCCP is not set
++
++#
++# SCTP Configuration (EXPERIMENTAL)
++#
++# CONFIG_IP_SCTP 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_NET_DIVERT 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_EMBEDDED_RAMDISK is not set
++# 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
+@@ -186,12 +352,17 @@
+ # CONFIG_FW_LOADER 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_PARTITIONS=y
+ # CONFIG_MTD_CONCAT is not set
++CONFIG_MTD_PARTITIONS=y
+ # CONFIG_MTD_REDBOOT_PARTS is not set
+ # CONFIG_MTD_CMDLINE_PARTS is not set
+
+@@ -203,6 +374,7 @@
+ # CONFIG_FTL is not set
+ # CONFIG_NFTL is not set
+ # CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
+
+ #
+ # RAM/ROM/Flash chip drivers
+@@ -236,8 +408,7 @@
+ # CONFIG_MTD_COMPLEX_MAPPINGS is not set
+ # CONFIG_MTD_PHYSMAP is not set
+ # CONFIG_MTD_SOLUTIONENGINE is not set
+-# CONFIG_MTD_MPC1211 is not set
+-# CONFIG_MTD_RTS7751R2D is not set
++# CONFIG_MTD_PLATRAM is not set
+
+ #
+ # Self-contained MTD device drivers
+@@ -262,6 +433,11 @@
+ # CONFIG_MTD_NAND is not set
+
+ #
++# OneNAND Flash Device Drivers
++#
++# CONFIG_MTD_ONENAND is not set
++
++#
+ # Parallel port support
+ #
+ # CONFIG_PARPORT is not set
+@@ -273,7 +449,6 @@
+ #
+ # Block devices
+ #
+-# CONFIG_BLK_DEV_FD is not set
+ # CONFIG_BLK_CPQ_DA is not set
+ # CONFIG_BLK_CPQ_CISS_DA is not set
+ # CONFIG_BLK_DEV_DAC960 is not set
+@@ -286,17 +461,7 @@
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=4096
+ CONFIG_BLK_DEV_INITRD=y
+-CONFIG_INITRAMFS_SOURCE=""
+-# CONFIG_LBD is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+-
+-#
+-# IO Schedulers
+-#
+-CONFIG_IOSCHED_NOOP=y
+-CONFIG_IOSCHED_AS=y
+-CONFIG_IOSCHED_DEADLINE=y
+-CONFIG_IOSCHED_CFQ=y
+ # CONFIG_ATA_OVER_ETH is not set
+
+ #
+@@ -307,6 +472,7 @@
+ #
+ # SCSI device support
+ #
++# CONFIG_RAID_ATTRS is not set
+ # CONFIG_SCSI is not set
+
+ #
+@@ -317,6 +483,7 @@
+ #
+ # Fusion MPT device support
+ #
++# CONFIG_FUSION is not set
+
+ #
+ # IEEE 1394 (FireWire) support
+@@ -329,92 +496,13 @@
+ # CONFIG_I2O is not set
+
+ #
+-# Networking support
+-#
+-CONFIG_NET=y
+-
+-#
+-# Networking options
+-#
+-CONFIG_PACKET=y
+-# CONFIG_PACKET_MMAP is not set
+-CONFIG_NETLINK_DEV=y
+-CONFIG_UNIX=y
+-# CONFIG_NET_KEY is not set
+-CONFIG_INET=y
+-CONFIG_IP_MULTICAST=y
+-# CONFIG_IP_ADVANCED_ROUTER is not set
+-CONFIG_IP_PNP=y
+-CONFIG_IP_PNP_DHCP=y
+-CONFIG_IP_PNP_BOOTP=y
+-CONFIG_IP_PNP_RARP=y
+-# CONFIG_NET_IPIP is not set
+-# CONFIG_NET_IPGRE is not set
+-# CONFIG_IP_MROUTE 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_TUNNEL is not set
+-CONFIG_IP_TCPDIAG=y
+-# CONFIG_IP_TCPDIAG_IPV6 is not set
+-
+-#
+-# IP: Virtual Server Configuration
+-#
+-# CONFIG_IP_VS is not set
+-# CONFIG_IPV6 is not set
+-CONFIG_NETFILTER=y
+-CONFIG_NETFILTER_DEBUG=y
+-
++# Network device support
+ #
+-# IP: Netfilter Configuration
+-#
+-# CONFIG_IP_NF_CONNTRACK is not set
+-# CONFIG_IP_NF_CONNTRACK_MARK is not set
+-CONFIG_IP_NF_QUEUE=y
+-# CONFIG_IP_NF_IPTABLES is not set
+-# CONFIG_IP_NF_ARPTABLES is not set
+-
+-#
+-# SCTP Configuration (EXPERIMENTAL)
+-#
+-# CONFIG_IP_SCTP 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_NET_DIVERT 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
+-# CONFIG_NET_CLS_ROUTE is not set
+-
+-#
+-# Network testing
+-#
+-# CONFIG_NET_PKTGEN is not set
+-# CONFIG_NETPOLL is not set
+-# CONFIG_NET_POLL_CONTROLLER is not set
+-# CONFIG_HAMRADIO is not set
+-# CONFIG_IRDA is not set
+-# CONFIG_BT is not set
+ CONFIG_NETDEVICES=y
+ # CONFIG_DUMMY is not set
+ # CONFIG_BONDING is not set
+ # CONFIG_EQUALIZER is not set
+ # CONFIG_TUN is not set
+-# CONFIG_ETHERTAP is not set
+
+ #
+ # ARCnet devices
+@@ -422,6 +510,11 @@
+ # CONFIG_ARCNET is not set
+
+ #
++# PHY device support
++#
++# CONFIG_PHYLIB is not set
++
++#
+ # Ethernet (10 or 100Mbit)
+ #
+ CONFIG_NET_ETHERNET=y
+@@ -429,6 +522,7 @@
+ # CONFIG_STNIC is not set
+ # CONFIG_HAPPYMEAL is not set
+ # CONFIG_SUNGEM is not set
++# CONFIG_CASSINI is not set
+ # CONFIG_NET_VENDOR_3COM is not set
+ # CONFIG_SMC91X is not set
+
+@@ -437,6 +531,7 @@
+ #
+ # CONFIG_NET_TULIP is not set
+ # CONFIG_HP100 is not set
++# CONFIG_NE2000 is not set
+ CONFIG_NET_PCI=y
+ CONFIG_PCNET32=y
+ # CONFIG_AMD8111_ETH is not set
+@@ -467,13 +562,17 @@
+ # CONFIG_HAMACHI is not set
+ # CONFIG_YELLOWFIN is not set
+ # CONFIG_R8169 is not set
++# CONFIG_SIS190 is not set
++# CONFIG_SKGE is not set
+ # CONFIG_SK98LIN is not set
+ # CONFIG_VIA_VELOCITY is not set
+ # CONFIG_TIGON3 is not set
++# CONFIG_BNX2 is not set
+
+ #
+ # Ethernet (10000 Mbit)
+ #
++# CONFIG_CHELSIO_T1 is not set
+ # CONFIG_IXGB is not set
+ # CONFIG_S2IO is not set
+
+@@ -497,6 +596,8 @@
+ # 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
+@@ -514,20 +615,10 @@
+ # CONFIG_INPUT is not set
+
+ #
+-# Userland interfaces
++# Hardware I/O ports
+ #
+-
+-#
+-# Input I/O drivers
+-#
+-# CONFIG_GAMEPORT is not set
+-CONFIG_SOUND_GAMEPORT=y
+ # CONFIG_SERIO is not set
+-# CONFIG_SERIO_I8042 is not set
+-
+-#
+-# Input Device Drivers
+-#
++# CONFIG_GAMEPORT is not set
+
+ #
+ # Character devices
+@@ -544,6 +635,7 @@
+ # Non-8250 serial port support
+ #
+ # CONFIG_SERIAL_SH_SCI is not set
++# CONFIG_SERIAL_JSM is not set
+ CONFIG_UNIX98_PTYS=y
+ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=256
+@@ -583,6 +675,12 @@
+ # CONFIG_RAW_DRIVER is not set
+
+ #
++# TPM devices
++#
++# CONFIG_TCG_TPM is not set
++# CONFIG_TELCLOCK is not set
++
++#
+ # I2C support
+ #
+ # CONFIG_I2C is not set
+@@ -593,10 +691,21 @@
+ # CONFIG_W1 is not set
+
+ #
++# Hardware Monitoring support
++#
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++# CONFIG_HWMON_DEBUG_CHIP is not set
++
++#
+ # Misc devices
+ #
+
+ #
++# Multimedia Capabilities Port drivers
++#
++
++#
+ # Multimedia devices
+ #
+ # CONFIG_VIDEO_DEV is not set
+@@ -619,12 +728,12 @@
+ #
+ # USB support
+ #
+-# CONFIG_USB is not set
+ CONFIG_USB_ARCH_HAS_HCD=y
+ CONFIG_USB_ARCH_HAS_OHCI=y
++# CONFIG_USB is not set
+
+ #
+-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+@@ -643,25 +752,29 @@
+ # CONFIG_INFINIBAND is not set
+
+ #
++# SN Devices
++#
++
++#
+ # File systems
+ #
+ CONFIG_EXT2_FS=y
+ # CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
+ # CONFIG_EXT3_FS is not set
+ # CONFIG_JBD is not set
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+-
+-#
+-# XFS support
+-#
++# CONFIG_FS_POSIX_ACL is not set
+ # CONFIG_XFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+ # CONFIG_ROMFS_FS is not set
++CONFIG_INOTIFY=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
+@@ -682,13 +795,11 @@
+ CONFIG_PROC_FS=y
+ CONFIG_PROC_KCORE=y
+ CONFIG_SYSFS=y
+-# CONFIG_DEVFS_FS is not set
+-# CONFIG_DEVPTS_FS_XATTR is not set
+ CONFIG_TMPFS=y
+-# CONFIG_TMPFS_XATTR is not set
+ # CONFIG_HUGETLBFS is not set
+ # CONFIG_HUGETLB_PAGE is not set
+ CONFIG_RAMFS=y
++# CONFIG_RELAYFS_FS is not set
+
+ #
+ # Miscellaneous filesystems
+@@ -703,8 +814,8 @@
+ # CONFIG_JFFS_FS is not set
+ CONFIG_JFFS2_FS=y
+ CONFIG_JFFS2_FS_DEBUG=0
+-# CONFIG_JFFS2_FS_NAND is not set
+-# CONFIG_JFFS2_FS_NOR_ECC is not set
++CONFIG_JFFS2_FS_WRITEBUFFER=y
++# CONFIG_JFFS2_SUMMARY is not set
+ # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+ CONFIG_JFFS2_ZLIB=y
+ CONFIG_JFFS2_RTIME=y
+@@ -726,6 +837,7 @@
+ # 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
+@@ -746,7 +858,9 @@
+ #
+ # Kernel hacking
+ #
++# CONFIG_PRINTK_TIME is not set
+ # CONFIG_DEBUG_KERNEL is not set
++CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_FRAME_POINTER is not set
+ # CONFIG_SH_STANDARD_BIOS is not set
+ # CONFIG_EARLY_SCIF_CONSOLE is not set
+@@ -771,6 +885,7 @@
+ # 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
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/sh03_defconfig linux-2.6.17/arch/sh/configs/sh03_defconfig
+--- linux-2.6.17-vanilla/arch/sh/configs/sh03_defconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/sh03_defconfig 2006-07-12 16:54:21.000000000 +0000
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.11-sh
+-# Wed Mar 2 15:09:49 2005
++# Linux kernel version: 2.6.15-sh
++# Wed Jan 4 20:14:31 2006
+ #
+ CONFIG_SUPERH=y
+ CONFIG_UID16=y
+@@ -18,11 +18,13 @@
+ CONFIG_BROKEN=y
+ CONFIG_BROKEN_ON_SMP=y
+ CONFIG_LOCK_KERNEL=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
+
+ #
+ # General setup
+ #
+ CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
+ CONFIG_SWAP=y
+ CONFIG_SYSVIPC=y
+ CONFIG_POSIX_MQUEUE=y
+@@ -30,22 +32,26 @@
+ # CONFIG_BSD_PROCESS_ACCT_V3 is not set
+ CONFIG_SYSCTL=y
+ # CONFIG_AUDIT is not set
+-CONFIG_LOG_BUF_SHIFT=14
+ CONFIG_HOTPLUG=y
+ CONFIG_KOBJECT_UEVENT=y
+ # CONFIG_IKCONFIG is not set
++CONFIG_INITRAMFS_SOURCE=""
++CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+ # CONFIG_EMBEDDED is not set
+ CONFIG_KALLSYMS=y
+ # CONFIG_KALLSYMS_EXTRA_PASS is not set
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_EPOLL=y
+-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_SHMEM=y
+ CONFIG_CC_ALIGN_FUNCTIONS=0
+ CONFIG_CC_ALIGN_LABELS=0
+ CONFIG_CC_ALIGN_LOOPS=0
+ CONFIG_CC_ALIGN_JUMPS=0
+ # CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
+
+ #
+ # Loadable module support
+@@ -59,6 +65,24 @@
+ CONFIG_KMOD=y
+
+ #
++# Block layer
++#
++# CONFIG_LBD 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_SH_SOLUTION_ENGINE is not set
+@@ -68,9 +92,7 @@
+ # CONFIG_SH_7751_SYSTEMH is not set
+ # CONFIG_SH_STB1_HARP is not set
+ # CONFIG_SH_STB1_OVERDRIVE is not set
+-# CONFIG_SH_HP620 is not set
+-# CONFIG_SH_HP680 is not set
+-# CONFIG_SH_HP690 is not set
++# CONFIG_SH_HP6XX is not set
+ # CONFIG_SH_CQREEK is not set
+ # CONFIG_SH_DMIDA is not set
+ # CONFIG_SH_EC3104 is not set
+@@ -87,47 +109,93 @@
+ # CONFIG_SH_RTS7751R2D is not set
+ # CONFIG_SH_EDOSK7705 is not set
+ # CONFIG_SH_SH4202_MICRODEV is not set
++# CONFIG_SH_LANDISK is not set
++# CONFIG_SH_TITAN is not set
+ # CONFIG_SH_UNKNOWN is not set
+-# CONFIG_CPU_SH2 is not set
+-# CONFIG_CPU_SH3 is not set
++
++#
++# Processor selection
++#
+ CONFIG_CPU_SH4=y
++
++#
++# SH-2 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7604 is not set
++
++#
++# SH-3 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7300 is not set
+ # CONFIG_CPU_SUBTYPE_SH7705 is not set
+ # CONFIG_CPU_SUBTYPE_SH7707 is not set
+ # CONFIG_CPU_SUBTYPE_SH7708 is not set
+ # CONFIG_CPU_SUBTYPE_SH7709 is not set
++
++#
++# SH-4 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7750 is not set
++# CONFIG_CPU_SUBTYPE_SH7091 is not set
++# CONFIG_CPU_SUBTYPE_SH7750R is not set
++# CONFIG_CPU_SUBTYPE_SH7750S is not set
+ CONFIG_CPU_SUBTYPE_SH7751=y
++# CONFIG_CPU_SUBTYPE_SH7751R is not set
+ # CONFIG_CPU_SUBTYPE_SH7760 is not set
+-# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# ST40 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_ST40STB1 is not set
+ # CONFIG_CPU_SUBTYPE_ST40GX1 is not set
+-# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# SH-4A Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH7770 is not set
++# CONFIG_CPU_SUBTYPE_SH7780 is not set
++
++#
++# Memory management options
++#
+ CONFIG_MMU=y
+-CONFIG_CMDLINE_BOOL=y
+-CONFIG_CMDLINE="console=ttySC1,115200 mem=64M root=/dev/nfs"
++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=4
++
++#
++# Cache configuration
++#
++# CONFIG_SH_DIRECT_MAPPED is not set
++# CONFIG_SH_WRITETHROUGH is not set
++# CONFIG_SH_OCRAM is not set
+ CONFIG_MEMORY_START=0x08000000
+ CONFIG_MEMORY_SIZE=0x08000000
+-CONFIG_MEMORY_SET=y
+-# CONFIG_MEMORY_OVERRIDE is not set
+ CONFIG_CF_ENABLER=y
+ CONFIG_CF_AREA5=y
+ # CONFIG_CF_AREA6 is not set
+ CONFIG_CF_BASE_ADDR=0xb4000000
++
++#
++# Processor features
++#
++CONFIG_CPU_LITTLE_ENDIAN=y
+ CONFIG_SH_RTC=y
+ CONFIG_SH_FPU=y
+-CONFIG_ZERO_PAGE_OFFSET=0x00004000
+-CONFIG_BOOT_LINK_OFFSET=0x00800000
+-CONFIG_CPU_LITTLE_ENDIAN=y
+-CONFIG_PREEMPT=y
+-# CONFIG_UBC_WAKEUP is not set
+-# CONFIG_SH_WRITETHROUGH is not set
+-# CONFIG_SH_OCRAM is not set
+ # CONFIG_SH_STORE_QUEUES is not set
+-# CONFIG_SMP is not set
+-CONFIG_SH_PCLK_CALC=y
+-CONFIG_SH_PCLK_FREQ=49876504
++
++#
++# Timer support
++#
++CONFIG_SH_TMU=y
++# CONFIG_SH_PCLK_FREQ_BOOL is not set
+
+ #
+ # CPU Frequency scaling
+@@ -146,14 +214,29 @@
+ CONFIG_HEARTBEAT=y
+
+ #
+-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
++# Kernel features
++#
++# CONFIG_KEXEC is not set
++CONFIG_PREEMPT=y
++# CONFIG_SMP is not set
++
++#
++# Boot options
++#
++CONFIG_ZERO_PAGE_OFFSET=0x00004000
++CONFIG_BOOT_LINK_OFFSET=0x00800000
++# CONFIG_UBC_WAKEUP is not set
++CONFIG_CMDLINE_BOOL=y
++CONFIG_CMDLINE="console=ttySC1,115200 mem=64M root=/dev/nfs"
++
++#
++# Bus options
+ #
+ CONFIG_PCI=y
+ CONFIG_SH_PCIDMA_NONCOHERENT=y
+ CONFIG_PCI_AUTO=y
+ CONFIG_PCI_AUTO_UPDATE_RESOURCES=y
+ CONFIG_PCI_LEGACY_PROC=y
+-CONFIG_PCI_NAMES=y
+
+ #
+ # PCCARD (PCMCIA/CardBus) support
+@@ -161,10 +244,6 @@
+ # CONFIG_PCCARD is not set
+
+ #
+-# PC-card bridges
+-#
+-
+-#
+ # PCI Hotplug Support
+ #
+ CONFIG_HOTPLUG_PCI=m
+@@ -180,9 +259,78 @@
+ CONFIG_BINFMT_MISC=y
+
+ #
+-# SH initrd options
++# Networking
++#
++CONFIG_NET=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++# CONFIG_PACKET_MMAP is not set
++CONFIG_UNIX=y
++CONFIG_XFRM=y
++# CONFIG_XFRM_USER is not set
++CONFIG_NET_KEY=y
++CONFIG_INET=y
++CONFIG_IP_MULTICAST=y
++# 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=y
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE is not set
++# CONFIG_IP_MROUTE 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_TUNNEL is not set
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_BIC=y
++# CONFIG_IPV6 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
++# 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_NET_DIVERT 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_EMBEDDED_RAMDISK is not set
++# 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
+@@ -196,6 +344,11 @@
+ # CONFIG_FW_LOADER is not set
+
+ #
++# Connector - unified userspace <-> kernelspace linker
++#
++# CONFIG_CONNECTOR is not set
++
++#
+ # Memory Technology Devices (MTD)
+ #
+ # CONFIG_MTD is not set
+@@ -212,7 +365,6 @@
+ #
+ # Block devices
+ #
+-# CONFIG_BLK_DEV_FD is not set
+ # CONFIG_BLK_CPQ_DA is not set
+ # CONFIG_BLK_CPQ_CISS_DA is not set
+ # CONFIG_BLK_DEV_DAC960 is not set
+@@ -226,17 +378,7 @@
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=4096
+ CONFIG_BLK_DEV_INITRD=y
+-CONFIG_INITRAMFS_SOURCE=""
+-# CONFIG_LBD is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+-
+-#
+-# IO Schedulers
+-#
+-CONFIG_IOSCHED_NOOP=y
+-CONFIG_IOSCHED_AS=y
+-CONFIG_IOSCHED_DEADLINE=y
+-CONFIG_IOSCHED_CFQ=y
+ # CONFIG_ATA_OVER_ETH is not set
+
+ #
+@@ -272,6 +414,7 @@
+ #
+ # SCSI device support
+ #
++# CONFIG_RAID_ATTRS is not set
+ CONFIG_SCSI=m
+ CONFIG_SCSI_PROC_FS=y
+
+@@ -284,6 +427,7 @@
+ CONFIG_BLK_DEV_SR=m
+ CONFIG_BLK_DEV_SR_VENDOR=y
+ CONFIG_CHR_DEV_SG=m
++# CONFIG_CHR_DEV_SCH is not set
+
+ #
+ # Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+@@ -298,10 +442,12 @@
+ # 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
+
+ #
+ # SCSI low-level drivers
+ #
++# CONFIG_ISCSI_TCP is not set
+ # CONFIG_BLK_DEV_3W_XXXX_RAID is not set
+ # CONFIG_SCSI_3W_9XXX is not set
+ # CONFIG_SCSI_ACARD is not set
+@@ -313,22 +459,16 @@
+ # CONFIG_SCSI_ADVANSYS is not set
+ # CONFIG_MEGARAID_NEWGEN is not set
+ # CONFIG_MEGARAID_LEGACY is not set
++# CONFIG_MEGARAID_SAS is not set
+ # CONFIG_SCSI_SATA is not set
+-# CONFIG_SCSI_BUSLOGIC is not set
+-# CONFIG_SCSI_CPQFCTS is not set
+ # CONFIG_SCSI_DMX3191D is not set
+-# CONFIG_SCSI_EATA is not set
+ # CONFIG_SCSI_EATA_PIO is not set
+ # CONFIG_SCSI_FUTURE_DOMAIN is not set
+-# CONFIG_SCSI_GDTH is not set
+ # CONFIG_SCSI_IPS is not set
+ # CONFIG_SCSI_INITIO is not set
+ # CONFIG_SCSI_INIA100 is not set
+ # CONFIG_SCSI_SYM53C8XX_2 is not set
+ # CONFIG_SCSI_IPR is not set
+-# CONFIG_SCSI_PCI2000 is not set
+-# CONFIG_SCSI_PCI2220I is not set
+-# CONFIG_SCSI_QLOGIC_ISP is not set
+ # CONFIG_SCSI_QLOGIC_FC is not set
+ # CONFIG_SCSI_QLOGIC_1280 is not set
+ CONFIG_SCSI_QLA2XXX=m
+@@ -337,6 +477,8 @@
+ # CONFIG_SCSI_QLA2300 is not set
+ # CONFIG_SCSI_QLA2322 is not set
+ # CONFIG_SCSI_QLA6312 is not set
++# CONFIG_SCSI_QLA24XX is not set
++# CONFIG_SCSI_LPFC is not set
+ # CONFIG_SCSI_DC395x is not set
+ # CONFIG_SCSI_DC390T is not set
+ # CONFIG_SCSI_NSP32 is not set
+@@ -351,6 +493,9 @@
+ # Fusion MPT device support
+ #
+ # CONFIG_FUSION is not set
++# CONFIG_FUSION_SPI is not set
++# CONFIG_FUSION_FC is not set
++# CONFIG_FUSION_SAS is not set
+
+ #
+ # IEEE 1394 (FireWire) support
+@@ -363,73 +508,8 @@
+ # CONFIG_I2O is not set
+
+ #
+-# Networking support
+-#
+-CONFIG_NET=y
+-
+-#
+-# Networking options
+-#
+-CONFIG_PACKET=y
+-# CONFIG_PACKET_MMAP is not set
+-# CONFIG_NETLINK_DEV is not set
+-CONFIG_UNIX=y
+-CONFIG_NET_KEY=y
+-CONFIG_INET=y
+-CONFIG_IP_MULTICAST=y
+-# CONFIG_IP_ADVANCED_ROUTER is not set
+-CONFIG_IP_PNP=y
+-CONFIG_IP_PNP_DHCP=y
+-CONFIG_IP_PNP_BOOTP=y
+-CONFIG_IP_PNP_RARP=y
+-# CONFIG_NET_IPIP is not set
+-# CONFIG_NET_IPGRE is not set
+-# CONFIG_IP_MROUTE 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_TUNNEL is not set
+-CONFIG_IP_TCPDIAG=y
+-# CONFIG_IP_TCPDIAG_IPV6 is not set
+-# CONFIG_IPV6 is not set
+-# CONFIG_NETFILTER is not set
+-CONFIG_XFRM=y
+-# CONFIG_XFRM_USER is not set
+-
+-#
+-# SCTP Configuration (EXPERIMENTAL)
++# Network device support
+ #
+-# CONFIG_IP_SCTP 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_NET_DIVERT 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
+-# CONFIG_NET_CLS_ROUTE is not set
+-
+-#
+-# Network testing
+-#
+-# CONFIG_NET_PKTGEN is not set
+-# CONFIG_NETPOLL is not set
+-# CONFIG_NET_POLL_CONTROLLER is not set
+-# CONFIG_HAMRADIO is not set
+-# CONFIG_IRDA is not set
+-# CONFIG_BT is not set
+ CONFIG_NETDEVICES=y
+ # CONFIG_DUMMY is not set
+ # CONFIG_BONDING is not set
+@@ -442,6 +522,11 @@
+ # CONFIG_ARCNET is not set
+
+ #
++# PHY device support
++#
++# CONFIG_PHYLIB is not set
++
++#
+ # Ethernet (10 or 100Mbit)
+ #
+ CONFIG_NET_ETHERNET=y
+@@ -449,6 +534,7 @@
+ # CONFIG_STNIC is not set
+ # CONFIG_HAPPYMEAL is not set
+ # CONFIG_SUNGEM is not set
++# CONFIG_CASSINI is not set
+ # CONFIG_NET_VENDOR_3COM is not set
+ # CONFIG_SMC91X is not set
+
+@@ -457,6 +543,7 @@
+ #
+ # CONFIG_NET_TULIP is not set
+ # CONFIG_HP100 is not set
++# CONFIG_NE2000 is not set
+ CONFIG_NET_PCI=y
+ # CONFIG_PCNET32 is not set
+ # CONFIG_AMD8111_ETH is not set
+@@ -487,13 +574,17 @@
+ # CONFIG_HAMACHI is not set
+ # CONFIG_YELLOWFIN is not set
+ # CONFIG_R8169 is not set
++# CONFIG_SIS190 is not set
++# CONFIG_SKGE is not set
+ # CONFIG_SK98LIN is not set
+ # CONFIG_VIA_VELOCITY is not set
+ # CONFIG_TIGON3 is not set
++# CONFIG_BNX2 is not set
+
+ #
+ # Ethernet (10000 Mbit)
+ #
++# CONFIG_CHELSIO_T1 is not set
+ # CONFIG_IXGB is not set
+ # CONFIG_S2IO is not set
+
+@@ -518,6 +609,8 @@
+ # CONFIG_NET_FC 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
+@@ -547,14 +640,6 @@
+ # CONFIG_INPUT_EVBUG is not set
+
+ #
+-# Input I/O drivers
+-#
+-# CONFIG_GAMEPORT is not set
+-CONFIG_SOUND_GAMEPORT=y
+-# CONFIG_SERIO is not set
+-# CONFIG_SERIO_I8042 is not set
+-
+-#
+ # Input Device Drivers
+ #
+ # CONFIG_INPUT_KEYBOARD is not set
+@@ -564,6 +649,12 @@
+ # CONFIG_INPUT_MISC is not set
+
+ #
++# Hardware I/O ports
++#
++# CONFIG_SERIO is not set
++# CONFIG_GAMEPORT is not set
++
++#
+ # Character devices
+ #
+ CONFIG_VT=y
+@@ -585,6 +676,7 @@
+ CONFIG_SERIAL_SH_SCI_CONSOLE=y
+ CONFIG_SERIAL_CORE=y
+ CONFIG_SERIAL_CORE_CONSOLE=y
++# CONFIG_SERIAL_JSM is not set
+ CONFIG_UNIX98_PTYS=y
+ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=256
+@@ -625,6 +717,12 @@
+ # CONFIG_RAW_DRIVER is not set
+
+ #
++# TPM devices
++#
++# CONFIG_TCG_TPM is not set
++# CONFIG_TELCLOCK is not set
++
++#
+ # I2C support
+ #
+ # CONFIG_I2C is not set
+@@ -635,10 +733,21 @@
+ # CONFIG_W1 is not set
+
+ #
++# Hardware Monitoring support
++#
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++# CONFIG_HWMON_DEBUG_CHIP is not set
++
++#
+ # Misc devices
+ #
+
+ #
++# Multimedia Capabilities Port drivers
++#
++
++#
+ # Multimedia devices
+ #
+ # CONFIG_VIDEO_DEV is not set
+@@ -656,7 +765,6 @@
+ #
+ # Console display driver support
+ #
+-# CONFIG_VGA_CONSOLE is not set
+ CONFIG_DUMMY_CONSOLE=y
+
+ #
+@@ -667,12 +775,12 @@
+ #
+ # USB support
+ #
+-# CONFIG_USB is not set
+ CONFIG_USB_ARCH_HAS_HCD=y
+ CONFIG_USB_ARCH_HAS_OHCI=y
++# CONFIG_USB is not set
+
+ #
+-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+@@ -691,12 +799,17 @@
+ # CONFIG_INFINIBAND is not set
+
+ #
++# SN Devices
++#
++
++#
+ # File systems
+ #
+ CONFIG_EXT2_FS=y
+ CONFIG_EXT2_FS_XATTR=y
+ # CONFIG_EXT2_FS_POSIX_ACL is not set
+ # CONFIG_EXT2_FS_SECURITY is not set
++# CONFIG_EXT2_FS_XIP is not set
+ CONFIG_EXT3_FS=y
+ CONFIG_EXT3_FS_XATTR=y
+ CONFIG_EXT3_FS_POSIX_ACL=y
+@@ -707,17 +820,15 @@
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+ CONFIG_FS_POSIX_ACL=y
+-
+-#
+-# XFS support
+-#
+ # CONFIG_XFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+ # CONFIG_ROMFS_FS is not set
++CONFIG_INOTIFY=y
+ # CONFIG_QUOTA is not set
+ CONFIG_DNOTIFY=y
+ CONFIG_AUTOFS_FS=y
+ CONFIG_AUTOFS4_FS=y
++# CONFIG_FUSE_FS is not set
+
+ #
+ # CD-ROM/DVD Filesystems
+@@ -745,13 +856,11 @@
+ CONFIG_PROC_FS=y
+ CONFIG_PROC_KCORE=y
+ CONFIG_SYSFS=y
+-# CONFIG_DEVFS_FS is not set
+-# CONFIG_DEVPTS_FS_XATTR is not set
+ CONFIG_TMPFS=y
+-# CONFIG_TMPFS_XATTR is not set
+ # CONFIG_HUGETLBFS is not set
+ # CONFIG_HUGETLB_PAGE is not set
+ CONFIG_RAMFS=y
++# CONFIG_RELAYFS_FS is not set
+
+ #
+ # Miscellaneous filesystems
+@@ -775,16 +884,19 @@
+ #
+ CONFIG_NFS_FS=y
+ CONFIG_NFS_V3=y
++# CONFIG_NFS_V3_ACL is not set
+ CONFIG_NFS_V4=y
+ # CONFIG_NFS_DIRECTIO is not set
+ CONFIG_NFSD=y
+ CONFIG_NFSD_V3=y
++# CONFIG_NFSD_V3_ACL is not set
+ # CONFIG_NFSD_V4 is not set
+ CONFIG_NFSD_TCP=y
+ CONFIG_ROOT_NFS=y
+ CONFIG_LOCKD=y
+ CONFIG_LOCKD_V4=y
+ CONFIG_EXPORTFS=y
++CONFIG_NFS_COMMON=y
+ CONFIG_SUNRPC=y
+ CONFIG_SUNRPC_GSS=y
+ CONFIG_RPCSEC_GSS_KRB5=y
+@@ -794,6 +906,7 @@
+ # 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
+@@ -868,8 +981,9 @@
+ #
+ # Kernel hacking
+ #
++# CONFIG_PRINTK_TIME is not set
+ # CONFIG_DEBUG_KERNEL is not set
+-CONFIG_DEBUG_PREEMPT=y
++CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_FRAME_POINTER is not set
+ CONFIG_SH_STANDARD_BIOS=y
+ # CONFIG_EARLY_SCIF_CONSOLE is not set
+@@ -894,6 +1008,7 @@
+ # 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_DES=y
+ # CONFIG_CRYPTO_BLOWFISH is not set
+ # CONFIG_CRYPTO_TWOFISH is not set
+@@ -918,6 +1033,7 @@
+ # Library routines
+ #
+ CONFIG_CRC_CCITT=y
++# CONFIG_CRC16 is not set
+ CONFIG_CRC32=y
+ # CONFIG_LIBCRC32C is not set
+ CONFIG_ZLIB_INFLATE=y
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/snapgear_defconfig linux-2.6.17/arch/sh/configs/snapgear_defconfig
+--- linux-2.6.17-vanilla/arch/sh/configs/snapgear_defconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/snapgear_defconfig 2006-07-12 16:54:21.000000000 +0000
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.11-sh
+-# Wed Mar 2 15:09:51 2005
++# Linux kernel version: 2.6.15-sh
++# Wed Jan 4 20:30:46 2006
+ #
+ CONFIG_SUPERH=y
+ CONFIG_UID16=y
+@@ -16,33 +16,39 @@
+ CONFIG_EXPERIMENTAL=y
+ CONFIG_CLEAN_COMPILE=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 is not set
+ # CONFIG_POSIX_MQUEUE is not set
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_SYSCTL is not set
+ # CONFIG_AUDIT is not set
+-CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_HOTPLUG is not set
+ CONFIG_KOBJECT_UEVENT=y
+ # CONFIG_IKCONFIG is not set
++CONFIG_INITRAMFS_SOURCE=""
++CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+ # CONFIG_EMBEDDED is not set
+ CONFIG_KALLSYMS=y
+ # CONFIG_KALLSYMS_EXTRA_PASS is not set
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_EPOLL=y
+-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_SHMEM=y
+ CONFIG_CC_ALIGN_FUNCTIONS=0
+ CONFIG_CC_ALIGN_LABELS=0
+ CONFIG_CC_ALIGN_LOOPS=0
+ CONFIG_CC_ALIGN_JUMPS=0
+ # CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
+
+ #
+ # Loadable module support
+@@ -50,6 +56,24 @@
+ # CONFIG_MODULES is not set
+
+ #
++# Block layer
++#
++# CONFIG_LBD 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_SH_SOLUTION_ENGINE is not set
+@@ -59,9 +83,7 @@
+ # CONFIG_SH_7751_SYSTEMH is not set
+ # CONFIG_SH_STB1_HARP is not set
+ # CONFIG_SH_STB1_OVERDRIVE is not set
+-# CONFIG_SH_HP620 is not set
+-# CONFIG_SH_HP680 is not set
+-# CONFIG_SH_HP690 is not set
++# CONFIG_SH_HP6XX is not set
+ # CONFIG_SH_CQREEK is not set
+ # CONFIG_SH_DMIDA is not set
+ # CONFIG_SH_EC3104 is not set
+@@ -78,42 +100,89 @@
+ # CONFIG_SH_RTS7751R2D is not set
+ # CONFIG_SH_EDOSK7705 is not set
+ # CONFIG_SH_SH4202_MICRODEV is not set
++# CONFIG_SH_LANDISK is not set
++# CONFIG_SH_TITAN is not set
+ # CONFIG_SH_UNKNOWN is not set
+-# CONFIG_CPU_SH2 is not set
+-# CONFIG_CPU_SH3 is not set
++
++#
++# Processor selection
++#
+ CONFIG_CPU_SH4=y
++
++#
++# SH-2 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7604 is not set
++
++#
++# SH-3 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7300 is not set
+ # CONFIG_CPU_SUBTYPE_SH7705 is not set
+ # CONFIG_CPU_SUBTYPE_SH7707 is not set
+ # CONFIG_CPU_SUBTYPE_SH7708 is not set
+ # CONFIG_CPU_SUBTYPE_SH7709 is not set
++
++#
++# SH-4 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7750 is not set
++# CONFIG_CPU_SUBTYPE_SH7091 is not set
++# CONFIG_CPU_SUBTYPE_SH7750R is not set
++# CONFIG_CPU_SUBTYPE_SH7750S is not set
+ CONFIG_CPU_SUBTYPE_SH7751=y
++CONFIG_CPU_SUBTYPE_SH7751R=y
+ # CONFIG_CPU_SUBTYPE_SH7760 is not set
+-# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# ST40 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_ST40STB1 is not set
+ # CONFIG_CPU_SUBTYPE_ST40GX1 is not set
+-# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# SH-4A Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH7770 is not set
++# CONFIG_CPU_SUBTYPE_SH7780 is not set
++
++#
++# Memory management options
++#
+ CONFIG_MMU=y
+-# CONFIG_CMDLINE_BOOL 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=4
++
++#
++# Cache configuration
++#
++# CONFIG_SH_DIRECT_MAPPED is not set
++# CONFIG_SH_WRITETHROUGH is not set
++# CONFIG_SH_OCRAM is not set
+ CONFIG_MEMORY_START=0x08000000
+ CONFIG_MEMORY_SIZE=0x01000000
+-CONFIG_MEMORY_SET=y
+-# CONFIG_MEMORY_OVERRIDE is not set
++
++#
++# Processor features
++#
++CONFIG_CPU_LITTLE_ENDIAN=y
+ CONFIG_SH_RTC=y
+ CONFIG_SH_FPU=y
+-CONFIG_ZERO_PAGE_OFFSET=0x00001000
+-CONFIG_BOOT_LINK_OFFSET=0x00800000
+-CONFIG_CPU_LITTLE_ENDIAN=y
+-# CONFIG_PREEMPT is not set
+-# CONFIG_UBC_WAKEUP is not set
+-# CONFIG_SH_WRITETHROUGH is not set
+-# CONFIG_SH_OCRAM is not set
+ # CONFIG_SH_STORE_QUEUES is not set
+-# CONFIG_SMP is not set
+-CONFIG_SH_PCLK_CALC=y
+-CONFIG_SH_PCLK_FREQ=60013568
++
++#
++# Timer support
++#
++CONFIG_SH_TMU=y
++# CONFIG_SH_PCLK_FREQ_BOOL is not set
+
+ #
+ # CPU Frequency scaling
+@@ -133,14 +202,28 @@
+ # CONFIG_HD6446X_SERIES is not set
+
+ #
+-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
++# Kernel features
++#
++# CONFIG_KEXEC is not set
++# CONFIG_PREEMPT is not set
++# CONFIG_SMP is not set
++
++#
++# Boot options
++#
++CONFIG_ZERO_PAGE_OFFSET=0x00001000
++CONFIG_BOOT_LINK_OFFSET=0x00800000
++# CONFIG_UBC_WAKEUP is not set
++# CONFIG_CMDLINE_BOOL is not set
++
++#
++# Bus options
+ #
+ CONFIG_PCI=y
+ # CONFIG_SH_PCIDMA_NONCOHERENT is not set
+ CONFIG_PCI_AUTO=y
+ CONFIG_PCI_AUTO_UPDATE_RESOURCES=y
+ # CONFIG_PCI_LEGACY_PROC is not set
+-CONFIG_PCI_NAMES=y
+
+ #
+ # PCCARD (PCMCIA/CardBus) support
+@@ -148,10 +231,6 @@
+ # CONFIG_PCCARD is not set
+
+ #
+-# PC-card bridges
+-#
+-
+-#
+ # PCI Hotplug Support
+ #
+ # CONFIG_HOTPLUG_PCI is not set
+@@ -164,9 +243,74 @@
+ # CONFIG_BINFMT_MISC is not set
+
+ #
+-# SH initrd options
++# Networking
++#
++CONFIG_NET=y
++
++#
++# Networking options
++#
++# CONFIG_PACKET is not set
++# CONFIG_UNIX 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 is not set
++# 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_TUNNEL is not set
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_BIC=y
++# CONFIG_IPV6 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
++# 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_NET_DIVERT 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_EMBEDDED_RAMDISK is not set
++# 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
+@@ -180,6 +324,11 @@
+ # CONFIG_FW_LOADER is not set
+
+ #
++# Connector - unified userspace <-> kernelspace linker
++#
++# CONFIG_CONNECTOR is not set
++
++#
+ # Memory Technology Devices (MTD)
+ #
+ # CONFIG_MTD is not set
+@@ -196,7 +345,6 @@
+ #
+ # Block devices
+ #
+-# CONFIG_BLK_DEV_FD is not set
+ # CONFIG_BLK_CPQ_DA is not set
+ # CONFIG_BLK_CPQ_CISS_DA is not set
+ # CONFIG_BLK_DEV_DAC960 is not set
+@@ -209,17 +357,7 @@
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=4096
+ CONFIG_BLK_DEV_INITRD=y
+-CONFIG_INITRAMFS_SOURCE=""
+-# CONFIG_LBD is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+-
+-#
+-# IO Schedulers
+-#
+-CONFIG_IOSCHED_NOOP=y
+-CONFIG_IOSCHED_AS=y
+-CONFIG_IOSCHED_DEADLINE=y
+-CONFIG_IOSCHED_CFQ=y
+ # CONFIG_ATA_OVER_ETH is not set
+
+ #
+@@ -230,6 +368,7 @@
+ #
+ # SCSI device support
+ #
++# CONFIG_RAID_ATTRS is not set
+ # CONFIG_SCSI is not set
+
+ #
+@@ -240,6 +379,7 @@
+ #
+ # Fusion MPT device support
+ #
++# CONFIG_FUSION is not set
+
+ #
+ # IEEE 1394 (FireWire) support
+@@ -252,69 +392,8 @@
+ # CONFIG_I2O is not set
+
+ #
+-# Networking support
+-#
+-CONFIG_NET=y
+-
+-#
+-# Networking options
+-#
+-# CONFIG_PACKET is not set
+-# CONFIG_NETLINK_DEV is not set
+-# CONFIG_UNIX 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_PNP=y
+-CONFIG_IP_PNP_DHCP=y
+-# CONFIG_IP_PNP_BOOTP is not set
+-# 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_TUNNEL is not set
+-CONFIG_IP_TCPDIAG=y
+-# CONFIG_IP_TCPDIAG_IPV6 is not set
+-# CONFIG_IPV6 is not set
+-# CONFIG_NETFILTER is not set
+-
+-#
+-# SCTP Configuration (EXPERIMENTAL)
+-#
+-# CONFIG_IP_SCTP 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_NET_DIVERT 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
+-# CONFIG_NET_CLS_ROUTE is not set
+-
++# Network device support
+ #
+-# Network testing
+-#
+-# CONFIG_NET_PKTGEN is not set
+-# CONFIG_NETPOLL is not set
+-# CONFIG_NET_POLL_CONTROLLER is not set
+-# CONFIG_HAMRADIO is not set
+-# CONFIG_IRDA is not set
+-# CONFIG_BT is not set
+ CONFIG_NETDEVICES=y
+ # CONFIG_DUMMY is not set
+ # CONFIG_BONDING is not set
+@@ -327,6 +406,11 @@
+ # CONFIG_ARCNET is not set
+
+ #
++# PHY device support
++#
++# CONFIG_PHYLIB is not set
++
++#
+ # Ethernet (10 or 100Mbit)
+ #
+ CONFIG_NET_ETHERNET=y
+@@ -334,6 +418,7 @@
+ # CONFIG_STNIC is not set
+ # CONFIG_HAPPYMEAL is not set
+ # CONFIG_SUNGEM is not set
++# CONFIG_CASSINI is not set
+ # CONFIG_NET_VENDOR_3COM is not set
+ # CONFIG_SMC91X is not set
+
+@@ -342,6 +427,7 @@
+ #
+ # CONFIG_NET_TULIP is not set
+ # CONFIG_HP100 is not set
++# CONFIG_NE2000 is not set
+ CONFIG_NET_PCI=y
+ # CONFIG_PCNET32 is not set
+ # CONFIG_AMD8111_ETH is not set
+@@ -376,13 +462,17 @@
+ # CONFIG_HAMACHI is not set
+ # CONFIG_YELLOWFIN is not set
+ # CONFIG_R8169 is not set
++# CONFIG_SIS190 is not set
++# CONFIG_SKGE is not set
+ # CONFIG_SK98LIN is not set
+ # CONFIG_VIA_VELOCITY is not set
+ # CONFIG_TIGON3 is not set
++# CONFIG_BNX2 is not set
+
+ #
+ # Ethernet (10000 Mbit)
+ #
++# CONFIG_CHELSIO_T1 is not set
+ # CONFIG_IXGB is not set
+ # CONFIG_S2IO is not set
+
+@@ -406,6 +496,8 @@
+ # 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
+@@ -435,18 +527,6 @@
+ # CONFIG_INPUT_EVBUG is not set
+
+ #
+-# Input I/O drivers
+-#
+-# CONFIG_GAMEPORT is not set
+-CONFIG_SOUND_GAMEPORT=y
+-CONFIG_SERIO=y
+-CONFIG_SERIO_I8042=y
+-CONFIG_SERIO_SERPORT=y
+-# CONFIG_SERIO_CT82C710 is not set
+-# CONFIG_SERIO_PCIPS2 is not set
+-# CONFIG_SERIO_RAW is not set
+-
+-#
+ # Input Device Drivers
+ #
+ # CONFIG_INPUT_KEYBOARD is not set
+@@ -456,6 +536,16 @@
+ # CONFIG_INPUT_MISC is not set
+
+ #
++# Hardware I/O ports
++#
++CONFIG_SERIO=y
++CONFIG_SERIO_I8042=y
++CONFIG_SERIO_SERPORT=y
++# CONFIG_SERIO_PCIPS2 is not set
++# CONFIG_SERIO_RAW is not set
++# CONFIG_GAMEPORT is not set
++
++#
+ # Character devices
+ #
+ CONFIG_VT=y
+@@ -472,6 +562,7 @@
+ # Non-8250 serial port support
+ #
+ # CONFIG_SERIAL_SH_SCI is not set
++# CONFIG_SERIAL_JSM is not set
+ CONFIG_UNIX98_PTYS=y
+ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=256
+@@ -498,6 +589,12 @@
+ # CONFIG_RAW_DRIVER is not set
+
+ #
++# TPM devices
++#
++# CONFIG_TCG_TPM is not set
++# CONFIG_TELCLOCK is not set
++
++#
+ # I2C support
+ #
+ # CONFIG_I2C is not set
+@@ -508,10 +605,21 @@
+ # CONFIG_W1 is not set
+
+ #
++# Hardware Monitoring support
++#
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++# CONFIG_HWMON_DEBUG_CHIP is not set
++
++#
+ # Misc devices
+ #
+
+ #
++# Multimedia Capabilities Port drivers
++#
++
++#
+ # Multimedia devices
+ #
+ # CONFIG_VIDEO_DEV is not set
+@@ -529,7 +637,6 @@
+ #
+ # Console display driver support
+ #
+-CONFIG_VGA_CONSOLE=y
+ CONFIG_DUMMY_CONSOLE=y
+
+ #
+@@ -540,12 +647,12 @@
+ #
+ # USB support
+ #
+-# CONFIG_USB is not set
+ CONFIG_USB_ARCH_HAS_HCD=y
+ CONFIG_USB_ARCH_HAS_OHCI=y
++# CONFIG_USB is not set
+
+ #
+-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+@@ -564,25 +671,29 @@
+ # CONFIG_INFINIBAND is not set
+
+ #
++# SN Devices
++#
++
++#
+ # File systems
+ #
+ CONFIG_EXT2_FS=y
+ # CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
+ # CONFIG_EXT3_FS is not set
+ # CONFIG_JBD is not set
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+-
+-#
+-# XFS support
+-#
++# CONFIG_FS_POSIX_ACL is not set
+ # CONFIG_XFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+ CONFIG_ROMFS_FS=y
++CONFIG_INOTIFY=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
+@@ -603,15 +714,11 @@
+ CONFIG_PROC_FS=y
+ # CONFIG_PROC_KCORE is not set
+ CONFIG_SYSFS=y
+-CONFIG_DEVFS_FS=y
+-CONFIG_DEVFS_MOUNT=y
+-# CONFIG_DEVFS_DEBUG is not set
+-# CONFIG_DEVPTS_FS_XATTR is not set
+ CONFIG_TMPFS=y
+-# CONFIG_TMPFS_XATTR is not set
+ # CONFIG_HUGETLBFS is not set
+ # CONFIG_HUGETLB_PAGE is not set
+ CONFIG_RAMFS=y
++# CONFIG_RELAYFS_FS is not set
+
+ #
+ # Miscellaneous filesystems
+@@ -635,12 +742,14 @@
+ #
+ CONFIG_NFS_FS=y
+ CONFIG_NFS_V3=y
++# CONFIG_NFS_V3_ACL 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_LOCKD_V4=y
++CONFIG_NFS_COMMON=y
+ CONFIG_SUNRPC=y
+ # CONFIG_RPCSEC_GSS_KRB5 is not set
+ # CONFIG_RPCSEC_GSS_SPKM3 is not set
+@@ -649,6 +758,7 @@
+ # 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
+@@ -669,7 +779,9 @@
+ #
+ # Kernel hacking
+ #
++# CONFIG_PRINTK_TIME is not set
+ # CONFIG_DEBUG_KERNEL is not set
++CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_FRAME_POINTER is not set
+ # CONFIG_SH_STANDARD_BIOS is not set
+ # CONFIG_EARLY_SCIF_CONSOLE is not set
+@@ -694,6 +806,7 @@
+ # 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
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/systemh_defconfig linux-2.6.17/arch/sh/configs/systemh_defconfig
+--- linux-2.6.17-vanilla/arch/sh/configs/systemh_defconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/systemh_defconfig 2006-07-12 16:54:21.000000000 +0000
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.11-sh
+-# Wed Mar 2 15:09:53 2005
++# Linux kernel version: 2.6.15-sh
++# Wed Jan 4 20:44:53 2006
+ #
+ CONFIG_SUPERH=y
+ CONFIG_UID16=y
+@@ -18,31 +18,36 @@
+ CONFIG_BROKEN=y
+ CONFIG_BROKEN_ON_SMP=y
+ CONFIG_LOCK_KERNEL=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
+
+ #
+ # General setup
+ #
+ CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
+ CONFIG_SWAP=y
+ # CONFIG_SYSVIPC is not set
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_SYSCTL is not set
+-# CONFIG_AUDIT is not set
+-CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_HOTPLUG is not set
+ # CONFIG_IKCONFIG is not set
++CONFIG_INITRAMFS_SOURCE=""
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_EMBEDDED=y
+ CONFIG_KALLSYMS=y
+ # CONFIG_KALLSYMS_EXTRA_PASS is not set
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_EPOLL=y
+-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_SHMEM=y
+ CONFIG_CC_ALIGN_FUNCTIONS=0
+ CONFIG_CC_ALIGN_LABELS=0
+ CONFIG_CC_ALIGN_LOOPS=0
+ CONFIG_CC_ALIGN_JUMPS=0
+ # CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
+
+ #
+ # Loadable module support
+@@ -56,6 +61,24 @@
+ # CONFIG_KMOD is not set
+
+ #
++# Block layer
++#
++# CONFIG_LBD 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_SH_SOLUTION_ENGINE is not set
+@@ -65,9 +88,7 @@
+ CONFIG_SH_7751_SYSTEMH=y
+ # CONFIG_SH_STB1_HARP is not set
+ # CONFIG_SH_STB1_OVERDRIVE is not set
+-# CONFIG_SH_HP620 is not set
+-# CONFIG_SH_HP680 is not set
+-# CONFIG_SH_HP690 is not set
++# CONFIG_SH_HP6XX is not set
+ # CONFIG_SH_CQREEK is not set
+ # CONFIG_SH_DMIDA is not set
+ # CONFIG_SH_EC3104 is not set
+@@ -84,41 +105,89 @@
+ # CONFIG_SH_RTS7751R2D is not set
+ # CONFIG_SH_EDOSK7705 is not set
+ # CONFIG_SH_SH4202_MICRODEV is not set
++# CONFIG_SH_LANDISK is not set
++# CONFIG_SH_TITAN is not set
+ # CONFIG_SH_UNKNOWN is not set
+-# CONFIG_CPU_SH2 is not set
+-# CONFIG_CPU_SH3 is not set
++
++#
++# Processor selection
++#
+ CONFIG_CPU_SH4=y
++
++#
++# SH-2 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7604 is not set
++
++#
++# SH-3 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7300 is not set
+ # CONFIG_CPU_SUBTYPE_SH7705 is not set
+ # CONFIG_CPU_SUBTYPE_SH7707 is not set
+ # CONFIG_CPU_SUBTYPE_SH7708 is not set
+ # CONFIG_CPU_SUBTYPE_SH7709 is not set
++
++#
++# SH-4 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_SH7750 is not set
++# CONFIG_CPU_SUBTYPE_SH7091 is not set
++# CONFIG_CPU_SUBTYPE_SH7750R is not set
++# CONFIG_CPU_SUBTYPE_SH7750S is not set
+ CONFIG_CPU_SUBTYPE_SH7751=y
++CONFIG_CPU_SUBTYPE_SH7751R=y
+ # CONFIG_CPU_SUBTYPE_SH7760 is not set
+-# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# ST40 Processor Support
++#
+ # CONFIG_CPU_SUBTYPE_ST40STB1 is not set
+ # CONFIG_CPU_SUBTYPE_ST40GX1 is not set
+-# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# SH-4A Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH7770 is not set
++# CONFIG_CPU_SUBTYPE_SH7780 is not set
++
++#
++# Memory management options
++#
+ CONFIG_MMU=y
+-# CONFIG_CMDLINE_BOOL 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=4
++
++#
++# Cache configuration
++#
++# CONFIG_SH_DIRECT_MAPPED is not set
++# CONFIG_SH_WRITETHROUGH is not set
++# CONFIG_SH_OCRAM is not set
+ CONFIG_MEMORY_START=0x0c000000
+ CONFIG_MEMORY_SIZE=0x00400000
+-# CONFIG_MEMORY_OVERRIDE is not set
++
++#
++# Processor features
++#
++CONFIG_CPU_LITTLE_ENDIAN=y
+ CONFIG_SH_RTC=y
+ CONFIG_SH_FPU=y
+-CONFIG_ZERO_PAGE_OFFSET=0x00001000
+-CONFIG_BOOT_LINK_OFFSET=0x00800000
+-CONFIG_CPU_LITTLE_ENDIAN=y
+-CONFIG_PREEMPT=y
+-# CONFIG_UBC_WAKEUP is not set
+-# CONFIG_SH_WRITETHROUGH is not set
+-# CONFIG_SH_OCRAM is not set
+ # CONFIG_SH_STORE_QUEUES is not set
+-# CONFIG_SMP is not set
+-CONFIG_SH_PCLK_CALC=y
+-CONFIG_SH_PCLK_FREQ=49876504
++
++#
++# Timer support
++#
++CONFIG_SH_TMU=y
++# CONFIG_SH_PCLK_FREQ_BOOL is not set
+
+ #
+ # CPU Frequency scaling
+@@ -136,14 +205,28 @@
+ # CONFIG_HD6446X_SERIES is not set
+
+ #
+-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
++# Kernel features
++#
++# CONFIG_KEXEC is not set
++CONFIG_PREEMPT=y
++# CONFIG_SMP is not set
++
++#
++# Boot options
++#
++CONFIG_ZERO_PAGE_OFFSET=0x00001000
++CONFIG_BOOT_LINK_OFFSET=0x00800000
++# CONFIG_UBC_WAKEUP is not set
++# CONFIG_CMDLINE_BOOL is not set
++
++#
++# Bus options
+ #
+ CONFIG_PCI=y
+ # CONFIG_SH_PCIDMA_NONCOHERENT is not set
+ CONFIG_PCI_AUTO=y
+ CONFIG_PCI_AUTO_UPDATE_RESOURCES=y
+ CONFIG_PCI_LEGACY_PROC=y
+-CONFIG_PCI_NAMES=y
+
+ #
+ # PCCARD (PCMCIA/CardBus) support
+@@ -151,10 +234,6 @@
+ # CONFIG_PCCARD is not set
+
+ #
+-# PC-card bridges
+-#
+-
+-#
+ # PCI Hotplug Support
+ #
+ # CONFIG_HOTPLUG_PCI is not set
+@@ -167,9 +246,9 @@
+ # CONFIG_BINFMT_MISC is not set
+
+ #
+-# SH initrd options
++# Networking
+ #
+-# CONFIG_EMBEDDED_RAMDISK is not set
++# CONFIG_NET is not set
+
+ #
+ # Device Drivers
+@@ -183,6 +262,10 @@
+ # CONFIG_FW_LOADER is not set
+
+ #
++# Connector - unified userspace <-> kernelspace linker
++#
++
++#
+ # Memory Technology Devices (MTD)
+ #
+ # CONFIG_MTD is not set
+@@ -199,7 +282,6 @@
+ #
+ # Block devices
+ #
+-# CONFIG_BLK_DEV_FD is not set
+ # CONFIG_BLK_CPQ_DA is not set
+ # CONFIG_BLK_CPQ_CISS_DA is not set
+ # CONFIG_BLK_DEV_DAC960 is not set
+@@ -211,19 +293,9 @@
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=1024
+ CONFIG_BLK_DEV_INITRD=y
+-CONFIG_INITRAMFS_SOURCE=""
+-# CONFIG_LBD is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+
+ #
+-# IO Schedulers
+-#
+-CONFIG_IOSCHED_NOOP=y
+-CONFIG_IOSCHED_AS=y
+-CONFIG_IOSCHED_DEADLINE=y
+-CONFIG_IOSCHED_CFQ=y
+-
+-#
+ # ATA/ATAPI/MFM/RLL support
+ #
+ # CONFIG_IDE is not set
+@@ -231,6 +303,7 @@
+ #
+ # SCSI device support
+ #
++# CONFIG_RAID_ATTRS is not set
+ # CONFIG_SCSI is not set
+
+ #
+@@ -241,6 +314,7 @@
+ #
+ # Fusion MPT device support
+ #
++# CONFIG_FUSION is not set
+
+ #
+ # IEEE 1394 (FireWire) support
+@@ -253,9 +327,8 @@
+ # CONFIG_I2O is not set
+
+ #
+-# Networking support
++# Network device support
+ #
+-# CONFIG_NET is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+
+@@ -274,25 +347,15 @@
+ # CONFIG_INPUT is not set
+
+ #
+-# Userland interfaces
+-#
+-
+-#
+-# Input I/O drivers
++# Hardware I/O ports
+ #
+-# CONFIG_GAMEPORT is not set
+-CONFIG_SOUND_GAMEPORT=y
+ CONFIG_SERIO=y
+ # CONFIG_SERIO_I8042 is not set
+ # CONFIG_SERIO_SERPORT is not set
+-# CONFIG_SERIO_CT82C710 is not set
+ # CONFIG_SERIO_PCIPS2 is not set
+ # CONFIG_SERIO_LIBPS2 is not set
+ # CONFIG_SERIO_RAW is not set
+-
+-#
+-# Input Device Drivers
+-#
++# CONFIG_GAMEPORT is not set
+
+ #
+ # Character devices
+@@ -309,6 +372,7 @@
+ # Non-8250 serial port support
+ #
+ # CONFIG_SERIAL_SH_SCI is not set
++# CONFIG_SERIAL_JSM is not set
+ CONFIG_UNIX98_PTYS=y
+ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=256
+@@ -335,6 +399,12 @@
+ # CONFIG_RAW_DRIVER is not set
+
+ #
++# TPM devices
++#
++# CONFIG_TCG_TPM is not set
++# CONFIG_TELCLOCK is not set
++
++#
+ # I2C support
+ #
+ # CONFIG_I2C is not set
+@@ -345,10 +415,21 @@
+ # CONFIG_W1 is not set
+
+ #
++# Hardware Monitoring support
++#
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++# CONFIG_HWMON_DEBUG_CHIP is not set
++
++#
+ # Misc devices
+ #
+
+ #
++# Multimedia Capabilities Port drivers
++#
++
++#
+ # Multimedia devices
+ #
+ # CONFIG_VIDEO_DEV is not set
+@@ -370,12 +451,12 @@
+ #
+ # USB support
+ #
+-# CONFIG_USB is not set
+ CONFIG_USB_ARCH_HAS_HCD=y
+ CONFIG_USB_ARCH_HAS_OHCI=y
++# CONFIG_USB is not set
+
+ #
+-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+
+ #
+@@ -394,6 +475,10 @@
+ # CONFIG_INFINIBAND is not set
+
+ #
++# SN Devices
++#
++
++#
+ # File systems
+ #
+ # CONFIG_EXT2_FS is not set
+@@ -401,17 +486,16 @@
+ # CONFIG_JBD is not set
+ # CONFIG_REISERFS_FS is not set
+ # CONFIG_JFS_FS is not set
+-
+-#
+-# XFS support
+-#
++# CONFIG_FS_POSIX_ACL is not set
+ # CONFIG_XFS_FS is not set
+ # CONFIG_MINIX_FS is not set
+ CONFIG_ROMFS_FS=y
++CONFIG_INOTIFY=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
+@@ -432,15 +516,11 @@
+ CONFIG_PROC_FS=y
+ CONFIG_PROC_KCORE=y
+ CONFIG_SYSFS=y
+-CONFIG_DEVFS_FS=y
+-CONFIG_DEVFS_MOUNT=y
+-# CONFIG_DEVFS_DEBUG is not set
+-# CONFIG_DEVPTS_FS_XATTR is not set
+ CONFIG_TMPFS=y
+-# CONFIG_TMPFS_XATTR is not set
+ # CONFIG_HUGETLBFS is not set
+ # CONFIG_HUGETLB_PAGE is not set
+ CONFIG_RAMFS=y
++# CONFIG_RELAYFS_FS is not set
+
+ #
+ # Miscellaneous filesystems
+@@ -478,8 +558,9 @@
+ #
+ # Kernel hacking
+ #
++# CONFIG_PRINTK_TIME is not set
+ # CONFIG_DEBUG_KERNEL is not set
+-CONFIG_DEBUG_PREEMPT=y
++CONFIG_LOG_BUF_SHIFT=14
+ # CONFIG_FRAME_POINTER is not set
+ # CONFIG_SH_STANDARD_BIOS is not set
+ # CONFIG_EARLY_SCIF_CONSOLE is not set
+@@ -504,6 +585,7 @@
+ # 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
+diff -ruN linux-2.6.17-vanilla/arch/sh/configs/titan_defconfig linux-2.6.17/arch/sh/configs/titan_defconfig
+--- linux-2.6.17-vanilla/arch/sh/configs/titan_defconfig 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/configs/titan_defconfig 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,1551 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.17
++# Thu Jul 6 12:42:07 2006
++#
++CONFIG_SUPERH=y
++CONFIG_RWSEM_GENERIC_SPINLOCK=y
++CONFIG_GENERIC_FIND_NEXT_BIT=y
++CONFIG_GENERIC_HWEIGHT=y
++CONFIG_GENERIC_HARDIRQS=y
++CONFIG_GENERIC_IRQ_PROBE=y
++CONFIG_GENERIC_CALIBRATE_DELAY=y
++
++#
++# 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_POSIX_MQUEUE=y
++# CONFIG_BSD_PROCESS_ACCT is not set
++CONFIG_SYSCTL=y
++# CONFIG_AUDIT is not set
++CONFIG_IKCONFIG=y
++CONFIG_IKCONFIG_PROC=y
++# CONFIG_RELAY is not set
++CONFIG_INITRAMFS_SOURCE=""
++CONFIG_UID16=y
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++# CONFIG_EMBEDDED 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_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
++# CONFIG_SLOB is not set
++CONFIG_OBSOLETE_INTERMODULE=m
++
++#
++# Loadable module support
++#
++CONFIG_MODULES=y
++CONFIG_MODULE_UNLOAD=y
++CONFIG_MODULE_FORCE_UNLOAD=y
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++CONFIG_KMOD=y
++
++#
++# Block layer
++#
++# CONFIG_LBD is not set
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF 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_SH_SOLUTION_ENGINE is not set
++# CONFIG_SH_7751_SOLUTION_ENGINE is not set
++# CONFIG_SH_7300_SOLUTION_ENGINE is not set
++# CONFIG_SH_73180_SOLUTION_ENGINE is not set
++# CONFIG_SH_7751_SYSTEMH is not set
++# CONFIG_SH_STB1_HARP is not set
++# CONFIG_SH_STB1_OVERDRIVE is not set
++# CONFIG_SH_HP6XX is not set
++# CONFIG_SH_CQREEK is not set
++# CONFIG_SH_DMIDA is not set
++# CONFIG_SH_EC3104 is not set
++# CONFIG_SH_SATURN is not set
++# CONFIG_SH_DREAMCAST is not set
++# CONFIG_SH_CAT68701 is not set
++# CONFIG_SH_BIGSUR is not set
++# CONFIG_SH_SH2000 is not set
++# CONFIG_SH_ADX is not set
++# CONFIG_SH_MPC1211 is not set
++# CONFIG_SH_SH03 is not set
++# CONFIG_SH_SECUREEDGE5410 is not set
++# CONFIG_SH_HS7751RVOIP is not set
++# CONFIG_SH_RTS7751R2D is not set
++# CONFIG_SH_R7780RP is not set
++# CONFIG_SH_EDOSK7705 is not set
++# CONFIG_SH_SH4202_MICRODEV is not set
++# CONFIG_SH_LANDISK is not set
++CONFIG_SH_TITAN=y
++# CONFIG_SH_UNKNOWN is not set
++
++#
++# Processor selection
++#
++CONFIG_CPU_SH4=y
++
++#
++# SH-2 Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH7604 is not set
++
++#
++# SH-3 Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH7300 is not set
++# CONFIG_CPU_SUBTYPE_SH7705 is not set
++# CONFIG_CPU_SUBTYPE_SH7707 is not set
++# CONFIG_CPU_SUBTYPE_SH7708 is not set
++# CONFIG_CPU_SUBTYPE_SH7709 is not set
++
++#
++# SH-4 Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH7750 is not set
++# CONFIG_CPU_SUBTYPE_SH7091 is not set
++# CONFIG_CPU_SUBTYPE_SH7750R is not set
++# CONFIG_CPU_SUBTYPE_SH7750S is not set
++CONFIG_CPU_SUBTYPE_SH7751=y
++CONFIG_CPU_SUBTYPE_SH7751R=y
++# CONFIG_CPU_SUBTYPE_SH7760 is not set
++# CONFIG_CPU_SUBTYPE_SH4_202 is not set
++
++#
++# ST40 Processor Support
++#
++# CONFIG_CPU_SUBTYPE_ST40STB1 is not set
++# CONFIG_CPU_SUBTYPE_ST40GX1 is not set
++
++#
++# SH-4A Processor Support
++#
++# CONFIG_CPU_SUBTYPE_SH73180 is not set
++# CONFIG_CPU_SUBTYPE_SH7770 is not set
++# CONFIG_CPU_SUBTYPE_SH7780 is not set
++
++#
++# Memory management options
++#
++CONFIG_MMU=y
++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=4
++
++#
++# Cache configuration
++#
++# CONFIG_SH_DIRECT_MAPPED is not set
++# CONFIG_SH_WRITETHROUGH is not set
++# CONFIG_SH_OCRAM is not set
++CONFIG_MEMORY_START=0x08030000
++CONFIG_MEMORY_SIZE=0x7fd0000
++
++#
++# Processor features
++#
++CONFIG_CPU_LITTLE_ENDIAN=y
++CONFIG_SH_RTC=y
++CONFIG_SH_FPU=y
++# CONFIG_SH_STORE_QUEUES is not set
++CONFIG_CPU_HAS_INTEVT=y
++CONFIG_CPU_HAS_SR_RB=y
++
++#
++# Timer support
++#
++CONFIG_SH_TMU=y
++CONFIG_SH_PCLK_FREQ=30000000
++
++#
++# CPU Frequency scaling
++#
++# CONFIG_CPU_FREQ is not set
++
++#
++# DMA support
++#
++CONFIG_SH_DMA=y
++CONFIG_NR_ONCHIP_DMA_CHANNELS=8
++# CONFIG_NR_DMA_CHANNELS_BOOL is not set
++
++#
++# Companion Chips
++#
++# CONFIG_HD6446X_SERIES is not set
++
++#
++# Kernel features
++#
++# CONFIG_KEXEC is not set
++# CONFIG_PREEMPT is not set
++# CONFIG_SMP is not set
++
++#
++# Boot options
++#
++CONFIG_ZERO_PAGE_OFFSET=0x00001000
++CONFIG_BOOT_LINK_OFFSET=0x009e0000
++# CONFIG_UBC_WAKEUP is not set
++CONFIG_CMDLINE_BOOL=y
++CONFIG_CMDLINE="console=ttySC1,38400N81 root=/dev/nfs ip=:::::eth1:autoconf"
++
++#
++# Bus options
++#
++CONFIG_PCI=y
++CONFIG_SH_PCIDMA_NONCOHERENT=y
++CONFIG_PCI_AUTO=y
++CONFIG_PCI_AUTO_UPDATE_RESOURCES=y
++# CONFIG_PCI_DEBUG is not set
++
++#
++# PCCARD (PCMCIA/CardBus) support
++#
++# CONFIG_PCCARD is not set
++
++#
++# PCI Hotplug Support
++#
++CONFIG_HOTPLUG_PCI=y
++# CONFIG_HOTPLUG_PCI_FAKE is not set
++# CONFIG_HOTPLUG_PCI_CPCI is not set
++# CONFIG_HOTPLUG_PCI_SHPC is not set
++
++#
++# Executable file formats
++#
++CONFIG_BINFMT_ELF=y
++# CONFIG_BINFMT_FLAT is not set
++# CONFIG_BINFMT_MISC is not set
++
++#
++# Power management options (EXPERIMENTAL)
++#
++# CONFIG_PM is not set
++
++#
++# Networking
++#
++CONFIG_NET=y
++
++#
++# Networking options
++#
++# CONFIG_NETDEBUG is not set
++CONFIG_PACKET=y
++CONFIG_PACKET_MMAP=y
++CONFIG_UNIX=y
++CONFIG_XFRM=y
++# CONFIG_XFRM_USER is not set
++CONFIG_NET_KEY=y
++CONFIG_INET=y
++CONFIG_IP_MULTICAST=y
++CONFIG_IP_ADVANCED_ROUTER=y
++CONFIG_ASK_IP_FIB_HASH=y
++# CONFIG_IP_FIB_TRIE is not set
++CONFIG_IP_FIB_HASH=y
++CONFIG_IP_MULTIPLE_TABLES=y
++# CONFIG_IP_ROUTE_FWMARK is not set
++CONFIG_IP_ROUTE_MULTIPATH=y
++CONFIG_IP_ROUTE_MULTIPATH_CACHED=y
++CONFIG_IP_ROUTE_MULTIPATH_RR=m
++CONFIG_IP_ROUTE_MULTIPATH_RANDOM=m
++CONFIG_IP_ROUTE_MULTIPATH_WRANDOM=m
++CONFIG_IP_ROUTE_MULTIPATH_DRR=m
++# CONFIG_IP_ROUTE_VERBOSE is not set
++CONFIG_IP_PNP=y
++CONFIG_IP_PNP_DHCP=y
++CONFIG_IP_PNP_BOOTP=y
++CONFIG_IP_PNP_RARP=y
++CONFIG_NET_IPIP=y
++CONFIG_NET_IPGRE=y
++CONFIG_NET_IPGRE_BROADCAST=y
++CONFIG_IP_MROUTE=y
++CONFIG_IP_PIMSM_V1=y
++CONFIG_IP_PIMSM_V2=y
++# CONFIG_ARPD is not set
++CONFIG_SYN_COOKIES=y
++CONFIG_INET_AH=y
++CONFIG_INET_ESP=y
++CONFIG_INET_IPCOMP=y
++CONFIG_INET_XFRM_TUNNEL=y
++CONFIG_INET_TUNNEL=y
++CONFIG_INET_DIAG=m
++CONFIG_INET_TCP_DIAG=m
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_BIC=y
++
++#
++# IP: Virtual Server Configuration
++#
++# CONFIG_IP_VS is not set
++CONFIG_IPV6=y
++CONFIG_IPV6_PRIVACY=y
++# CONFIG_IPV6_ROUTER_PREF is not set
++CONFIG_INET6_AH=y
++CONFIG_INET6_ESP=y
++CONFIG_INET6_IPCOMP=y
++CONFIG_INET6_XFRM_TUNNEL=y
++CONFIG_INET6_TUNNEL=y
++CONFIG_IPV6_TUNNEL=y
++CONFIG_NETFILTER=y
++# CONFIG_NETFILTER_DEBUG is not set
++CONFIG_BRIDGE_NETFILTER=y
++
++#
++# Core Netfilter Configuration
++#
++CONFIG_NETFILTER_NETLINK=m
++CONFIG_NETFILTER_NETLINK_QUEUE=m
++CONFIG_NETFILTER_NETLINK_LOG=m
++CONFIG_NETFILTER_XTABLES=m
++CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
++CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
++CONFIG_NETFILTER_XT_TARGET_MARK=m
++CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
++CONFIG_NETFILTER_XT_TARGET_NOTRACK=m
++CONFIG_NETFILTER_XT_MATCH_COMMENT=m
++CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
++CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
++CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
++CONFIG_NETFILTER_XT_MATCH_DCCP=m
++CONFIG_NETFILTER_XT_MATCH_ESP=m
++CONFIG_NETFILTER_XT_MATCH_HELPER=m
++CONFIG_NETFILTER_XT_MATCH_LENGTH=m
++CONFIG_NETFILTER_XT_MATCH_LIMIT=m
++CONFIG_NETFILTER_XT_MATCH_MAC=m
++CONFIG_NETFILTER_XT_MATCH_MARK=m
++CONFIG_NETFILTER_XT_MATCH_POLICY=m
++CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
++CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
++CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
++CONFIG_NETFILTER_XT_MATCH_REALM=m
++CONFIG_NETFILTER_XT_MATCH_SCTP=m
++CONFIG_NETFILTER_XT_MATCH_STATE=m
++CONFIG_NETFILTER_XT_MATCH_STRING=m
++CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
++
++#
++# IP: Netfilter Configuration
++#
++CONFIG_IP_NF_CONNTRACK=m
++CONFIG_IP_NF_CT_ACCT=y
++CONFIG_IP_NF_CONNTRACK_MARK=y
++CONFIG_IP_NF_CONNTRACK_EVENTS=y
++CONFIG_IP_NF_CONNTRACK_NETLINK=m
++# CONFIG_IP_NF_CT_PROTO_SCTP is not set
++CONFIG_IP_NF_FTP=m
++CONFIG_IP_NF_IRC=m
++CONFIG_IP_NF_NETBIOS_NS=m
++CONFIG_IP_NF_TFTP=m
++# CONFIG_IP_NF_AMANDA is not set
++CONFIG_IP_NF_PPTP=m
++CONFIG_IP_NF_H323=m
++CONFIG_IP_NF_QUEUE=m
++CONFIG_IP_NF_IPTABLES=m
++CONFIG_IP_NF_MATCH_IPRANGE=m
++CONFIG_IP_NF_MATCH_TOS=m
++CONFIG_IP_NF_MATCH_RECENT=m
++CONFIG_IP_NF_MATCH_ECN=m
++CONFIG_IP_NF_MATCH_DSCP=m
++CONFIG_IP_NF_MATCH_AH=m
++CONFIG_IP_NF_MATCH_TTL=m
++CONFIG_IP_NF_MATCH_OWNER=m
++CONFIG_IP_NF_MATCH_ADDRTYPE=m
++CONFIG_IP_NF_MATCH_HASHLIMIT=m
++CONFIG_IP_NF_FILTER=m
++CONFIG_IP_NF_TARGET_REJECT=m
++CONFIG_IP_NF_TARGET_LOG=m
++CONFIG_IP_NF_TARGET_ULOG=m
++CONFIG_IP_NF_TARGET_TCPMSS=m
++CONFIG_IP_NF_NAT=m
++CONFIG_IP_NF_NAT_NEEDED=y
++CONFIG_IP_NF_TARGET_MASQUERADE=m
++CONFIG_IP_NF_TARGET_REDIRECT=m
++CONFIG_IP_NF_TARGET_NETMAP=m
++CONFIG_IP_NF_TARGET_SAME=m
++CONFIG_IP_NF_NAT_SNMP_BASIC=m
++CONFIG_IP_NF_NAT_IRC=m
++CONFIG_IP_NF_NAT_FTP=m
++CONFIG_IP_NF_NAT_TFTP=m
++CONFIG_IP_NF_NAT_PPTP=m
++CONFIG_IP_NF_NAT_H323=m
++CONFIG_IP_NF_MANGLE=m
++CONFIG_IP_NF_TARGET_TOS=m
++CONFIG_IP_NF_TARGET_ECN=m
++CONFIG_IP_NF_TARGET_DSCP=m
++CONFIG_IP_NF_TARGET_TTL=m
++CONFIG_IP_NF_TARGET_CLUSTERIP=m
++CONFIG_IP_NF_RAW=m
++CONFIG_IP_NF_ARPTABLES=m
++CONFIG_IP_NF_ARPFILTER=m
++CONFIG_IP_NF_ARP_MANGLE=m
++
++#
++# IPv6: Netfilter Configuration (EXPERIMENTAL)
++#
++CONFIG_IP6_NF_QUEUE=m
++CONFIG_IP6_NF_IPTABLES=m
++CONFIG_IP6_NF_MATCH_RT=m
++CONFIG_IP6_NF_MATCH_OPTS=m
++CONFIG_IP6_NF_MATCH_FRAG=m
++CONFIG_IP6_NF_MATCH_HL=m
++CONFIG_IP6_NF_MATCH_OWNER=m
++CONFIG_IP6_NF_MATCH_IPV6HEADER=m
++CONFIG_IP6_NF_MATCH_AH=m
++CONFIG_IP6_NF_MATCH_EUI64=m
++CONFIG_IP6_NF_FILTER=m
++CONFIG_IP6_NF_TARGET_LOG=m
++CONFIG_IP6_NF_TARGET_REJECT=m
++CONFIG_IP6_NF_MANGLE=m
++CONFIG_IP6_NF_TARGET_HL=m
++CONFIG_IP6_NF_RAW=m
++
++#
++# Bridge: Netfilter Configuration
++#
++# CONFIG_BRIDGE_NF_EBTABLES 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=y
++CONFIG_VLAN_8021Q=y
++# CONFIG_DECNET is not set
++CONFIG_LLC=y
++# 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_NET_DIVERT is not set
++# CONFIG_ECONET is not set
++# CONFIG_WAN_ROUTER is not set
++
++#
++# QoS and/or fair queueing
++#
++CONFIG_NET_SCHED=y
++CONFIG_NET_SCH_CLK_JIFFIES=y
++# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
++# CONFIG_NET_SCH_CLK_CPU is not set
++
++#
++# Queueing/Scheduling
++#
++CONFIG_NET_SCH_CBQ=m
++CONFIG_NET_SCH_HTB=m
++CONFIG_NET_SCH_HFSC=m
++CONFIG_NET_SCH_PRIO=m
++CONFIG_NET_SCH_RED=m
++CONFIG_NET_SCH_SFQ=m
++CONFIG_NET_SCH_TEQL=m
++CONFIG_NET_SCH_TBF=m
++CONFIG_NET_SCH_GRED=m
++CONFIG_NET_SCH_DSMARK=m
++CONFIG_NET_SCH_NETEM=m
++CONFIG_NET_SCH_INGRESS=m
++
++#
++# Classification
++#
++CONFIG_NET_CLS=y
++CONFIG_NET_CLS_BASIC=m
++CONFIG_NET_CLS_TCINDEX=m
++CONFIG_NET_CLS_ROUTE4=m
++CONFIG_NET_CLS_ROUTE=y
++CONFIG_NET_CLS_FW=m
++CONFIG_NET_CLS_U32=m
++CONFIG_CLS_U32_PERF=y
++CONFIG_CLS_U32_MARK=y
++CONFIG_NET_CLS_RSVP=m
++CONFIG_NET_CLS_RSVP6=m
++CONFIG_NET_EMATCH=y
++CONFIG_NET_EMATCH_STACK=32
++CONFIG_NET_EMATCH_CMP=m
++CONFIG_NET_EMATCH_NBYTE=m
++CONFIG_NET_EMATCH_U32=m
++CONFIG_NET_EMATCH_META=m
++CONFIG_NET_EMATCH_TEXT=m
++CONFIG_NET_CLS_ACT=y
++CONFIG_NET_ACT_POLICE=m
++CONFIG_NET_ACT_GACT=m
++CONFIG_GACT_PROB=y
++CONFIG_NET_ACT_MIRRED=m
++CONFIG_NET_ACT_IPT=m
++CONFIG_NET_ACT_PEDIT=m
++# CONFIG_NET_ACT_SIMP is not set
++CONFIG_NET_CLS_IND=y
++CONFIG_NET_ESTIMATOR=y
++
++#
++# 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=y
++CONFIG_IEEE80211_SOFTMAC=m
++# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set
++CONFIG_WIRELESS_EXT=y
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_STANDALONE=y
++CONFIG_PREVENT_FIRMWARE_BUILD=y
++CONFIG_FW_LOADER=m
++# CONFIG_DEBUG_DRIVER is not set
++
++#
++# Connector - unified userspace <-> kernelspace linker
++#
++CONFIG_CONNECTOR=m
++
++#
++# Memory Technology Devices (MTD)
++#
++CONFIG_MTD=m
++CONFIG_MTD_DEBUG=y
++CONFIG_MTD_DEBUG_VERBOSE=0
++# CONFIG_MTD_CONCAT is not set
++# CONFIG_MTD_PARTITIONS is not set
++
++#
++# User Modules And Translation Layers
++#
++CONFIG_MTD_CHAR=m
++CONFIG_MTD_BLOCK=m
++# CONFIG_MTD_BLOCK_RO is not set
++CONFIG_FTL=m
++CONFIG_NFTL=m
++# CONFIG_NFTL_RW is not set
++CONFIG_INFTL=m
++CONFIG_RFD_FTL=m
++
++#
++# RAM/ROM/Flash chip drivers
++#
++CONFIG_MTD_CFI=m
++CONFIG_MTD_JEDECPROBE=m
++CONFIG_MTD_GEN_PROBE=m
++# 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 is not set
++# 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 is not set
++# CONFIG_MTD_CFI_AMDSTD is not set
++# CONFIG_MTD_CFI_STAA is not set
++# CONFIG_MTD_RAM is not set
++# CONFIG_MTD_ROM is not set
++# 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_SOLUTIONENGINE is not set
++# CONFIG_MTD_PLATRAM is not set
++
++#
++# Self-contained MTD device drivers
++#
++# CONFIG_MTD_PMC551 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=m
++# CONFIG_MTD_NAND_VERIFY_WRITE is not set
++CONFIG_MTD_NAND_IDS=m
++# CONFIG_MTD_NAND_DISKONCHIP is not set
++
++#
++# OneNAND Flash Device Drivers
++#
++# CONFIG_MTD_ONENAND is not set
++
++#
++# Parallel port support
++#
++# CONFIG_PARPORT is not set
++
++#
++# Plug and Play support
++#
++
++#
++# Block devices
++#
++# CONFIG_BLK_CPQ_DA is not set
++# CONFIG_BLK_CPQ_CISS_DA is not set
++# CONFIG_BLK_DEV_DAC960 is not set
++CONFIG_BLK_SSFDC=y
++# CONFIG_BLK_DEV_UMEM is not set
++# CONFIG_BLK_DEV_COW_COMMON is not set
++CONFIG_BLK_DEV_LOOP=m
++CONFIG_BLK_DEV_CRYPTOLOOP=m
++# CONFIG_BLK_DEV_NBD is not set
++# CONFIG_BLK_DEV_SX8 is not set
++# 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_INITRD=y
++# CONFIG_CDROM_PKTCDVD is not set
++CONFIG_ATA_OVER_ETH=m
++
++#
++# ATA/ATAPI/MFM/RLL support
++#
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++CONFIG_SCSI=y
++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 is not set
++
++#
++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
++#
++# CONFIG_SCSI_MULTI_LUN is not set
++# CONFIG_SCSI_CONSTANTS is not set
++# CONFIG_SCSI_LOGGING is not set
++
++#
++# SCSI Transport Attributes
++#
++# 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
++
++#
++# SCSI low-level drivers
++#
++# CONFIG_ISCSI_TCP is not set
++# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
++# CONFIG_SCSI_3W_9XXX is not set
++# CONFIG_SCSI_ACARD is not set
++# CONFIG_SCSI_AACRAID is not set
++# CONFIG_SCSI_AIC7XXX is not set
++# CONFIG_SCSI_AIC7XXX_OLD is not set
++# CONFIG_SCSI_AIC79XX is not set
++# CONFIG_SCSI_DPT_I2O is not set
++# CONFIG_MEGARAID_NEWGEN is not set
++# CONFIG_MEGARAID_LEGACY is not set
++# CONFIG_MEGARAID_SAS is not set
++# CONFIG_SCSI_SATA is not set
++# CONFIG_SCSI_DMX3191D is not set
++# CONFIG_SCSI_FUTURE_DOMAIN is not set
++# CONFIG_SCSI_IPS is not set
++# CONFIG_SCSI_INITIO is not set
++# CONFIG_SCSI_INIA100 is not set
++# CONFIG_SCSI_SYM53C8XX_2 is not set
++# CONFIG_SCSI_IPR is not set
++# CONFIG_SCSI_QLOGIC_1280 is not set
++# CONFIG_SCSI_QLA_FC is not set
++# CONFIG_SCSI_LPFC is not set
++# CONFIG_SCSI_DC395x is not set
++# CONFIG_SCSI_DC390T is not set
++# CONFIG_SCSI_NSP32 is not set
++# CONFIG_SCSI_DEBUG is not set
++
++#
++# Multi-device support (RAID and LVM)
++#
++# CONFIG_MD is not set
++
++#
++# Fusion MPT device support
++#
++# CONFIG_FUSION is not set
++# CONFIG_FUSION_SPI is not set
++# CONFIG_FUSION_FC is not set
++# CONFIG_FUSION_SAS is not set
++
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_IEEE1394 is not set
++
++#
++# I2O device support
++#
++# CONFIG_I2O is not set
++
++#
++# Network device support
++#
++CONFIG_NETDEVICES=y
++# CONFIG_IFB is not set
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_EQUALIZER is not set
++CONFIG_TUN=m
++
++#
++# ARCnet devices
++#
++# CONFIG_ARCNET is not set
++
++#
++# PHY device support
++#
++CONFIG_PHYLIB=m
++
++#
++# MII PHY device drivers
++#
++CONFIG_MARVELL_PHY=m
++CONFIG_DAVICOM_PHY=m
++CONFIG_QSEMI_PHY=m
++CONFIG_LXT_PHY=m
++CONFIG_CICADA_PHY=m
++
++#
++# Ethernet (10 or 100Mbit)
++#
++CONFIG_NET_ETHERNET=y
++CONFIG_MII=y
++# CONFIG_STNIC is not set
++# CONFIG_HAPPYMEAL is not set
++# CONFIG_SUNGEM is not set
++# CONFIG_CASSINI is not set
++# CONFIG_NET_VENDOR_3COM is not set
++# CONFIG_SMC91X is not set
++
++#
++# Tulip family network device support
++#
++# CONFIG_NET_TULIP is not set
++# CONFIG_HP100 is not set
++# CONFIG_NE2000 is not set
++CONFIG_NET_PCI=y
++# CONFIG_PCNET32 is not set
++# CONFIG_AMD8111_ETH is not set
++# CONFIG_ADAPTEC_STARFIRE is not set
++# CONFIG_B44 is not set
++# CONFIG_FORCEDETH is not set
++# CONFIG_DGRS is not set
++# CONFIG_EEPRO100 is not set
++# CONFIG_E100 is not set
++# CONFIG_FEALNX is not set
++# CONFIG_NATSEMI is not set
++# CONFIG_NE2K_PCI is not set
++# CONFIG_8139CP is not set
++CONFIG_8139TOO=y
++# CONFIG_8139TOO_PIO is not set
++CONFIG_8139TOO_TUNE_TWISTER=y
++# CONFIG_8139TOO_8129 is not set
++CONFIG_8139_OLD_RX_RESET=y
++# CONFIG_SIS900 is not set
++# CONFIG_EPIC100 is not set
++# CONFIG_SUNDANCE is not set
++# CONFIG_TLAN is not set
++# CONFIG_VIA_RHINE is not set
++
++#
++# Ethernet (1000 Mbit)
++#
++# CONFIG_ACENIC is not set
++# CONFIG_DL2K is not set
++# CONFIG_E1000 is not set
++# CONFIG_NS83820 is not set
++# CONFIG_HAMACHI is not set
++# CONFIG_YELLOWFIN is not set
++# CONFIG_R8169 is not set
++# CONFIG_SIS190 is not set
++# CONFIG_SKGE is not set
++# CONFIG_SKY2 is not set
++# CONFIG_SK98LIN is not set
++# CONFIG_VIA_VELOCITY is not set
++# CONFIG_TIGON3 is not set
++# CONFIG_BNX2 is not set
++
++#
++# Ethernet (10000 Mbit)
++#
++# CONFIG_CHELSIO_T1 is not set
++# CONFIG_IXGB is not set
++# CONFIG_S2IO is not set
++
++#
++# Token Ring devices
++#
++# CONFIG_TR is not set
++
++#
++# Wireless LAN (non-hamradio)
++#
++CONFIG_NET_RADIO=y
++CONFIG_NET_WIRELESS_RTNETLINK=y
++
++#
++# Obsolete Wireless cards support (pre-802.11)
++#
++# CONFIG_STRIP is not set
++
++#
++# Wireless 802.11b ISA/PCI cards support
++#
++# CONFIG_IPW2100 is not set
++# CONFIG_IPW2200 is not set
++# CONFIG_HERMES is not set
++# CONFIG_ATMEL is not set
++
++#
++# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
++#
++CONFIG_PRISM54=m
++# CONFIG_HOSTAP is not set
++CONFIG_BCM43XX=m
++CONFIG_BCM43XX_DEBUG=y
++CONFIG_BCM43XX_DMA=y
++CONFIG_BCM43XX_PIO=y
++CONFIG_BCM43XX_DMA_AND_PIO_MODE=y
++# CONFIG_BCM43XX_DMA_MODE is not set
++# CONFIG_BCM43XX_PIO_MODE is not set
++CONFIG_NET_WIRELESS=y
++
++#
++# Wan interfaces
++#
++# CONFIG_WAN is not set
++# CONFIG_FDDI is not set
++# CONFIG_HIPPI is not set
++CONFIG_PPP=m
++CONFIG_PPP_MULTILINK=y
++CONFIG_PPP_FILTER=y
++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=y
++CONFIG_SLIP_SMART=y
++# CONFIG_SLIP_MODE_SLIP6 is not set
++# CONFIG_NET_FC 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
++
++#
++# Telephony Support
++#
++# CONFIG_PHONE is not set
++
++#
++# Input device support
++#
++CONFIG_INPUT=y
++
++#
++# 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 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 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 is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++CONFIG_VT=y
++CONFIG_VT_CONSOLE=y
++CONFIG_HW_CONSOLE=y
++# CONFIG_SERIAL_NONSTANDARD is not set
++
++#
++# Serial drivers
++#
++# CONFIG_SERIAL_8250 is not set
++
++#
++# Non-8250 serial port support
++#
++CONFIG_SERIAL_SH_SCI=y
++CONFIG_SERIAL_SH_SCI_CONSOLE=y
++CONFIG_SERIAL_CORE=y
++CONFIG_SERIAL_CORE_CONSOLE=y
++# CONFIG_SERIAL_JSM is not set
++CONFIG_UNIX98_PTYS=y
++CONFIG_LEGACY_PTYS=y
++CONFIG_LEGACY_PTY_COUNT=256
++
++#
++# 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_SH_WDT=m
++
++#
++# PCI-based Watchdog Cards
++#
++# CONFIG_PCIPCWATCHDOG is not set
++# CONFIG_WDTPCI is not set
++
++#
++# USB-based Watchdog Cards
++#
++# CONFIG_USBPCWATCHDOG is not set
++# CONFIG_RTC is not set
++# CONFIG_GEN_RTC is not set
++# CONFIG_DTLK is not set
++# CONFIG_R3964 is not set
++# CONFIG_APPLICOM is not set
++
++#
++# Ftape, the floppy tape device driver
++#
++# CONFIG_DRM is not set
++# CONFIG_RAW_DRIVER is not set
++
++#
++# TPM devices
++#
++# CONFIG_TCG_TPM is not set
++# CONFIG_TELCLOCK is not set
++
++#
++# I2C support
++#
++# CONFIG_I2C is not set
++
++#
++# SPI support
++#
++# CONFIG_SPI is not set
++# CONFIG_SPI_MASTER is not set
++
++#
++# Dallas's 1-wire bus
++#
++# CONFIG_W1 is not set
++
++#
++# Hardware Monitoring support
++#
++CONFIG_HWMON=y
++# CONFIG_HWMON_VID is not set
++# CONFIG_SENSORS_F71805F is not set
++# CONFIG_HWMON_DEBUG_CHIP is not set
++
++#
++# Misc devices
++#
++
++#
++# Multimedia devices
++#
++# CONFIG_VIDEO_DEV is not set
++CONFIG_VIDEO_V4L2=y
++
++#
++# Digital Video Broadcasting Devices
++#
++# CONFIG_DVB is not set
++# CONFIG_USB_DABUSB is not set
++
++#
++# Graphics support
++#
++# CONFIG_FB is not set
++
++#
++# Console display driver support
++#
++CONFIG_DUMMY_CONSOLE=y
++
++#
++# 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=y
++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_OTG is not set
++
++#
++# USB Host Controller Drivers
++#
++CONFIG_USB_EHCI_HCD=y
++# CONFIG_USB_EHCI_SPLIT_ISO is not set
++# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
++# 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_UHCI_HCD is not set
++# CONFIG_USB_SL811_HCD is not set
++
++#
++# USB Device Class drivers
++#
++CONFIG_USB_ACM=m
++CONFIG_USB_PRINTER=m
++
++#
++# 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_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_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 is not set
++# CONFIG_USB_ZD1201 is not set
++CONFIG_USB_MON=y
++
++#
++# USB port drivers
++#
++
++#
++# USB Serial Converter support
++#
++CONFIG_USB_SERIAL=m
++CONFIG_USB_SERIAL_GENERIC=y
++# CONFIG_USB_SERIAL_AIRPRIME is not set
++# CONFIG_USB_SERIAL_ANYDATA is not set
++CONFIG_USB_SERIAL_ARK3116=m
++# CONFIG_USB_SERIAL_BELKIN is not set
++# CONFIG_USB_SERIAL_WHITEHEAT is not set
++# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
++# CONFIG_USB_SERIAL_CP2101 is not set
++# CONFIG_USB_SERIAL_CYPRESS_M8 is not set
++# CONFIG_USB_SERIAL_EMPEG is not set
++# CONFIG_USB_SERIAL_FTDI_SIO is not set
++# CONFIG_USB_SERIAL_FUNSOFT is not set
++# CONFIG_USB_SERIAL_VISOR is not set
++# CONFIG_USB_SERIAL_IPAQ is not set
++# CONFIG_USB_SERIAL_IR is not set
++# CONFIG_USB_SERIAL_EDGEPORT is not set
++# CONFIG_USB_SERIAL_EDGEPORT_TI is not set
++# CONFIG_USB_SERIAL_GARMIN is not set
++# CONFIG_USB_SERIAL_IPW is not set
++# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
++# CONFIG_USB_SERIAL_KEYSPAN is not set
++# CONFIG_USB_SERIAL_KLSI is not set
++# CONFIG_USB_SERIAL_KOBIL_SCT is not set
++# CONFIG_USB_SERIAL_MCT_U232 is not set
++# CONFIG_USB_SERIAL_NAVMAN is not set
++CONFIG_USB_SERIAL_PL2303=m
++# CONFIG_USB_SERIAL_HP4X is not set
++# CONFIG_USB_SERIAL_SAFE is not set
++# CONFIG_USB_SERIAL_TI is not set
++# CONFIG_USB_SERIAL_CYBERJACK is not set
++# CONFIG_USB_SERIAL_XIRCOM is not set
++# CONFIG_USB_SERIAL_OMNINET is not set
++
++#
++# USB Miscellaneous drivers
++#
++# CONFIG_USB_EMI62 is not set
++# CONFIG_USB_EMI26 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_CYTHERM is not set
++# CONFIG_USB_PHIDGETKIT is not set
++# CONFIG_USB_PHIDGETSERVO is not set
++# CONFIG_USB_IDMOUSE is not set
++# CONFIG_USB_SISUSBVGA is not set
++# CONFIG_USB_LD 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
++
++#
++# LED devices
++#
++# CONFIG_NEW_LEDS is not set
++
++#
++# LED drivers
++#
++
++#
++# LED Triggers
++#
++
++#
++# InfiniBand support
++#
++# CONFIG_INFINIBAND is not set
++
++#
++# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
++#
++
++#
++# Real Time Clock
++#
++# CONFIG_RTC_CLASS 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 is not set
++CONFIG_JBD=y
++# CONFIG_JBD_DEBUG is not set
++CONFIG_REISERFS_FS=m
++# CONFIG_REISERFS_CHECK is not set
++# CONFIG_REISERFS_PROC_INFO is not set
++# CONFIG_REISERFS_FS_XATTR is not set
++# CONFIG_JFS_FS is not set
++# CONFIG_FS_POSIX_ACL is not set
++CONFIG_XFS_FS=m
++CONFIG_XFS_EXPORT=y
++# CONFIG_XFS_QUOTA is not set
++# CONFIG_XFS_SECURITY is not set
++# CONFIG_XFS_POSIX_ACL is not set
++# CONFIG_XFS_RT is not set
++# CONFIG_OCFS2_FS is not set
++# CONFIG_MINIX_FS is not set
++# CONFIG_ROMFS_FS is not set
++CONFIG_INOTIFY=y
++# CONFIG_QUOTA is not set
++CONFIG_DNOTIFY=y
++# CONFIG_AUTOFS_FS is not set
++# CONFIG_AUTOFS4_FS is not set
++CONFIG_FUSE_FS=m
++
++#
++# CD-ROM/DVD Filesystems
++#
++CONFIG_ISO9660_FS=m
++CONFIG_JOLIET=y
++CONFIG_ZISOFS=y
++CONFIG_ZISOFS_FS=m
++CONFIG_UDF_FS=m
++CONFIG_UDF_NLS=y
++
++#
++# DOS/FAT/NT Filesystems
++#
++CONFIG_FAT_FS=m
++CONFIG_MSDOS_FS=m
++CONFIG_VFAT_FS=m
++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_KCORE=y
++CONFIG_SYSFS=y
++CONFIG_TMPFS=y
++# CONFIG_HUGETLBFS is not set
++# CONFIG_HUGETLB_PAGE is not set
++CONFIG_RAMFS=y
++CONFIG_CONFIGFS_FS=m
++
++#
++# 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 is not set
++# CONFIG_JFFS2_FS 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=y
++# CONFIG_NFS_V3_ACL is not set
++# CONFIG_NFS_V4 is not set
++# CONFIG_NFS_DIRECTIO is not set
++CONFIG_NFSD=y
++CONFIG_NFSD_V3=y
++# CONFIG_NFSD_V3_ACL is not set
++# CONFIG_NFSD_V4 is not set
++CONFIG_NFSD_TCP=y
++CONFIG_ROOT_NFS=y
++CONFIG_LOCKD=y
++CONFIG_LOCKD_V4=y
++CONFIG_EXPORTFS=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=m
++# CONFIG_SMB_NLS_DEFAULT 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=m
++
++#
++# 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 is not set
++# CONFIG_MINIX_SUBPARTITION is not set
++# CONFIG_SOLARIS_X86_PARTITION is not set
++# 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=m
++CONFIG_NLS_DEFAULT="iso8859-1"
++CONFIG_NLS_CODEPAGE_437=m
++# 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=m
++CONFIG_NLS_ISO8859_1=m
++# 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=m
++
++#
++# Profiling support
++#
++# CONFIG_PROFILING is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_MAGIC_SYSRQ=y
++CONFIG_DEBUG_KERNEL=y
++CONFIG_LOG_BUF_SHIFT=16
++# CONFIG_DETECT_SOFTLOCKUP is not set
++# CONFIG_SCHEDSTATS is not set
++# CONFIG_DEBUG_SLAB is not set
++# CONFIG_DEBUG_MUTEXES is not set
++# CONFIG_DEBUG_SPINLOCK is not set
++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
++# CONFIG_DEBUG_KOBJECT is not set
++# CONFIG_DEBUG_INFO is not set
++# CONFIG_DEBUG_FS is not set
++# CONFIG_DEBUG_VM is not set
++# CONFIG_FRAME_POINTER is not set
++# CONFIG_FORCED_INLINING is not set
++# CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_SH_STANDARD_BIOS is not set
++CONFIG_EARLY_SCIF_CONSOLE=y
++# CONFIG_EARLY_PRINTK is not set
++# CONFIG_KGDB is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++
++#
++# Cryptographic options
++#
++CONFIG_CRYPTO=y
++CONFIG_CRYPTO_HMAC=y
++CONFIG_CRYPTO_NULL=m
++CONFIG_CRYPTO_MD4=m
++CONFIG_CRYPTO_MD5=y
++CONFIG_CRYPTO_SHA1=y
++CONFIG_CRYPTO_SHA256=m
++CONFIG_CRYPTO_SHA512=m
++CONFIG_CRYPTO_WP512=m
++CONFIG_CRYPTO_TGR192=m
++CONFIG_CRYPTO_DES=y
++CONFIG_CRYPTO_BLOWFISH=m
++CONFIG_CRYPTO_TWOFISH=m
++CONFIG_CRYPTO_SERPENT=m
++CONFIG_CRYPTO_AES=y
++CONFIG_CRYPTO_CAST5=m
++CONFIG_CRYPTO_CAST6=m
++CONFIG_CRYPTO_TEA=m
++CONFIG_CRYPTO_ARC4=y
++CONFIG_CRYPTO_KHAZAD=m
++CONFIG_CRYPTO_ANUBIS=m
++CONFIG_CRYPTO_DEFLATE=y
++CONFIG_CRYPTO_MICHAEL_MIC=y
++CONFIG_CRYPTO_CRC32C=m
++# CONFIG_CRYPTO_TEST is not set
++
++#
++# Hardware crypto devices
++#
++
++#
++# Library routines
++#
++CONFIG_CRC_CCITT=m
++CONFIG_CRC16=m
++CONFIG_CRC32=y
++CONFIG_LIBCRC32C=m
++CONFIG_ZLIB_INFLATE=y
++CONFIG_ZLIB_DEFLATE=y
++CONFIG_TEXTSEARCH=y
++CONFIG_TEXTSEARCH_KMP=m
++CONFIG_TEXTSEARCH_BM=m
++CONFIG_TEXTSEARCH_FSM=m
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/CVS/Entries linux-2.6.17/arch/sh/drivers/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/drivers/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/CVS/Entries 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,4 @@
++/Makefile/1.2/Thu Mar 17 07:43:07 2005//
++D/dma////
++D/pci////
++D/superhyway////
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/CVS/Repository linux-2.6.17/arch/sh/drivers/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/drivers/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/CVS/Repository 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/drivers
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/CVS/Root linux-2.6.17/arch/sh/drivers/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/drivers/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/CVS/Root 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/dma/CVS/Entries linux-2.6.17/arch/sh/drivers/dma/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/drivers/dma/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/dma/CVS/Entries 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,10 @@
++/Kconfig/1.6/Sun Feb 5 15:23:46 2006//
++/Makefile/1.5/Sun May 16 01:53:40 2004//
++/dma-api.c/1.15/Wed Jan 4 15:01:03 2006//
++/dma-isa.c/1.4/Sun Oct 16 16:37:55 2005//
++/dma-pvr2.c/1.6/Sun Feb 5 15:28:01 2006//
++/dma-sh.c/1.15/Sun Feb 5 15:25:52 2006//
++/dma-sh.h/1.5/Mon Oct 17 02:27:14 2005//
++/dma-sysfs.c/1.7/Wed Jan 4 15:01:03 2006//
++/dma-g2.c/1.6/Thu Jul 6 12:38:08 2006//
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/dma/CVS/Repository linux-2.6.17/arch/sh/drivers/dma/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/drivers/dma/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/dma/CVS/Repository 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/drivers/dma
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/dma/CVS/Root linux-2.6.17/arch/sh/drivers/dma/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/drivers/dma/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/dma/CVS/Root 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/dma/Kconfig linux-2.6.17/arch/sh/drivers/dma/Kconfig
+--- linux-2.6.17-vanilla/arch/sh/drivers/dma/Kconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/dma/Kconfig 2006-07-12 16:54:21.000000000 +0000
+@@ -11,6 +11,8 @@
+ config NR_ONCHIP_DMA_CHANNELS
+ depends on SH_DMA
+ int "Number of on-chip DMAC channels"
++ default "8" if CPU_SUBTYPE_SH7750R || CPU_SUBTYPE_SH7751R
++ default "12" if CPU_SUBTYPE_SH7780
+ default "4"
+ help
+ This allows you to specify the number of channels that the on-chip
+@@ -52,4 +54,3 @@
+ are dual-address capable.
+
+ endmenu
+-
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/dma/dma-g2.c linux-2.6.17/arch/sh/drivers/dma/dma-g2.c
+--- linux-2.6.17-vanilla/arch/sh/drivers/dma/dma-g2.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/dma/dma-g2.c 2006-07-12 16:54:21.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * G2 bus DMA support
+ *
+- * Copyright (C) 2003, 2004 Paul Mundt
++ * Copyright (C) 2003 - 2006 Paul Mundt
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+@@ -13,7 +13,7 @@
+ #include <linux/kernel.h>
+ #include <linux/module.h>
+ #include <linux/interrupt.h>
+-
++#include <asm/cacheflush.h>
+ #include <asm/mach/sysasic.h>
+ #include <asm/mach/dma.h>
+ #include <asm/dma.h>
+@@ -47,17 +47,31 @@
+
+ static volatile struct g2_dma_info *g2_dma = (volatile struct g2_dma_info *)0xa05f7800;
+
++#define g2_bytes_remaining(i) \
++ ((g2_dma->channel[i].size - \
++ g2_dma->status[i].size) & 0x0fffffff)
++
+ static irqreturn_t g2_dma_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+ {
+- /* FIXME: Do some meaningful completion work here.. */
+- return IRQ_HANDLED;
+-}
++ int i;
+
+-static struct irqaction g2_dma_irq = {
+- .name = "g2 DMA handler",
+- .handler = g2_dma_interrupt,
+- .flags = SA_INTERRUPT,
+-};
++ for (i = 0; i < G2_NR_DMA_CHANNELS; i++) {
++ if (g2_dma->status[i].status & 0x20000000) {
++ unsigned int bytes = g2_bytes_remaining(i);
++
++ if (likely(bytes == 0)) {
++ struct dma_info *info = dev_id;
++ struct dma_channel *chan = info->channels + i;
++
++ wake_up(&chan->wait_queue);
++
++ return IRQ_HANDLED;
++ }
++ }
++ }
++
++ return IRQ_NONE;
++}
+
+ static int g2_enable_dma(struct dma_channel *chan)
+ {
+@@ -135,8 +149,14 @@
+ return 0;
+ }
+
++static int g2_get_residue(struct dma_channel *chan)
++{
++ return g2_bytes_remaining(chan->chan);
++}
++
+ static struct dma_ops g2_dma_ops = {
+ .xfer = g2_xfer_dma,
++ .get_residue = g2_get_residue,
+ };
+
+ static struct dma_info g2_dma_info = {
+@@ -148,13 +168,22 @@
+
+ static int __init g2_dma_init(void)
+ {
+- setup_irq(HW_EVENT_G2_DMA, &g2_dma_irq);
++ int ret;
+
++ ret = request_irq(HW_EVENT_G2_DMA, g2_dma_interrupt, SA_INTERRUPT,
++ "g2 DMA handler", &g2_dma_info);
++ if (unlikely(ret))
++ return -EINVAL;
++
+ /* Magic */
+ g2_dma->wait_state = 27;
+ g2_dma->magic = 0x4659404f;
+
+- return register_dmac(&g2_dma_info);
++ ret = register_dmac(&g2_dma_info);
++ if (unlikely(ret != 0))
++ free_irq(HW_EVENT_G2_DMA, 0);
++
++ return ret;
+ }
+
+ static void __exit g2_dma_exit(void)
+@@ -169,4 +198,3 @@
+ MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>");
+ MODULE_DESCRIPTION("G2 bus DMA driver");
+ MODULE_LICENSE("GPL");
+-
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/dma/dma-pvr2.c linux-2.6.17/arch/sh/drivers/dma/dma-pvr2.c
+--- linux-2.6.17-vanilla/arch/sh/drivers/dma/dma-pvr2.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/dma/dma-pvr2.c 2006-07-12 16:54:21.000000000 +0000
+@@ -18,8 +18,8 @@
+ #include <asm/dma.h>
+ #include <asm/io.h>
+
+-static unsigned int xfer_complete = 0;
+-static int count = 0;
++static unsigned int xfer_complete;
++static int count;
+
+ static irqreturn_t pvr2_dma_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+ {
+@@ -107,4 +107,3 @@
+ MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>");
+ MODULE_DESCRIPTION("NEC PowerVR 2 DMA driver");
+ MODULE_LICENSE("GPL");
+-
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/dma/dma-sh.c linux-2.6.17/arch/sh/drivers/dma/dma-sh.c
+--- linux-2.6.17-vanilla/arch/sh/drivers/dma/dma-sh.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/dma/dma-sh.c 2006-07-12 16:54:21.000000000 +0000
+@@ -11,15 +11,11 @@
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+-
+ #include <linux/config.h>
+ #include <linux/init.h>
+-#include <linux/irq.h>
+ #include <linux/interrupt.h>
+ #include <linux/module.h>
+ #include <asm/dreamcast/dma.h>
+-#include <asm/signal.h>
+-#include <asm/irq.h>
+ #include <asm/dma.h>
+ #include <asm/io.h>
+ #include "dma-sh.h"
+@@ -87,6 +83,9 @@
+ {
+ char name[32];
+
++ if (unlikely(!chan->flags & DMA_TEI_CAPABLE))
++ return 0;
++
+ snprintf(name, sizeof(name), "DMAC Transfer End (Channel %d)",
+ chan->chan);
+
+@@ -260,7 +259,7 @@
+ #ifdef CONFIG_CPU_SH4
+ make_ipr_irq(DMAE_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY);
+ i = request_irq(DMAE_IRQ, dma_err, SA_INTERRUPT, "DMAC Address Error", 0);
+- if (i < 0)
++ if (unlikely(i < 0))
+ return i;
+ #endif
+
+@@ -275,7 +274,7 @@
+ * been set.
+ */
+ i = dmaor_reset();
+- if (i < 0)
++ if (unlikely(i != 0))
+ return i;
+
+ return register_dmac(info);
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/CVS/Entries linux-2.6.17/arch/sh/drivers/pci/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/CVS/Entries 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,26 @@
++/Kconfig/1.4/Wed Mar 2 13:02:55 2005//
++/Makefile/1.9/Wed Feb 8 21:55:09 2006//
++/dma-dreamcast.c/1.4/Tue Jan 3 22:35:51 2006//
++/fixups-dreamcast.c/1.6/Tue Feb 7 20:12:06 2006//
++/fixups-r7780rp.c/1.5/Wed Feb 8 12:17:46 2006/-ko/
++/fixups-rts7751r2d.c/1.4/Thu Feb 23 11:10:52 2006/-ko/
++/fixups-sh03.c/1.3/Sun Feb 5 18:34:56 2006/-ko/
++/ops-bigsur.c/1.3/Sun Feb 5 21:55:29 2006//
++/ops-dreamcast.c/1.1/Sun Aug 24 19:15:45 2003//
++/ops-landisk.c/1.1/Wed Feb 8 21:55:09 2006/-ko/
++/ops-r7780rp.c/1.3/Sun Feb 5 21:55:29 2006/-ko/
++/ops-rts7751r2d.c/1.4/Sun Feb 5 21:55:29 2006/-ko/
++/ops-sh03.c/1.1/Thu Oct 7 11:01:14 2004/-ko/
++/ops-sh4.c/1.1/Sun Feb 5 21:55:29 2006/-ko/
++/ops-snapgear.c/1.4/Sun Feb 5 21:55:29 2006//
++/ops-titan.c/1.5/Wed Feb 8 13:32:20 2006/-ko/
++/pci-auto.c/1.6/Sun Feb 5 18:31:46 2006//
++/pci-sh4.h/1.1/Sun Feb 5 21:55:29 2006/-ko/
++/pci-sh7751.c/1.17/Thu Feb 23 11:10:52 2006//
++/pci-sh7751.h/1.5/Sun Feb 5 21:55:29 2006/-ko/
++/pci-sh7780.c/1.5/Tue Feb 7 15:28:03 2006/-ko/
++/pci-sh7780.h/1.4/Wed Feb 8 12:09:30 2006/-ko/
++/pci-st40.c/1.7/Sun Feb 5 18:45:40 2006//
++/pci-st40.h/1.3/Thu Aug 19 16:10:14 2004//
++/pci.c/1.10/Wed Feb 8 12:21:32 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/CVS/Repository linux-2.6.17/arch/sh/drivers/pci/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/CVS/Repository 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/drivers/pci
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/CVS/Root linux-2.6.17/arch/sh/drivers/pci/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/CVS/Root 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/Makefile linux-2.6.17/arch/sh/drivers/pci/Makefile
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/Makefile 2006-07-12 16:54:21.000000000 +0000
+@@ -6,7 +6,8 @@
+ obj-$(CONFIG_PCI_AUTO) += pci-auto.o
+
+ obj-$(CONFIG_CPU_SUBTYPE_ST40STB1) += pci-st40.o
+-obj-$(CONFIG_CPU_SUBTYPE_SH7751) += pci-sh7751.o
++obj-$(CONFIG_CPU_SUBTYPE_SH7751) += pci-sh7751.o ops-sh4.o
++obj-$(CONFIG_CPU_SUBTYPE_SH7780) += pci-sh7780.o ops-sh4.o
+
+ obj-$(CONFIG_SH_DREAMCAST) += ops-dreamcast.o fixups-dreamcast.o \
+ dma-dreamcast.o
+@@ -14,3 +15,6 @@
+ obj-$(CONFIG_SH_BIGSUR) += ops-bigsur.o
+ obj-$(CONFIG_SH_RTS7751R2D) += ops-rts7751r2d.o fixups-rts7751r2d.o
+ obj-$(CONFIG_SH_SH03) += ops-sh03.o fixups-sh03.o
++obj-$(CONFIG_SH_R7780RP) += ops-r7780rp.o fixups-r7780rp.o
++obj-$(CONFIG_SH_TITAN) += ops-titan.o
++obj-$(CONFIG_SH_LANDISK) += ops-landisk.o
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/fixups-dreamcast.c linux-2.6.17/arch/sh/drivers/pci/fixups-dreamcast.c
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/fixups-dreamcast.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/fixups-dreamcast.c 2006-07-12 16:54:21.000000000 +0000
+@@ -4,7 +4,7 @@
+ * PCI fixups for the Sega Dreamcast
+ *
+ * Copyright (C) 2001, 2002 M. R. Brown
+- * Copyright (C) 2002, 2003 Paul Mundt
++ * Copyright (C) 2002, 2003, 2006 Paul Mundt
+ *
+ * This file originally bore the message (with enclosed-$):
+ * Id: pci.c,v 1.3 2003/05/04 19:29:46 lethal Exp
+@@ -46,36 +46,16 @@
+ printk("PCI: Failed resource fixup\n");
+ }
+ }
+-
+ DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, gapspci_fixup_resources);
+
+-void __init pcibios_fixup_bus(struct pci_bus *bus)
++int __init pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin)
+ {
+- /*
+- * We don't have any sub bus to fix up, and this is a rather
+- * stupid place to put general device fixups. Don't do it.
+- * Use the pcibios_fixups table or suffer the consequences.
++ /*
++ * The interrupt routing semantics here are quite trivial.
++ *
++ * We basically only support one interrupt, so we only bother
++ * updating a device's interrupt line with this single shared
++ * interrupt. Keeps routing quite simple, doesn't it?
+ */
++ return GAPSPCI_IRQ;
+ }
+-
+-void __init pcibios_fixup_irqs(void)
+-{
+- struct pci_dev *dev = 0;
+-
+- for_each_pci_dev(dev) {
+- /*
+- * The interrupt routing semantics here are quite trivial.
+- *
+- * We basically only support one interrupt, so we only bother
+- * updating a device's interrupt line with this single shared
+- * interrupt. Keeps routing quite simple, doesn't it?
+- */
+- printk(KERN_NOTICE "PCI: Fixing up IRQ routing for device %s\n",
+- pci_name(dev));
+-
+- dev->irq = GAPSPCI_IRQ;
+-
+- pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
+- }
+-}
+-
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/fixups-r7780rp.c linux-2.6.17/arch/sh/drivers/pci/fixups-r7780rp.c
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/fixups-r7780rp.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/fixups-r7780rp.c 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,45 @@
++/*
++ * arch/sh/drivers/pci/fixups-r7780rp.c
++ *
++ * Highlander R7780RP-1 PCI fixups
++ *
++ * Copyright (C) 2003 Lineo uSolutions, Inc.
++ * Copyright (C) 2004 - 2006 Paul Mundt
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ */
++#include <linux/pci.h>
++#include "pci-sh4.h"
++#include <asm/io.h>
++
++int pci_fixup_pcic(void)
++{
++ pci_write_reg(0x000043ff, SH4_PCIINTM);
++ pci_write_reg(0x0000380f, SH4_PCIAINTM);
++
++ pci_write_reg(0xfbb00047, SH7780_PCICMD);
++ pci_write_reg(0x00000000, SH7780_PCIIBAR);
++
++ pci_write_reg(0x00011912, SH7780_PCISVID);
++ pci_write_reg(0x08000000, SH7780_PCICSCR0);
++ pci_write_reg(0x0000001b, SH7780_PCICSAR0);
++ pci_write_reg(0xfd000000, SH7780_PCICSCR1);
++ pci_write_reg(0x0000000f, SH7780_PCICSAR1);
++
++ pci_write_reg(0xfd000000, SH7780_PCIMBR0);
++ pci_write_reg(0x00fc0000, SH7780_PCIMBMR0);
++
++#ifdef CONFIG_32BIT
++ pci_write_reg(0xc0000000, SH7780_PCIMBR2);
++ pci_write_reg(0x20000000 - SH7780_PCI_IO_SIZE, SH7780_PCIMBMR2);
++#endif
++
++ /* Set IOBR for windows containing area specified in pci.h */
++ pci_write_reg((PCIBIOS_MIN_IO & ~(SH7780_PCI_IO_SIZE - 1)),
++ SH7780_PCIIOBR);
++ pci_write_reg(((SH7780_PCI_IO_SIZE-1) & (7<<18)), SH7780_PCIIOBMR);
++
++ return 0;
++}
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/fixups-rts7751r2d.c linux-2.6.17/arch/sh/drivers/pci/fixups-rts7751r2d.c
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/fixups-rts7751r2d.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/fixups-rts7751r2d.c 2006-07-12 16:54:21.000000000 +0000
+@@ -10,8 +10,7 @@
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+-#include "pci-sh7751.h"
+-#include <asm/io.h>
++#include "pci-sh4.h"
+
+ #define PCIMCR_MRSET_OFF 0xBFFFFFFF
+ #define PCIMCR_RFSH_OFF 0xFFFFFFFB
+@@ -22,22 +21,23 @@
+
+ bcr1 = inl(SH7751_BCR1);
+ bcr1 |= 0x40080000; /* Enable Bit 19 BREQEN, set PCIC to slave */
+- outl(bcr1, PCI_REG(SH7751_PCIBCR1));
++ pci_write_reg(bcr1, SH4_PCIBCR1);
+
+ /* Enable all interrupts, so we known what to fix */
+- outl(0x0000c3ff, PCI_REG(SH7751_PCIINTM));
+- outl(0x0000380f, PCI_REG(SH7751_PCIAINTM));
++ pci_write_reg(0x0000c3ff, SH4_PCIINTM);
++ pci_write_reg(0x0000380f, SH4_PCIAINTM);
+
+- outl(0xfb900047, PCI_REG(SH7751_PCICONF1));
+- outl(0xab000001, PCI_REG(SH7751_PCICONF4));
++ pci_write_reg(0xfb900047, SH7751_PCICONF1);
++ pci_write_reg(0xab000001, SH7751_PCICONF4);
+
+ mcr = inl(SH7751_MCR);
+ mcr = (mcr & PCIMCR_MRSET_OFF) & PCIMCR_RFSH_OFF;
+- outl(mcr, PCI_REG(SH7751_PCIMCR));
++ pci_write_reg(mcr, SH4_PCIMCR);
++
++ pci_write_reg(0x0c000000, SH7751_PCICONF5);
++ pci_write_reg(0xd0000000, SH7751_PCICONF6);
++ pci_write_reg(0x0c000000, SH4_PCILAR0);
++ pci_write_reg(0x00000000, SH4_PCILAR1);
+
+- outl(0x0c000000, PCI_REG(SH7751_PCICONF5));
+- outl(0xd0000000, PCI_REG(SH7751_PCICONF6));
+- outl(0x0c000000, PCI_REG(SH7751_PCILAR0));
+- outl(0x00000000, PCI_REG(SH7751_PCILAR1));
+ return 0;
+ }
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/fixups-sh03.c linux-2.6.17/arch/sh/drivers/pci/fixups-sh03.c
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/fixups-sh03.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/fixups-sh03.c 2006-07-12 16:54:21.000000000 +0000
+@@ -3,11 +3,7 @@
+ #include <linux/types.h>
+ #include <linux/pci.h>
+
+-/*
+- * IRQ functions
+- */
+-
+-int __init pcibios_map_platform_irq(u8 slot, u8 pin, struct pci_dev *dev)
++int __init pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin)
+ {
+ int irq;
+
+@@ -17,8 +13,9 @@
+ case 8: return 5; /* eth1 */
+ case 6: return 2; /* PCI bridge */
+ default:
+- printk("PCI: Bad IRQ mapping request for slot %d\n", slot);
+- return 2;
++ printk(KERN_ERR "PCI: Bad IRQ mapping request "
++ "for slot %d\n", slot);
++ return 2;
+ }
+ } else {
+ switch (pin) {
+@@ -32,30 +29,3 @@
+ }
+ return irq;
+ }
+-
+-static u8 __init sh03_no_swizzle(struct pci_dev *dev, u8 *pin)
+-{
+- /* no swizzling */
+- return PCI_SLOT(dev->devfn);
+-}
+-
+-static int sh03_pci_lookup_irq(struct pci_dev *dev, u8 slot, u8 pin)
+-{
+- int irq = -1;
+-
+- /* now lookup the actual IRQ on a platform specific basis (pci-'platform'.c) */
+- irq = pcibios_map_platform_irq(slot, pin, dev);
+- if( irq < 0 ) {
+- pr_debug("PCI: Error mapping IRQ on device %s\n", pci_name(dev));
+- return irq;
+- }
+-
+- pr_debug("Setting IRQ for slot %s to %d\n", pci_name(dev), irq);
+-
+- return irq;
+-}
+-
+-void __init pcibios_fixup_irqs(void)
+-{
+- pci_fixup_irqs(sh03_no_swizzle, sh03_pci_lookup_irq);
+-}
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/ops-bigsur.c linux-2.6.17/arch/sh/drivers/pci/ops-bigsur.c
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/ops-bigsur.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/ops-bigsur.c 2006-07-12 16:54:21.000000000 +0000
+@@ -10,16 +10,13 @@
+ *
+ * PCI initialization for the Hitachi Big Sur Evaluation Board
+ */
+-
+ #include <linux/config.h>
+ #include <linux/kernel.h>
+ #include <linux/types.h>
+ #include <linux/init.h>
+-#include <linux/delay.h>
+ #include <linux/pci.h>
+-
+ #include <asm/io.h>
+-#include "pci-sh7751.h"
++#include "pci-sh4.h"
+ #include <asm/bigsur/bigsur.h>
+
+ #define BIGSUR_PCI_IO 0x4000
+@@ -42,11 +39,11 @@
+ extern struct pci_ops sh7751_pci_ops;
+
+ struct pci_channel board_pci_channels[] = {
+- { &sh7751_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff },
++ { &sh4_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff },
+ { 0, }
+ };
+
+-static struct sh7751_pci_address_map sh7751_pci_map = {
++static struct sh4_pci_address_map sh7751_pci_map = {
+ .window0 = {
+ .base = SH7751_CS3_BASE_ADDR,
+ .size = BIGSUR_LSR0_SIZE,
+@@ -59,7 +56,7 @@
+ };
+
+ /*
+- * Initialize the Big Sur PCI interface
++ * Initialize the Big Sur PCI interface
+ * Setup hardware to be Central Funtion
+ * Copy the BSR regs to the PCI interface
+ * Setup PCI windows into local RAM
+@@ -69,15 +66,15 @@
+ return sh7751_pcic_init(&sh7751_pci_map);
+ }
+
+-int pcibios_map_platform_irq(u8 slot, u8 pin)
++int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin)
+ {
+- /*
++ /*
+ * The Big Sur can be used in a CPCI chassis, but the SH7751 PCI
+ * interface is on the wrong end of the board so that it can also
+ * support a V320 CPI interface chip... Therefor the IRQ mapping is
+ * somewhat use dependent... I'l assume a linear map for now, i.e.
+ * INTA=slot0,pin0... INTD=slot3,pin0...
+- */
++ */
+ int irq = (slot + pin-1) % 4 + BIGSUR_SH7751_PCI_IRQ_BASE;
+
+ PCIDBG(2, "PCI: Mapping Big Sur IRQ for slot %d, pin %c to irq %d\n",
+@@ -85,4 +82,3 @@
+
+ return irq;
+ }
+-
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/ops-landisk.c linux-2.6.17/arch/sh/drivers/pci/ops-landisk.c
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/ops-landisk.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/ops-landisk.c 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,68 @@
++/*
++ * arch/sh/drivers/pci/ops-landisk.c
++ *
++ * PCI initialization for the I-O DATA Device, Inc. LANDISK board
++ *
++ * Copyright (C) 2006 kogiidena
++ *
++ * May be copied or modified under the terms of the GNU General Public
++ * License. See linux/COPYING for more information.
++ */
++#include <linux/config.h>
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++#include <linux/pci.h>
++#include "pci-sh4.h"
++
++static struct resource sh7751_io_resource = {
++ .name = "SH7751 IO",
++ .start = 0x4000,
++ .end = 0x4000 + SH7751_PCI_IO_SIZE - 1,
++ .flags = IORESOURCE_IO
++};
++
++static struct resource sh7751_mem_resource = {
++ .name = "SH7751 mem",
++ .start = SH7751_PCI_MEMORY_BASE,
++ .end = SH7751_PCI_MEMORY_BASE + SH7751_PCI_MEM_SIZE - 1,
++ .flags = IORESOURCE_MEM
++};
++
++struct pci_channel board_pci_channels[] = {
++ {&sh4_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0x3ff},
++ {NULL, NULL, NULL, 0, 0},
++};
++
++static struct sh4_pci_address_map sh7751_pci_map = {
++ .window0 = {
++ .base = SH7751_CS3_BASE_ADDR,
++ .size = (64 << 20), /* 64MB */
++ },
++
++ .flags = SH4_PCIC_NO_RESET,
++};
++
++int __init pcibios_init_platform(void)
++{
++ return sh7751_pcic_init(&sh7751_pci_map);
++}
++
++int pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin)
++{
++ /*
++ * slot0: pin1-4 = irq5,6,7,8
++ * slot1: pin1-4 = irq6,7,8,5
++ * slot2: pin1-4 = irq7,8,5,6
++ * slot3: pin1-4 = irq8,5,6,7
++ */
++ int irq = ((slot + pin - 1) & 0x3) + 5;
++
++ if ((slot | (pin - 1)) > 0x3) {
++ printk("PCI: Bad IRQ mapping request for slot %d pin %c\n",
++ slot, pin - 1 + 'A');
++ return -1;
++ }
++ return irq;
++}
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/ops-r7780rp.c linux-2.6.17/arch/sh/drivers/pci/ops-r7780rp.c
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/ops-r7780rp.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/ops-r7780rp.c 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,75 @@
++/*
++ * Author: Ian DaSilva (idasilva@mvista.com)
++ *
++ * Highly leveraged from pci-bigsur.c, written by Dustin McIntire.
++ *
++ * May be copied or modified under the terms of the GNU General Public
++ * License. See linux/COPYING for more information.
++ *
++ * PCI initialization for the Renesas SH7780 Highlander R7780RP-1 board
++ */
++
++#include <linux/config.h>
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++#include <linux/pci.h>
++#include <asm/r7780rp/r7780rp.h>
++#include <asm/io.h>
++#include "pci-sh4.h"
++
++int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin)
++{
++ switch (slot) {
++ case 0: return IRQ_PCISLOT1; /* PCI Interrupt #1 */
++ case 1: return IRQ_PCISLOT2; /* PCI Interrupt #2 */
++ case 2: return IRQ_PCISLOT3; /* PCI Interrupt #3 */
++ case 3: return IRQ_PCISLOT4; /* PCI Interrupt E4 */
++ default:
++ printk(KERN_ERR "PCI: Bad IRQ mapping "
++ "request for slot %d, func %d\n", slot, pin-1);
++ return -1;
++ }
++}
++
++static struct resource sh7780_io_resource = {
++ .name = "SH7780_IO",
++ .start = 0x2000,
++ .end = 0x2000 + SH7780_PCI_IO_SIZE - 1,
++ .flags = IORESOURCE_IO
++};
++
++static struct resource sh7780_mem_resource = {
++ .name = "SH7780_mem",
++ .start = SH7780_PCI_MEMORY_BASE,
++ .end = SH7780_PCI_MEMORY_BASE + SH7780_PCI_MEM_SIZE - 1,
++ .flags = IORESOURCE_MEM
++};
++
++extern struct pci_ops sh7780_pci_ops;
++
++struct pci_channel board_pci_channels[] = {
++ { &sh4_pci_ops, &sh7780_io_resource, &sh7780_mem_resource, 0, 0xff },
++ { NULL, NULL, NULL, 0, 0 },
++};
++EXPORT_SYMBOL(board_pci_channels);
++
++static struct sh4_pci_address_map sh7780_pci_map = {
++ .window0 = {
++ .base = SH7780_CS2_BASE_ADDR,
++ .size = 0x04000000,
++ },
++
++ .window1 = {
++ .base = SH7780_CS3_BASE_ADDR,
++ .size = 0x04000000,
++ },
++
++ .flags = SH4_PCIC_NO_RESET,
++};
++
++int __init pcibios_init_platform(void)
++{
++ return sh7780_pcic_init(&sh7780_pci_map);
++}
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/ops-rts7751r2d.c linux-2.6.17/arch/sh/drivers/pci/ops-rts7751r2d.c
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/ops-rts7751r2d.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/ops-rts7751r2d.c 2006-07-12 16:54:21.000000000 +0000
+@@ -18,12 +18,11 @@
+ #include <linux/delay.h>
+ #include <linux/pci.h>
+ #include <linux/module.h>
+-
+-#include <asm/io.h>
+-#include "pci-sh7751.h"
+ #include <asm/rts7751r2d/rts7751r2d.h>
++#include <asm/io.h>
++#include "pci-sh4.h"
+
+-int __init pcibios_map_platform_irq(u8 slot, u8 pin)
++int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin)
+ {
+ switch (slot) {
+ case 0: return IRQ_PCISLOT1; /* PCI Extend slot #1 */
+@@ -53,12 +52,12 @@
+ extern struct pci_ops sh7751_pci_ops;
+
+ struct pci_channel board_pci_channels[] = {
+- { &sh7751_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff },
++ { &sh4_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff },
+ { NULL, NULL, NULL, 0, 0 },
+ };
+ EXPORT_SYMBOL(board_pci_channels);
+
+-static struct sh7751_pci_address_map sh7751_pci_map = {
++static struct sh4_pci_address_map sh7751_pci_map = {
+ .window0 = {
+ .base = SH7751_CS3_BASE_ADDR,
+ .size = 0x04000000,
+@@ -69,7 +68,7 @@
+ .size = 0x00000000, /* Unused */
+ },
+
+- .flags = SH7751_PCIC_NO_RESET,
++ .flags = SH4_PCIC_NO_RESET,
+ };
+
+ int __init pcibios_init_platform(void)
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/ops-sh4.c linux-2.6.17/arch/sh/drivers/pci/ops-sh4.c
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/ops-sh4.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/ops-sh4.c 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,164 @@
++/*
++ * Generic SH-4 / SH-4A PCIC operations (SH7751, SH7780).
++ *
++ * Copyright (C) 2002 - 2006 Paul Mundt
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License v2. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ */
++#include <linux/pci.h>
++#include <asm/addrspace.h>
++#include <asm/io.h>
++#include "pci-sh4.h"
++
++/*
++ * Direct access to PCI hardware...
++ */
++#define CONFIG_CMD(bus, devfn, where) \
++ P1SEGADDR((bus->number << 16) | (devfn << 8) | (where & ~3))
++
++static DEFINE_SPINLOCK(sh4_pci_lock);
++
++/*
++ * Functions for accessing PCI configuration space with type 1 accesses
++ */
++static int sh4_pci_read(struct pci_bus *bus, unsigned int devfn,
++ int where, int size, u32 *val)
++{
++ unsigned long flags;
++ u32 data;
++
++ /*
++ * PCIPDR may only be accessed as 32 bit words,
++ * so we must do byte alignment by hand
++ */
++ spin_lock_irqsave(&sh4_pci_lock, flags);
++ pci_write_reg(CONFIG_CMD(bus, devfn, where), SH4_PCIPAR);
++ data = pci_read_reg(SH4_PCIPDR);
++ spin_unlock_irqrestore(&sh4_pci_lock, flags);
++
++ switch (size) {
++ case 1:
++ *val = (data >> ((where & 3) << 3)) & 0xff;
++ break;
++ case 2:
++ *val = (data >> ((where & 2) << 3)) & 0xffff;
++ break;
++ case 4:
++ *val = data;
++ break;
++ default:
++ return PCIBIOS_FUNC_NOT_SUPPORTED;
++ }
++
++ return PCIBIOS_SUCCESSFUL;
++}
++
++/*
++ * Since SH4 only does 32bit access we'll have to do a read,
++ * mask,write operation.
++ * We'll allow an odd byte offset, though it should be illegal.
++ */
++static int sh4_pci_write(struct pci_bus *bus, unsigned int devfn,
++ int where, int size, u32 val)
++{
++ unsigned long flags;
++ int shift;
++ u32 data;
++
++ spin_lock_irqsave(&sh4_pci_lock, flags);
++ pci_write_reg(CONFIG_CMD(bus, devfn, where), SH4_PCIPAR);
++ data = pci_read_reg(SH4_PCIPDR);
++ spin_unlock_irqrestore(&sh4_pci_lock, flags);
++
++ switch (size) {
++ case 1:
++ shift = (where & 3) << 3;
++ data &= ~(0xff << shift);
++ data |= ((val & 0xff) << shift);
++ break;
++ case 2:
++ shift = (where & 2) << 3;
++ data &= ~(0xffff << shift);
++ data |= ((val & 0xffff) << shift);
++ break;
++ case 4:
++ data = val;
++ break;
++ default:
++ return PCIBIOS_FUNC_NOT_SUPPORTED;
++ }
++
++ pci_write_reg(data, SH4_PCIPDR);
++
++ return PCIBIOS_SUCCESSFUL;
++}
++
++struct pci_ops sh4_pci_ops = {
++ .read = sh4_pci_read,
++ .write = sh4_pci_write,
++};
++
++/*
++ * Not really related to pci_ops, but it's common and not worth shoving
++ * somewhere else for now..
++ */
++static unsigned int pci_probe = PCI_PROBE_CONF1;
++
++int __init sh4_pci_check_direct(void)
++{
++ /*
++ * Check if configuration works.
++ */
++ if (pci_probe & PCI_PROBE_CONF1) {
++ unsigned int tmp = pci_read_reg(SH4_PCIPAR);
++
++ pci_write_reg(P1SEG, SH4_PCIPAR);
++
++ if (pci_read_reg(SH4_PCIPAR) == P1SEG) {
++ pci_write_reg(tmp, SH4_PCIPAR);
++ printk(KERN_INFO "PCI: Using configuration type 1\n");
++ request_region(PCI_REG(SH4_PCIPAR), 8, "PCI conf1");
++
++ return 0;
++ }
++
++ pci_write_reg(tmp, SH4_PCIPAR);
++ }
++
++ pr_debug("PCI: pci_check_direct failed\n");
++ return -EINVAL;
++}
++
++/* Handle generic fixups */
++static void __init pci_fixup_ide_bases(struct pci_dev *d)
++{
++ int i;
++
++ /*
++ * PCI IDE controllers use non-standard I/O port decoding, respect it.
++ */
++ if ((d->class >> 8) != PCI_CLASS_STORAGE_IDE)
++ return;
++ pr_debug("PCI: IDE base address fixup for %s\n", pci_name(d));
++ for(i = 0; i < 4; i++) {
++ struct resource *r = &d->resource[i];
++
++ if ((r->start & ~0x80) == 0x374) {
++ r->start |= 2;
++ r->end = r->start;
++ }
++ }
++}
++DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_ide_bases);
++
++char * __init pcibios_setup(char *str)
++{
++ if (!strcmp(str, "off")) {
++ pci_probe = 0;
++ return NULL;
++ }
++
++ return str;
++}
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/ops-snapgear.c linux-2.6.17/arch/sh/drivers/pci/ops-snapgear.c
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/ops-snapgear.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/ops-snapgear.c 2006-07-12 16:54:21.000000000 +0000
+@@ -2,7 +2,7 @@
+ * arch/sh/drivers/pci/ops-snapgear.c
+ *
+ * Author: David McCullough <davidm@snapgear.com>
+- *
++ *
+ * Ported to new API by Paul Mundt <lethal@linux-sh.org>
+ *
+ * Highly leveraged from pci-bigsur.c, written by Dustin McIntire.
+@@ -12,16 +12,12 @@
+ *
+ * PCI initialization for the SnapGear boards
+ */
+-
+ #include <linux/config.h>
+ #include <linux/kernel.h>
+ #include <linux/types.h>
+ #include <linux/init.h>
+-#include <linux/delay.h>
+ #include <linux/pci.h>
+-
+-#include <asm/io.h>
+-#include "pci-sh7751.h"
++#include "pci-sh4.h"
+
+ #define SNAPGEAR_PCI_IO 0x4000
+ #define SNAPGEAR_PCI_MEM 0xfd000000
+@@ -44,14 +40,12 @@
+ .flags = IORESOURCE_MEM,
+ };
+
+-extern struct pci_ops sh7751_pci_ops;
+-
+ struct pci_channel board_pci_channels[] = {
+- { &sh7751_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff },
++ { &sh4_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff },
+ { 0, }
+ };
+
+-static struct sh7751_pci_address_map sh7751_pci_map = {
++static struct sh4_pci_address_map sh7751_pci_map = {
+ .window0 = {
+ .base = SH7751_CS2_BASE_ADDR,
+ .size = SNAPGEAR_LSR0_SIZE,
+@@ -62,11 +56,11 @@
+ .size = SNAPGEAR_LSR1_SIZE,
+ },
+
+- .flags = SH7751_PCIC_NO_RESET,
++ .flags = SH4_PCIC_NO_RESET,
+ };
+
+ /*
+- * Initialize the SnapGear PCI interface
++ * Initialize the SnapGear PCI interface
+ * Setup hardware to be Central Funtion
+ * Copy the BSR regs to the PCI interface
+ * Setup PCI windows into local RAM
+@@ -76,7 +70,7 @@
+ return sh7751_pcic_init(&sh7751_pci_map);
+ }
+
+-int __init pcibios_map_platform_irq(u8 slot, u8 pin)
++int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin)
+ {
+ int irq = -1;
+
+@@ -99,4 +93,3 @@
+ {
+ /* Nothing to fixup .. */
+ }
+-
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/ops-titan.c linux-2.6.17/arch/sh/drivers/pci/ops-titan.c
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/ops-titan.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/ops-titan.c 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,83 @@
++/*
++ * arch/sh/drivers/pci/ops-titan.c
++ *
++ * Ported to new API by Paul Mundt <lethal@linux-sh.org>
++ *
++ * Modified from ops-snapgear.c written by David McCullough
++ * Highly leveraged from pci-bigsur.c, written by Dustin McIntire.
++ *
++ * May be copied or modified under the terms of the GNU General Public
++ * License. See linux/COPYING for more information.
++ *
++ * PCI initialization for the Titan boards
++ */
++
++#include <linux/config.h>
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/init.h>
++#include <linux/pci.h>
++#include <asm/io.h>
++#include <asm/titan.h>
++#include "pci-sh4.h"
++
++int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin)
++{
++ int irq = -1;
++
++ switch (slot) {
++ case 0: irq = TITAN_IRQ_WAN; break; /* eth0 (WAN) */
++ case 1: irq = TITAN_IRQ_LAN; break; /* eth1 (LAN) */
++ case 2: irq = TITAN_IRQ_MPCIA; break; /* mPCI A */
++ case 3: irq = TITAN_IRQ_MPCIB; break; /* mPCI B */
++ case 4: irq = TITAN_IRQ_USB; break; /* USB */
++ default:
++ printk(KERN_INFO "PCI: Bad IRQ mapping "
++ "request for slot %d\n", slot);
++ return -1;
++ }
++
++ printk("PCI: Mapping TITAN IRQ for slot %d, pin %c to irq %d\n",
++ slot, pin - 1 + 'A', irq);
++
++ return irq;
++}
++
++static struct resource sh7751_io_resource = {
++ .name = "SH7751_IO",
++ .start = SH7751_PCI_IO_BASE,
++ .end = SH7751_PCI_IO_BASE + SH7751_PCI_IO_SIZE - 1,
++ .flags = IORESOURCE_IO
++};
++
++static struct resource sh7751_mem_resource = {
++ .name = "SH7751_mem",
++ .start = SH7751_PCI_MEMORY_BASE,
++ .end = SH7751_PCI_MEMORY_BASE + SH7751_PCI_MEM_SIZE - 1,
++ .flags = IORESOURCE_MEM
++};
++
++struct pci_channel board_pci_channels[] = {
++ { &sh4_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff },
++ { NULL, NULL, NULL, 0, 0 },
++};
++EXPORT_SYMBOL(board_pci_channels);
++
++static struct sh4_pci_address_map sh7751_pci_map = {
++ .window0 = {
++ .base = SH7751_CS2_BASE_ADDR,
++ .size = SH7751_MEM_REGION_SIZE*2, /* cs2 and cs3 */
++ },
++
++ .window1 = {
++ .base = SH7751_CS2_BASE_ADDR,
++ .size = SH7751_MEM_REGION_SIZE*2,
++ },
++
++ .flags = SH4_PCIC_NO_RESET,
++};
++
++int __init pcibios_init_platform(void)
++{
++ return sh7751_pcic_init(&sh7751_pci_map);
++}
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/pci-auto.c linux-2.6.17/arch/sh/drivers/pci/pci-auto.c
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/pci-auto.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/pci-auto.c 2006-07-12 16:54:21.000000000 +0000
+@@ -45,11 +45,11 @@
+ #include <linux/types.h>
+ #include <linux/pci.h>
+
+-#undef DEBUG
+-#ifdef DEBUG
++#define DEBUG
++#ifdef DEBUG
+ #define DBG(x...) printk(x)
+ #else
+-#define DBG(x...)
++#define DBG(x...)
+ #endif
+
+ /*
+@@ -102,7 +102,7 @@
+ static u32 pciauto_lower_memspc;
+ static u32 pciauto_upper_memspc;
+
+-static void __init
++static void __init
+ pciauto_setup_bars(struct pci_channel *hose,
+ int top_bus,
+ int current_bus,
+@@ -116,7 +116,6 @@
+ int found_mem64 = 0;
+
+ for (bar = PCI_BASE_ADDRESS_0; bar <= bar_limit; bar+=4) {
+-#if !defined(CONFIG_SH_HS7751RVOIP) && !defined(CONFIG_SH_RTS7751R2D)
+ u32 bar_addr;
+
+ /* Read the old BAR value */
+@@ -125,7 +124,6 @@
+ pci_devfn,
+ bar,
+ &bar_addr);
+-#endif
+
+ /* Tickle the BAR and get the response */
+ early_write_config_dword(hose, top_bus,
+@@ -140,8 +138,7 @@
+ bar,
+ &bar_response);
+
+-#if !defined(CONFIG_SH_HS7751RVOIP) && !defined(CONFIG_SH_RTS7751R2D)
+- /*
++ /*
+ * Write the old BAR value back out, only update the BAR
+ * if we implicitly want resources to be updated, which
+ * is done by the generic code further down. -- PFM.
+@@ -151,7 +148,6 @@
+ pci_devfn,
+ bar,
+ bar_addr);
+-#endif
+
+ /* If BAR is not implemented go to the next BAR */
+ if (!bar_response)
+@@ -177,7 +173,7 @@
+ PCI_BASE_ADDRESS_MEM_TYPE_64)
+ found_mem64 = 1;
+
+- addr_mask = PCI_BASE_ADDRESS_MEM_MASK;
++ addr_mask = PCI_BASE_ADDRESS_MEM_MASK;
+ upper_limit = &pciauto_upper_memspc;
+ lower_limit = &pciauto_lower_memspc;
+ DBG(" Mem");
+@@ -193,22 +189,22 @@
+ if ((bar_value + bar_size) > *upper_limit) {
+ if (bar_response & PCI_BASE_ADDRESS_SPACE) {
+ if (io_resource_inuse->child) {
+- io_resource_inuse =
++ io_resource_inuse =
+ io_resource_inuse->child;
+- pciauto_lower_iospc =
++ pciauto_lower_iospc =
+ io_resource_inuse->start;
+- pciauto_upper_iospc =
++ pciauto_upper_iospc =
+ io_resource_inuse->end + 1;
+ goto retry;
+ }
+
+ } else {
+ if (mem_resource_inuse->child) {
+- mem_resource_inuse =
++ mem_resource_inuse =
+ mem_resource_inuse->child;
+- pciauto_lower_memspc =
++ pciauto_lower_memspc =
+ mem_resource_inuse->start;
+- pciauto_upper_memspc =
++ pciauto_upper_memspc =
+ mem_resource_inuse->end + 1;
+ goto retry;
+ }
+@@ -230,7 +226,7 @@
+ * If we are a 64-bit decoder then increment to the
+ * upper 32 bits of the bar and force it to locate
+ * in the lower 4GB of memory.
+- */
++ */
+ if (found_mem64) {
+ bar += 4;
+ early_write_config_dword(hose, top_bus,
+@@ -362,7 +358,6 @@
+ {
+ u32 temp;
+
+-#if !defined(CONFIG_SH_HS7751RVOIP) && !defined(CONFIG_SH_RTS7751R2D)
+ /*
+ * [jsun] we always bump up baselines a little, so that if there
+ * nothing behind P2P bridge, we don't wind up overlapping IO/MEM
+@@ -370,7 +365,6 @@
+ */
+ pciauto_lower_memspc += 1;
+ pciauto_lower_iospc += 1;
+-#endif
+
+ /*
+ * Configure subordinate bus number. The PCI subsystem
+@@ -396,11 +390,6 @@
+ * configured by this routine to happily live behind a
+ * P2P bridge in a system.
+ */
+-#if defined(CONFIG_SH_HS7751RVOIP) || defined(CONFIG_SH_RTS7751R2D)
+- pciauto_lower_memspc += 0x00400000;
+- pciauto_lower_iospc += 0x00004000;
+-#endif
+-
+ /* Align memory and I/O to 4KB and 4 byte boundaries. */
+ pciauto_lower_memspc = (pciauto_lower_memspc + (0x1000 - 1))
+ & ~(0x1000 - 1);
+@@ -433,12 +422,12 @@
+ int devfn_stop = 0xff;
+
+ sub_bus = current_bus;
+-
++
+ if (hose->first_devfn)
+ devfn_start = hose->first_devfn;
+ if (hose->last_devfn)
+ devfn_stop = hose->last_devfn;
+-
++
+ for (pci_devfn=devfn_start; pci_devfn<devfn_stop; pci_devfn++) {
+
+ if (PCI_FUNC(pci_devfn) && !found_multi)
+@@ -471,9 +460,6 @@
+ if ((pci_class >> 16) == PCI_CLASS_BRIDGE_PCI) {
+ DBG(" Bridge: primary=%.2x, secondary=%.2x\n",
+ current_bus, sub_bus + 1);
+-#if defined(CONFIG_SH_HS7751RVOIP) || defined(CONFIG_SH_RTS7751R2D)
+- pciauto_setup_bars(hose, top_bus, current_bus, pci_devfn, PCI_BASE_ADDRESS_1);
+-#endif
+ pciauto_prescan_setup_bridge(hose, top_bus, current_bus,
+ pci_devfn, sub_bus);
+ DBG("Scanning sub bus %.2x, I/O 0x%.8x, Mem 0x%.8x\n",
+@@ -490,10 +476,10 @@
+ DBG("PCI Autoconfig: Found CardBus bridge, device %d function %d\n", PCI_SLOT(pci_devfn), PCI_FUNC(pci_devfn));
+ /* Place CardBus Socket/ExCA registers */
+ pciauto_setup_bars(hose, top_bus, current_bus, pci_devfn, PCI_BASE_ADDRESS_0);
+-
++
+ pciauto_prescan_setup_cardbus_bridge(hose, top_bus,
+ current_bus, pci_devfn, sub_bus);
+-
++
+ DBG("Scanning sub bus %.2x, I/O 0x%.8x, Mem 0x%.8x\n",
+ sub_bus + 1,
+ pciauto_lower_iospc, pciauto_lower_memspc);
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/pci-sh4.h linux-2.6.17/arch/sh/drivers/pci/pci-sh4.h
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/pci-sh4.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/pci-sh4.h 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,180 @@
++#ifndef __PCI_SH4_H
++#define __PCI_SH4_H
++
++#ifdef CONFIG_CPU_SUBTYPE_SH7780
++#include "pci-sh7780.h"
++#else
++#include "pci-sh7751.h"
++#endif
++
++#include <asm/io.h>
++
++/* startup values */
++#define PCI_PROBE_BIOS 1
++#define PCI_PROBE_CONF1 2
++#define PCI_PROBE_CONF2 4
++#define PCI_NO_SORT 0x100
++#define PCI_BIOS_SORT 0x200
++#define PCI_NO_CHECKS 0x400
++#define PCI_ASSIGN_ROMS 0x1000
++#define PCI_BIOS_IRQ_SCAN 0x2000
++
++#define SH4_PCICR 0x100 /* PCI Control Register */
++ #define SH4_PCICR_PREFIX 0xA5000000 /* CR prefix for write */
++ #define SH4_PCICR_FTO 0x00000400 /* TRDY/IRDY Enable */
++ #define SH4_PCICR_TRSB 0x00000200 /* Target Read Single */
++ #define SH4_PCICR_BSWP 0x00000100 /* Target Byte Swap */
++ #define SH4_PCICR_PLUP 0x00000080 /* Enable PCI Pullup */
++ #define SH4_PCICR_ARBM 0x00000040 /* PCI Arbitration Mode */
++ #define SH4_PCICR_MD 0x00000030 /* MD9 and MD10 status */
++ #define SH4_PCICR_SERR 0x00000008 /* SERR output assert */
++ #define SH4_PCICR_INTA 0x00000004 /* INTA output assert */
++ #define SH4_PCICR_PRST 0x00000002 /* PCI Reset Assert */
++ #define SH4_PCICR_CFIN 0x00000001 /* Central Fun. Init Done */
++#define SH4_PCILSR0 0x104 /* PCI Local Space Register0 */
++#define SH4_PCILSR1 0x108 /* PCI Local Space Register1 */
++#define SH4_PCILAR0 0x10C /* PCI Local Addr Register1 */
++#define SH4_PCILAR1 0x110 /* PCI Local Addr Register1 */
++#define SH4_PCIINT 0x114 /* PCI Interrupt Register */
++ #define SH4_PCIINT_MLCK 0x00008000 /* Master Lock Error */
++ #define SH4_PCIINT_TABT 0x00004000 /* Target Abort Error */
++ #define SH4_PCIINT_TRET 0x00000200 /* Target Retry Error */
++ #define SH4_PCIINT_MFDE 0x00000100 /* Master Func. Disable Error */
++ #define SH4_PCIINT_PRTY 0x00000080 /* Address Parity Error */
++ #define SH4_PCIINT_SERR 0x00000040 /* SERR Detection Error */
++ #define SH4_PCIINT_TWDP 0x00000020 /* Tgt. Write Parity Error */
++ #define SH4_PCIINT_TRDP 0x00000010 /* Tgt. Read Parity Err Det. */
++ #define SH4_PCIINT_MTABT 0x00000008 /* Master-Tgt. Abort Error */
++ #define SH4_PCIINT_MMABT 0x00000004 /* Master-Master Abort Error */
++ #define SH4_PCIINT_MWPD 0x00000002 /* Master Write PERR Detect */
++ #define SH4_PCIINT_MRPD 0x00000001 /* Master Read PERR Detect */
++#define SH4_PCIINTM 0x118 /* PCI Interrupt Mask */
++#define SH4_PCIALR 0x11C /* Error Address Register */
++#define SH4_PCICLR 0x120 /* Error Command/Data */
++ #define SH4_PCICLR_MPIO 0x80000000
++ #define SH4_PCICLR_MDMA0 0x40000000 /* DMA0 Transfer Error */
++ #define SH4_PCICLR_MDMA1 0x20000000 /* DMA1 Transfer Error */
++ #define SH4_PCICLR_MDMA2 0x10000000 /* DMA2 Transfer Error */
++ #define SH4_PCICLR_MDMA3 0x08000000 /* DMA3 Transfer Error */
++ #define SH4_PCICLR_TGT 0x04000000 /* Target Transfer Error */
++ #define SH4_PCICLR_CMDL 0x0000000F /* PCI Command at Error */
++#define SH4_PCIAINT 0x130 /* Arbiter Interrupt Register */
++ #define SH4_PCIAINT_MBKN 0x00002000 /* Master Broken Interrupt */
++ #define SH4_PCIAINT_TBTO 0x00001000 /* Target Bus Time Out */
++ #define SH4_PCIAINT_MBTO 0x00001000 /* Master Bus Time Out */
++ #define SH4_PCIAINT_TABT 0x00000008 /* Target Abort */
++ #define SH4_PCIAINT_MABT 0x00000004 /* Master Abort */
++ #define SH4_PCIAINT_RDPE 0x00000002 /* Read Data Parity Error */
++ #define SH4_PCIAINT_WDPE 0x00000001 /* Write Data Parity Error */
++#define SH4_PCIAINTM 0x134 /* Arbiter Int. Mask Register */
++#define SH4_PCIBMLR 0x138 /* Error Bus Master Register */
++ #define SH4_PCIBMLR_REQ4 0x00000010 /* REQ4 bus master at error */
++ #define SH4_PCIBMLR_REQ3 0x00000008 /* REQ3 bus master at error */
++ #define SH4_PCIBMLR_REQ2 0x00000004 /* REQ2 bus master at error */
++ #define SH4_PCIBMLR_REQ1 0x00000002 /* REQ1 bus master at error */
++ #define SH4_PCIBMLR_REQ0 0x00000001 /* REQ0 bus master at error */
++#define SH4_PCIDMABT 0x140 /* DMA Transfer Arb. Register */
++ #define SH4_PCIDMABT_RRBN 0x00000001 /* DMA Arbitor Round-Robin */
++#define SH4_PCIDPA0 0x180 /* DMA0 Transfer Addr. */
++#define SH4_PCIDLA0 0x184 /* DMA0 Local Addr. */
++#define SH4_PCIDTC0 0x188 /* DMA0 Transfer Cnt. */
++#define SH4_PCIDCR0 0x18C /* DMA0 Control Register */
++ #define SH4_PCIDCR_ALGN 0x00000600 /* DMA Alignment Mode */
++ #define SH4_PCIDCR_MAST 0x00000100 /* DMA Termination Type */
++ #define SH4_PCIDCR_INTM 0x00000080 /* DMA Interrupt Done Mask*/
++ #define SH4_PCIDCR_INTS 0x00000040 /* DMA Interrupt Done Status */
++ #define SH4_PCIDCR_LHLD 0x00000020 /* Local Address Control */
++ #define SH4_PCIDCR_PHLD 0x00000010 /* PCI Address Control*/
++ #define SH4_PCIDCR_IOSEL 0x00000008 /* PCI Address Space Type */
++ #define SH4_PCIDCR_DIR 0x00000004 /* DMA Transfer Direction */
++ #define SH4_PCIDCR_STOP 0x00000002 /* Force DMA Stop */
++ #define SH4_PCIDCR_STRT 0x00000001 /* DMA Start */
++#define SH4_PCIDPA1 0x190 /* DMA1 Transfer Addr. */
++#define SH4_PCIDLA1 0x194 /* DMA1 Local Addr. */
++#define SH4_PCIDTC1 0x198 /* DMA1 Transfer Cnt. */
++#define SH4_PCIDCR1 0x19C /* DMA1 Control Register */
++#define SH4_PCIDPA2 0x1A0 /* DMA2 Transfer Addr. */
++#define SH4_PCIDLA2 0x1A4 /* DMA2 Local Addr. */
++#define SH4_PCIDTC2 0x1A8 /* DMA2 Transfer Cnt. */
++#define SH4_PCIDCR2 0x1AC /* DMA2 Control Register */
++#define SH4_PCIDPA3 0x1B0 /* DMA3 Transfer Addr. */
++#define SH4_PCIDLA3 0x1B4 /* DMA3 Local Addr. */
++#define SH4_PCIDTC3 0x1B8 /* DMA3 Transfer Cnt. */
++#define SH4_PCIDCR3 0x1BC /* DMA3 Control Register */
++#define SH4_PCIPAR 0x1C0 /* PIO Address Register */
++ #define SH4_PCIPAR_CFGEN 0x80000000 /* Configuration Enable */
++ #define SH4_PCIPAR_BUSNO 0x00FF0000 /* Config. Bus Number */
++ #define SH4_PCIPAR_DEVNO 0x0000FF00 /* Config. Device Number */
++ #define SH4_PCIPAR_REGAD 0x000000FC /* Register Address Number */
++#define SH4_PCIMBR 0x1C4 /* Memory Base Address */
++ #define SH4_PCIMBR_MASK 0xFF000000 /* Memory Space Mask */
++ #define SH4_PCIMBR_LOCK 0x00000001 /* Lock Memory Space */
++#define SH4_PCIIOBR 0x1C8 /* I/O Base Address Register */
++ #define SH4_PCIIOBR_MASK 0xFFFC0000 /* IO Space Mask */
++ #define SH4_PCIIOBR_LOCK 0x00000001 /* Lock IO Space */
++#define SH4_PCIPINT 0x1CC /* Power Mgmnt Int. Register */
++ #define SH4_PCIPINT_D3 0x00000002 /* D3 Pwr Mgmt. Interrupt */
++ #define SH4_PCIPINT_D0 0x00000001 /* D0 Pwr Mgmt. Interrupt */
++#define SH4_PCIPINTM 0x1D0 /* Power Mgmnt Mask Register */
++#define SH4_PCICLKR 0x1D4 /* Clock Ctrl. Register */
++ #define SH4_PCICLKR_PCSTP 0x00000002 /* PCI Clock Stop */
++ #define SH4_PCICLKR_BCSTP 0x00000001 /* BCLK Clock Stop */
++/* For definitions of BCR, MCR see ... */
++#define SH4_PCIBCR1 0x1E0 /* Memory BCR1 Register */
++ #define SH4_PCIMBR0 SH4_PCIBCR1
++#define SH4_PCIBCR2 0x1E4 /* Memory BCR2 Register */
++ #define SH4_PCIMBMR0 SH4_PCIBCR2
++#define SH4_PCIWCR1 0x1E8 /* Wait Control 1 Register */
++#define SH4_PCIWCR2 0x1EC /* Wait Control 2 Register */
++#define SH4_PCIWCR3 0x1F0 /* Wait Control 3 Register */
++ #define SH4_PCIMBR2 SH4_PCIWCR3
++#define SH4_PCIMCR 0x1F4 /* Memory Control Register */
++#define SH4_PCIBCR3 0x1f8 /* Memory BCR3 Register */
++#define SH4_PCIPCTR 0x200 /* Port Control Register */
++ #define SH4_PCIPCTR_P2EN 0x000400000 /* Port 2 Enable */
++ #define SH4_PCIPCTR_P1EN 0x000200000 /* Port 1 Enable */
++ #define SH4_PCIPCTR_P0EN 0x000100000 /* Port 0 Enable */
++ #define SH4_PCIPCTR_P2UP 0x000000020 /* Port2 Pull Up Enable */
++ #define SH4_PCIPCTR_P2IO 0x000000010 /* Port2 Output Enable */
++ #define SH4_PCIPCTR_P1UP 0x000000008 /* Port1 Pull Up Enable */
++ #define SH4_PCIPCTR_P1IO 0x000000004 /* Port1 Output Enable */
++ #define SH4_PCIPCTR_P0UP 0x000000002 /* Port0 Pull Up Enable */
++ #define SH4_PCIPCTR_P0IO 0x000000001 /* Port0 Output Enable */
++#define SH4_PCIPDTR 0x204 /* Port Data Register */
++ #define SH4_PCIPDTR_PB5 0x000000020 /* Port 5 Enable */
++ #define SH4_PCIPDTR_PB4 0x000000010 /* Port 4 Enable */
++ #define SH4_PCIPDTR_PB3 0x000000008 /* Port 3 Enable */
++ #define SH4_PCIPDTR_PB2 0x000000004 /* Port 2 Enable */
++ #define SH4_PCIPDTR_PB1 0x000000002 /* Port 1 Enable */
++ #define SH4_PCIPDTR_PB0 0x000000001 /* Port 0 Enable */
++#define SH4_PCIPDR 0x220 /* Port IO Data Register */
++
++/* Flags */
++#define SH4_PCIC_NO_RESET 0x0001
++
++/* arch/sh/kernel/drivers/pci/ops-sh4.c */
++extern struct pci_ops sh4_pci_ops;
++int sh4_pci_check_direct(void);
++int pci_fixup_pcic(void);
++
++struct sh4_pci_address_space {
++ unsigned long base;
++ unsigned long size;
++};
++
++struct sh4_pci_address_map {
++ struct sh4_pci_address_space window0;
++ struct sh4_pci_address_space window1;
++ unsigned long flags;
++};
++
++static inline void pci_write_reg(unsigned long val, unsigned long reg)
++{
++ outl(val, PCI_REG(reg));
++}
++
++static inline unsigned long pci_read_reg(unsigned long reg)
++{
++ return inl(PCI_REG(reg));
++}
++#endif /* __PCI_SH4_H */
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/pci-sh7751.c linux-2.6.17/arch/sh/drivers/pci/pci-sh7751.c
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/pci-sh7751.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/pci-sh7751.c 2006-07-12 16:54:21.000000000 +0000
+@@ -16,206 +16,44 @@
+ #undef DEBUG
+
+ #include <linux/config.h>
+-#include <linux/types.h>
+-#include <linux/kernel.h>
+ #include <linux/init.h>
+ #include <linux/pci.h>
+-#include <linux/sched.h>
+-#include <linux/ioport.h>
++#include <linux/types.h>
+ #include <linux/errno.h>
+-#include <linux/irq.h>
+ #include <linux/delay.h>
+-
+-#include <asm/machvec.h>
++#include "pci-sh4.h"
++#include <asm/addrspace.h>
+ #include <asm/io.h>
+-#include "pci-sh7751.h"
+-
+-static unsigned int pci_probe = PCI_PROBE_CONF1;
+-extern int pci_fixup_pcic(void);
+-
+-void pcibios_fixup_irqs(void) __attribute__ ((weak));
+-
+-/*
+- * Direct access to PCI hardware...
+- */
+-
+-#define CONFIG_CMD(bus, devfn, where) (0x80000000 | (bus->number << 16) | (devfn << 8) | (where & ~3))
+
+ /*
+- * Functions for accessing PCI configuration space with type 1 accesses
++ * Initialization. Try all known PCI access methods. Note that we support
++ * using both PCI BIOS and direct access: in such cases, we use I/O ports
++ * to access config space.
++ *
++ * Note that the platform specific initialization (BSC registers, and memory
++ * space mapping) will be called via the platform defined function
++ * pcibios_init_platform().
+ */
+-static int sh7751_pci_read(struct pci_bus *bus, unsigned int devfn,
+- int where, int size, u32 *val)
+-{
+- unsigned long flags;
+- u32 data;
+-
+- /*
+- * PCIPDR may only be accessed as 32 bit words,
+- * so we must do byte alignment by hand
+- */
+- local_irq_save(flags);
+- outl(CONFIG_CMD(bus,devfn,where), PCI_REG(SH7751_PCIPAR));
+- data = inl(PCI_REG(SH7751_PCIPDR));
+- local_irq_restore(flags);
+-
+- switch (size) {
+- case 1:
+- *val = (data >> ((where & 3) << 3)) & 0xff;
+- break;
+- case 2:
+- *val = (data >> ((where & 2) << 3)) & 0xffff;
+- break;
+- case 4:
+- *val = data;
+- break;
+- default:
+- return PCIBIOS_FUNC_NOT_SUPPORTED;
+- }
+-
+- return PCIBIOS_SUCCESSFUL;
+-}
+-
+-/*
+- * Since SH7751 only does 32bit access we'll have to do a read,
+- * mask,write operation.
+- * We'll allow an odd byte offset, though it should be illegal.
+- */
+-static int sh7751_pci_write(struct pci_bus *bus, unsigned int devfn,
+- int where, int size, u32 val)
++static int __init sh7751_pci_init(void)
+ {
+- unsigned long flags;
+- int shift;
+- u32 data;
+-
+- local_irq_save(flags);
+- outl(CONFIG_CMD(bus,devfn,where), PCI_REG(SH7751_PCIPAR));
+- data = inl(PCI_REG(SH7751_PCIPDR));
+- local_irq_restore(flags);
+-
+- switch (size) {
+- case 1:
+- shift = (where & 3) << 3;
+- data &= ~(0xff << shift);
+- data |= ((val & 0xff) << shift);
+- break;
+- case 2:
+- shift = (where & 2) << 3;
+- data &= ~(0xffff << shift);
+- data |= ((val & 0xffff) << shift);
+- break;
+- case 4:
+- data = val;
+- break;
+- default:
+- return PCIBIOS_FUNC_NOT_SUPPORTED;
+- }
+-
+- outl(data, PCI_REG(SH7751_PCIPDR));
+-
+- return PCIBIOS_SUCCESSFUL;
+-}
+-
+-#undef CONFIG_CMD
+-
+-struct pci_ops sh7751_pci_ops = {
+- .read = sh7751_pci_read,
+- .write = sh7751_pci_write,
+-};
++ unsigned int id;
++ int ret;
+
+-static int __init pci_check_direct(void)
+-{
+- unsigned int tmp, id;
++ pr_debug("PCI: Starting intialization.\n");
+
+ /* check for SH7751/SH7751R hardware */
+- id = inl(SH7751_PCIREG_BASE+SH7751_PCICONF0);
++ id = pci_read_reg(SH7751_PCICONF0);
+ if (id != ((SH7751_DEVICE_ID << 16) | SH7751_VENDOR_ID) &&
+ id != ((SH7751R_DEVICE_ID << 16) | SH7751_VENDOR_ID)) {
+ pr_debug("PCI: This is not an SH7751(R) (%x)\n", id);
+ return -ENODEV;
+ }
+
+- /*
+- * Check if configuration works.
+- */
+- if (pci_probe & PCI_PROBE_CONF1) {
+- tmp = inl (PCI_REG(SH7751_PCIPAR));
+- outl (0x80000000, PCI_REG(SH7751_PCIPAR));
+- if (inl (PCI_REG(SH7751_PCIPAR)) == 0x80000000) {
+- outl (tmp, PCI_REG(SH7751_PCIPAR));
+- printk(KERN_INFO "PCI: Using configuration type 1\n");
+- request_region(PCI_REG(SH7751_PCIPAR), 8, "PCI conf1");
+- return 0;
+- }
+- outl (tmp, PCI_REG(SH7751_PCIPAR));
+- }
+-
+- pr_debug("PCI: pci_check_direct failed\n");
+- return -EINVAL;
+-}
+-
+-/***************************************************************************************/
+-
+-/*
+- * Handle bus scanning and fixups ....
+- */
+-
+-static void __init pci_fixup_ide_bases(struct pci_dev *d)
+-{
+- int i;
+-
+- /*
+- * PCI IDE controllers use non-standard I/O port decoding, respect it.
+- */
+- if ((d->class >> 8) != PCI_CLASS_STORAGE_IDE)
+- return;
+- pr_debug("PCI: IDE base address fixup for %s\n", pci_name(d));
+- for(i=0; i<4; i++) {
+- struct resource *r = &d->resource[i];
+- if ((r->start & ~0x80) == 0x374) {
+- r->start |= 2;
+- r->end = r->start;
+- }
+- }
+-}
+-
+-DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_ide_bases);
+-
+-/*
+- * Called after each bus is probed, but before its children
+- * are examined.
+- */
+-
+-void __init pcibios_fixup_bus(struct pci_bus *b)
+-{
+- pci_read_bridge_bases(b);
+-}
+-
+-/*
+- * Initialization. Try all known PCI access methods. Note that we support
+- * using both PCI BIOS and direct access: in such cases, we use I/O ports
+- * to access config space.
+- *
+- * Note that the platform specific initialization (BSC registers, and memory
+- * space mapping) will be called via the machine vectors (sh_mv.mv_pci_init()) if it
+- * exitst and via the platform defined function pcibios_init_platform().
+- * See pci_bigsur.c for implementation;
+- *
+- * The BIOS version of the pci functions is not yet implemented but it is left
+- * in for completeness. Currently an error will be genereated at compile time.
+- */
+-
+-static int __init sh7751_pci_init(void)
+-{
+- int ret;
+-
+- pr_debug("PCI: Starting intialization.\n");
+- if ((ret = pci_check_direct()) != 0)
++ if ((ret = sh4_pci_check_direct()) != 0)
+ return ret;
+
+ return pcibios_init_platform();
+ }
+-
+ subsys_initcall(sh7751_pci_init);
+
+ static int __init __area_sdram_check(unsigned int area)
+@@ -224,26 +62,26 @@
+
+ word = inl(SH7751_BCR1);
+ /* check BCR for SDRAM in area */
+- if(((word >> area) & 1) == 0) {
++ if (((word >> area) & 1) == 0) {
+ printk("PCI: Area %d is not configured for SDRAM. BCR1=0x%x\n",
+ area, word);
+ return 0;
+ }
+- outl(word, PCI_REG(SH7751_PCIBCR1));
++ pci_write_reg(word, SH4_PCIBCR1);
+
+ word = (u16)inw(SH7751_BCR2);
+ /* check BCR2 for 32bit SDRAM interface*/
+- if(((word >> (area << 1)) & 0x3) != 0x3) {
++ if (((word >> (area << 1)) & 0x3) != 0x3) {
+ printk("PCI: Area %d is not 32 bit SDRAM. BCR2=0x%x\n",
+ area, word);
+ return 0;
+ }
+- outl(word, PCI_REG(SH7751_PCIBCR2));
++ pci_write_reg(word, SH4_PCIBCR2);
+
+ return 1;
+ }
+
+-int __init sh7751_pcic_init(struct sh7751_pci_address_map *map)
++int __init sh7751_pcic_init(struct sh4_pci_address_map *map)
+ {
+ u32 reg;
+ u32 word;
+@@ -252,86 +90,89 @@
+ reg = inl(SH7751_BCR1);
+ reg |= 0x80000;
+ outl(reg, SH7751_BCR1);
+-
++
+ /* Turn the clocks back on (not done in reset)*/
+- outl(0, PCI_REG(SH7751_PCICLKR));
++ pci_write_reg(0, SH4_PCICLKR);
+ /* Clear Powerdown IRQ's (not done in reset) */
+- word = SH7751_PCIPINT_D3 | SH7751_PCIPINT_D0;
+- outl(word, PCI_REG(SH7751_PCIPINT));
++ word = SH4_PCIPINT_D3 | SH4_PCIPINT_D0;
++ pci_write_reg(word, SH4_PCIPINT);
+
+ /*
+ * This code is unused for some boards as it is done in the
+ * bootloader and doing it here means the MAC addresses loaded
+ * by the bootloader get lost.
+ */
+- if (!(map->flags & SH7751_PCIC_NO_RESET)) {
++ if (!(map->flags & SH4_PCIC_NO_RESET)) {
+ /* toggle PCI reset pin */
+- word = SH7751_PCICR_PREFIX | SH7751_PCICR_PRST;
+- outl(word,PCI_REG(SH7751_PCICR));
++ word = SH4_PCICR_PREFIX | SH4_PCICR_PRST;
++ pci_write_reg(word, SH4_PCICR);
+ /* Wait for a long time... not 1 sec. but long enough */
+ mdelay(100);
+- word = SH7751_PCICR_PREFIX;
+- outl(word,PCI_REG(SH7751_PCICR));
++ word = SH4_PCICR_PREFIX;
++ pci_write_reg(word, SH4_PCICR);
+ }
+-
++
+ /* set the command/status bits to:
+ * Wait Cycle Control + Parity Enable + Bus Master +
+ * Mem space enable
+ */
+- word = SH7751_PCICONF1_WCC | SH7751_PCICONF1_PER |
++ word = SH7751_PCICONF1_WCC | SH7751_PCICONF1_PER |
+ SH7751_PCICONF1_BUM | SH7751_PCICONF1_MES;
+- outl(word, PCI_REG(SH7751_PCICONF1));
++ pci_write_reg(word, SH7751_PCICONF1);
+
+ /* define this host as the host bridge */
+- word = SH7751_PCI_HOST_BRIDGE << 24;
+- outl(word, PCI_REG(SH7751_PCICONF2));
++ word = PCI_BASE_CLASS_BRIDGE << 24;
++ pci_write_reg(word, SH7751_PCICONF2);
+
+- /* Set IO and Mem windows to local address
+- * Make PCI and local address the same for easy 1 to 1 mapping
++ /* Set IO and Mem windows to local address
++ * Make PCI and local address the same for easy 1 to 1 mapping
+ * Window0 = map->window0.size @ non-cached area base = SDRAM
+- * Window1 = map->window1.size @ cached area base = SDRAM
++ * Window1 = map->window1.size @ cached area base = SDRAM
+ */
+ word = map->window0.size - 1;
+- outl(word, PCI_REG(SH7751_PCILSR0));
++ pci_write_reg(word, SH4_PCILSR0);
+ word = map->window1.size - 1;
+- outl(word, PCI_REG(SH7751_PCILSR1));
++ pci_write_reg(word, SH4_PCILSR1);
+ /* Set the values on window 0 PCI config registers */
+ word = P2SEGADDR(map->window0.base);
+- outl(word, PCI_REG(SH7751_PCILAR0));
+- outl(word, PCI_REG(SH7751_PCICONF5));
++ pci_write_reg(word, SH4_PCILAR0);
++ pci_write_reg(word, SH7751_PCICONF5);
+ /* Set the values on window 1 PCI config registers */
+ word = PHYSADDR(map->window1.base);
+- outl(word, PCI_REG(SH7751_PCILAR1));
+- outl(word, PCI_REG(SH7751_PCICONF6));
++ pci_write_reg(word, SH4_PCILAR1);
++ pci_write_reg(word, SH7751_PCICONF6);
+
+- /* Set the local 16MB PCI memory space window to
++ /* Set the local 16MB PCI memory space window to
+ * the lowest PCI mapped address
+ */
+- word = PCIBIOS_MIN_MEM & SH7751_PCIMBR_MASK;
+- PCIDBG(2,"PCI: Setting upper bits of Memory window to 0x%x\n", word);
+- outl(word , PCI_REG(SH7751_PCIMBR));
++ word = PCIBIOS_MIN_MEM & SH4_PCIMBR_MASK;
++ pr_debug("PCI: Setting upper bits of Memory window to 0x%x\n", word);
++ pci_write_reg(word , SH4_PCIMBR);
+
+ /* Map IO space into PCI IO window
+ * The IO window is 64K-PCIBIOS_MIN_IO in size
+- * IO addresses will be translated to the
++ * IO addresses will be translated to the
+ * PCI IO window base address
+ */
+- PCIDBG(3,"PCI: Mapping IO address 0x%x - 0x%x to base 0x%x\n", PCIBIOS_MIN_IO,
+- (64*1024), SH7751_PCI_IO_BASE+PCIBIOS_MIN_IO);
++ pr_debug("PCI: Mapping IO address 0x%x - 0x%x to base 0x%x\n",
++ PCIBIOS_MIN_IO, (64 << 10),
++ SH4_PCI_IO_BASE + PCIBIOS_MIN_IO);
+
+- /*
++ /*
+ * XXX: For now, leave this board-specific. In the event we have other
+ * boards that need to do similar work, this can be wrapped.
+ */
+ #ifdef CONFIG_SH_BIGSUR
+- bigsur_port_map(PCIBIOS_MIN_IO, (64*1024), SH7751_PCI_IO_BASE+PCIBIOS_MIN_IO,0);
++ bigsur_port_map(PCIBIOS_MIN_IO, (64 << 10),
++ SH4_PCI_IO_BASE + PCIBIOS_MIN_IO, 0);
+ #endif
+
+- /* Make sure the MSB's of IO window are set to access PCI space correctly */
+- word = PCIBIOS_MIN_IO & SH7751_PCIIOBR_MASK;
+- PCIDBG(2,"PCI: Setting upper bits of IO window to 0x%x\n", word);
+- outl(word, PCI_REG(SH7751_PCIIOBR));
+-
++ /* Make sure the MSB's of IO window are set to access PCI space
++ * correctly */
++ word = PCIBIOS_MIN_IO & SH4_PCIIOBR_MASK;
++ pr_debug("PCI: Setting upper bits of IO window to 0x%x\n", word);
++ pci_write_reg(word, SH4_PCIIOBR);
++
+ /* Set PCI WCRx, BCRx's, copy from BSC locations */
+
+ /* check BCR for SDRAM in specified area */
+@@ -344,19 +185,19 @@
+ case SH7751_CS5_BASE_ADDR: word = __area_sdram_check(5); break;
+ case SH7751_CS6_BASE_ADDR: word = __area_sdram_check(6); break;
+ }
+-
++
+ if (!word)
+ return 0;
+
+ /* configure the wait control registers */
+ word = inl(SH7751_WCR1);
+- outl(word, PCI_REG(SH7751_PCIWCR1));
++ pci_write_reg(word, SH4_PCIWCR1);
+ word = inl(SH7751_WCR2);
+- outl(word, PCI_REG(SH7751_PCIWCR2));
++ pci_write_reg(word, SH4_PCIWCR2);
+ word = inl(SH7751_WCR3);
+- outl(word, PCI_REG(SH7751_PCIWCR3));
++ pci_write_reg(word, SH4_PCIWCR3);
+ word = inl(SH7751_MCR);
+- outl(word, PCI_REG(SH7751_PCIMCR));
++ pci_write_reg(word, SH4_PCIMCR);
+
+ /* NOTE: I'm ignoring the PCI error IRQs for now..
+ * TODO: add support for the internal error interrupts and
+@@ -369,49 +210,8 @@
+
+ /* SH7751 init done, set central function init complete */
+ /* use round robin mode to stop a device starving/overruning */
+- word = SH7751_PCICR_PREFIX | SH7751_PCICR_CFIN | SH7751_PCICR_ARBM;
+- outl(word,PCI_REG(SH7751_PCICR));
++ word = SH4_PCICR_PREFIX | SH4_PCICR_CFIN | SH4_PCICR_ARBM;
++ pci_write_reg(word, SH4_PCICR);
+
+ return 1;
+ }
+-
+-char * __init pcibios_setup(char *str)
+-{
+- if (!strcmp(str, "off")) {
+- pci_probe = 0;
+- return NULL;
+- }
+-
+- return str;
+-}
+-
+-/*
+- * IRQ functions
+- */
+-static u8 __init sh7751_no_swizzle(struct pci_dev *dev, u8 *pin)
+-{
+- /* no swizzling */
+- return PCI_SLOT(dev->devfn);
+-}
+-
+-static int sh7751_pci_lookup_irq(struct pci_dev *dev, u8 slot, u8 pin)
+-{
+- int irq = -1;
+-
+- /* now lookup the actual IRQ on a platform specific basis (pci-'platform'.c) */
+- irq = pcibios_map_platform_irq(slot,pin);
+- if( irq < 0 ) {
+- pr_debug("PCI: Error mapping IRQ on device %s\n", pci_name(dev));
+- return irq;
+- }
+-
+- pr_debug("Setting IRQ for slot %s to %d\n", pci_name(dev), irq);
+-
+- return irq;
+-}
+-
+-void __init pcibios_fixup_irqs(void)
+-{
+- pci_fixup_irqs(sh7751_no_swizzle, sh7751_pci_lookup_irq);
+-}
+-
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/pci-sh7751.h linux-2.6.17/arch/sh/drivers/pci/pci-sh7751.h
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/pci-sh7751.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/pci-sh7751.h 2006-07-12 16:54:21.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * Dustin McIntire (dustin@sensoria.com) (c) 2001
+ * Paul Mundt (lethal@linux-sh.org) (c) 2003
+- *
++ *
+ * May be copied or modified under the terms of the GNU General Public
+ * License. See linux/COPYING for more information.
+ *
+@@ -12,28 +12,6 @@
+ #ifndef _PCI_SH7751_H_
+ #define _PCI_SH7751_H_
+
+-#include <linux/pci.h>
+-
+-/* set debug level 4=verbose...1=terse */
+-//#define DEBUG_PCI 3
+-#undef DEBUG_PCI
+-
+-#ifdef DEBUG_PCI
+-#define PCIDBG(n, x...) { if(DEBUG_PCI>=n) printk(x); }
+-#else
+-#define PCIDBG(n, x...)
+-#endif
+-
+-/* startup values */
+-#define PCI_PROBE_BIOS 1
+-#define PCI_PROBE_CONF1 2
+-#define PCI_PROBE_CONF2 4
+-#define PCI_NO_SORT 0x100
+-#define PCI_BIOS_SORT 0x200
+-#define PCI_NO_CHECKS 0x400
+-#define PCI_ASSIGN_ROMS 0x1000
+-#define PCI_BIOS_IRQ_SCAN 0x2000
+-
+ /* Platform Specific Values */
+ #define SH7751_VENDOR_ID 0x1054
+ #define SH7751_DEVICE_ID 0x3505
+@@ -128,131 +106,6 @@
+ #define SH7751_PCICONF17_PMEN 0x00010000 /* PME Enable */
+ #define SH7751_PCICONF17_PWST 0x00000003 /* Power State */
+ /* SH7715 Internal PCI Registers */
+-#define SH7751_PCICR 0x100 /* PCI Control Register */
+- #define SH7751_PCICR_PREFIX 0xA5000000 /* CR prefix for write */
+- #define SH7751_PCICR_TRSB 0x00000200 /* Target Read Single */
+- #define SH7751_PCICR_BSWP 0x00000100 /* Target Byte Swap */
+- #define SH7751_PCICR_PLUP 0x00000080 /* Enable PCI Pullup */
+- #define SH7751_PCICR_ARBM 0x00000040 /* PCI Arbitration Mode */
+- #define SH7751_PCICR_MD 0x00000030 /* MD9 and MD10 status */
+- #define SH7751_PCICR_SERR 0x00000008 /* SERR output assert */
+- #define SH7751_PCICR_INTA 0x00000004 /* INTA output assert */
+- #define SH7751_PCICR_PRST 0x00000002 /* PCI Reset Assert */
+- #define SH7751_PCICR_CFIN 0x00000001 /* Central Fun. Init Done */
+-#define SH7751_PCILSR0 0x104 /* PCI Local Space Register0 */
+-#define SH7751_PCILSR1 0x108 /* PCI Local Space Register1 */
+-#define SH7751_PCILAR0 0x10C /* PCI Local Address Register1 */
+-#define SH7751_PCILAR1 0x110 /* PCI Local Address Register1 */
+-#define SH7751_PCIINT 0x114 /* PCI Interrupt Register */
+- #define SH7751_PCIINT_MLCK 0x00008000 /* Master Lock Error */
+- #define SH7751_PCIINT_TABT 0x00004000 /* Target Abort Error */
+- #define SH7751_PCIINT_TRET 0x00000200 /* Target Retry Error */
+- #define SH7751_PCIINT_MFDE 0x00000100 /* Master Func. Disable Error */
+- #define SH7751_PCIINT_PRTY 0x00000080 /* Address Parity Error */
+- #define SH7751_PCIINT_SERR 0x00000040 /* SERR Detection Error */
+- #define SH7751_PCIINT_TWDP 0x00000020 /* Tgt. Write Parity Error */
+- #define SH7751_PCIINT_TRDP 0x00000010 /* Tgt. Read Parity Error Det. */
+- #define SH7751_PCIINT_MTABT 0x00000008 /* Master-Tgt. Abort Error */
+- #define SH7751_PCIINT_MMABT 0x00000004 /* Master-Master Abort Error */
+- #define SH7751_PCIINT_MWPD 0x00000002 /* Master Write PERR Detect */
+- #define SH7751_PCIINT_MRPD 0x00000002 /* Master Read PERR Detect */
+-#define SH7751_PCIINTM 0x118 /* PCI Interrupt Mask Register */
+-#define SH7751_PCIALR 0x11C /* Error Address Register */
+-#define SH7751_PCICLR 0x120 /* Error Command/Data Register */
+- #define SH7751_PCICLR_MPIO 0x80000000 /* Error Command/Data Register */
+- #define SH7751_PCICLR_MDMA0 0x40000000 /* DMA0 Transfer Error */
+- #define SH7751_PCICLR_MDMA1 0x20000000 /* DMA1 Transfer Error */
+- #define SH7751_PCICLR_MDMA2 0x10000000 /* DMA2 Transfer Error */
+- #define SH7751_PCICLR_MDMA3 0x08000000 /* DMA3 Transfer Error */
+- #define SH7751_PCICLR_TGT 0x04000000 /* Target Transfer Error */
+- #define SH7751_PCICLR_CMDL 0x0000000F /* PCI Command at Error */
+-#define SH7751_PCIAINT 0x130 /* Arbiter Interrupt Register */
+- #define SH7751_PCIAINT_MBKN 0x00002000 /* Master Broken Interrupt */
+- #define SH7751_PCIAINT_TBTO 0x00001000 /* Target Bus Time Out */
+- #define SH7751_PCIAINT_MBTO 0x00001000 /* Master Bus Time Out */
+- #define SH7751_PCIAINT_TABT 0x00000008 /* Target Abort */
+- #define SH7751_PCIAINT_MABT 0x00000004 /* Master Abort */
+- #define SH7751_PCIAINT_RDPE 0x00000002 /* Read Data Parity Error */
+- #define SH7751_PCIAINT_WDPE 0x00000002 /* Write Data Parity Error */
+-#define SH7751_PCIAINTM 0x134 /* Arbiter Int. Mask Register */
+-#define SH7751_PCIBMLR 0x138 /* Error Bus Master Register */
+- #define SH7751_PCIBMLR_REQ4 0x00000010 /* REQ4 bus master at error */
+- #define SH7751_PCIBMLR_REQ3 0x00000008 /* REQ3 bus master at error */
+- #define SH7751_PCIBMLR_REQ2 0x00000004 /* REQ2 bus master at error */
+- #define SH7751_PCIBMLR_REQ1 0x00000002 /* REQ1 bus master at error */
+- #define SH7751_PCIBMLR_REQ0 0x00000001 /* REQ0 bus master at error */
+-#define SH7751_PCIDMABT 0x140 /* DMA Transfer Arb. Register */
+- #define SH7751_PCIDMABT_RRBN 0x00000001 /* DMA Arbitor Round-Robin */
+-#define SH7751_PCIDPA0 0x180 /* DMA0 Transfer Addr. Register */
+-#define SH7751_PCIDLA0 0x184 /* DMA0 Local Addr. Register */
+-#define SH7751_PCIDTC0 0x188 /* DMA0 Transfer Cnt. Register */
+-#define SH7751_PCIDCR0 0x18C /* DMA0 Control Register */
+- #define SH7751_PCIDCR_ALGN 0x00000600 /* DMA Alignment Mode */
+- #define SH7751_PCIDCR_MAST 0x00000100 /* DMA Termination Type */
+- #define SH7751_PCIDCR_INTM 0x00000080 /* DMA Interrupt Done Mask*/
+- #define SH7751_PCIDCR_INTS 0x00000040 /* DMA Interrupt Done Status */
+- #define SH7751_PCIDCR_LHLD 0x00000020 /* Local Address Control */
+- #define SH7751_PCIDCR_PHLD 0x00000010 /* PCI Address Control*/
+- #define SH7751_PCIDCR_IOSEL 0x00000008 /* PCI Address Space Type */
+- #define SH7751_PCIDCR_DIR 0x00000004 /* DMA Transfer Direction */
+- #define SH7751_PCIDCR_STOP 0x00000002 /* Force DMA Stop */
+- #define SH7751_PCIDCR_STRT 0x00000001 /* DMA Start */
+-#define SH7751_PCIDPA1 0x190 /* DMA1 Transfer Addr. Register */
+-#define SH7751_PCIDLA1 0x194 /* DMA1 Local Addr. Register */
+-#define SH7751_PCIDTC1 0x198 /* DMA1 Transfer Cnt. Register */
+-#define SH7751_PCIDCR1 0x19C /* DMA1 Control Register */
+-#define SH7751_PCIDPA2 0x1A0 /* DMA2 Transfer Addr. Register */
+-#define SH7751_PCIDLA2 0x1A4 /* DMA2 Local Addr. Register */
+-#define SH7751_PCIDTC2 0x1A8 /* DMA2 Transfer Cnt. Register */
+-#define SH7751_PCIDCR2 0x1AC /* DMA2 Control Register */
+-#define SH7751_PCIDPA3 0x1B0 /* DMA3 Transfer Addr. Register */
+-#define SH7751_PCIDLA3 0x1B4 /* DMA3 Local Addr. Register */
+-#define SH7751_PCIDTC3 0x1B8 /* DMA3 Transfer Cnt. Register */
+-#define SH7751_PCIDCR3 0x1BC /* DMA3 Control Register */
+-#define SH7751_PCIPAR 0x1C0 /* PIO Address Register */
+- #define SH7751_PCIPAR_CFGEN 0x80000000 /* Configuration Enable */
+- #define SH7751_PCIPAR_BUSNO 0x00FF0000 /* Config. Bus Number */
+- #define SH7751_PCIPAR_DEVNO 0x0000FF00 /* Config. Device Number */
+- #define SH7751_PCIPAR_REGAD 0x000000FC /* Register Address Number */
+-#define SH7751_PCIMBR 0x1C4 /* Memory Base Address Register */
+- #define SH7751_PCIMBR_MASK 0xFF000000 /* Memory Space Mask */
+- #define SH7751_PCIMBR_LOCK 0x00000001 /* Lock Memory Space */
+-#define SH7751_PCIIOBR 0x1C8 /* I/O Base Address Register */
+- #define SH7751_PCIIOBR_MASK 0xFFFC0000 /* IO Space Mask */
+- #define SH7751_PCIIOBR_LOCK 0x00000001 /* Lock IO Space */
+-#define SH7751_PCIPINT 0x1CC /* Power Mgmnt Int. Register */
+- #define SH7751_PCIPINT_D3 0x00000002 /* D3 Pwr Mgmt. Interrupt */
+- #define SH7751_PCIPINT_D0 0x00000001 /* D0 Pwr Mgmt. Interrupt */
+-#define SH7751_PCIPINTM 0x1D0 /* Power Mgmnt Mask Register */
+-#define SH7751_PCICLKR 0x1D4 /* Clock Ctrl. Register */
+- #define SH7751_PCICLKR_PCSTP 0x00000002 /* PCI Clock Stop */
+- #define SH7751_PCICLKR_BCSTP 0x00000002 /* BCLK Clock Stop */
+-/* For definitions of BCR, MCR see ... */
+-#define SH7751_PCIBCR1 0x1E0 /* Memory BCR1 Register */
+-#define SH7751_PCIBCR2 0x1E4 /* Memory BCR2 Register */
+-#define SH7751_PCIWCR1 0x1E8 /* Wait Control 1 Register */
+-#define SH7751_PCIWCR2 0x1EC /* Wait Control 2 Register */
+-#define SH7751_PCIWCR3 0x1F0 /* Wait Control 3 Register */
+-#define SH7751_PCIMCR 0x1F4 /* Memory Control Register */
+-#define SH7751_PCIBCR3 0x1f8 /* Memory BCR3 Register */
+-#define SH7751_PCIPCTR 0x200 /* Port Control Register */
+- #define SH7751_PCIPCTR_P2EN 0x000400000 /* Port 2 Enable */
+- #define SH7751_PCIPCTR_P1EN 0x000200000 /* Port 1 Enable */
+- #define SH7751_PCIPCTR_P0EN 0x000100000 /* Port 0 Enable */
+- #define SH7751_PCIPCTR_P2UP 0x000000020 /* Port2 Pull Up Enable */
+- #define SH7751_PCIPCTR_P2IO 0x000000010 /* Port2 Output Enable */
+- #define SH7751_PCIPCTR_P1UP 0x000000008 /* Port1 Pull Up Enable */
+- #define SH7751_PCIPCTR_P1IO 0x000000004 /* Port1 Output Enable */
+- #define SH7751_PCIPCTR_P0UP 0x000000002 /* Port0 Pull Up Enable */
+- #define SH7751_PCIPCTR_P0IO 0x000000001 /* Port0 Output Enable */
+-#define SH7751_PCIPDTR 0x204 /* Port Data Register */
+- #define SH7751_PCIPDTR_PB5 0x000000020 /* Port 5 Enable */
+- #define SH7751_PCIPDTR_PB4 0x000000010 /* Port 4 Enable */
+- #define SH7751_PCIPDTR_PB3 0x000000008 /* Port 3 Enable */
+- #define SH7751_PCIPDTR_PB2 0x000000004 /* Port 2 Enable */
+- #define SH7751_PCIPDTR_PB1 0x000000002 /* Port 1 Enable */
+- #define SH7751_PCIPDTR_PB0 0x000000001 /* Port 0 Enable */
+-#define SH7751_PCIPDR 0x220 /* Port IO Data Register */
+
+ /* Memory Control Registers */
+ #define SH7751_BCR1 0xFF800000 /* Memory BCR1 Register */
+@@ -274,30 +127,9 @@
+ #define SH7751_CS5_BASE_ADDR (SH7751_CS4_BASE_ADDR + SH7751_MEM_REGION_SIZE)
+ #define SH7751_CS6_BASE_ADDR (SH7751_CS5_BASE_ADDR + SH7751_MEM_REGION_SIZE)
+
+-/* General PCI values */
+-#define SH7751_PCI_HOST_BRIDGE 0x6
+-
+-/* Flags */
+-#define SH7751_PCIC_NO_RESET 0x0001
+-
+-/* External functions defined per platform i.e. Big Sur, SE... (these could be routed
+- * through the machine vectors... */
+-extern int pcibios_init_platform(void);
+-extern int pcibios_map_platform_irq(u8 slot, u8 pin);
+-
+-struct sh7751_pci_address_space {
+- unsigned long base;
+- unsigned long size;
+-};
+-
+-struct sh7751_pci_address_map {
+- struct sh7751_pci_address_space window0;
+- struct sh7751_pci_address_space window1;
+- unsigned long flags;
+-};
++struct sh4_pci_address_map;
+
+ /* arch/sh/drivers/pci/pci-sh7751.c */
+-extern int sh7751_pcic_init(struct sh7751_pci_address_map *map);
++int sh7751_pcic_init(struct sh4_pci_address_map *map);
+
+ #endif /* _PCI_SH7751_H_ */
+-
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/pci-sh7780.c linux-2.6.17/arch/sh/drivers/pci/pci-sh7780.c
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/pci-sh7780.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/pci-sh7780.c 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,139 @@
++/*
++ * Low-Level PCI Support for the SH7780
++ *
++ * Dustin McIntire (dustin@sensoria.com)
++ * Derived from arch/i386/kernel/pci-*.c which bore the message:
++ * (c) 1999--2000 Martin Mares <mj@ucw.cz>
++ *
++ * Ported to the new API by Paul Mundt <lethal@linux-sh.org>
++ * With cleanup by Paul van Gool <pvangool@mimotech.com>
++ *
++ * May be copied or modified under the terms of the GNU General Public
++ * License. See linux/COPYING for more information.
++ *
++ */
++
++#undef DEBUG
++
++#include <linux/config.h>
++#include <linux/types.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/pci.h>
++#include <linux/errno.h>
++#include <linux/delay.h>
++#include "pci-sh4.h"
++
++/*
++ * Initialization. Try all known PCI access methods. Note that we support
++ * using both PCI BIOS and direct access: in such cases, we use I/O ports
++ * to access config space.
++ *
++ * Note that the platform specific initialization (BSC registers, and memory
++ * space mapping) will be called via the platform defined function
++ * pcibios_init_platform().
++ */
++static int __init sh7780_pci_init(void)
++{
++ unsigned int id;
++ int ret;
++
++ pr_debug("PCI: Starting intialization.\n");
++
++ outl(0x00000001, SH7780_PCI_VCR2); /* Enable PCIC */
++
++ /* check for SH7780/SH7780R hardware */
++ id = pci_read_reg(SH7780_PCIVID);
++ if ((id != ((SH7780_DEVICE_ID << 16) | SH7780_VENDOR_ID)) &&
++ (id != ((SH7781_DEVICE_ID << 16) | SH7780_VENDOR_ID))) {
++ printk(KERN_ERR "PCI: This is not an SH7780 (%x)\n", id);
++ return -ENODEV;
++ }
++
++ /* Setup the INTC */
++ ctrl_outl(0x00200000, INTC_ICR0); /* INTC SH-4 Mode */
++ ctrl_outl(0x00078000, INTC_INT2MSKCR); /* enable PCIINTA - PCIINTD */
++ ctrl_outl(0x40000000, INTC_INTMSK1); /* disable IRL4-7 Interrupt */
++ ctrl_outl(0x0000fffe, INTC_INTMSK2); /* disable IRL4-7 Interrupt */
++ ctrl_outl(0x80000000, INTC_INTMSKCLR1); /* enable IRL0-3 Interrupt */
++ ctrl_outl(0xfffe0000, INTC_INTMSKCLR2); /* enable IRL0-3 Interrupt */
++
++ if ((ret = sh4_pci_check_direct()) != 0)
++ return ret;
++
++ return pcibios_init_platform();
++}
++core_initcall(sh7780_pci_init);
++
++int __init sh7780_pcic_init(struct sh4_pci_address_map *map)
++{
++ u32 word;
++
++ /*
++ * This code is unused for some boards as it is done in the
++ * bootloader and doing it here means the MAC addresses loaded
++ * by the bootloader get lost.
++ */
++ if (!(map->flags & SH4_PCIC_NO_RESET)) {
++ /* toggle PCI reset pin */
++ word = SH4_PCICR_PREFIX | SH4_PCICR_PRST;
++ pci_write_reg(word, SH4_PCICR);
++ /* Wait for a long time... not 1 sec. but long enough */
++ mdelay(100);
++ word = SH4_PCICR_PREFIX;
++ pci_write_reg(word, SH4_PCICR);
++ }
++
++ /* set the command/status bits to:
++ * Wait Cycle Control + Parity Enable + Bus Master +
++ * Mem space enable
++ */
++ pci_write_reg(0x00000046, SH7780_PCICMD);
++
++ /* define this host as the host bridge */
++ word = PCI_BASE_CLASS_BRIDGE << 24;
++ pci_write_reg(word, SH7780_PCIRID);
++
++ /* Set IO and Mem windows to local address
++ * Make PCI and local address the same for easy 1 to 1 mapping
++ * Window0 = map->window0.size @ non-cached area base = SDRAM
++ * Window1 = map->window1.size @ cached area base = SDRAM
++ */
++ word = ((map->window0.size - 1) & 0x1ff00001) | 0x01;
++ pci_write_reg(0x07f00001, SH4_PCILSR0);
++ word = ((map->window1.size - 1) & 0x1ff00001) | 0x01;
++ pci_write_reg(0x00000001, SH4_PCILSR1);
++ /* Set the values on window 0 PCI config registers */
++ word = P2SEGADDR(map->window0.base);
++ pci_write_reg(0xa8000000, SH4_PCILAR0);
++ pci_write_reg(0x08000000, SH7780_PCIMBAR0);
++ /* Set the values on window 1 PCI config registers */
++ word = P2SEGADDR(map->window1.base);
++ pci_write_reg(0x00000000, SH4_PCILAR1);
++ pci_write_reg(0x00000000, SH7780_PCIMBAR1);
++
++ /* Map IO space into PCI IO window
++ * The IO window is 64K-PCIBIOS_MIN_IO in size
++ * IO addresses will be translated to the
++ * PCI IO window base address
++ */
++ pr_debug("PCI: Mapping IO address 0x%x - 0x%x to base 0x%x\n",
++ PCIBIOS_MIN_IO, (64 << 10),
++ SH7780_PCI_IO_BASE + PCIBIOS_MIN_IO);
++
++ /* NOTE: I'm ignoring the PCI error IRQs for now..
++ * TODO: add support for the internal error interrupts and
++ * DMA interrupts...
++ */
++
++#ifdef CONFIG_SH_R7780RP
++ pci_fixup_pcic();
++#endif
++
++ /* SH7780 init done, set central function init complete */
++ /* use round robin mode to stop a device starving/overruning */
++ word = SH4_PCICR_PREFIX | SH4_PCICR_CFIN | SH4_PCICR_FTO;
++ pci_write_reg(word, SH4_PCICR);
++
++ return 1;
++}
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/pci-sh7780.h linux-2.6.17/arch/sh/drivers/pci/pci-sh7780.h
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/pci-sh7780.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/pci-sh7780.h 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,94 @@
++/*
++ * Low-Level PCI Support for SH7780 targets
++ *
++ * Dustin McIntire (dustin@sensoria.com) (c) 2001
++ * Paul Mundt (lethal@linux-sh.org) (c) 2003
++ *
++ * May be copied or modified under the terms of the GNU General Public
++ * License. See linux/COPYING for more information.
++ *
++ */
++
++#ifndef _PCI_SH7780_H_
++#define _PCI_SH7780_H_
++
++/* Platform Specific Values */
++#define SH7780_VENDOR_ID 0x1912
++#define SH7780_DEVICE_ID 0x0002
++#define SH7781_DEVICE_ID 0x0001
++
++/* SH7780 Control Registers */
++#define SH7780_PCI_VCR0 0xFE000000
++#define SH7780_PCI_VCR1 0xFE000004
++#define SH7780_PCI_VCR2 0xFE000008
++
++/* SH7780 Specific Values */
++#define SH7780_PCI_CONFIG_BASE 0xFD000000 /* Config space base addr */
++#define SH7780_PCI_CONFIG_SIZE 0x01000000 /* Config space size */
++
++#define SH7780_PCI_MEMORY_BASE 0xFD000000 /* Memory space base addr */
++#define SH7780_PCI_MEM_SIZE 0x01000000 /* Size of Memory window */
++
++#define SH7780_PCI_IO_BASE 0xFE400000 /* IO space base address */
++#define SH7780_PCI_IO_SIZE 0x00400000 /* Size of IO window */
++
++#define SH7780_PCIREG_BASE 0xFE040000 /* PCI regs base address */
++#define PCI_REG(n) (SH7780_PCIREG_BASE+n)
++
++/* SH7780 PCI Config Registers */
++#define SH7780_PCIVID 0x000 /* Vendor ID */
++#define SH7780_PCIDID 0x002 /* Device ID */
++#define SH7780_PCICMD 0x004 /* Command */
++#define SH7780_PCISTATUS 0x006 /* Status */
++#define SH7780_PCIRID 0x008 /* Revision ID */
++#define SH7780_PCIPIF 0x009 /* Program Interface */
++#define SH7780_PCISUB 0x00a /* Sub class code */
++#define SH7780_PCIBCC 0x00b /* Base class code */
++#define SH7780_PCICLS 0x00c /* Cache line size */
++#define SH7780_PCILTM 0x00d /* latency timer */
++#define SH7780_PCIHDR 0x00e /* Header type */
++#define SH7780_PCIBIST 0x00f /* BIST */
++#define SH7780_PCIIBAR 0x010 /* IO Base address */
++#define SH7780_PCIMBAR0 0x014 /* Memory base address0 */
++#define SH7780_PCIMBAR1 0x018 /* Memory base address1 */
++#define SH7780_PCISVID 0x02c /* Sub system vendor ID */
++#define SH7780_PCISID 0x02e /* Sub system ID */
++#define SH7780_PCICP 0x034
++#define SH7780_PCIINTLINE 0x03c /* Interrupt line */
++#define SH7780_PCIINTPIN 0x03d /* Interrupt pin */
++#define SH7780_PCIMINGNT 0x03e /* Minumum grand */
++#define SH7780_PCIMAXLAT 0x03f /* Maxmum latency */
++#define SH7780_PCICID 0x040
++#define SH7780_PCINIP 0x041
++#define SH7780_PCIPMC 0x042
++#define SH7780_PCIPMCSR 0x044
++#define SH7780_PCIPMCSR_BSE 0x046
++#define SH7780_PCICDD 0x047
++
++#define SH7780_PCIMBR0 0x1E0
++#define SH7780_PCIMBMR0 0x1E4
++#define SH7780_PCIMBR2 0x1F0
++#define SH7780_PCIMBMR2 0x1F4
++#define SH7780_PCIIOBR 0x1F8
++#define SH7780_PCIIOBMR 0x1FC
++#define SH7780_PCICSCR0 0x210 /* Cache Snoop1 Cnt. Register */
++#define SH7780_PCICSCR1 0x214 /* Cache Snoop2 Cnt. Register */
++#define SH7780_PCICSAR0 0x218 /* Cache Snoop1 Addr. Register */
++#define SH7780_PCICSAR1 0x21C /* Cache Snoop2 Addr. Register */
++
++/* General Memory Config Addresses */
++#define SH7780_CS0_BASE_ADDR 0x0
++#define SH7780_MEM_REGION_SIZE 0x04000000
++#define SH7780_CS1_BASE_ADDR (SH7780_CS0_BASE_ADDR + SH7780_MEM_REGION_SIZE)
++#define SH7780_CS2_BASE_ADDR (SH7780_CS1_BASE_ADDR + SH7780_MEM_REGION_SIZE)
++#define SH7780_CS3_BASE_ADDR (SH7780_CS2_BASE_ADDR + SH7780_MEM_REGION_SIZE)
++#define SH7780_CS4_BASE_ADDR (SH7780_CS3_BASE_ADDR + SH7780_MEM_REGION_SIZE)
++#define SH7780_CS5_BASE_ADDR (SH7780_CS4_BASE_ADDR + SH7780_MEM_REGION_SIZE)
++#define SH7780_CS6_BASE_ADDR (SH7780_CS5_BASE_ADDR + SH7780_MEM_REGION_SIZE)
++
++struct sh4_pci_address_map;
++
++/* arch/sh/drivers/pci/pci-sh7780.c */
++int sh7780_pcic_init(struct sh4_pci_address_map *map);
++
++#endif /* _PCI_SH7780_H_ */
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/pci-st40.c linux-2.6.17/arch/sh/drivers/pci/pci-st40.c
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/pci-st40.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/pci-st40.c 2006-07-12 16:54:21.000000000 +0000
+@@ -71,12 +71,6 @@
+ static void pci_set_rbar_region(unsigned int region, unsigned long localAddr,
+ unsigned long pciOffset, unsigned long regionSize);
+
+-/*
+- * The pcibios_map_platform_irq function is defined in the appropriate
+- * board specific code and referenced here
+- */
+-extern int __init pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin);
+-
+ static __init void SetPCIPLL(void)
+ {
+ {
+@@ -110,12 +104,12 @@
+
+ static struct pci_err int_error[]={
+ { INT_MNLTDIM,"MNLTDIM: Master non-lock transfer"},
+- { INT_TTADI, "TTADI: Illegal byte enable in I/O transfer"},
+- { INT_TMTO, "TMTO: Target memory read/write timeout"},
++ { INT_TTADI, "TTADI: Illegal byte enable in I/O transfer"},
++ { INT_TMTO, "TMTO: Target memory read/write timeout"},
+ { INT_MDEI, "MDEI: Master function disable error"},
+ { INT_APEDI, "APEDI: Address parity error"},
+ { INT_SDI, "SDI: SERR detected"},
+- { INT_DPEITW, "DPEITW: Data parity error target write"},
++ { INT_DPEITW, "DPEITW: Data parity error target write"},
+ { INT_PEDITR, "PEDITR: PERR detected"},
+ { INT_TADIM, "TADIM: Target abort detected"},
+ { INT_MADIM, "MADIM: Master abort detected"},
+@@ -178,7 +172,7 @@
+ pci_cir = ST40PCI_READ(CIR);pci_air = ST40PCI_READ(AIR);
+
+ /* Reset state to stop multiple interrupts */
+- ST40PCI_WRITE(INT, ~0); ST40PCI_WRITE(AINT, ~0);
++ ST40PCI_WRITE(INT, ~0); ST40PCI_WRITE(AINT, ~0);
+
+
+ if(++count>1) return IRQ_HANDLED;
+@@ -193,8 +187,8 @@
+ if(pci_aint) {
+ printk("** AINT register status\n");
+ print_pci_errors(pci_aint,aint_error,NUM_PCI_AINT_ERRS);
+- }
+-
++ }
++
+ printk("** Address and command info\n");
+
+ printk("** Command %s : Address 0x%x\n",
+@@ -246,7 +240,7 @@
+ */
+ if ((d->class >> 8) != PCI_CLASS_STORAGE_IDE)
+ return;
+- printk("PCI: IDE base address fixup for %s\n", pci_name(d));
++ printk("PCI: IDE base address fixup for %s\n", d->slot_name);
+ for(i=0; i<4; i++) {
+ struct resource *r = &d->resource[i];
+ if ((r->start & ~0x80) == 0x374) {
+@@ -255,11 +249,13 @@
+ }
+ }
+ }
++
+ DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_ide_bases);
+
+ int __init st40pci_init(unsigned memStart, unsigned memSize)
+ {
+- u32 lsr0;
++
++ printk("PCI version register reads 0x%x\n",ST40PCI_READ(VCR_VERSION));
+
+ SetPCIPLL();
+
+@@ -423,19 +419,12 @@
+ /* Everything hangs off this */
+ static struct pci_bus *pci_root_bus;
+
+-
+-static u8 __init no_swizzle(struct pci_dev *dev, u8 * pin)
+-{
+- return PCI_SLOT(dev->devfn);
+-}
+-
+-
+ static int __init pcibios_init(void)
+ {
+ extern unsigned long memory_start, memory_end;
+
+ printk(KERN_ALERT "pci-st40.c: pcibios_init\n");
+-
++
+ if (sh_mv.mv_init_pci != NULL) {
+ sh_mv.mv_init_pci();
+ }
+@@ -466,17 +455,11 @@
+ /* ok, do the scan man */
+ pci_root_bus = pci_scan_bus(0, &st40pci_config_ops, NULL);
+ pci_assign_unassigned_resources();
+- pci_fixup_irqs(no_swizzle, pcibios_map_platform_irq);
+
+ return 0;
+ }
+-
+ subsys_initcall(pcibios_init);
+
+-void __init pcibios_fixup_bus(struct pci_bus *bus)
+-{
+-}
+-
+ /*
+ * Publish a region of local address space over the PCI bus
+ * to other devices.
+@@ -505,5 +488,5 @@
+
+ /* Size of region */
+ ST40PCI_WRITE_INDEXED(RSR, region, mask | 1);
+-}
++}
+
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/pci/pci.c linux-2.6.17/arch/sh/drivers/pci/pci.c
+--- linux-2.6.17-vanilla/arch/sh/drivers/pci/pci.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/pci/pci.c 2006-07-12 16:54:21.000000000 +0000
+@@ -1,21 +1,45 @@
+-/* arch/sh/kernel/pci.c
+- * $Id: pci.c,v 1.1 2003/08/24 19:15:45 lethal Exp $
++/*
++ * arch/sh/drivers/pci/pci.c
+ *
+ * Copyright (c) 2002 M. R. Brown <mrbrown@linux-sh.org>
+- *
+- *
++ * Copyright (c) 2004 - 2006 Paul Mundt <lethal@linux-sh.org>
++ *
+ * These functions are collected here to reduce duplication of common
+ * code amongst the many platform-specific PCI support code files.
+- *
++ *
+ * These routines require the following board-specific routines:
+ * void pcibios_fixup_irqs();
+ *
+ * See include/asm-sh/pci.h for more information.
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
+ */
+-
+ #include <linux/kernel.h>
+ #include <linux/pci.h>
+ #include <linux/init.h>
++#include <asm/io.h>
++
++static inline u8 bridge_swizzle(u8 pin, u8 slot)
++{
++ return (((pin - 1) + slot) % 4) + 1;
++}
++
++static u8 __init simple_swizzle(struct pci_dev *dev, u8 *pinp)
++{
++ u8 pin = *pinp;
++
++ while (dev->bus->parent) {
++ pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn));
++ /* Move up the chain of bridges. */
++ dev = dev->bus->self;
++ }
++ *pinp = pin;
++
++ /* The slot is the slot of the last bridge. */
++ return PCI_SLOT(dev->devfn);
++}
+
+ static int __init pcibios_init(void)
+ {
+@@ -26,26 +50,32 @@
+ #ifdef CONFIG_PCI_AUTO
+ /* assign resources */
+ busno = 0;
+- for (p = board_pci_channels; p->pci_ops != NULL; p++) {
++ for (p = board_pci_channels; p->pci_ops != NULL; p++)
+ busno = pciauto_assign_resources(busno, p) + 1;
+- }
+ #endif
+
+ /* scan the buses */
+ busno = 0;
+- for (p= board_pci_channels; p->pci_ops != NULL; p++) {
++ for (p = board_pci_channels; p->pci_ops != NULL; p++) {
+ bus = pci_scan_bus(busno, p->pci_ops, p);
+- busno = bus->subordinate+1;
++ busno = bus->subordinate + 1;
+ }
+
+- /* board-specific fixups */
+- pcibios_fixup_irqs();
++ pci_fixup_irqs(simple_swizzle, pcibios_map_platform_irq);
+
+ return 0;
+ }
+-
+ subsys_initcall(pcibios_init);
+
++/*
++ * Called after each bus is probed, but before its children
++ * are examined.
++ */
++void __init pcibios_fixup_bus(struct pci_bus *bus)
++{
++ pci_read_bridge_bases(bus);
++}
++
+ void
+ pcibios_update_resource(struct pci_dev *dev, struct resource *root,
+ struct resource *res, int resource)
+@@ -61,13 +91,17 @@
+ new |= PCI_ROM_ADDRESS_ENABLE;
+ reg = dev->rom_base_reg;
+ } else {
+- /* Somebody might have asked allocation of a non-standard resource */
++ /*
++ * Somebody might have asked allocation of a non-standard
++ * resource
++ */
+ return;
+ }
+-
++
+ pci_write_config_dword(dev, reg, new);
+ pci_read_config_dword(dev, reg, &check);
+- if ((new ^ check) & ((new & PCI_BASE_ADDRESS_SPACE_IO) ? PCI_BASE_ADDRESS_IO_MASK : PCI_BASE_ADDRESS_MEM_MASK)) {
++ if ((new ^ check) & ((new & PCI_BASE_ADDRESS_SPACE_IO) ?
++ PCI_BASE_ADDRESS_IO_MASK : PCI_BASE_ADDRESS_MEM_MASK)) {
+ printk(KERN_ERR "PCI: Error while updating region "
+ "%s/%d (%08x != %08x)\n", pci_name(dev), resource,
+ new, check);
+@@ -145,7 +179,8 @@
+ lat = pcibios_max_latency;
+ else
+ return;
+- printk(KERN_INFO "PCI: Setting latency timer of device %s to %d\n", pci_name(dev), lat);
++ printk(KERN_INFO "PCI: Setting latency timer of device %s to %d\n",
++ pci_name(dev), lat);
+ pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat);
+ }
+
+@@ -153,3 +188,39 @@
+ {
+ pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq);
+ }
++
++void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen)
++{
++ unsigned long start = pci_resource_start(dev, bar);
++ unsigned long len = pci_resource_len(dev, bar);
++ unsigned long flags = pci_resource_flags(dev, bar);
++
++ if (unlikely(!len || !start))
++ return NULL;
++ if (maxlen && len > maxlen)
++ len = maxlen;
++
++ /*
++ * Presently the IORESOURCE_MEM case is a bit special, most
++ * SH7751 style PCI controllers have PCI memory at a fixed
++ * location in the address space where no remapping is desired
++ * (typically at 0xfd000000, but is_pci_memaddr() will know
++ * best). With the IORESOURCE_MEM case more care has to be taken
++ * to inhibit page table mapping for legacy cores, but this is
++ * punted off to __ioremap().
++ * -- PFM.
++ */
++ if (flags & IORESOURCE_IO)
++ return ioport_map(start, len);
++ if (flags & IORESOURCE_MEM)
++ return ioremap(start, len);
++
++ return NULL;
++}
++EXPORT_SYMBOL(pci_iomap);
++
++void pci_iounmap(struct pci_dev *dev, void __iomem *addr)
++{
++ iounmap(addr);
++}
++EXPORT_SYMBOL(pci_iounmap);
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/superhyway/CVS/Entries linux-2.6.17/arch/sh/drivers/superhyway/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/drivers/superhyway/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/superhyway/CVS/Entries 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,3 @@
++/Makefile/1.1/Thu Mar 17 07:43:07 2005//
++/ops-sh4-202.c/1.3/Tue Jan 3 22:35:52 2006//
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/superhyway/CVS/Repository linux-2.6.17/arch/sh/drivers/superhyway/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/drivers/superhyway/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/superhyway/CVS/Repository 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/drivers/superhyway
+diff -ruN linux-2.6.17-vanilla/arch/sh/drivers/superhyway/CVS/Root linux-2.6.17/arch/sh/drivers/superhyway/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/drivers/superhyway/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/drivers/superhyway/CVS/Root 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/.cvsignore linux-2.6.17/arch/sh/kernel/.cvsignore
+--- linux-2.6.17-vanilla/arch/sh/kernel/.cvsignore 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/.cvsignore 2006-07-12 16:54:22.000000000 +0000
+@@ -0,0 +1 @@
++vmlinux.lds.s
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/CVS/Entries linux-2.6.17/arch/sh/kernel/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/kernel/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/CVS/Entries 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,34 @@
++/.cvsignore/1.1/Wed May 12 13:51:13 2004/-ko/
++/Makefile/1.19/Sun Jan 29 17:46:23 2006//
++/apm.c/1.2/Mon Jan 30 15:57:20 2006//
++/asm-offsets.c/1.1/Mon Jun 28 22:03:37 2004/-ko/
++/cf-enabler.c/1.6/Wed Jan 4 18:03:38 2006/-ko/
++/cpufreq.c/1.7/Tue Jan 3 22:35:53 2006/-ko/
++/early_printk.c/1.4/Sat Aug 13 15:49:28 2005//
++/entry.S/1.46/Sun Jan 29 17:46:23 2006/-ko/
++/head.S/1.9/Thu Oct 20 22:51:38 2005/-ko/
++/init_task.c/1.7/Sun Aug 15 16:59:26 2004//
++/io.c/1.7/Wed Nov 23 15:47:38 2005/-ko/
++/io_generic.c/1.6/Tue Jan 3 22:51:47 2006/-ko/
++/kgdb_jmp.S/1.2/Fri Nov 1 17:19:24 2002//
++/kgdb_stub.c/1.5/Sun Feb 5 12:27:59 2006//
++/machine_kexec.c/1.1/Mon Sep 19 19:20:56 2005/-ko/
++/module.c/1.5/Sun Feb 22 23:08:43 2004/-ko/
++/pm.c/1.2/Mon Jan 30 15:57:20 2006//
++/ptrace.c/1.22/Mon Mar 27 21:06:13 2006//
++/relocate_kernel.S/1.1/Mon Sep 19 19:20:56 2005/-ko/
++/semaphore.c/1.4/Thu Mar 17 07:40:18 2005/-ko/
++/sh_bios.c/1.3/Tue Jun 15 18:40:42 2004/-ko/
++/signal.c/1.30/Fri Oct 28 13:12:48 2005/-ko/
++/smp.c/1.10/Mon Mar 27 21:06:14 2006/-ko/
++/sys_sh.c/1.11/Sat Dec 31 11:30:47 2005//
++/vmlinux.lds.S/1.6/Thu Mar 17 07:49:06 2005/-ko/
++D/cpu////
++D/timers////
++/irq.c/1.28/Wed Jul 5 14:50:39 2006/-ko/
++/process.c/1.42/Fri Jul 7 10:15:14 2006/-ko/
++/syscalls.S/1.4/Fri Jul 7 10:15:14 2006/-ko/
++/setup.c/1.53/Sat Jul 8 20:16:09 2006/-ko/
++/time.c/1.38/Sat Jul 8 20:16:09 2006/-ko/
++/sh_ksyms.c/1.26/Wed Jul 12 16:51:54 2006//
++/traps.c/1.21/Wed Jul 12 16:51:54 2006/-ko/
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/CVS/Repository linux-2.6.17/arch/sh/kernel/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/kernel/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/CVS/Repository 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/kernel
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/CVS/Root linux-2.6.17/arch/sh/kernel/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/kernel/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/CVS/Root 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/Makefile linux-2.6.17/arch/sh/kernel/Makefile
+--- linux-2.6.17-vanilla/arch/sh/kernel/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/Makefile 2006-07-12 16:54:22.000000000 +0000
+@@ -6,7 +6,7 @@
+
+ obj-y := process.o signal.o entry.o traps.o irq.o \
+ ptrace.o setup.o time.o sys_sh.o semaphore.o \
+- io.o io_generic.o sh_ksyms.o
++ io.o io_generic.o sh_ksyms.o syscalls.o
+
+ obj-y += cpu/ timers/
+
+@@ -18,3 +18,5 @@
+ obj-$(CONFIG_MODULES) += module.o
+ obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
+ obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
++obj-$(CONFIG_APM) += apm.o
++obj-$(CONFIG_PM) += pm.o
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/apm.c linux-2.6.17/arch/sh/kernel/apm.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/apm.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/apm.c 2006-07-12 16:54:22.000000000 +0000
+@@ -0,0 +1,539 @@
++/*
++ * bios-less APM driver for hp680
++ *
++ * Copyright 2005 (c) Andriy Skulysh <askulysh@gmail.com>
++ *
++ * based on ARM APM driver by
++ * Jamey Hicks <jamey@crl.dec.com>
++ *
++ * adapted from the APM BIOS driver for Linux by
++ * Stephen Rothwell (sfr@linuxcare.com)
++ *
++ * APM 1.2 Reference:
++ * Intel Corporation, Microsoft Corporation. Advanced Power Management
++ * (APM) BIOS Interface Specification, Revision 1.2, February 1996.
++ *
++ * [This document is available from Microsoft at:
++ * http://www.microsoft.com/hwdev/busbios/amp_12.htm]
++ */
++#include <linux/config.h>
++#include <linux/module.h>
++#include <linux/poll.h>
++#include <linux/timer.h>
++#include <linux/slab.h>
++#include <linux/proc_fs.h>
++#include <linux/miscdevice.h>
++#include <linux/apm_bios.h>
++#include <linux/pm.h>
++#include <linux/pm_legacy.h>
++#include <asm/apm.h>
++
++#define MODNAME "apm"
++
++/*
++ * The apm_bios device is one of the misc char devices.
++ * This is its minor number.
++ */
++#define APM_MINOR_DEV 134
++
++/*
++ * Maximum number of events stored
++ */
++#define APM_MAX_EVENTS 16
++
++struct apm_queue {
++ unsigned int event_head;
++ unsigned int event_tail;
++ apm_event_t events[APM_MAX_EVENTS];
++};
++
++/*
++ * The per-file APM data
++ */
++struct apm_user {
++ struct list_head list;
++
++ unsigned int suser: 1;
++ unsigned int writer: 1;
++ unsigned int reader: 1;
++
++ int suspend_result;
++ unsigned int suspend_state;
++#define SUSPEND_NONE 0 /* no suspend pending */
++#define SUSPEND_PENDING 1 /* suspend pending read */
++#define SUSPEND_READ 2 /* suspend read, pending ack */
++#define SUSPEND_ACKED 3 /* suspend acked */
++#define SUSPEND_DONE 4 /* suspend completed */
++
++ struct apm_queue queue;
++};
++
++/*
++ * Local variables
++ */
++static int suspends_pending;
++
++static DECLARE_WAIT_QUEUE_HEAD(apm_waitqueue);
++static DECLARE_WAIT_QUEUE_HEAD(apm_suspend_waitqueue);
++
++/*
++ * This is a list of everyone who has opened /dev/apm_bios
++ */
++static DECLARE_RWSEM(user_list_lock);
++static LIST_HEAD(apm_user_list);
++
++/*
++ * kapmd info. kapmd provides us a process context to handle
++ * "APM" events within - specifically necessary if we're going
++ * to be suspending the system.
++ */
++static DECLARE_WAIT_QUEUE_HEAD(kapmd_wait);
++static DECLARE_COMPLETION(kapmd_exit);
++static DEFINE_SPINLOCK(kapmd_queue_lock);
++static struct apm_queue kapmd_queue;
++
++int apm_suspended;
++EXPORT_SYMBOL(apm_suspended);
++
++/* Platform-specific apm_read_proc(). */
++int (*apm_get_info)(char *buf, char **start, off_t fpos, int length);
++EXPORT_SYMBOL(apm_get_info);
++
++/*
++ * APM event queue management.
++ */
++static inline int queue_empty(struct apm_queue *q)
++{
++ return q->event_head == q->event_tail;
++}
++
++static inline apm_event_t queue_get_event(struct apm_queue *q)
++{
++ q->event_tail = (q->event_tail + 1) % APM_MAX_EVENTS;
++ return q->events[q->event_tail];
++}
++
++static void queue_add_event(struct apm_queue *q, apm_event_t event)
++{
++ q->event_head = (q->event_head + 1) % APM_MAX_EVENTS;
++ if (q->event_head == q->event_tail) {
++ static int notified;
++
++ if (notified++ == 0)
++ printk(KERN_ERR "apm: an event queue overflowed\n");
++
++ q->event_tail = (q->event_tail + 1) % APM_MAX_EVENTS;
++ }
++ q->events[q->event_head] = event;
++}
++
++static void queue_event_one_user(struct apm_user *as, apm_event_t event)
++{
++ if (as->suser && as->writer) {
++ switch (event) {
++ case APM_SYS_SUSPEND:
++ case APM_USER_SUSPEND:
++ /*
++ * If this user already has a suspend pending,
++ * don't queue another one.
++ */
++ if (as->suspend_state != SUSPEND_NONE)
++ return;
++
++ as->suspend_state = SUSPEND_PENDING;
++ suspends_pending++;
++ break;
++ }
++ }
++ queue_add_event(&as->queue, event);
++}
++
++static void queue_event(apm_event_t event, struct apm_user *sender)
++{
++ struct apm_user *as;
++
++ down_read(&user_list_lock);
++
++ list_for_each_entry(as, &apm_user_list, list)
++ if (as != sender && as->reader)
++ queue_event_one_user(as, event);
++
++ up_read(&user_list_lock);
++ wake_up_interruptible(&apm_waitqueue);
++}
++
++/**
++ * apm_queue_event - queue an APM event for kapmd
++ * @event: APM event
++ *
++ * Queue an APM event for kapmd to process and ultimately take the
++ * appropriate action. Only a subset of events are handled:
++ * %APM_LOW_BATTERY
++ * %APM_POWER_STATUS_CHANGE
++ * %APM_USER_SUSPEND
++ * %APM_SYS_SUSPEND
++ * %APM_CRITICAL_SUSPEND
++ */
++void apm_queue_event(apm_event_t event)
++{
++ spin_lock_irq(&kapmd_queue_lock);
++ queue_add_event(&kapmd_queue, event);
++ spin_unlock_irq(&kapmd_queue_lock);
++
++ wake_up_interruptible(&kapmd_wait);
++}
++EXPORT_SYMBOL(apm_queue_event);
++
++static void apm_suspend(void)
++{
++ struct apm_user *as;
++ int err;
++
++ apm_suspended = 1;
++ err = pm_suspend(PM_SUSPEND_MEM);
++
++ /*
++ * Anyone on the APM queues will think we're still suspended.
++ * Send a message so everyone knows we're now awake again.
++ */
++ queue_event(APM_NORMAL_RESUME, NULL);
++
++ /*
++ * Finally, wake up anyone who is sleeping on the suspend.
++ */
++ down_read(&user_list_lock);
++ list_for_each_entry(as, &apm_user_list, list) {
++ as->suspend_result = err;
++ as->suspend_state = SUSPEND_DONE;
++ }
++ up_read(&user_list_lock);
++
++ wake_up(&apm_suspend_waitqueue);
++ apm_suspended = 0;
++}
++
++static ssize_t apm_read(struct file *fp, char __user *buf,
++ size_t count, loff_t *ppos)
++{
++ struct apm_user *as = fp->private_data;
++ apm_event_t event;
++ int i = count, ret = 0;
++
++ if (count < sizeof(apm_event_t))
++ return -EINVAL;
++
++ if (queue_empty(&as->queue) && fp->f_flags & O_NONBLOCK)
++ return -EAGAIN;
++
++ wait_event_interruptible(apm_waitqueue, !queue_empty(&as->queue));
++
++ while ((i >= sizeof(event)) && !queue_empty(&as->queue)) {
++ event = queue_get_event(&as->queue);
++
++ ret = -EFAULT;
++ if (copy_to_user(buf, &event, sizeof(event)))
++ break;
++
++ if (event == APM_SYS_SUSPEND || event == APM_USER_SUSPEND)
++ as->suspend_state = SUSPEND_READ;
++
++ buf += sizeof(event);
++ i -= sizeof(event);
++ }
++
++ if (i < count)
++ ret = count - i;
++
++ return ret;
++}
++
++static unsigned int apm_poll(struct file *fp, poll_table * wait)
++{
++ struct apm_user *as = fp->private_data;
++
++ poll_wait(fp, &apm_waitqueue, wait);
++ return queue_empty(&as->queue) ? 0 : POLLIN | POLLRDNORM;
++}
++
++/*
++ * apm_ioctl - handle APM ioctl
++ *
++ * APM_IOC_SUSPEND
++ * This IOCTL is overloaded, and performs two functions. It is used to:
++ * - initiate a suspend
++ * - acknowledge a suspend read from /dev/apm_bios.
++ * Only when everyone who has opened /dev/apm_bios with write permission
++ * has acknowledge does the actual suspend happen.
++ */
++static int
++apm_ioctl(struct inode * inode, struct file *filp, u_int cmd, u_long arg)
++{
++ struct apm_user *as = filp->private_data;
++ unsigned long flags;
++ int err = -EINVAL;
++
++ if (!as->suser || !as->writer)
++ return -EPERM;
++
++ switch (cmd) {
++ case APM_IOC_SUSPEND:
++ as->suspend_result = -EINTR;
++
++ if (as->suspend_state == SUSPEND_READ) {
++ /*
++ * If we read a suspend command from /dev/apm_bios,
++ * then the corresponding APM_IOC_SUSPEND ioctl is
++ * interpreted as an acknowledge.
++ */
++ as->suspend_state = SUSPEND_ACKED;
++ suspends_pending--;
++ } else {
++ /*
++ * Otherwise it is a request to suspend the system.
++ * Queue an event for all readers, and expect an
++ * acknowledge from all writers who haven't already
++ * acknowledged.
++ */
++ queue_event(APM_USER_SUSPEND, as);
++ }
++
++ /*
++ * If there are no further acknowledges required, suspend
++ * the system.
++ */
++ if (suspends_pending == 0)
++ apm_suspend();
++
++ /*
++ * Wait for the suspend/resume to complete. If there are
++ * pending acknowledges, we wait here for them.
++ *
++ * Note that we need to ensure that the PM subsystem does
++ * not kick us out of the wait when it suspends the threads.
++ */
++ flags = current->flags;
++ current->flags |= PF_NOFREEZE;
++
++ /*
++ * Note: do not allow a thread which is acking the suspend
++ * to escape until the resume is complete.
++ */
++ if (as->suspend_state == SUSPEND_ACKED)
++ wait_event(apm_suspend_waitqueue,
++ as->suspend_state == SUSPEND_DONE);
++ else
++ wait_event_interruptible(apm_suspend_waitqueue,
++ as->suspend_state == SUSPEND_DONE);
++
++ current->flags = flags;
++ err = as->suspend_result;
++ as->suspend_state = SUSPEND_NONE;
++ break;
++ }
++
++ return err;
++}
++
++static int apm_release(struct inode * inode, struct file * filp)
++{
++ struct apm_user *as = filp->private_data;
++ filp->private_data = NULL;
++
++ down_write(&user_list_lock);
++ list_del(&as->list);
++ up_write(&user_list_lock);
++
++ /*
++ * We are now unhooked from the chain. As far as new
++ * events are concerned, we no longer exist. However, we
++ * need to balance suspends_pending, which means the
++ * possibility of sleeping.
++ */
++ if (as->suspend_state != SUSPEND_NONE) {
++ suspends_pending -= 1;
++ if (suspends_pending == 0)
++ apm_suspend();
++ }
++
++ kfree(as);
++ return 0;
++}
++
++static int apm_open(struct inode * inode, struct file * filp)
++{
++ struct apm_user *as;
++
++ as = kzalloc(sizeof(*as), GFP_KERNEL);
++ if (as) {
++ /*
++ * XXX - this is a tiny bit broken, when we consider BSD
++ * process accounting. If the device is opened by root, we
++ * instantly flag that we used superuser privs. Who knows,
++ * we might close the device immediately without doing a
++ * privileged operation -- cevans
++ */
++ as->suser = capable(CAP_SYS_ADMIN);
++ as->writer = (filp->f_mode & FMODE_WRITE) == FMODE_WRITE;
++ as->reader = (filp->f_mode & FMODE_READ) == FMODE_READ;
++
++ down_write(&user_list_lock);
++ list_add(&as->list, &apm_user_list);
++ up_write(&user_list_lock);
++
++ filp->private_data = as;
++ }
++
++ return as ? 0 : -ENOMEM;
++}
++
++static struct file_operations apm_bios_fops = {
++ .owner = THIS_MODULE,
++ .read = apm_read,
++ .poll = apm_poll,
++ .ioctl = apm_ioctl,
++ .open = apm_open,
++ .release = apm_release,
++};
++
++static struct miscdevice apm_device = {
++ .minor = APM_MINOR_DEV,
++ .name = "apm_bios",
++ .fops = &apm_bios_fops
++};
++
++
++#ifdef CONFIG_PROC_FS
++/*
++ * Arguments, with symbols from linux/apm_bios.h.
++ *
++ * 0) Linux driver version (this will change if format changes)
++ * 1) APM BIOS Version. Usually 1.0, 1.1 or 1.2.
++ * 2) APM flags from APM Installation Check (0x00):
++ * bit 0: APM_16_BIT_SUPPORT
++ * bit 1: APM_32_BIT_SUPPORT
++ * bit 2: APM_IDLE_SLOWS_CLOCK
++ * bit 3: APM_BIOS_DISABLED
++ * bit 4: APM_BIOS_DISENGAGED
++ * 3) AC line status
++ * 0x00: Off-line
++ * 0x01: On-line
++ * 0x02: On backup power (BIOS >= 1.1 only)
++ * 0xff: Unknown
++ * 4) Battery status
++ * 0x00: High
++ * 0x01: Low
++ * 0x02: Critical
++ * 0x03: Charging
++ * 0x04: Selected battery not present (BIOS >= 1.2 only)
++ * 0xff: Unknown
++ * 5) Battery flag
++ * bit 0: High
++ * bit 1: Low
++ * bit 2: Critical
++ * bit 3: Charging
++ * bit 7: No system battery
++ * 0xff: Unknown
++ * 6) Remaining battery life (percentage of charge):
++ * 0-100: valid
++ * -1: Unknown
++ * 7) Remaining battery life (time units):
++ * Number of remaining minutes or seconds
++ * -1: Unknown
++ * 8) min = minutes; sec = seconds
++ */
++static int apm_read_proc(char *buf, char **start, off_t fpos, int length)
++{
++ if (likely(apm_get_info))
++ return apm_get_info(buf, start, fpos, length);
++
++ return -EINVAL;
++}
++#endif
++
++static int kapmd(void *arg)
++{
++ daemonize("kapmd");
++ current->flags |= PF_NOFREEZE;
++
++ do {
++ apm_event_t event;
++
++ wait_event_interruptible(kapmd_wait,
++ !queue_empty(&kapmd_queue) || !pm_active);
++
++ if (!pm_active)
++ break;
++
++ spin_lock_irq(&kapmd_queue_lock);
++ event = 0;
++ if (!queue_empty(&kapmd_queue))
++ event = queue_get_event(&kapmd_queue);
++ spin_unlock_irq(&kapmd_queue_lock);
++
++ switch (event) {
++ case 0:
++ break;
++
++ case APM_LOW_BATTERY:
++ case APM_POWER_STATUS_CHANGE:
++ queue_event(event, NULL);
++ break;
++
++ case APM_USER_SUSPEND:
++ case APM_SYS_SUSPEND:
++ queue_event(event, NULL);
++ if (suspends_pending == 0)
++ apm_suspend();
++ break;
++
++ case APM_CRITICAL_SUSPEND:
++ apm_suspend();
++ break;
++ }
++ } while (1);
++
++ complete_and_exit(&kapmd_exit, 0);
++}
++
++static int __init apm_init(void)
++{
++ int ret;
++
++ pm_active = 1;
++
++ ret = kernel_thread(kapmd, NULL, CLONE_KERNEL);
++ if (unlikely(ret < 0)) {
++ pm_active = 0;
++ return ret;
++ }
++
++ create_proc_info_entry("apm", 0, NULL, apm_read_proc);
++
++ ret = misc_register(&apm_device);
++ if (unlikely(ret != 0)) {
++ remove_proc_entry("apm", NULL);
++
++ pm_active = 0;
++ wake_up(&kapmd_wait);
++ wait_for_completion(&kapmd_exit);
++ }
++
++ return ret;
++}
++
++static void __exit apm_exit(void)
++{
++ misc_deregister(&apm_device);
++ remove_proc_entry("apm", NULL);
++
++ pm_active = 0;
++ wake_up(&kapmd_wait);
++ wait_for_completion(&kapmd_exit);
++}
++
++module_init(apm_init);
++module_exit(apm_exit);
++
++MODULE_AUTHOR("Stephen Rothwell, Andriy Skulysh");
++MODULE_DESCRIPTION("Advanced Power Management");
++MODULE_LICENSE("GPL");
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cf-enabler.c linux-2.6.17/arch/sh/kernel/cf-enabler.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/cf-enabler.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cf-enabler.c 2006-07-12 16:54:22.000000000 +0000
+@@ -11,7 +11,8 @@
+
+ #include <linux/config.h>
+ #include <linux/init.h>
+-
++#include <linux/mm.h>
++#include <linux/vmalloc.h>
+ #include <asm/io.h>
+ #include <asm/irq.h>
+
+@@ -33,8 +34,6 @@
+ /* SH4 can't access PCMCIA interface through P2 area.
+ * we must remap it with appropreate attribute bit of the page set.
+ * this part is based on Greg Banks' hd64465_ss.c implementation - Masahiro Abe */
+-#include <linux/mm.h>
+-#include <linux/vmalloc.h>
+
+ #if defined(CONFIG_CF_AREA6)
+ #define slot_no 0
+@@ -42,9 +41,6 @@
+ #define slot_no 1
+ #endif
+
+-/* defined in mm/ioremap.c */
+-extern void * p3_ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags);
+-
+ /* use this pointer to access to directly connected compact flash io area*/
+ void *cf_io_base;
+
+@@ -63,7 +59,7 @@
+ return -ENOMEM;
+ }
+ /* printk("p3_ioremap(paddr=0x%08lx, psize=0x%08lx, prot=0x%08lx)=0x%08lx\n",
+- paddrbase, psize, prot.pgprot, cf_io_base);*/
++ paddrbase, psize, prot.pgprot, cf_io_base);*/
+
+ /* XXX : do we need attribute and common-memory area also? */
+
+@@ -88,7 +84,7 @@
+ }
+
+ #if defined(CONFIG_SH_SOLUTION_ENGINE)
+-#include <asm/se/se.h>
++#include <asm/se.h>
+
+ /*
+ * SolutionEngine
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/CVS/Entries linux-2.6.17/arch/sh/kernel/cpu/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/CVS/Entries 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,10 @@
++/Makefile/1.10/Sat Jan 28 01:22:16 2006/-ko/
++/adc.c/1.2/Sun Aug 15 16:59:26 2004/-ko/
++/clock.c/1.6/Sat Jan 28 01:27:00 2006/-ko/
++/ubc.S/1.2/Sun May 4 19:29:53 2003/-ko/
++D/irq////
++D/sh2////
++D/sh3////
++D/sh4////
++/init.c/1.11/Wed Jul 5 14:50:40 2006/-ko/
++/rtc.c/1.5/Wed Jul 5 14:50:40 2006/-ko/
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/CVS/Repository linux-2.6.17/arch/sh/kernel/cpu/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/CVS/Repository 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/kernel/cpu
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/CVS/Root linux-2.6.17/arch/sh/kernel/cpu/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/CVS/Root 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/clock.c linux-2.6.17/arch/sh/kernel/cpu/clock.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/clock.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/clock.c 2006-07-12 16:54:22.000000000 +0000
+@@ -225,7 +225,7 @@
+ {
+ int i, ret = 0;
+
+- BUG_ON(unlikely(!master_clk.rate));
++ BUG_ON(!master_clk.rate);
+
+ for (i = 0; i < ARRAY_SIZE(onchip_clocks); i++) {
+ struct clk *clk = onchip_clocks[i];
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/init.c linux-2.6.17/arch/sh/kernel/cpu/init.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/init.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/init.c 2006-07-12 16:54:22.000000000 +0000
+@@ -4,6 +4,7 @@
+ * CPU init code
+ *
+ * Copyright (C) 2002, 2003 Paul Mundt
++ * Copyright (C) 2003 Richard Curnow
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+@@ -51,7 +52,15 @@
+ ccr = ctrl_inl(CCR);
+
+ /*
+- * If the cache is already enabled .. flush it.
++ * At this point we don't know whether the cache is enabled or not - a
++ * bootloader may have enabled it. There are at least 2 things that
++ * could be dirty in the cache at this point:
++ * 1. kernel command line set up by boot loader
++ * 2. spilled registers from the prolog of this function
++ * => before re-initialising the cache, we must do a purge of the whole
++ * cache out to memory for safety. As long as nothing is spilled
++ * during the loop to lines that have already been done, this is safe.
++ * - RPC
+ */
+ if (ccr & CCR_CACHE_ENABLE) {
+ unsigned long ways, waysize, addrstart;
+@@ -98,6 +107,8 @@
+ /* Force EMODE if possible */
+ if (cpu_data->dcache.ways > 1)
+ flags |= CCR_CACHE_EMODE;
++ else
++ flags &= ~CCR_CACHE_EMODE;
+ #endif
+
+ #ifdef CONFIG_SH_WRITETHROUGH
+@@ -112,6 +123,9 @@
+ /* Turn on OCRAM -- halve the OC */
+ flags |= CCR_CACHE_ORA;
+ cpu_data->dcache.sets >>= 1;
++
++ cpu_data->dcache.way_size = cpu_data->dcache.sets *
++ cpu_data->dcache.linesz;
+ #endif
+
+ ctrl_outl(flags, CCR);
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/irq/CVS/Entries linux-2.6.17/arch/sh/kernel/cpu/irq/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/irq/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/irq/CVS/Entries 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1,6 @@
++/Makefile/1.1/Sat Jan 7 20:16:39 2006/-ko/
++/imask.c/1.1/Sat Jan 7 20:16:39 2006/-ko/
++/ipr.c/1.2/Sun Jan 8 12:21:42 2006/-ko/
++/pint.c/1.1/Sat Jan 7 20:16:39 2006/-ko/
++/intc2.c/1.2/Wed Jul 12 16:51:54 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/irq/CVS/Repository linux-2.6.17/arch/sh/kernel/cpu/irq/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/irq/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/irq/CVS/Repository 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/kernel/cpu/irq
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/irq/CVS/Root linux-2.6.17/arch/sh/kernel/cpu/irq/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/irq/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/irq/CVS/Root 2006-07-12 16:54:21.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/irq/intc2.c linux-2.6.17/arch/sh/kernel/cpu/irq/intc2.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/irq/intc2.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/irq/intc2.c 2006-07-12 16:54:21.000000000 +0000
+@@ -241,9 +241,9 @@
+ /* 110-111 reserved/unused */
+ #elif defined(CONFIG_CPU_SUBTYPE_SH7780)
+ { TIMER_IRQ, 0, 24, 0, INTC_TMU0_MSK, 2},
+-#ifdef CONFIG_SH_RTC
+- { RTC_IRQ, 4, 0, 0, INTC_RTC_MSK, TIMER_PRIORITY },
+-#endif
++ { 21, 1, 0, 0, INTC_RTC_MSK, TIMER_PRIORITY },
++ { 22, 1, 1, 0, INTC_RTC_MSK, TIMER_PRIORITY },
++ { 23, 1, 2, 0, INTC_RTC_MSK, TIMER_PRIORITY },
+ { SCIF0_ERI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY },
+ { SCIF0_RXI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY },
+ { SCIF0_BRI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY },
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh2/CVS/Entries linux-2.6.17/arch/sh/kernel/cpu/sh2/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh2/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/sh2/CVS/Entries 2006-07-12 16:54:22.000000000 +0000
+@@ -0,0 +1,3 @@
++/Makefile/1.3/Thu Jul 8 13:52:22 2004/-ko/
++/probe.c/1.1/Thu Jul 8 13:52:22 2004/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh2/CVS/Repository linux-2.6.17/arch/sh/kernel/cpu/sh2/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh2/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/sh2/CVS/Repository 2006-07-12 16:54:22.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/kernel/cpu/sh2
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh2/CVS/Root linux-2.6.17/arch/sh/kernel/cpu/sh2/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh2/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/sh2/CVS/Root 2006-07-12 16:54:22.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh3/CVS/Entries linux-2.6.17/arch/sh/kernel/cpu/sh3/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh3/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/sh3/CVS/Entries 2006-07-12 16:54:22.000000000 +0000
+@@ -0,0 +1,8 @@
++/Makefile/1.6/Fri Jun 10 15:51:47 2005/-ko/
++/clock-sh3.c/1.1/Sat Mar 26 20:25:36 2005/-ko/
++/clock-sh7300.c/1.2/Tue May 31 14:06:34 2005/-ko/
++/clock-sh7705.c/1.1/Sat Mar 26 20:25:36 2005/-ko/
++/clock-sh7709.c/1.2/Wed Sep 28 11:32:44 2005//
++/ex.S/1.4/Sun Jun 20 20:27:22 2004/-ko/
++/probe.c/1.2/Mon Aug 30 12:55:31 2004/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh3/CVS/Repository linux-2.6.17/arch/sh/kernel/cpu/sh3/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh3/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/sh3/CVS/Repository 2006-07-12 16:54:22.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/kernel/cpu/sh3
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh3/CVS/Root linux-2.6.17/arch/sh/kernel/cpu/sh3/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh3/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/sh3/CVS/Root 2006-07-12 16:54:22.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh3/clock-sh7709.c linux-2.6.17/arch/sh/kernel/cpu/sh3/clock-sh7709.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh3/clock-sh7709.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/sh3/clock-sh7709.c 2006-07-12 16:54:22.000000000 +0000
+@@ -4,7 +4,7 @@
+ * SH7709 support for the clock framework
+ *
+ * Copyright (C) 2005 Andriy Skulysh
+- *
++ *
+ * Based on arch/sh/kernel/cpu/sh3/clock-sh7705.c
+ * Copyright (C) 2005 Paul Mundt
+ *
+@@ -59,7 +59,7 @@
+ static void bus_clk_recalc(struct clk *clk)
+ {
+ int frqcr = ctrl_inw(FRQCR);
+- int idx = (frqcr & 0x0080) ?
++ int idx = (frqcr & 0x0080) ?
+ ((frqcr & 0x8000) >> 13) | ((frqcr & 0x0030) >> 4) : 1;
+
+ clk->rate = clk->parent->rate * stc_multipliers[idx];
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh4/CVS/Entries linux-2.6.17/arch/sh/kernel/cpu/sh4/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh4/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/sh4/CVS/Entries 2006-07-12 16:54:22.000000000 +0000
+@@ -0,0 +1,12 @@
++/clock-sh4-202.c/1.1/Sat Mar 26 20:25:36 2005/-ko/
++/clock-sh4.c/1.1/Sat Mar 26 20:25:36 2005/-ko/
++/clock-sh73180.c/1.1/Sat Mar 26 20:25:36 2005/-ko/
++/clock-sh7770.c/1.1/Sun Aug 21 23:47:31 2005/-ko/
++/clock-sh7780.c/1.1/Sun Aug 21 23:47:31 2005/-ko/
++/ex.S/1.3/Sun Aug 21 23:47:31 2005//
++/fpu.c/1.5/Wed Mar 2 13:02:56 2005/-ko/
++/probe.c/1.6/Sat Oct 8 22:08:40 2005/-ko/
++/sq.c/1.15/Sat Jan 7 17:33:56 2006//
++/Makefile/1.13/Wed Jul 12 16:51:55 2006/-ko/
++/setup-sh7780.c/1.1/Tue Jul 11 07:57:40 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh4/CVS/Repository linux-2.6.17/arch/sh/kernel/cpu/sh4/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh4/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/sh4/CVS/Repository 2006-07-12 16:54:22.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/kernel/cpu/sh4
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh4/CVS/Root linux-2.6.17/arch/sh/kernel/cpu/sh4/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh4/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/sh4/CVS/Root 2006-07-12 16:54:22.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh4/Makefile linux-2.6.17/arch/sh/kernel/cpu/sh4/Makefile
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh4/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/sh4/Makefile 2006-07-12 16:54:22.000000000 +0000
+@@ -4,9 +4,12 @@
+
+ obj-y := ex.o probe.o
+
+-obj-$(CONFIG_SH_FPU) += fpu.o
++obj-$(CONFIG_SH_FPU) += fpu.o
+ obj-$(CONFIG_SH_STORE_QUEUES) += sq.o
+
++# CPU subtype setup
++obj-$(CONFIG_CPU_SUBTYPE_SH7780) += setup-sh7780.o
++
+ # Primary on-chip clocks (common)
+ clock-$(CONFIG_CPU_SH4) := clock-sh4.o
+ clock-$(CONFIG_CPU_SUBTYPE_SH73180) := clock-sh73180.o
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh4/ex.S linux-2.6.17/arch/sh/kernel/cpu/sh4/ex.S
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh4/ex.S 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/sh4/ex.S 2006-07-12 16:54:22.000000000 +0000
+@@ -39,9 +39,9 @@
+ #endif
+ #if defined(CONFIG_SH_FPU)
+ .long do_fpu_error /* 120 */
+-#else
++#else
+ .long exception_error /* 120 */
+-#endif
++#endif
+ .long exception_error /* 140 */
+ .long system_call ! Unconditional Trap /* 160 */
+ .long exception_error ! reserved_instruction (filled by trap_init) /* 180 */
+@@ -73,6 +73,7 @@
+ .long do_IRQ ! 1110
+ .long exception_error
+ ! Internal hardware
++#ifndef CONFIG_CPU_SUBTYPE_SH7780
+ .long do_IRQ ! TMU0 tuni0 /* 400 */
+ .long do_IRQ ! TMU1 tuni1
+ .long do_IRQ ! TMU2 tuni2
+@@ -129,13 +130,13 @@
+ .long exception_error ! 46
+ .long exception_error ! 47
+ #endif
+-#if defined(CONFIG_SH_FPU)
++#if defined(CONFIG_SH_FPU)
+ .long do_fpu_state_restore ! 48 /* 800 */
+ .long do_fpu_state_restore ! 49 /* 820 */
+-#else
++#else
+ .long exception_error
+ .long exception_error
+-#endif
++#endif
+ #if defined(CONFIG_CPU_SUBTYPE_SH7751)
+ .long exception_error /* 840 */
+ .long exception_error
+@@ -380,5 +381,168 @@
+ .long exception_error ! 141 0x13a0
+ .long exception_error ! 142 0x13c0
+ .long exception_error ! 143 0x13e0
++#elif defined(CONFIG_CPU_SUBTYPE_SH7770)
++ .long do_IRQ ! 50 0x840
++ .long do_IRQ ! 51 0x860
++ .long do_IRQ ! 52 0x880
++ .long do_IRQ ! 53 0x8a0
++ .long do_IRQ ! 54 0x8c0
++ .long do_IRQ ! 55 0x8e0
++ .long do_IRQ ! 56 0x900
++ .long do_IRQ ! 57 0x920
++ .long do_IRQ ! 58 0x940
++ .long do_IRQ ! 59 0x960
++ .long do_IRQ ! 60 0x980
++ .long do_IRQ ! 61 0x9a0
++ .long do_IRQ ! 62 0x9c0
++ .long do_IRQ ! 63 0x9e0
++ .long do_IRQ ! 64 0xa00
++ .long do_IRQ ! 65 0xa20
++ .long do_IRQ ! 66 0xa4d
++ .long do_IRQ ! 67 0xa60
++ .long do_IRQ ! 68 0xa80
++ .long do_IRQ ! 69 0xaa0
++ .long do_IRQ ! 70 0xac0
++ .long do_IRQ ! 71 0xae0
++ .long do_IRQ ! 72 0xb00
++ .long do_IRQ ! 73 0xb20
++ .long do_IRQ ! 74 0xb40
++ .long do_IRQ ! 75 0xb60
++ .long do_IRQ ! 76 0xb80
++ .long do_IRQ ! 77 0xba0
++ .long do_IRQ ! 78 0xbc0
++ .long do_IRQ ! 79 0xbe0
++ .long do_IRQ ! 80 0xc00
++ .long do_IRQ ! 81 0xc20
++ .long do_IRQ ! 82 0xc40
++ .long do_IRQ ! 83 0xc60
++ .long do_IRQ ! 84 0xc80
++ .long do_IRQ ! 85 0xca0
++ .long do_IRQ ! 86 0xcc0
++ .long do_IRQ ! 87 0xce0
++ .long do_IRQ ! 88 0xd00
++ .long do_IRQ ! 89 0xd20
++ .long do_IRQ ! 90 0xd40
++ .long do_IRQ ! 91 0xd60
++ .long do_IRQ ! 92 0xd80
++ .long do_IRQ ! 93 0xda0
++ .long do_IRQ ! 94 0xdc0
++ .long do_IRQ ! 95 0xde0
++ .long do_IRQ ! 96 0xe00
++ .long do_IRQ ! 97 0xe20
++ .long do_IRQ ! 98 0xe40
++ .long do_IRQ ! 99 0xe60
++ .long do_IRQ ! 100 0xe80
++ .long do_IRQ ! 101 0xea0
++ .long do_IRQ ! 102 0xec0
++ .long do_IRQ ! 103 0xee0
++ .long do_IRQ ! 104 0xf00
++ .long do_IRQ ! 105 0xf20
++ .long do_IRQ ! 106 0xf40
++ .long do_IRQ ! 107 0xf60
++ .long do_IRQ ! 108 0xf80
++#endif
++#else
++ .long exception_error /* 400 */
++ .long exception_error
++ .long exception_error
++ .long exception_error
++ .long do_IRQ ! RTC ati
++ .long do_IRQ ! pri
++ .long do_IRQ ! cui
++ .long exception_error
++ .long exception_error /* 500 */
++ .long exception_error
++ .long exception_error
++ .long do_IRQ ! WDT iti /* 560 */
++ .long do_IRQ ! TMU-ch0
++ .long do_IRQ ! TMU-ch1
++ .long do_IRQ ! TMU-ch2
++ .long do_IRQ ! ticpi2 /* 5E0 */
++ .long do_IRQ ! 32 Hitachi UDI /* 600 */
++ .long exception_error
++ .long do_IRQ ! 34 DMAC dmte0
++ .long do_IRQ ! 35 dmte1
++ .long do_IRQ ! 36 dmte2
++ .long do_IRQ ! 37 dmte3
++ .long do_IRQ ! 38 dmae
++ .long exception_error ! 39 /* 6E0 */
++ .long do_IRQ ! 40 SCIF-ch0 eri /* 700 */
++ .long do_IRQ ! 41 rxi
++ .long do_IRQ ! 42 bri
++ .long do_IRQ ! 43 txi
++ .long do_IRQ ! 44 DMAC dmte4 /* 780 */
++ .long do_IRQ ! 45 dmte5
++ .long do_IRQ ! 46 dmte6
++ .long do_IRQ ! 47 dmte7 /* 7E0 */
++#if defined(CONFIG_SH_FPU)
++ .long do_fpu_state_restore ! 48 /* 800 */
++ .long do_fpu_state_restore ! 49 /* 820 */
++#else
++ .long exception_error
++ .long exception_error
++#endif
++ .long exception_error /* 840 */
++ .long exception_error
++ .long exception_error
++ .long exception_error
++ .long exception_error
++ .long exception_error
++ .long do_IRQ ! 56 CMT /* 900 */
++ .long exception_error
++ .long exception_error
++ .long exception_error
++ .long do_IRQ ! 60 HAC
++ .long exception_error
++ .long exception_error
++ .long exception_error
++ .long do_IRQ ! PCI serr /* A00 */
++ .long do_IRQ ! INTA
++ .long do_IRQ ! INTB
++ .long do_IRQ ! INTC
++ .long do_IRQ ! INTD
++ .long do_IRQ ! err
++ .long do_IRQ ! pwd3
++ .long do_IRQ ! pwd2
++ .long do_IRQ ! pwd1 /* B00 */
++ .long do_IRQ ! pwd0
++ .long exception_error
++ .long exception_error
++ .long do_IRQ ! SCIF-ch1 eri /* B80 */
++ .long do_IRQ ! rxi
++ .long do_IRQ ! bri
++ .long do_IRQ ! txi
++ .long do_IRQ ! SIOF /* C00 */
++ .long exception_error
++ .long exception_error
++ .long exception_error
++ .long do_IRQ ! HSPI /* C80 */
++ .long exception_error
++ .long exception_error
++ .long exception_error
++ .long do_IRQ ! MMCIF fatat /* D00 */
++ .long do_IRQ ! tran
++ .long do_IRQ ! err
++ .long do_IRQ ! frdy
++ .long do_IRQ ! DMAC dmint8 /* D80 */
++ .long do_IRQ ! dmint9
++ .long do_IRQ ! dmint10
++ .long do_IRQ ! dmint11
++ .long do_IRQ ! TMU-ch3 /* E00 */
++ .long do_IRQ ! TMU-ch4
++ .long do_IRQ ! TMU-ch5
++ .long exception_error
++ .long do_IRQ ! SSI
++ .long exception_error
++ .long exception_error
++ .long exception_error
++ .long do_IRQ ! FLCTL flste /* F00 */
++ .long do_IRQ ! fltend
++ .long do_IRQ ! fltrq0
++ .long do_IRQ ! fltrq1
++ .long do_IRQ ! GPIO gpioi0 /* F80 */
++ .long do_IRQ ! gpioi1
++ .long do_IRQ ! gpioi2
++ .long do_IRQ ! gpioi3
+ #endif
+
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh4/probe.c linux-2.6.17/arch/sh/kernel/cpu/sh4/probe.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh4/probe.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/sh4/probe.c 2006-07-12 16:54:22.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * CPU Subtype Probing for SH-4.
+ *
+- * Copyright (C) 2001, 2002, 2003, 2004 Paul Mundt
++ * Copyright (C) 2001 - 2005 Paul Mundt
+ * Copyright (C) 2003 Richard Curnow
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+@@ -53,9 +53,6 @@
+ cpu_data->dcache.ways = 1;
+ cpu_data->dcache.linesz = L1_CACHE_BYTES;
+
+- /* Set the FPU flag, virtually all SH-4's have one */
+- cpu_data->flags |= CPU_HAS_FPU;
+-
+ /*
+ * Probe the underlying processor version/revision and
+ * adjust cpu_data setup accordingly.
+@@ -63,56 +60,99 @@
+ switch (pvr) {
+ case 0x205:
+ cpu_data->type = CPU_SH7750;
+- cpu_data->flags |= CPU_HAS_P2_FLUSH_BUG | CPU_HAS_PERF_COUNTER;
++ cpu_data->flags |= CPU_HAS_P2_FLUSH_BUG | CPU_HAS_FPU |
++ CPU_HAS_PERF_COUNTER | CPU_HAS_PTEA;
+ break;
+ case 0x206:
+ cpu_data->type = CPU_SH7750S;
+- cpu_data->flags |= CPU_HAS_P2_FLUSH_BUG | CPU_HAS_PERF_COUNTER;
++ cpu_data->flags |= CPU_HAS_P2_FLUSH_BUG | CPU_HAS_FPU |
++ CPU_HAS_PERF_COUNTER | CPU_HAS_PTEA;
+ break;
+ case 0x1100:
+ cpu_data->type = CPU_SH7751;
++ cpu_data->flags |= CPU_HAS_FPU | CPU_HAS_PTEA;
+ break;
+ case 0x2000:
+ cpu_data->type = CPU_SH73180;
+ cpu_data->icache.ways = 4;
+ cpu_data->dcache.ways = 4;
+- cpu_data->flags &= ~CPU_HAS_FPU;
++
++ /*
++ * XXX: Double check this, none of the SH-4A/SH-4AL processors
++ * should have this, as it's essentially a legacy thing.
++ */
++ cpu_data->flags |= CPU_HAS_PTEA;
++ break;
++ case 0x2001:
++ case 0x2004:
++ cpu_data->type = CPU_SH7770;
++ cpu_data->icache.ways = 4;
++ cpu_data->dcache.ways = 4;
++
++ /* Same note as above applies here for PTEA */
++ cpu_data->flags |= CPU_HAS_FPU | CPU_HAS_PTEA;
++ break;
++ case 0x2006:
++ case 0x200A:
++ if (prr == 0x61)
++ cpu_data->type = CPU_SH7781;
++ else
++ cpu_data->type = CPU_SH7780;
++
++ cpu_data->icache.ways = 4;
++ cpu_data->dcache.ways = 4;
++
++ cpu_data->flags |= CPU_HAS_FPU | CPU_HAS_PERF_COUNTER;
+ break;
+ case 0x8000:
+ cpu_data->type = CPU_ST40RA;
++ cpu_data->flags |= CPU_HAS_FPU | CPU_HAS_PTEA;
+ break;
+ case 0x8100:
+ cpu_data->type = CPU_ST40GX1;
++ cpu_data->flags |= CPU_HAS_FPU | CPU_HAS_PTEA;
+ break;
+ case 0x700:
+ cpu_data->type = CPU_SH4_501;
+ cpu_data->icache.ways = 2;
+ cpu_data->dcache.ways = 2;
+-
+- /* No FPU on the SH4-500 series.. */
+- cpu_data->flags &= ~CPU_HAS_FPU;
++ cpu_data->flags |= CPU_HAS_PTEA;
+ break;
+ case 0x600:
+ cpu_data->type = CPU_SH4_202;
+ cpu_data->icache.ways = 2;
+ cpu_data->dcache.ways = 2;
++ cpu_data->flags |= CPU_HAS_FPU | CPU_HAS_PTEA;
+ break;
+ case 0x500 ... 0x501:
+ switch (prr) {
+- case 0x10: cpu_data->type = CPU_SH7750R; break;
+- case 0x11: cpu_data->type = CPU_SH7751R; break;
+- case 0x50: cpu_data->type = CPU_SH7760; break;
++ case 0x10:
++ cpu_data->type = CPU_SH7750R;
++ break;
++ case 0x11:
++ cpu_data->type = CPU_SH7751R;
++ break;
++ case 0x50 ... 0x5f:
++ cpu_data->type = CPU_SH7760;
++ break;
+ }
+
+ cpu_data->icache.ways = 2;
+ cpu_data->dcache.ways = 2;
+
++ cpu_data->flags |= CPU_HAS_FPU | CPU_HAS_PTEA;
++
+ break;
+ default:
+ cpu_data->type = CPU_SH_NONE;
+ break;
+ }
+
++#ifdef CONFIG_SH_DIRECT_MAPPED
++ cpu_data->icache.ways = 1;
++ cpu_data->dcache.ways = 1;
++#endif
++
+ /*
+ * On anything that's not a direct-mapped cache, look to the CVR
+ * for I/D-cache specifics.
+@@ -125,6 +165,9 @@
+ (cpu_data->icache.way_incr - (1 << 5));
+ }
+
++ cpu_data->icache.way_size = cpu_data->icache.sets *
++ cpu_data->icache.linesz;
++
+ if (cpu_data->dcache.ways > 1) {
+ size = sizes[(cvr >> 16) & 0xf];
+ cpu_data->dcache.way_incr = (size >> 1);
+@@ -133,6 +176,9 @@
+ (cpu_data->dcache.way_incr - (1 << 5));
+ }
+
++ cpu_data->dcache.way_size = cpu_data->dcache.sets *
++ cpu_data->dcache.linesz;
++
+ return 0;
+ }
+
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh4/setup-sh7780.c linux-2.6.17/arch/sh/kernel/cpu/sh4/setup-sh7780.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh4/setup-sh7780.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/sh4/setup-sh7780.c 2006-07-12 16:54:22.000000000 +0000
+@@ -0,0 +1,52 @@
++/*
++ * SH7780 Setup
++ *
++ * Copyright (C) 2006 Paul Mundt
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ */
++#include <linux/platform_device.h>
++#include <linux/init.h>
++
++static struct resource rtc_resources[] = {
++ [0] = {
++ .start = 0xffe80000,
++ .end = 0xffe80000 + 0x58 - 1,
++ .flags = IORESOURCE_IO,
++ },
++ [1] = {
++ /* Period IRQ */
++ .start = 21,
++ .flags = IORESOURCE_IRQ,
++ },
++ [2] = {
++ /* Carry IRQ */
++ .start = 22,
++ .flags = IORESOURCE_IRQ,
++ },
++ [3] = {
++ /* Alarm IRQ */
++ .start = 23,
++ .flags = IORESOURCE_IRQ,
++ },
++};
++
++static struct platform_device rtc_device = {
++ .name = "sh-rtc",
++ .id = -1,
++ .num_resources = ARRAY_SIZE(rtc_resources),
++ .resource = rtc_resources,
++};
++
++static struct platform_device *sh7780_devices[] __initdata = {
++ &rtc_device,
++};
++
++static int __init sh7780_devices_setup(void)
++{
++ return platform_add_devices(sh7780_devices,
++ ARRAY_SIZE(sh7780_devices));
++}
++__initcall(sh7780_devices_setup);
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh4/sq.c linux-2.6.17/arch/sh/kernel/cpu/sh4/sq.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/cpu/sh4/sq.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/cpu/sh4/sq.c 2006-07-12 16:54:22.000000000 +0000
+@@ -1,50 +1,53 @@
+ /*
+- * arch/sh/kernel/cpu/sq.c
++ * arch/sh/kernel/cpu/sh4/sq.c
+ *
+ * General management API for SH-4 integrated Store Queues
+ *
+- * Copyright (C) 2001, 2002, 2003, 2004 Paul Mundt
++ * Copyright (C) 2001 - 2006 Paul Mundt
+ * Copyright (C) 2001, 2002 M. R. Brown
+ *
+- * Some of this code has been adopted directly from the old arch/sh/mm/sq.c
+- * hack that was part of the LinuxDC project. For all intents and purposes,
+- * this is a completely new interface that really doesn't have much in common
+- * with the old zone-based approach at all. In fact, it's only listed here for
+- * general completeness.
+- *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+ #include <linux/init.h>
++#include <linux/cpu.h>
++#include <linux/bitmap.h>
++#include <linux/sysdev.h>
+ #include <linux/kernel.h>
+ #include <linux/module.h>
+ #include <linux/config.h>
+ #include <linux/slab.h>
+-#include <linux/list.h>
+-#include <linux/proc_fs.h>
+-#include <linux/miscdevice.h>
+ #include <linux/vmalloc.h>
+-
++#include <linux/mm.h>
+ #include <asm/io.h>
+ #include <asm/page.h>
+-#include <asm/mmu_context.h>
++#include <asm/cacheflush.h>
+ #include <asm/cpu/sq.h>
+
+-static LIST_HEAD(sq_mapping_list);
++struct sq_mapping;
++
++struct sq_mapping {
++ const char *name;
++
++ unsigned long sq_addr;
++ unsigned long addr;
++ unsigned int size;
++
++ struct sq_mapping *next;
++};
++
++static struct sq_mapping *sq_mapping_list;
+ static DEFINE_SPINLOCK(sq_mapping_lock);
++static kmem_cache_t *sq_cache;
++static unsigned long *sq_bitmap;
+
+-/**
+- * sq_flush - Flush (prefetch) the store queue cache
+- * @addr: the store queue address to flush
+- *
+- * Executes a prefetch instruction on the specified store queue cache,
+- * so that the cached data is written to physical memory.
+- */
+-inline void sq_flush(void *addr)
+-{
+- __asm__ __volatile__ ("pref @%0" : : "r" (addr) : "memory");
+-}
++#define store_queue_barrier() \
++do { \
++ (void)ctrl_inl(P4SEG_STORE_QUE); \
++ ctrl_outl(0, P4SEG_STORE_QUE + 0); \
++ ctrl_outl(0, P4SEG_STORE_QUE + 8); \
++} while (0);
+
+ /**
+ * sq_flush_range - Flush (prefetch) a specific SQ range
+@@ -57,152 +60,73 @@
+ void sq_flush_range(unsigned long start, unsigned int len)
+ {
+ volatile unsigned long *sq = (unsigned long *)start;
+- unsigned long dummy;
+
+ /* Flush the queues */
+ for (len >>= 5; len--; sq += 8)
+- sq_flush((void *)sq);
++ prefetchw((void *)sq);
+
+ /* Wait for completion */
+- dummy = ctrl_inl(P4SEG_STORE_QUE);
+-
+- ctrl_outl(0, P4SEG_STORE_QUE + 0);
+- ctrl_outl(0, P4SEG_STORE_QUE + 8);
++ store_queue_barrier();
+ }
+
+-static struct sq_mapping *__sq_alloc_mapping(unsigned long virt, unsigned long phys, unsigned long size, const char *name)
++static inline void sq_mapping_list_add(struct sq_mapping *map)
+ {
+- struct sq_mapping *map;
+-
+- if (virt + size > SQ_ADDRMAX)
+- return ERR_PTR(-ENOSPC);
++ struct sq_mapping **p, *tmp;
+
+- map = kmalloc(sizeof(struct sq_mapping), GFP_KERNEL);
+- if (!map)
+- return ERR_PTR(-ENOMEM);
++ spin_lock_irq(&sq_mapping_lock);
+
+- INIT_LIST_HEAD(&map->list);
++ p = &sq_mapping_list;
++ while ((tmp = *p) != NULL)
++ p = &tmp->next;
+
+- map->sq_addr = virt;
+- map->addr = phys;
+- map->size = size + 1;
+- map->name = name;
++ map->next = tmp;
++ *p = map;
+
+- list_add(&map->list, &sq_mapping_list);
+-
+- return map;
++ spin_unlock_irq(&sq_mapping_lock);
+ }
+
+-static unsigned long __sq_get_next_addr(void)
++static inline void sq_mapping_list_del(struct sq_mapping *map)
+ {
+- if (!list_empty(&sq_mapping_list)) {
+- struct list_head *pos, *tmp;
+-
+- /*
+- * Read one off the list head, as it will have the highest
+- * mapped allocation. Set the next one up right above it.
+- *
+- * This is somewhat sub-optimal, as we don't look at
+- * gaps between allocations or anything lower then the
+- * highest-level allocation.
+- *
+- * However, in the interest of performance and the general
+- * lack of desire to do constant list rebalancing, we don't
+- * worry about it.
+- */
+- list_for_each_safe(pos, tmp, &sq_mapping_list) {
+- struct sq_mapping *entry;
++ struct sq_mapping **p, *tmp;
+
+- entry = list_entry(pos, typeof(*entry), list);
++ spin_lock_irq(&sq_mapping_lock);
+
+- return entry->sq_addr + entry->size;
++ for (p = &sq_mapping_list; (tmp = *p); p = &tmp->next)
++ if (tmp == map) {
++ *p = tmp->next;
++ break;
+ }
+- }
+
+- return P4SEG_STORE_QUE;
++ spin_unlock_irq(&sq_mapping_lock);
+ }
+
+-/**
+- * __sq_remap - Perform a translation from the SQ to a phys addr
+- * @map: sq mapping containing phys and store queue addresses.
+- *
+- * Maps the store queue address specified in the mapping to the physical
+- * address specified in the mapping.
+- */
+-static struct sq_mapping *__sq_remap(struct sq_mapping *map)
++static int __sq_remap(struct sq_mapping *map, unsigned long flags)
+ {
+- unsigned long flags, pteh, ptel;
++#if defined(CONFIG_MMU)
+ struct vm_struct *vma;
+- pgprot_t pgprot;
+-
+- /*
+- * Without an MMU (or with it turned off), this is much more
+- * straightforward, as we can just load up each queue's QACR with
+- * the physical address appropriately masked.
+- */
+-
+- ctrl_outl(((map->addr >> 26) << 2) & 0x1c, SQ_QACR0);
+- ctrl_outl(((map->addr >> 26) << 2) & 0x1c, SQ_QACR1);
+-
+-#ifdef CONFIG_MMU
+- /*
+- * With an MMU on the other hand, things are slightly more involved.
+- * Namely, we have to have a direct mapping between the SQ addr and
+- * the associated physical address in the UTLB by way of setting up
+- * a virt<->phys translation by hand. We do this by simply specifying
+- * the SQ addr in UTLB.VPN and the associated physical address in
+- * UTLB.PPN.
+- *
+- * Notably, even though this is a special case translation, and some
+- * of the configuration bits are meaningless, we're still required
+- * to have a valid ASID context in PTEH.
+- *
+- * We could also probably get by without explicitly setting PTEA, but
+- * we do it here just for good measure.
+- */
+- spin_lock_irqsave(&sq_mapping_lock, flags);
+-
+- pteh = map->sq_addr;
+- ctrl_outl((pteh & MMU_VPN_MASK) | get_asid(), MMU_PTEH);
+-
+- ptel = map->addr & PAGE_MASK;
+- ctrl_outl(((ptel >> 28) & 0xe) | (ptel & 0x1), MMU_PTEA);
+-
+- pgprot = pgprot_noncached(PAGE_KERNEL);
+-
+- ptel &= _PAGE_FLAGS_HARDWARE_MASK;
+- ptel |= pgprot_val(pgprot);
+- ctrl_outl(ptel, MMU_PTEL);
+
+- __asm__ __volatile__ ("ldtlb" : : : "memory");
+-
+- spin_unlock_irqrestore(&sq_mapping_lock, flags);
+-
+- /*
+- * Next, we need to map ourselves in the kernel page table, so that
+- * future accesses after a TLB flush will be handled when we take a
+- * page fault.
+- *
+- * Theoretically we could just do this directly and not worry about
+- * setting up the translation by hand ahead of time, but for the
+- * cases where we want a one-shot SQ mapping followed by a quick
+- * writeout before we hit the TLB flush, we do it anyways. This way
+- * we at least save ourselves the initial page fault overhead.
+- */
+ vma = __get_vm_area(map->size, VM_ALLOC, map->sq_addr, SQ_ADDRMAX);
+ if (!vma)
+- return ERR_PTR(-ENOMEM);
++ return -ENOMEM;
+
+ vma->phys_addr = map->addr;
+
+ if (remap_area_pages((unsigned long)vma->addr, vma->phys_addr,
+- map->size, pgprot_val(pgprot))) {
++ map->size, flags)) {
+ vunmap(vma->addr);
+- return NULL;
++ return -EAGAIN;
+ }
+-#endif /* CONFIG_MMU */
++#else
++ /*
++ * Without an MMU (or with it turned off), this is much more
++ * straightforward, as we can just load up each queue's QACR with
++ * the physical address appropriately masked.
++ */
++ ctrl_outl(((map->addr >> 26) << 2) & 0x1c, SQ_QACR0);
++ ctrl_outl(((map->addr >> 26) << 2) & 0x1c, SQ_QACR1);
++#endif
+
+- return map;
++ return 0;
+ }
+
+ /**
+@@ -210,42 +134,65 @@
+ * @phys: Physical address of mapping.
+ * @size: Length of mapping.
+ * @name: User invoking mapping.
++ * @flags: Protection flags.
+ *
+ * Remaps the physical address @phys through the next available store queue
+ * address of @size length. @name is logged at boot time as well as through
+- * the procfs interface.
+- *
+- * A pre-allocated and filled sq_mapping pointer is returned, and must be
+- * cleaned up with a call to sq_unmap() when the user is done with the
+- * mapping.
++ * the sysfs interface.
+ */
+-struct sq_mapping *sq_remap(unsigned long phys, unsigned int size, const char *name)
++unsigned long sq_remap(unsigned long phys, unsigned int size,
++ const char *name, unsigned long flags)
+ {
+ struct sq_mapping *map;
+- unsigned long virt, end;
++ unsigned long end;
+ unsigned int psz;
++ int ret, page;
+
+ /* Don't allow wraparound or zero size */
+ end = phys + size - 1;
+- if (!size || end < phys)
+- return NULL;
++ if (unlikely(!size || end < phys))
++ return -EINVAL;
+ /* Don't allow anyone to remap normal memory.. */
+- if (phys < virt_to_phys(high_memory))
+- return NULL;
++ if (unlikely(phys < virt_to_phys(high_memory)))
++ return -EINVAL;
+
+ phys &= PAGE_MASK;
++ size = PAGE_ALIGN(end + 1) - phys;
++
++ map = kmem_cache_alloc(sq_cache, GFP_KERNEL);
++ if (unlikely(!map))
++ return -ENOMEM;
++
++ map->addr = phys;
++ map->size = size;
++ map->name = name;
++
++ page = bitmap_find_free_region(sq_bitmap, 0x04000000,
++ get_order(map->size));
++ if (unlikely(page < 0)) {
++ ret = -ENOSPC;
++ goto out;
++ }
++
++ map->sq_addr = P4SEG_STORE_QUE + (page << PAGE_SHIFT);
++
++ ret = __sq_remap(map, flags);
++ if (unlikely(ret != 0))
++ goto out;
++
++ psz = (size + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
++ pr_info("sqremap: %15s [%4d page%s] va 0x%08lx pa 0x%08lx\n",
++ likely(map->name) ? map->name : "???",
++ psz, psz == 1 ? " " : "s",
++ map->sq_addr, map->addr);
++
++ sq_mapping_list_add(map);
+
+- size = PAGE_ALIGN(end + 1) - phys;
+- virt = __sq_get_next_addr();
+- psz = (size + (PAGE_SIZE - 1)) / PAGE_SIZE;
+- map = __sq_alloc_mapping(virt, phys, size, name);
+-
+- printk("sqremap: %15s [%4d page%s] va 0x%08lx pa 0x%08lx\n",
+- map->name ? map->name : "???",
+- psz, psz == 1 ? " " : "s",
+- map->sq_addr, map->addr);
++ return map->sq_addr;
+
+- return __sq_remap(map);
++out:
++ kmem_cache_free(sq_cache, map);
++ return ret;
+ }
+
+ /**
+@@ -256,185 +203,196 @@
+ * sq_remap(). Also frees up the pte that was previously inserted into
+ * the kernel page table and discards the UTLB translation.
+ */
+-void sq_unmap(struct sq_mapping *map)
++void sq_unmap(unsigned long vaddr)
+ {
+- if (map->sq_addr > (unsigned long)high_memory)
+- vfree((void *)(map->sq_addr & PAGE_MASK));
++ struct sq_mapping **p, *map;
++ struct vm_struct *vma;
++ int page;
+
+- list_del(&map->list);
+- kfree(map);
+-}
++ for (p = &sq_mapping_list; (map = *p); p = &map->next)
++ if (map->sq_addr == vaddr)
++ break;
++
++ if (unlikely(!map)) {
++ printk("%s: bad store queue address 0x%08lx\n",
++ __FUNCTION__, vaddr);
++ return;
++ }
+
+-/**
+- * sq_clear - Clear a store queue range
+- * @addr: Address to start clearing from.
+- * @len: Length to clear.
+- *
+- * A quick zero-fill implementation for clearing out memory that has been
+- * remapped through the store queues.
+- */
+-void sq_clear(unsigned long addr, unsigned int len)
+-{
+- int i;
++ page = (map->sq_addr - P4SEG_STORE_QUE) >> PAGE_SHIFT;
++ bitmap_release_region(sq_bitmap, page, get_order(map->size));
+
+- /* Clear out both queues linearly */
+- for (i = 0; i < 8; i++) {
+- ctrl_outl(0, addr + i + 0);
+- ctrl_outl(0, addr + i + 8);
++ vma = remove_vm_area((void *)(map->sq_addr & PAGE_MASK));
++ if (!vma) {
++ printk(KERN_ERR "%s: bad address 0x%08lx\n",
++ __FUNCTION__, map->sq_addr);
++ return;
+ }
+
+- sq_flush_range(addr, len);
++ sq_mapping_list_del(map);
++
++ kmem_cache_free(sq_cache, map);
+ }
+
+-/**
+- * sq_vma_unmap - Unmap a VMA range
+- * @area: VMA containing range.
+- * @addr: Start of range.
+- * @len: Length of range.
+- *
+- * Searches the sq_mapping_list for a mapping matching the sq addr @addr,
+- * and subsequently frees up the entry. Further cleanup is done by generic
+- * code.
++/*
++ * Needlessly complex sysfs interface. Unfortunately it doesn't seem like
++ * there is any other easy way to add things on a per-cpu basis without
++ * putting the directory entries somewhere stupid and having to create
++ * links in sysfs by hand back in to the per-cpu directories.
++ *
++ * Some day we may want to have an additional abstraction per store
++ * queue, but considering the kobject hell we already have to deal with,
++ * it's simply not worth the trouble.
+ */
+-static void sq_vma_unmap(struct vm_area_struct *area,
+- unsigned long addr, size_t len)
+-{
+- struct list_head *pos, *tmp;
++static struct kobject *sq_kobject[NR_CPUS];
+
+- list_for_each_safe(pos, tmp, &sq_mapping_list) {
+- struct sq_mapping *entry;
++struct sq_sysfs_attr {
++ struct attribute attr;
++ ssize_t (*show)(char *buf);
++ ssize_t (*store)(const char *buf, size_t count);
++};
+
+- entry = list_entry(pos, typeof(*entry), list);
++#define to_sq_sysfs_attr(attr) container_of(attr, struct sq_sysfs_attr, attr)
+
+- if (entry->sq_addr == addr) {
+- /*
+- * We could probably get away without doing the tlb flush
+- * here, as generic code should take care of most of this
+- * when unmapping the rest of the VMA range for us. Leave
+- * it in for added sanity for the time being..
+- */
+- __flush_tlb_page(get_asid(), entry->sq_addr & PAGE_MASK);
++static ssize_t sq_sysfs_show(struct kobject *kobj, struct attribute *attr,
++ char *buf)
++{
++ struct sq_sysfs_attr *sattr = to_sq_sysfs_attr(attr);
+
+- list_del(&entry->list);
+- kfree(entry);
++ if (likely(sattr->show))
++ return sattr->show(buf);
+
+- return;
+- }
+- }
++ return -EIO;
+ }
+
+-/**
+- * sq_vma_sync - Sync a VMA range
+- * @area: VMA containing range.
+- * @start: Start of range.
+- * @len: Length of range.
+- * @flags: Additional flags.
+- *
+- * Synchronizes an sq mapped range by flushing the store queue cache for
+- * the duration of the mapping.
+- *
+- * Used internally for user mappings, which must use msync() to prefetch
+- * the store queue cache.
+- */
+-static int sq_vma_sync(struct vm_area_struct *area,
+- unsigned long start, size_t len, unsigned int flags)
++static ssize_t sq_sysfs_store(struct kobject *kobj, struct attribute *attr,
++ const char *buf, size_t count)
+ {
+- sq_flush_range(start, len);
++ struct sq_sysfs_attr *sattr = to_sq_sysfs_attr(attr);
+
+- return 0;
++ if (likely(sattr->store))
++ return sattr->store(buf, count);
++
++ return -EIO;
+ }
+
+-static struct vm_operations_struct sq_vma_ops = {
+- .unmap = sq_vma_unmap,
+- .sync = sq_vma_sync,
+-};
++static ssize_t mapping_show(char *buf)
++{
++ struct sq_mapping **list, *entry;
++ char *p = buf;
+
+-/**
+- * sq_mmap - mmap() for /dev/cpu/sq
+- * @file: unused.
+- * @vma: VMA to remap.
+- *
+- * Remap the specified vma @vma through the store queues, and setup associated
+- * information for the new mapping. Also build up the page tables for the new
+- * area.
+- */
+-static int sq_mmap(struct file *file, struct vm_area_struct *vma)
++ for (list = &sq_mapping_list; (entry = *list); list = &entry->next)
++ p += sprintf(p, "%08lx-%08lx [%08lx]: %s\n",
++ entry->sq_addr, entry->sq_addr + entry->size,
++ entry->addr, entry->name);
++
++ return p - buf;
++}
++
++static ssize_t mapping_store(const char *buf, size_t count)
+ {
+- unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
+- unsigned long size = vma->vm_end - vma->vm_start;
+- struct sq_mapping *map;
++ unsigned long base = 0, len = 0;
+
+- /*
+- * We're not interested in any arbitrary virtual address that has
+- * been stuck in the VMA, as we already know what addresses we
+- * want. Save off the size, and reposition the VMA to begin at
+- * the next available sq address.
+- */
+- vma->vm_start = __sq_get_next_addr();
+- vma->vm_end = vma->vm_start + size;
++ sscanf(buf, "%lx %lx", &base, &len);
++ if (!base)
++ return -EIO;
+
+- vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
++ if (likely(len)) {
++ int ret = sq_remap(base, len, "Userspace",
++ pgprot_val(PAGE_SHARED));
++ if (ret < 0)
++ return ret;
++ } else
++ sq_unmap(base);
+
+- vma->vm_flags |= VM_IO | VM_RESERVED;
++ return count;
++}
+
+- map = __sq_alloc_mapping(vma->vm_start, offset, size, "Userspace");
++static struct sq_sysfs_attr mapping_attr =
++ __ATTR(mapping, 0644, mapping_show, mapping_store);
+
+- if (io_remap_pfn_range(vma, map->sq_addr, map->addr >> PAGE_SHIFT,
+- size, vma->vm_page_prot))
+- return -EAGAIN;
++static struct attribute *sq_sysfs_attrs[] = {
++ &mapping_attr.attr,
++ NULL,
++};
+
+- vma->vm_ops = &sq_vma_ops;
++static struct sysfs_ops sq_sysfs_ops = {
++ .show = sq_sysfs_show,
++ .store = sq_sysfs_store,
++};
+
+- return 0;
+-}
++static struct kobj_type ktype_percpu_entry = {
++ .sysfs_ops = &sq_sysfs_ops,
++ .default_attrs = sq_sysfs_attrs,
++};
+
+-#ifdef CONFIG_PROC_FS
+-static int sq_mapping_read_proc(char *buf, char **start, off_t off,
+- int len, int *eof, void *data)
++static int __devinit sq_sysdev_add(struct sys_device *sysdev)
+ {
+- struct list_head *pos;
+- char *p = buf;
++ unsigned int cpu = sysdev->id;
++ struct kobject *kobj;
+
+- list_for_each_prev(pos, &sq_mapping_list) {
+- struct sq_mapping *entry;
++ sq_kobject[cpu] = kzalloc(sizeof(struct kobject), GFP_KERNEL);
++ if (unlikely(!sq_kobject[cpu]))
++ return -ENOMEM;
+
+- entry = list_entry(pos, typeof(*entry), list);
++ kobj = sq_kobject[cpu];
++ kobj->parent = &sysdev->kobj;
++ kobject_set_name(kobj, "%s", "sq");
++ kobj->ktype = &ktype_percpu_entry;
+
+- p += sprintf(p, "%08lx-%08lx [%08lx]: %s\n", entry->sq_addr,
+- entry->sq_addr + entry->size - 1, entry->addr,
+- entry->name);
+- }
+-
+- return p - buf;
++ return kobject_register(kobj);
+ }
+-#endif
+
+-static struct file_operations sq_fops = {
+- .owner = THIS_MODULE,
+- .mmap = sq_mmap,
+-};
++static int __devexit sq_sysdev_remove(struct sys_device *sysdev)
++{
++ unsigned int cpu = sysdev->id;
++ struct kobject *kobj = sq_kobject[cpu];
++
++ kobject_unregister(kobj);
++ return 0;
++}
+
+-static struct miscdevice sq_dev = {
+- .minor = STORE_QUEUE_MINOR,
+- .name = "sq",
+- .devfs_name = "cpu/sq",
+- .fops = &sq_fops,
++static struct sysdev_driver sq_sysdev_driver = {
++ .add = sq_sysdev_add,
++ .remove = __devexit_p(sq_sysdev_remove),
+ };
+
+ static int __init sq_api_init(void)
+ {
++ unsigned int nr_pages = 0x04000000 >> PAGE_SHIFT;
++ unsigned int size = (nr_pages + (BITS_PER_LONG - 1)) / BITS_PER_LONG;
++ int ret = -ENOMEM;
++
+ printk(KERN_NOTICE "sq: Registering store queue API.\n");
+
+-#ifdef CONFIG_PROC_FS
+- create_proc_read_entry("sq_mapping", 0, 0, sq_mapping_read_proc, 0);
+-#endif
++ sq_cache = kmem_cache_create("store_queue_cache",
++ sizeof(struct sq_mapping), 0, 0,
++ NULL, NULL);
++ if (unlikely(!sq_cache))
++ return ret;
++
++ sq_bitmap = kzalloc(size, GFP_KERNEL);
++ if (unlikely(!sq_bitmap))
++ goto out;
++
++ ret = sysdev_driver_register(&cpu_sysdev_class, &sq_sysdev_driver);
++ if (unlikely(ret != 0))
++ goto out;
+
+- return misc_register(&sq_dev);
++ return 0;
++
++out:
++ kfree(sq_bitmap);
++ kmem_cache_destroy(sq_cache);
++
++ return ret;
+ }
+
+ static void __exit sq_api_exit(void)
+ {
+- misc_deregister(&sq_dev);
++ sysdev_driver_unregister(&cpu_sysdev_class, &sq_sysdev_driver);
++ kfree(sq_bitmap);
++ kmem_cache_destroy(sq_cache);
+ }
+
+ module_init(sq_api_init);
+@@ -443,11 +401,7 @@
+ MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>, M. R. Brown <mrbrown@0xd6.org>");
+ MODULE_DESCRIPTION("Simple API for SH-4 integrated Store Queues");
+ MODULE_LICENSE("GPL");
+-MODULE_ALIAS_MISCDEV(STORE_QUEUE_MINOR);
+
+ EXPORT_SYMBOL(sq_remap);
+ EXPORT_SYMBOL(sq_unmap);
+-EXPORT_SYMBOL(sq_clear);
+-EXPORT_SYMBOL(sq_flush);
+ EXPORT_SYMBOL(sq_flush_range);
+-
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/early_printk.c linux-2.6.17/arch/sh/kernel/early_printk.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/early_printk.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/early_printk.c 2006-07-12 16:54:22.000000000 +0000
+@@ -59,34 +59,42 @@
+ #endif
+
+ #ifdef CONFIG_EARLY_SCIF_CONSOLE
++#include <linux/serial_core.h>
++#include "../../../drivers/serial/sh-sci.h"
++
++#ifdef CONFIG_CPU_SH4
+ #define SCIF_REG 0xffe80000
++#elif defined(CONFIG_CPU_SUBTYPE_SH72060)
++#define SCIF_REG 0xfffe9800
++#else
++#error "Undefined SCIF for this subtype"
++#endif
++
++static struct uart_port scif_port = {
++ .mapbase = SCIF_REG,
++ .membase = (char *)SCIF_REG,
++};
+
+ static void scif_sercon_putc(int c)
+ {
+- while (!(ctrl_inw(SCIF_REG + 0x10) & 0x20)) ;
++ while (((sci_in(&scif_port, SCFDR) & 0x1f00 >> 8) == 16))
++ ;
++
++ sci_out(&scif_port, SCxTDR, c);
++ sci_in(&scif_port, SCxSR);
++ sci_out(&scif_port, SCxSR, 0xf3 & ~(0x20 | 0x40));
+
+- ctrl_outb(c, SCIF_REG + 12);
+- ctrl_outw((ctrl_inw(SCIF_REG + 0x10) & 0x9f), SCIF_REG + 0x10);
++ while ((sci_in(&scif_port, SCxSR) & 0x40) == 0);
++ ;
+
+ if (c == '\n')
+ scif_sercon_putc('\r');
+ }
+
+-static void scif_sercon_flush(void)
+-{
+- ctrl_outw((ctrl_inw(SCIF_REG + 0x10) & 0xbf), SCIF_REG + 0x10);
+-
+- while (!(ctrl_inw(SCIF_REG + 0x10) & 0x40)) ;
+-
+- ctrl_outw((ctrl_inw(SCIF_REG + 0x10) & 0xbf), SCIF_REG + 0x10);
+-}
+-
+ static void scif_sercon_write(struct console *con, const char *s, unsigned count)
+ {
+ while (count-- > 0)
+ scif_sercon_putc(*s++);
+-
+- scif_sercon_flush();
+ }
+
+ static int __init scif_sercon_setup(struct console *con, char *options)
+@@ -124,7 +132,7 @@
+
+ void __init enable_early_printk(void)
+ {
+-#ifdef CONFIG_EARLY_SCIF_CONSOLE
++#if defined(CONFIG_EARLY_SCIF_CONSOLE) && defined(CONFIG_CPU_SH4)
+ scif_sercon_init(115200);
+ #endif
+ register_console(&early_console);
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/entry.S linux-2.6.17/arch/sh/kernel/entry.S
+--- linux-2.6.17-vanilla/arch/sh/kernel/entry.S 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/entry.S 2006-07-12 16:54:22.000000000 +0000
+@@ -19,24 +19,6 @@
+ #include <asm/cpu/mmu_context.h>
+ #include <asm/unistd.h>
+
+-#if !defined(CONFIG_NFSD) && !defined(CONFIG_NFSD_MODULE)
+-#define sys_nfsservctl sys_ni_syscall
+-#endif
+-
+-#if !defined(CONFIG_MMU)
+-#define sys_madvise sys_ni_syscall
+-#define sys_readahead sys_ni_syscall
+-#define sys_mprotect sys_ni_syscall
+-#define sys_msync sys_ni_syscall
+-#define sys_mlock sys_ni_syscall
+-#define sys_munlock sys_ni_syscall
+-#define sys_mlockall sys_ni_syscall
+-#define sys_munlockall sys_ni_syscall
+-#define sys_mremap sys_ni_syscall
+-#define sys_mincore sys_ni_syscall
+-#define sys_remap_file_pages sys_ni_syscall
+-#endif
+-
+ ! NOTE:
+ ! GNU as (as of 2.9.1) changes bf/s into bt/s and bra, when the address
+ ! to be jumped is too far, but it causes illegal slot exception.
+@@ -327,7 +309,7 @@
+ .align 2
+ ret_from_exception:
+ preempt_stop()
+-ret_from_irq:
++ENTRY(ret_from_irq)
+ !
+ mov #OFF_SR, r0
+ mov.l @(r0,r15), r0 ! get status register
+@@ -645,7 +627,7 @@
+ !
+ #if defined(CONFIG_KGDB_NMI)
+ ! Clear in_nmi
+- mov.l 4f, k0
++ mov.l 6f, k0
+ mov #0, k1
+ mov.b k1, @k0
+ #endif
+@@ -723,7 +705,7 @@
+ !
+ !
+ .align 2
+-handle_exception:
++ENTRY(handle_exception)
+ ! Using k0, k1 for scratch registers (r0_bank1, r1_bank),
+ ! save all registers onto stack.
+ !
+@@ -839,300 +821,3 @@
+ rts
+ nop
+
+- .data
+-ENTRY(sys_call_table)
+- .long sys_ni_syscall /* 0 - old "setup()" system call*/
+- .long sys_exit
+- .long sys_fork
+- .long sys_read
+- .long sys_write
+- .long sys_open /* 5 */
+- .long sys_close
+- .long sys_waitpid
+- .long sys_creat
+- .long sys_link
+- .long sys_unlink /* 10 */
+- .long sys_execve
+- .long sys_chdir
+- .long sys_time
+- .long sys_mknod
+- .long sys_chmod /* 15 */
+- .long sys_lchown16
+- .long sys_ni_syscall /* old break syscall holder */
+- .long sys_stat
+- .long sys_lseek
+- .long sys_getpid /* 20 */
+- .long sys_mount
+- .long sys_oldumount
+- .long sys_setuid16
+- .long sys_getuid16
+- .long sys_stime /* 25 */
+- .long sys_ptrace
+- .long sys_alarm
+- .long sys_fstat
+- .long sys_pause
+- .long sys_utime /* 30 */
+- .long sys_ni_syscall /* old stty syscall holder */
+- .long sys_ni_syscall /* old gtty syscall holder */
+- .long sys_access
+- .long sys_nice
+- .long sys_ni_syscall /* 35 */ /* old ftime syscall holder */
+- .long sys_sync
+- .long sys_kill
+- .long sys_rename
+- .long sys_mkdir
+- .long sys_rmdir /* 40 */
+- .long sys_dup
+- .long sys_pipe
+- .long sys_times
+- .long sys_ni_syscall /* old prof syscall holder */
+- .long sys_brk /* 45 */
+- .long sys_setgid16
+- .long sys_getgid16
+- .long sys_signal
+- .long sys_geteuid16
+- .long sys_getegid16 /* 50 */
+- .long sys_acct
+- .long sys_umount /* recycled never used phys() */
+- .long sys_ni_syscall /* old lock syscall holder */
+- .long sys_ioctl
+- .long sys_fcntl /* 55 */
+- .long sys_ni_syscall /* old mpx syscall holder */
+- .long sys_setpgid
+- .long sys_ni_syscall /* old ulimit syscall holder */
+- .long sys_ni_syscall /* sys_olduname */
+- .long sys_umask /* 60 */
+- .long sys_chroot
+- .long sys_ustat
+- .long sys_dup2
+- .long sys_getppid
+- .long sys_getpgrp /* 65 */
+- .long sys_setsid
+- .long sys_sigaction
+- .long sys_sgetmask
+- .long sys_ssetmask
+- .long sys_setreuid16 /* 70 */
+- .long sys_setregid16
+- .long sys_sigsuspend
+- .long sys_sigpending
+- .long sys_sethostname
+- .long sys_setrlimit /* 75 */
+- .long sys_old_getrlimit
+- .long sys_getrusage
+- .long sys_gettimeofday
+- .long sys_settimeofday
+- .long sys_getgroups16 /* 80 */
+- .long sys_setgroups16
+- .long sys_ni_syscall /* sys_oldselect */
+- .long sys_symlink
+- .long sys_lstat
+- .long sys_readlink /* 85 */
+- .long sys_uselib
+- .long sys_swapon
+- .long sys_reboot
+- .long old_readdir
+- .long old_mmap /* 90 */
+- .long sys_munmap
+- .long sys_truncate
+- .long sys_ftruncate
+- .long sys_fchmod
+- .long sys_fchown16 /* 95 */
+- .long sys_getpriority
+- .long sys_setpriority
+- .long sys_ni_syscall /* old profil syscall holder */
+- .long sys_statfs
+- .long sys_fstatfs /* 100 */
+- .long sys_ni_syscall /* ioperm */
+- .long sys_socketcall
+- .long sys_syslog
+- .long sys_setitimer
+- .long sys_getitimer /* 105 */
+- .long sys_newstat
+- .long sys_newlstat
+- .long sys_newfstat
+- .long sys_uname
+- .long sys_ni_syscall /* 110 */ /* iopl */
+- .long sys_vhangup
+- .long sys_ni_syscall /* idle */
+- .long sys_ni_syscall /* vm86old */
+- .long sys_wait4
+- .long sys_swapoff /* 115 */
+- .long sys_sysinfo
+- .long sys_ipc
+- .long sys_fsync
+- .long sys_sigreturn
+- .long sys_clone /* 120 */
+- .long sys_setdomainname
+- .long sys_newuname
+- .long sys_ni_syscall /* sys_modify_ldt */
+- .long sys_adjtimex
+- .long sys_mprotect /* 125 */
+- .long sys_sigprocmask
+- .long sys_ni_syscall /* old "create_module" */
+- .long sys_init_module
+- .long sys_delete_module
+- .long sys_ni_syscall /* 130: old "get_kernel_syms" */
+- .long sys_quotactl
+- .long sys_getpgid
+- .long sys_fchdir
+- .long sys_bdflush
+- .long sys_sysfs /* 135 */
+- .long sys_personality
+- .long sys_ni_syscall /* for afs_syscall */
+- .long sys_setfsuid16
+- .long sys_setfsgid16
+- .long sys_llseek /* 140 */
+- .long sys_getdents
+- .long sys_select
+- .long sys_flock
+- .long sys_msync
+- .long sys_readv /* 145 */
+- .long sys_writev
+- .long sys_getsid
+- .long sys_fdatasync
+- .long sys_sysctl
+- .long sys_mlock /* 150 */
+- .long sys_munlock
+- .long sys_mlockall
+- .long sys_munlockall
+- .long sys_sched_setparam
+- .long sys_sched_getparam /* 155 */
+- .long sys_sched_setscheduler
+- .long sys_sched_getscheduler
+- .long sys_sched_yield
+- .long sys_sched_get_priority_max
+- .long sys_sched_get_priority_min /* 160 */
+- .long sys_sched_rr_get_interval
+- .long sys_nanosleep
+- .long sys_mremap
+- .long sys_setresuid16
+- .long sys_getresuid16 /* 165 */
+- .long sys_ni_syscall /* vm86 */
+- .long sys_ni_syscall /* old "query_module" */
+- .long sys_poll
+- .long sys_nfsservctl
+- .long sys_setresgid16 /* 170 */
+- .long sys_getresgid16
+- .long sys_prctl
+- .long sys_rt_sigreturn
+- .long sys_rt_sigaction
+- .long sys_rt_sigprocmask /* 175 */
+- .long sys_rt_sigpending
+- .long sys_rt_sigtimedwait
+- .long sys_rt_sigqueueinfo
+- .long sys_rt_sigsuspend
+- .long sys_pread_wrapper /* 180 */
+- .long sys_pwrite_wrapper
+- .long sys_chown16
+- .long sys_getcwd
+- .long sys_capget
+- .long sys_capset /* 185 */
+- .long sys_sigaltstack
+- .long sys_sendfile
+- .long sys_ni_syscall /* streams1 */
+- .long sys_ni_syscall /* streams2 */
+- .long sys_vfork /* 190 */
+- .long sys_getrlimit
+- .long sys_mmap2
+- .long sys_truncate64
+- .long sys_ftruncate64
+- .long sys_stat64 /* 195 */
+- .long sys_lstat64
+- .long sys_fstat64
+- .long sys_lchown
+- .long sys_getuid
+- .long sys_getgid /* 200 */
+- .long sys_geteuid
+- .long sys_getegid
+- .long sys_setreuid
+- .long sys_setregid
+- .long sys_getgroups /* 205 */
+- .long sys_setgroups
+- .long sys_fchown
+- .long sys_setresuid
+- .long sys_getresuid
+- .long sys_setresgid /* 210 */
+- .long sys_getresgid
+- .long sys_chown
+- .long sys_setuid
+- .long sys_setgid
+- .long sys_setfsuid /* 215 */
+- .long sys_setfsgid
+- .long sys_pivot_root
+- .long sys_mincore
+- .long sys_madvise
+- .long sys_getdents64 /* 220 */
+- .long sys_fcntl64
+- .long sys_ni_syscall /* reserved for TUX */
+- .long sys_ni_syscall /* Reserved for Security */
+- .long sys_gettid
+- .long sys_readahead /* 225 */
+- .long sys_setxattr
+- .long sys_lsetxattr
+- .long sys_fsetxattr
+- .long sys_getxattr
+- .long sys_lgetxattr /* 230 */
+- .long sys_fgetxattr
+- .long sys_listxattr
+- .long sys_llistxattr
+- .long sys_flistxattr
+- .long sys_removexattr /* 235 */
+- .long sys_lremovexattr
+- .long sys_fremovexattr
+- .long sys_tkill
+- .long sys_sendfile64
+- .long sys_futex /* 240 */
+- .long sys_sched_setaffinity
+- .long sys_sched_getaffinity
+- .long sys_ni_syscall
+- .long sys_ni_syscall
+- .long sys_io_setup /* 245 */
+- .long sys_io_destroy
+- .long sys_io_getevents
+- .long sys_io_submit
+- .long sys_io_cancel
+- .long sys_fadvise64 /* 250 */
+- .long sys_ni_syscall
+- .long sys_exit_group
+- .long sys_lookup_dcookie
+- .long sys_epoll_create
+- .long sys_epoll_ctl /* 255 */
+- .long sys_epoll_wait
+- .long sys_remap_file_pages
+- .long sys_set_tid_address
+- .long sys_timer_create
+- .long sys_timer_settime /* 260 */
+- .long sys_timer_gettime
+- .long sys_timer_getoverrun
+- .long sys_timer_delete
+- .long sys_clock_settime
+- .long sys_clock_gettime /* 265 */
+- .long sys_clock_getres
+- .long sys_clock_nanosleep
+- .long sys_statfs64
+- .long sys_fstatfs64
+- .long sys_tgkill /* 270 */
+- .long sys_utimes
+- .long sys_fadvise64_64_wrapper
+- .long sys_ni_syscall /* Reserved for vserver */
+- .long sys_ni_syscall /* Reserved for mbind */
+- .long sys_ni_syscall /* 275 - get_mempolicy */
+- .long sys_ni_syscall /* set_mempolicy */
+- .long sys_mq_open
+- .long sys_mq_unlink
+- .long sys_mq_timedsend
+- .long sys_mq_timedreceive /* 280 */
+- .long sys_mq_notify
+- .long sys_mq_getsetattr
+- .long sys_ni_syscall /* Reserved for kexec */
+- .long sys_waitid
+- .long sys_add_key /* 285 */
+- .long sys_request_key
+- .long sys_keyctl
+- .long sys_ioprio_set
+- .long sys_ioprio_get
+- .long sys_inotify_init /* 290 */
+- .long sys_inotify_add_watch
+- .long sys_inotify_rm_watch
+-
+-/* End of entry.S */
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/head.S linux-2.6.17/arch/sh/kernel/head.S
+--- linux-2.6.17-vanilla/arch/sh/kernel/head.S 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/head.S 2006-07-12 16:54:22.000000000 +0000
+@@ -12,6 +12,17 @@
+ */
+ #include <linux/linkage.h>
+
++#ifdef CONFIG_CPU_SH4A
++#define SYNCO() synco
++
++#define PREFI(label, reg) \
++ mov.l label, reg; \
++ prefi @reg
++#else
++#define SYNCO()
++#define PREFI(label, reg)
++#endif
++
+ .section .empty_zero_page, "aw"
+ ENTRY(empty_zero_page)
+ .long 1 /* MOUNT_ROOT_RDONLY */
+@@ -42,6 +53,17 @@
+ ! Initialize global interrupt mask
+ mov #0, r0
+ ldc r0, r6_bank
++
++ /*
++ * Prefetch if possible to reduce cache miss penalty.
++ *
++ * We do this early on for SH-4A as a micro-optimization,
++ * as later on we will have speculative execution enabled
++ * and this will become less of an issue.
++ */
++ PREFI(5f, r0)
++ PREFI(6f, r0)
++
+ !
+ mov.l 2f, r0
+ mov r0, r15 ! Set initial r15 (stack pointer)
+@@ -49,11 +71,7 @@
+ shll8 r1 ! r1 = 8192
+ sub r1, r0 !
+ ldc r0, r7_bank ! ... and initial thread_info
+- !
+- ! Additional CPU initialization
+- mov.l 6f, r0
+- jsr @r0
+- nop
++
+ ! Clear BSS area
+ mov.l 3f, r1
+ add #4, r1
+@@ -62,6 +80,14 @@
+ 9: cmp/hs r2, r1
+ bf/s 9b ! while (r1 < r2)
+ mov.l r0,@-r2
++
++ ! Additional CPU initialization
++ mov.l 6f, r0
++ jsr @r0
++ nop
++
++ SYNCO() ! Wait for pending instructions..
++
+ ! Start kernel
+ mov.l 5f, r0
+ jmp @r0
+@@ -69,7 +95,7 @@
+
+ .balign 4
+ 1: .long 0x400080F0 ! MD=1, RB=0, BL=0, FD=1, IMASK=0xF
+-2: .long stack
++2: .long init_thread_union+8192
+ 3: .long __bss_start
+ 4: .long _end
+ 5: .long start_kernel
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/kgdb_stub.c linux-2.6.17/arch/sh/kernel/kgdb_stub.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/kgdb_stub.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/kgdb_stub.c 2006-07-12 16:54:22.000000000 +0000
+@@ -101,16 +101,17 @@
+ #include <linux/linkage.h>
+ #include <linux/init.h>
+
++#ifdef CONFIG_SH_KGDB_CONSOLE
++#include <linux/console.h>
++#endif
++
+ #include <asm/system.h>
+ #include <asm/current.h>
+ #include <asm/signal.h>
+ #include <asm/pgtable.h>
+ #include <asm/ptrace.h>
+ #include <asm/kgdb.h>
+-
+-#ifdef CONFIG_SH_KGDB_CONSOLE
+-#include <linux/console.h>
+-#endif
++#include <asm/io.h>
+
+ /* Function pointers for linkage */
+ kgdb_debug_hook_t *kgdb_debug_hook;
+@@ -240,7 +241,6 @@
+ /* Misc static */
+ static int stepped_address;
+ static short stepped_opcode;
+-static const char hexchars[] = "0123456789abcdef";
+ static char in_buffer[BUFMAX];
+ static char out_buffer[OUTBUFMAX];
+
+@@ -253,29 +253,6 @@
+ #define BUF_THREAD_ID_SIZE 16
+ #endif
+
+-/* Return addr as a real volatile address */
+-static inline unsigned int ctrl_inl(const unsigned long addr)
+-{
+- return *(volatile unsigned long *) addr;
+-}
+-
+-/* Correctly set *addr using volatile */
+-static inline void ctrl_outl(const unsigned int b, unsigned long addr)
+-{
+- *(volatile unsigned long *) addr = b;
+-}
+-
+-/* Get high hex bits */
+-static char highhex(const int x)
+-{
+- return hexchars[(x >> 4) & 0xf];
+-}
+-
+-/* Get low hex bits */
+-static char lowhex(const int x)
+-{
+- return hexchars[x & 0xf];
+-}
+
+ /* Convert ch to hex */
+ static int hex(const char ch)
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/machine_kexec.c linux-2.6.17/arch/sh/kernel/machine_kexec.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/machine_kexec.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/machine_kexec.c 2006-07-12 16:54:22.000000000 +0000
+@@ -27,7 +27,7 @@
+
+ const extern unsigned char relocate_new_kernel[];
+ const extern unsigned int relocate_new_kernel_size;
+-extern void *gdb_vbr_vector;
++extern void *gdb_vbr_vector;
+
+ /*
+ * Provide a dummy crash_notes definition while crash dump arrives to ppc.
+@@ -78,7 +78,7 @@
+ */
+ NORET_TYPE void machine_kexec(struct kimage *image)
+ {
+-
++
+ unsigned long page_list;
+ unsigned long reboot_code_buffer;
+ unsigned long vbr_reg;
+@@ -87,7 +87,7 @@
+ #if defined(CONFIG_SH_STANDARD_BIOS)
+ vbr_reg = ((unsigned long )gdb_vbr_vector) - 0x100;
+ #else
+- vbr_reg = 0x80000000; // dummy
++ vbr_reg = 0x80000000; // dummy
+ #endif
+ /* Interrupts aren't acceptable while we reboot */
+ local_irq_disable();
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/pm.c linux-2.6.17/arch/sh/kernel/pm.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/pm.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/pm.c 2006-07-12 16:54:22.000000000 +0000
+@@ -0,0 +1,88 @@
++/*
++ * Generic Power Management Routine
++ *
++ * Copyright (c) 2006 Andriy Skulysh <askulsyh@gmail.com>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License.
++ */
++#include <linux/suspend.h>
++#include <linux/delay.h>
++#include <linux/gfp.h>
++#include <asm/freq.h>
++#include <asm/io.h>
++#include <asm/watchdog.h>
++#include <asm/pm.h>
++
++#define INTR_OFFSET 0x600
++
++#define STBCR 0xffffff82
++#define STBCR2 0xffffff88
++
++#define STBCR_STBY 0x80
++#define STBCR_MSTP2 0x04
++
++#define MCR 0xffffff68
++#define RTCNT 0xffffff70
++
++#define MCR_RMODE 2
++#define MCR_RFSH 4
++
++void pm_enter(void)
++{
++ u8 stbcr, csr;
++ u16 frqcr, mcr;
++ u32 vbr_new, vbr_old;
++
++ set_bl_bit();
++
++ /* set wdt */
++ csr = sh_wdt_read_csr();
++ csr &= ~WTCSR_TME;
++ csr |= WTCSR_CKS_4096;
++ sh_wdt_write_csr(csr);
++ csr = sh_wdt_read_csr();
++ sh_wdt_write_cnt(0);
++
++ /* disable PLL1 */
++ frqcr = ctrl_inw(FRQCR);
++ frqcr &= ~(FRQCR_PLLEN | FRQCR_PSTBY);
++ ctrl_outw(frqcr, FRQCR);
++
++ /* enable standby */
++ stbcr = ctrl_inb(STBCR);
++ ctrl_outb(stbcr | STBCR_STBY | STBCR_MSTP2, STBCR);
++
++ /* set self-refresh */
++ mcr = ctrl_inw(MCR);
++ ctrl_outw(mcr & ~MCR_RFSH, MCR);
++
++ /* set interrupt handler */
++ asm volatile("stc vbr, %0" : "=r" (vbr_old));
++ vbr_new = get_zeroed_page(GFP_ATOMIC);
++ udelay(50);
++ memcpy((void*)(vbr_new + INTR_OFFSET),
++ &wakeup_start, &wakeup_end - &wakeup_start);
++ asm volatile("ldc %0, vbr" : : "r" (vbr_new));
++
++ ctrl_outw(0, RTCNT);
++ ctrl_outw(mcr | MCR_RFSH | MCR_RMODE, MCR);
++
++ cpu_sleep();
++
++ asm volatile("ldc %0, vbr" : : "r" (vbr_old));
++
++ free_page(vbr_new);
++
++ /* enable PLL1 */
++ frqcr = ctrl_inw(FRQCR);
++ frqcr |= FRQCR_PSTBY;
++ ctrl_outw(frqcr, FRQCR);
++ udelay(50);
++ frqcr |= FRQCR_PLLEN;
++ ctrl_outw(frqcr, FRQCR);
++
++ ctrl_outb(stbcr, STBCR);
++
++ clear_bl_bit();
++}
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/process.c linux-2.6.17/arch/sh/kernel/process.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/process.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/process.c 2006-07-12 16:54:22.000000000 +0000
+@@ -227,13 +227,13 @@
+ return fpvalid;
+ }
+
+-/*
++/*
+ * Capture the user space registers if the task is not running (in user space)
+ */
+ int dump_task_regs(struct task_struct *tsk, elf_gregset_t *regs)
+ {
+ struct pt_regs ptregs;
+-
++
+ ptregs = *task_pt_regs(tsk);
+ elf_core_copy_regs(regs, &ptregs);
+
+@@ -262,6 +262,7 @@
+ unsigned long unused,
+ struct task_struct *p, struct pt_regs *regs)
+ {
++ struct thread_info *ti = task_thread_info(p);
+ struct pt_regs *childregs;
+ #if defined(CONFIG_SH_FPU)
+ struct task_struct *tsk = current;
+@@ -276,8 +277,10 @@
+
+ if (user_mode(regs)) {
+ childregs->regs[15] = usp;
++ ti->addr_limit = USER_DS;
+ } else {
+ childregs->regs[15] = (unsigned long)task_stack_page(p) + THREAD_SIZE;
++ ti->addr_limit = KERNEL_DS;
+ }
+ if (clone_flags & CLONE_SETTLS) {
+ childregs->gbr = childregs->regs[0];
+@@ -345,7 +348,7 @@
+
+ /*
+ * Restore the kernel mode register
+- * k7 (r7_bank1)
++ * k7 (r7_bank1)
+ */
+ asm volatile("ldc %0, r7_bank"
+ : /* no output */
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/ptrace.c linux-2.6.17/arch/sh/kernel/ptrace.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/ptrace.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/ptrace.c 2006-07-12 16:54:22.000000000 +0000
+@@ -225,7 +225,6 @@
+
+ case PTRACE_SETDSPREGS: {
+ unsigned long dp;
+- int i;
+
+ ret = -EIO;
+ dp = ((unsigned long) child) + THREAD_SIZE -
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/relocate_kernel.S linux-2.6.17/arch/sh/kernel/relocate_kernel.S
+--- linux-2.6.17-vanilla/arch/sh/kernel/relocate_kernel.S 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/relocate_kernel.S 2006-07-12 16:54:22.000000000 +0000
+@@ -12,8 +12,8 @@
+ #include <linux/linkage.h>
+
+ #define PAGE_SIZE 4096 /* must be same value as in <asm/page.h> */
+-
+-
++
++
+ .globl relocate_new_kernel
+ relocate_new_kernel:
+ /* r4 = indirection_page */
+@@ -30,43 +30,43 @@
+
+ bra 1f
+ mov r4,r0 /* cmd = indirection_page */
+-0:
+- mov.l @r4+,r0 /* cmd = *ind++ */
++0:
++ mov.l @r4+,r0 /* cmd = *ind++ */
+
+ 1: /* addr = (cmd | 0xa0000000) & 0xfffffff0 */
+ mov r0,r2
+ or r9,r2
+ mov #-16,r1
+- and r1,r2
++ and r1,r2
+
+ /* if(cmd & IND_DESTINATION) dst = addr */
+- tst #1,r0
++ tst #1,r0
+ bt 2f
+- bra 0b
+- mov r2,r5
++ bra 0b
++ mov r2,r5
+
+ 2: /* else if(cmd & IND_INDIRECTION) ind = addr */
+- tst #2,r0
++ tst #2,r0
+ bt 3f
+- bra 0b
+- mov r2,r4
++ bra 0b
++ mov r2,r4
+
+ 3: /* else if(cmd & IND_DONE) goto 6 */
+- tst #4,r0
++ tst #4,r0
+ bt 4f
+ bra 6f
+ nop
+
+ 4: /* else if(cmd & IND_SOURCE) memcpy(dst,addr,PAGE_SIZE) */
+- tst #8,r0
++ tst #8,r0
+ bt 0b
+
+- mov r8,r3
+- shlr2 r3
+- shlr2 r3
+-5:
++ mov r8,r3
++ shlr2 r3
++ shlr2 r3
++5:
+ dt r3
+- mov.l @r2+,r1 /* 16n+0 */
++ mov.l @r2+,r1 /* 16n+0 */
+ mov.l r1,@r5
+ add #4,r5
+ mov.l @r2+,r1 /* 16n+4 */
+@@ -79,7 +79,7 @@
+ mov.l r1,@r5
+ add #4,r5
+ bf 5b
+-
++
+ bra 0b
+ nop
+ 6:
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/semaphore.c linux-2.6.17/arch/sh/kernel/semaphore.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/semaphore.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/semaphore.c 2006-07-12 16:54:22.000000000 +0000
+@@ -14,7 +14,7 @@
+ #include <asm/semaphore.h>
+ #include <asm/semaphore-helper.h>
+
+-spinlock_t semaphore_wake_lock;
++DEFINE_SPINLOCK(semaphore_wake_lock);
+
+ /*
+ * Semaphores are implemented using a two-way counter:
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/setup.c linux-2.6.17/arch/sh/kernel/setup.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/setup.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/setup.c 2006-07-12 16:54:22.000000000 +0000
+@@ -493,7 +493,7 @@
+ * unified cache on the SH-2 and SH-3, as well as the harvard
+ * style cache on the SH-4.
+ */
+- if (test_bit(SH_CACHE_COMBINED, &(boot_cpu_data.icache.flags))) {
++ if (boot_cpu_data.icache.flags & SH_CACHE_COMBINED) {
+ seq_printf(m, "unified\n");
+ show_cacheinfo(m, "cache", boot_cpu_data.icache);
+ } else {
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/sh_ksyms.c linux-2.6.17/arch/sh/kernel/sh_ksyms.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/sh_ksyms.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/sh_ksyms.c 2006-07-12 16:54:22.000000000 +0000
+@@ -28,21 +28,11 @@
+
+ /* platform dependent support */
+ EXPORT_SYMBOL(dump_fpu);
+-EXPORT_SYMBOL(iounmap);
+-EXPORT_SYMBOL(enable_irq);
+-EXPORT_SYMBOL(disable_irq);
+-EXPORT_SYMBOL(probe_irq_mask);
+ EXPORT_SYMBOL(kernel_thread);
+-EXPORT_SYMBOL(disable_irq_nosync);
+ EXPORT_SYMBOL(irq_desc);
+ EXPORT_SYMBOL(no_irq_type);
+
+-EXPORT_SYMBOL(strstr);
+ EXPORT_SYMBOL(strlen);
+-EXPORT_SYMBOL(strnlen);
+-EXPORT_SYMBOL(strchr);
+-EXPORT_SYMBOL(strcat);
+-EXPORT_SYMBOL(strncat);
+
+ /* PCI exports */
+ #ifdef CONFIG_PCI
+@@ -53,13 +43,8 @@
+ /* mem exports */
+ EXPORT_SYMBOL(memchr);
+ EXPORT_SYMBOL(memcpy);
+-EXPORT_SYMBOL(memcpy_fromio);
+-EXPORT_SYMBOL(memcpy_toio);
+ EXPORT_SYMBOL(memset);
+-EXPORT_SYMBOL(memset_io);
+ EXPORT_SYMBOL(memmove);
+-EXPORT_SYMBOL(memcmp);
+-EXPORT_SYMBOL(memscan);
+ EXPORT_SYMBOL(__copy_user);
+ EXPORT_SYMBOL(boot_cpu_data);
+
+@@ -101,6 +86,7 @@
+ EXPORT_SYMBOL(flush_cache_range);
+ EXPORT_SYMBOL(flush_dcache_page);
+ EXPORT_SYMBOL(__flush_purge_region);
++EXPORT_SYMBOL(clear_user_page);
+ #endif
+
+ #if defined(CONFIG_SH7705_CACHE_32KB)
+@@ -117,7 +103,12 @@
+ EXPORT_SYMBOL(synchronize_irq);
+ #endif
+
++#ifdef CONFIG_PM
++EXPORT_SYMBOL(pm_suspend);
++#endif
++
+ EXPORT_SYMBOL(csum_partial);
++#ifdef CONFIG_IPV6
+ EXPORT_SYMBOL(csum_ipv6_magic);
+-EXPORT_SYMBOL(consistent_sync);
++#endif
+ EXPORT_SYMBOL(clear_page);
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/sys_sh.c linux-2.6.17/arch/sh/kernel/sys_sh.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/sys_sh.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/sys_sh.c 2006-07-12 16:54:22.000000000 +0000
+@@ -21,7 +21,7 @@
+ #include <linux/mman.h>
+ #include <linux/file.h>
+ #include <linux/utsname.h>
+-
++#include <asm/cacheflush.h>
+ #include <asm/uaccess.h>
+ #include <asm/ipc.h>
+
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/syscalls.S linux-2.6.17/arch/sh/kernel/syscalls.S
+--- linux-2.6.17-vanilla/arch/sh/kernel/syscalls.S 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/syscalls.S 2006-07-12 16:54:22.000000000 +0000
+@@ -0,0 +1,354 @@
++/*
++ * arch/sh/kernel/syscalls.S
++ *
++ * System call table for SuperH
++ *
++ * Copyright (C) 1999, 2000, 2002 Niibe Yutaka
++ * Copyright (C) 2003 Paul Mundt
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ *
++ */
++
++#include <linux/sys.h>
++#include <linux/linkage.h>
++#include <linux/config.h>
++
++#if !defined(CONFIG_NFSD) && !defined(CONFIG_NFSD_MODULE)
++#define sys_nfsservctl sys_ni_syscall
++#endif
++
++#if !defined(CONFIG_MMU)
++#define sys_madvise sys_ni_syscall
++#define sys_readahead sys_ni_syscall
++#define sys_mprotect sys_ni_syscall
++#define sys_msync sys_ni_syscall
++#define sys_mlock sys_ni_syscall
++#define sys_munlock sys_ni_syscall
++#define sys_mlockall sys_ni_syscall
++#define sys_munlockall sys_ni_syscall
++#define sys_mremap sys_ni_syscall
++#define sys_mincore sys_ni_syscall
++#define sys_remap_file_pages sys_ni_syscall
++#endif
++
++ .data
++ENTRY(sys_call_table)
++ .long sys_ni_syscall /* 0 - old "setup()" system call*/
++ .long sys_exit
++ .long sys_fork
++ .long sys_read
++ .long sys_write
++ .long sys_open /* 5 */
++ .long sys_close
++ .long sys_waitpid
++ .long sys_creat
++ .long sys_link
++ .long sys_unlink /* 10 */
++ .long sys_execve
++ .long sys_chdir
++ .long sys_time
++ .long sys_mknod
++ .long sys_chmod /* 15 */
++ .long sys_lchown16
++ .long sys_ni_syscall /* old break syscall holder */
++ .long sys_stat
++ .long sys_lseek
++ .long sys_getpid /* 20 */
++ .long sys_mount
++ .long sys_oldumount
++ .long sys_setuid16
++ .long sys_getuid16
++ .long sys_stime /* 25 */
++ .long sys_ptrace
++ .long sys_alarm
++ .long sys_fstat
++ .long sys_pause
++ .long sys_utime /* 30 */
++ .long sys_ni_syscall /* old stty syscall holder */
++ .long sys_ni_syscall /* old gtty syscall holder */
++ .long sys_access
++ .long sys_nice
++ .long sys_ni_syscall /* 35 */ /* old ftime syscall holder */
++ .long sys_sync
++ .long sys_kill
++ .long sys_rename
++ .long sys_mkdir
++ .long sys_rmdir /* 40 */
++ .long sys_dup
++ .long sys_pipe
++ .long sys_times
++ .long sys_ni_syscall /* old prof syscall holder */
++ .long sys_brk /* 45 */
++ .long sys_setgid16
++ .long sys_getgid16
++ .long sys_signal
++ .long sys_geteuid16
++ .long sys_getegid16 /* 50 */
++ .long sys_acct
++ .long sys_umount /* recycled never used phys() */
++ .long sys_ni_syscall /* old lock syscall holder */
++ .long sys_ioctl
++ .long sys_fcntl /* 55 */
++ .long sys_ni_syscall /* old mpx syscall holder */
++ .long sys_setpgid
++ .long sys_ni_syscall /* old ulimit syscall holder */
++ .long sys_ni_syscall /* sys_olduname */
++ .long sys_umask /* 60 */
++ .long sys_chroot
++ .long sys_ustat
++ .long sys_dup2
++ .long sys_getppid
++ .long sys_getpgrp /* 65 */
++ .long sys_setsid
++ .long sys_sigaction
++ .long sys_sgetmask
++ .long sys_ssetmask
++ .long sys_setreuid16 /* 70 */
++ .long sys_setregid16
++ .long sys_sigsuspend
++ .long sys_sigpending
++ .long sys_sethostname
++ .long sys_setrlimit /* 75 */
++ .long sys_old_getrlimit
++ .long sys_getrusage
++ .long sys_gettimeofday
++ .long sys_settimeofday
++ .long sys_getgroups16 /* 80 */
++ .long sys_setgroups16
++ .long sys_ni_syscall /* sys_oldselect */
++ .long sys_symlink
++ .long sys_lstat
++ .long sys_readlink /* 85 */
++ .long sys_uselib
++ .long sys_swapon
++ .long sys_reboot
++ .long old_readdir
++ .long old_mmap /* 90 */
++ .long sys_munmap
++ .long sys_truncate
++ .long sys_ftruncate
++ .long sys_fchmod
++ .long sys_fchown16 /* 95 */
++ .long sys_getpriority
++ .long sys_setpriority
++ .long sys_ni_syscall /* old profil syscall holder */
++ .long sys_statfs
++ .long sys_fstatfs /* 100 */
++ .long sys_ni_syscall /* ioperm */
++ .long sys_socketcall
++ .long sys_syslog
++ .long sys_setitimer
++ .long sys_getitimer /* 105 */
++ .long sys_newstat
++ .long sys_newlstat
++ .long sys_newfstat
++ .long sys_uname
++ .long sys_ni_syscall /* 110 */ /* iopl */
++ .long sys_vhangup
++ .long sys_ni_syscall /* idle */
++ .long sys_ni_syscall /* vm86old */
++ .long sys_wait4
++ .long sys_swapoff /* 115 */
++ .long sys_sysinfo
++ .long sys_ipc
++ .long sys_fsync
++ .long sys_sigreturn
++ .long sys_clone /* 120 */
++ .long sys_setdomainname
++ .long sys_newuname
++ .long sys_ni_syscall /* sys_modify_ldt */
++ .long sys_adjtimex
++ .long sys_mprotect /* 125 */
++ .long sys_sigprocmask
++ .long sys_ni_syscall /* old "create_module" */
++ .long sys_init_module
++ .long sys_delete_module
++ .long sys_ni_syscall /* 130: old "get_kernel_syms" */
++ .long sys_quotactl
++ .long sys_getpgid
++ .long sys_fchdir
++ .long sys_bdflush
++ .long sys_sysfs /* 135 */
++ .long sys_personality
++ .long sys_ni_syscall /* for afs_syscall */
++ .long sys_setfsuid16
++ .long sys_setfsgid16
++ .long sys_llseek /* 140 */
++ .long sys_getdents
++ .long sys_select
++ .long sys_flock
++ .long sys_msync
++ .long sys_readv /* 145 */
++ .long sys_writev
++ .long sys_getsid
++ .long sys_fdatasync
++ .long sys_sysctl
++ .long sys_mlock /* 150 */
++ .long sys_munlock
++ .long sys_mlockall
++ .long sys_munlockall
++ .long sys_sched_setparam
++ .long sys_sched_getparam /* 155 */
++ .long sys_sched_setscheduler
++ .long sys_sched_getscheduler
++ .long sys_sched_yield
++ .long sys_sched_get_priority_max
++ .long sys_sched_get_priority_min /* 160 */
++ .long sys_sched_rr_get_interval
++ .long sys_nanosleep
++ .long sys_mremap
++ .long sys_setresuid16
++ .long sys_getresuid16 /* 165 */
++ .long sys_ni_syscall /* vm86 */
++ .long sys_ni_syscall /* old "query_module" */
++ .long sys_poll
++ .long sys_nfsservctl
++ .long sys_setresgid16 /* 170 */
++ .long sys_getresgid16
++ .long sys_prctl
++ .long sys_rt_sigreturn
++ .long sys_rt_sigaction
++ .long sys_rt_sigprocmask /* 175 */
++ .long sys_rt_sigpending
++ .long sys_rt_sigtimedwait
++ .long sys_rt_sigqueueinfo
++ .long sys_rt_sigsuspend
++ .long sys_pread_wrapper /* 180 */
++ .long sys_pwrite_wrapper
++ .long sys_chown16
++ .long sys_getcwd
++ .long sys_capget
++ .long sys_capset /* 185 */
++ .long sys_sigaltstack
++ .long sys_sendfile
++ .long sys_ni_syscall /* streams1 */
++ .long sys_ni_syscall /* streams2 */
++ .long sys_vfork /* 190 */
++ .long sys_getrlimit
++ .long sys_mmap2
++ .long sys_truncate64
++ .long sys_ftruncate64
++ .long sys_stat64 /* 195 */
++ .long sys_lstat64
++ .long sys_fstat64
++ .long sys_lchown
++ .long sys_getuid
++ .long sys_getgid /* 200 */
++ .long sys_geteuid
++ .long sys_getegid
++ .long sys_setreuid
++ .long sys_setregid
++ .long sys_getgroups /* 205 */
++ .long sys_setgroups
++ .long sys_fchown
++ .long sys_setresuid
++ .long sys_getresuid
++ .long sys_setresgid /* 210 */
++ .long sys_getresgid
++ .long sys_chown
++ .long sys_setuid
++ .long sys_setgid
++ .long sys_setfsuid /* 215 */
++ .long sys_setfsgid
++ .long sys_pivot_root
++ .long sys_mincore
++ .long sys_madvise
++ .long sys_getdents64 /* 220 */
++ .long sys_fcntl64
++ .long sys_ni_syscall /* reserved for TUX */
++ .long sys_ni_syscall /* Reserved for Security */
++ .long sys_gettid
++ .long sys_readahead /* 225 */
++ .long sys_setxattr
++ .long sys_lsetxattr
++ .long sys_fsetxattr
++ .long sys_getxattr
++ .long sys_lgetxattr /* 230 */
++ .long sys_fgetxattr
++ .long sys_listxattr
++ .long sys_llistxattr
++ .long sys_flistxattr
++ .long sys_removexattr /* 235 */
++ .long sys_lremovexattr
++ .long sys_fremovexattr
++ .long sys_tkill
++ .long sys_sendfile64
++ .long sys_futex /* 240 */
++ .long sys_sched_setaffinity
++ .long sys_sched_getaffinity
++ .long sys_ni_syscall
++ .long sys_ni_syscall
++ .long sys_io_setup /* 245 */
++ .long sys_io_destroy
++ .long sys_io_getevents
++ .long sys_io_submit
++ .long sys_io_cancel
++ .long sys_fadvise64 /* 250 */
++ .long sys_ni_syscall
++ .long sys_exit_group
++ .long sys_lookup_dcookie
++ .long sys_epoll_create
++ .long sys_epoll_ctl /* 255 */
++ .long sys_epoll_wait
++ .long sys_remap_file_pages
++ .long sys_set_tid_address
++ .long sys_timer_create
++ .long sys_timer_settime /* 260 */
++ .long sys_timer_gettime
++ .long sys_timer_getoverrun
++ .long sys_timer_delete
++ .long sys_clock_settime
++ .long sys_clock_gettime /* 265 */
++ .long sys_clock_getres
++ .long sys_clock_nanosleep
++ .long sys_statfs64
++ .long sys_fstatfs64
++ .long sys_tgkill /* 270 */
++ .long sys_utimes
++ .long sys_fadvise64_64_wrapper
++ .long sys_ni_syscall /* Reserved for vserver */
++ .long sys_ni_syscall /* Reserved for mbind */
++ .long sys_ni_syscall /* 275 - get_mempolicy */
++ .long sys_ni_syscall /* set_mempolicy */
++ .long sys_mq_open
++ .long sys_mq_unlink
++ .long sys_mq_timedsend
++ .long sys_mq_timedreceive /* 280 */
++ .long sys_mq_notify
++ .long sys_mq_getsetattr
++ .long sys_kexec_load
++ .long sys_waitid
++ .long sys_add_key /* 285 */
++ .long sys_request_key
++ .long sys_keyctl
++ .long sys_ioprio_set
++ .long sys_ioprio_get
++ .long sys_inotify_init /* 290 */
++ .long sys_inotify_add_watch
++ .long sys_inotify_rm_watch
++ .long sys_migrate_pages
++ .long sys_openat
++ .long sys_mkdirat /* 295 */
++ .long sys_mknodat
++ .long sys_fchownat
++ .long sys_futimesat
++ .long sys_fstatat64
++ .long sys_unlinkat /* 300 */
++ .long sys_renameat
++ .long sys_linkat
++ .long sys_symlinkat
++ .long sys_readlinkat
++ .long sys_fchmodat /* 305 */
++ .long sys_faccessat
++ .long sys_ni_syscall /* Reserved for pselect6 */
++ .long sys_ni_syscall /* Reserved for ppoll */
++ .long sys_unshare
++ .long sys_set_robust_list /* 310 */
++ .long sys_get_robust_list
++ .long sys_splice
++ .long sys_sync_file_range
++ .long sys_tee
++ .long sys_vmsplice /* 315 */
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/time.c linux-2.6.17/arch/sh/kernel/time.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/time.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/time.c 2006-07-12 16:54:22.000000000 +0000
+@@ -30,11 +30,11 @@
+ /* XXX: Can we initialize this in a routine somewhere? Dreamcast doesn't want
+ * these routines anywhere... */
+ #ifdef CONFIG_SH_RTC
+-void (*rtc_get_time)(struct timespec *) = sh_rtc_gettimeofday;
+-int (*rtc_set_time)(const time_t) = sh_rtc_settimeofday;
++void (*rtc_sh_get_time)(struct timespec *) = sh_rtc_gettimeofday;
++int (*rtc_sh_set_time)(const time_t) = sh_rtc_settimeofday;
+ #else
+-void (*rtc_get_time)(struct timespec *);
+-int (*rtc_set_time)(const time_t);
++void (*rtc_sh_get_time)(struct timespec *);
++int (*rtc_sh_set_time)(const time_t);
+ #endif
+
+ /*
+@@ -136,7 +136,7 @@
+ xtime.tv_sec > last_rtc_update + 660 &&
+ (xtime.tv_nsec / 1000) >= 500000 - ((unsigned) TICK_SIZE) / 2 &&
+ (xtime.tv_nsec / 1000) <= 500000 + ((unsigned) TICK_SIZE) / 2) {
+- if (rtc_set_time(xtime.tv_sec) == 0)
++ if (rtc_sh_set_time(xtime.tv_sec) == 0)
+ last_rtc_update = xtime.tv_sec;
+ else
+ /* do it again in 60s */
+@@ -144,8 +144,33 @@
+ }
+ }
+
++#ifdef CONFIG_PM
++int timer_suspend(struct sys_device *dev, pm_message_t state)
++{
++ struct sys_timer *sys_timer = container_of(dev, struct sys_timer, dev);
++
++ sys_timer->ops->stop();
++
++ return 0;
++}
++
++int timer_resume(struct sys_device *dev)
++{
++ struct sys_timer *sys_timer = container_of(dev, struct sys_timer, dev);
++
++ sys_timer->ops->start();
++
++ return 0;
++}
++#else
++#define timer_suspend NULL
++#define timer_resume NULL
++#endif
++
+ static struct sysdev_class timer_sysclass = {
+ set_kset_name("timer"),
++ .suspend = timer_suspend,
++ .resume = timer_resume,
+ };
+
+ static int __init timer_init_sysfs(void)
+@@ -169,8 +194,8 @@
+
+ clk_init();
+
+- if (rtc_get_time) {
+- rtc_get_time(&xtime);
++ if (rtc_sh_get_time) {
++ rtc_sh_get_time(&xtime);
+ } else {
+ xtime.tv_sec = mktime(2000, 1, 1, 0, 0, 0);
+ xtime.tv_nsec = 0;
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/timers/CVS/Entries linux-2.6.17/arch/sh/kernel/timers/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/kernel/timers/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/timers/CVS/Entries 2006-07-12 16:54:22.000000000 +0000
+@@ -0,0 +1,4 @@
++/Makefile/1.1/Sat Mar 26 20:25:36 2005/-ko/
++/timer.c/1.1/Sat Mar 26 20:25:36 2005/-ko/
++/timer-tmu.c/1.4/Sat Jul 8 20:16:10 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/timers/CVS/Repository linux-2.6.17/arch/sh/kernel/timers/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/kernel/timers/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/timers/CVS/Repository 2006-07-12 16:54:22.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/kernel/timers
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/timers/CVS/Root linux-2.6.17/arch/sh/kernel/timers/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/kernel/timers/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/timers/CVS/Root 2006-07-12 16:54:22.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/timers/timer-tmu.c linux-2.6.17/arch/sh/kernel/timers/timer-tmu.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/timers/timer-tmu.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/timers/timer-tmu.c 2006-07-12 16:54:22.000000000 +0000
+@@ -132,17 +132,17 @@
+ ctrl_outl(0xffffffff, TMU0_TCOR);
+ ctrl_outl(0xffffffff, TMU0_TCNT);
+
+- rtc_get_time(&ts2);
++ rtc_sh_get_time(&ts2);
+
+ do {
+- rtc_get_time(&ts1);
++ rtc_sh_get_time(&ts1);
+ } while (ts1.tv_nsec == ts2.tv_nsec && ts1.tv_sec == ts2.tv_sec);
+
+ /* actually start the timer */
+ ctrl_outb(TMU_TSTR_INIT, TMU_TSTR);
+
+ do {
+- rtc_get_time(&ts2);
++ rtc_sh_get_time(&ts2);
+ } while (ts1.tv_nsec == ts2.tv_nsec && ts1.tv_sec == ts2.tv_sec);
+
+ freq = 0xffffffff - ctrl_inl(TMU0_TCNT);
+@@ -188,6 +188,18 @@
+ .ops = &tmu_clk_ops,
+ };
+
++static int tmu_timer_start(void)
++{
++ ctrl_outb(TMU_TSTR_INIT, TMU_TSTR);
++ return 0;
++}
++
++static int tmu_timer_stop(void)
++{
++ ctrl_outb(0, TMU_TSTR);
++ return 0;
++}
++
+ static int tmu_timer_init(void)
+ {
+ unsigned long interval;
+@@ -197,7 +209,7 @@
+ tmu0_clk.parent = clk_get("module_clk");
+
+ /* Start TMU0 */
+- ctrl_outb(0, TMU_TSTR);
++ tmu_timer_stop();
+ #if !defined(CONFIG_CPU_SUBTYPE_SH7300) && !defined(CONFIG_CPU_SUBTYPE_SH7760)
+ ctrl_outb(TMU_TOCR_INIT, TMU_TOCR);
+ #endif
+@@ -211,13 +223,15 @@
+ ctrl_outl(interval, TMU0_TCOR);
+ ctrl_outl(interval, TMU0_TCNT);
+
+- ctrl_outb(TMU_TSTR_INIT, TMU_TSTR);
++ tmu_timer_start();
+
+ return 0;
+ }
+
+ struct sys_timer_ops tmu_timer_ops = {
+ .init = tmu_timer_init,
++ .start = tmu_timer_start,
++ .stop = tmu_timer_stop,
+ .get_frequency = tmu_timer_get_frequency,
+ .get_offset = tmu_timer_get_offset,
+ };
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/traps.c linux-2.6.17/arch/sh/kernel/traps.c
+--- linux-2.6.17-vanilla/arch/sh/kernel/traps.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/traps.c 2006-07-12 16:54:22.000000000 +0000
+@@ -37,40 +37,15 @@
+
+ #ifdef CONFIG_SH_KGDB
+ #include <asm/kgdb.h>
+-#define CHK_REMOTE_DEBUG(regs) \
+-{ \
+- if ((kgdb_debug_hook != (kgdb_debug_hook_t *) NULL) && (!user_mode(regs))) \
+- { \
+- (*kgdb_debug_hook)(regs); \
+- } \
++#define CHK_REMOTE_DEBUG(regs) \
++{ \
++ if (kgdb_debug_hook && !user_mode(regs))\
++ (*kgdb_debug_hook)(regs); \
+ }
+ #else
+ #define CHK_REMOTE_DEBUG(regs)
+ #endif
+
+-#define DO_ERROR(trapnr, signr, str, name, tsk) \
+-asmlinkage void do_##name(unsigned long r4, unsigned long r5, \
+- unsigned long r6, unsigned long r7, \
+- struct pt_regs regs) \
+-{ \
+- unsigned long error_code; \
+- \
+- /* Check if it's a DSP instruction */ \
+- if (is_dsp_inst(&regs)) { \
+- /* Enable DSP mode, and restart instruction. */ \
+- regs.sr |= SR_DSP; \
+- return; \
+- } \
+- \
+- asm volatile("stc r2_bank, %0": "=r" (error_code)); \
+- local_irq_enable(); \
+- tsk->thread.error_code = error_code; \
+- tsk->thread.trap_no = trapnr; \
+- CHK_REMOTE_DEBUG(&regs); \
+- force_sig(signr, tsk); \
+- die_if_no_fixup(str,&regs,error_code); \
+-}
+-
+ #ifdef CONFIG_CPU_SH2
+ #define TRAP_RESERVED_INST 4
+ #define TRAP_ILLEGAL_SLOT_INST 6
+@@ -87,7 +62,7 @@
+ #define VMALLOC_OFFSET (8*1024*1024)
+ #define MODULE_RANGE (8*1024*1024)
+
+-spinlock_t die_lock;
++DEFINE_SPINLOCK(die_lock);
+
+ void die(const char * str, struct pt_regs * regs, long err)
+ {
+@@ -576,8 +551,117 @@
+ #define is_dsp_inst(regs) (0)
+ #endif /* CONFIG_SH_DSP */
+
+-DO_ERROR(TRAP_RESERVED_INST, SIGILL, "reserved instruction", reserved_inst, current)
+-DO_ERROR(TRAP_ILLEGAL_SLOT_INST, SIGILL, "illegal slot instruction", illegal_slot_inst, current)
++extern int do_fpu_inst(unsigned short, struct pt_regs*);
++
++asmlinkage void do_reserved_inst(unsigned long r4, unsigned long r5,
++ unsigned long r6, unsigned long r7,
++ struct pt_regs regs)
++{
++ unsigned long error_code;
++ struct task_struct *tsk = current;
++
++#ifdef CONFIG_SH_FPU_EMU
++ unsigned short inst;
++ int err;
++
++ get_user(inst, (unsigned short*)regs.pc);
++
++ err = do_fpu_inst(inst, &regs);
++ if (!err) {
++ regs.pc += 2;
++ return;
++ }
++ /* not a FPU inst. */
++#endif
++
++#ifdef CONFIG_SH_DSP
++ /* Check if it's a DSP instruction */
++ if (is_dsp_inst(&regs)) {
++ /* Enable DSP mode, and restart instruction. */
++ regs.sr |= SR_DSP;
++ return;
++ }
++#endif
++
++ asm volatile("stc r2_bank, %0": "=r" (error_code));
++ local_irq_enable();
++ tsk->thread.error_code = error_code;
++ tsk->thread.trap_no = TRAP_RESERVED_INST;
++ CHK_REMOTE_DEBUG(&regs);
++ force_sig(SIGILL, tsk);
++ die_if_no_fixup("reserved instruction", &regs, error_code);
++}
++
++#ifdef CONFIG_SH_FPU_EMU
++static int emulate_branch(unsigned short inst, struct pt_regs* regs)
++{
++ /*
++ * bfs: 8fxx: PC+=d*2+4;
++ * bts: 8dxx: PC+=d*2+4;
++ * bra: axxx: PC+=D*2+4;
++ * bsr: bxxx: PC+=D*2+4 after PR=PC+4;
++ * braf:0x23: PC+=Rn*2+4;
++ * bsrf:0x03: PC+=Rn*2+4 after PR=PC+4;
++ * jmp: 4x2b: PC=Rn;
++ * jsr: 4x0b: PC=Rn after PR=PC+4;
++ * rts: 000b: PC=PR;
++ */
++ if ((inst & 0xfd00) == 0x8d00) {
++ regs->pc += SH_PC_8BIT_OFFSET(inst);
++ return 0;
++ }
++
++ if ((inst & 0xe000) == 0xa000) {
++ regs->pc += SH_PC_12BIT_OFFSET(inst);
++ return 0;
++ }
++
++ if ((inst & 0xf0df) == 0x0003) {
++ regs->pc += regs->regs[(inst & 0x0f00) >> 8] + 4;
++ return 0;
++ }
++
++ if ((inst & 0xf0df) == 0x400b) {
++ regs->pc = regs->regs[(inst & 0x0f00) >> 8];
++ return 0;
++ }
++
++ if ((inst & 0xffff) == 0x000b) {
++ regs->pc = regs->pr;
++ return 0;
++ }
++
++ return 1;
++}
++#endif
++
++asmlinkage void do_illegal_slot_inst(unsigned long r4, unsigned long r5,
++ unsigned long r6, unsigned long r7,
++ struct pt_regs regs)
++{
++ unsigned long error_code;
++ struct task_struct *tsk = current;
++#ifdef CONFIG_SH_FPU_EMU
++ unsigned short inst;
++
++ get_user(inst, (unsigned short *)regs.pc + 1);
++ if (!do_fpu_inst(inst, &regs)) {
++ get_user(inst, (unsigned short *)regs.pc);
++ if (!emulate_branch(inst, &regs))
++ return;
++ /* fault in branch.*/
++ }
++ /* not a FPU inst. */
++#endif
++
++ asm volatile("stc r2_bank, %0": "=r" (error_code));
++ local_irq_enable();
++ tsk->thread.error_code = error_code;
++ tsk->thread.trap_no = TRAP_RESERVED_INST;
++ CHK_REMOTE_DEBUG(&regs);
++ force_sig(SIGILL, tsk);
++ die_if_no_fixup("illegal slot instruction", &regs, error_code);
++}
+
+ asmlinkage void do_exception_error(unsigned long r4, unsigned long r5,
+ unsigned long r6, unsigned long r7,
+@@ -635,14 +719,16 @@
+ exception_handling_table[TRAP_ILLEGAL_SLOT_INST]
+ = (void *)do_illegal_slot_inst;
+
+-#ifdef CONFIG_CPU_SH4
+- if (!(cpu_data->flags & CPU_HAS_FPU)) {
+- /* For SH-4 lacking an FPU, treat floating point instructions
+- as reserved. */
+- /* entry 64 corresponds to EXPEVT=0x800 */
+- exception_handling_table[64] = (void *)do_reserved_inst;
+- exception_handling_table[65] = (void *)do_illegal_slot_inst;
+- }
++#if defined(CONFIG_CPU_SH4) && !defined(CONFIG_SH_FPU) || \
++ defined(CONFIG_SH_FPU_EMU)
++ /*
++ * For SH-4 lacking an FPU, treat floating point instructions as
++ * reserved. They'll be handled in the math-emu case, or faulted on
++ * otherwise.
++ */
++ /* entry 64 corresponds to EXPEVT=0x800 */
++ exception_handling_table[64] = (void *)do_reserved_inst;
++ exception_handling_table[65] = (void *)do_illegal_slot_inst;
+ #endif
+
+ /* Setup VBR for boot cpu */
+diff -ruN linux-2.6.17-vanilla/arch/sh/kernel/vmlinux.lds.S linux-2.6.17/arch/sh/kernel/vmlinux.lds.S
+--- linux-2.6.17-vanilla/arch/sh/kernel/vmlinux.lds.S 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/kernel/vmlinux.lds.S 2006-07-12 16:54:22.000000000 +0000
+@@ -63,8 +63,6 @@
+
+ . = ALIGN(8192); /* init_task */
+ .data.init_task : { *(.data.init_task) }
+- /* stack */
+- .stack : { stack = .; _stack = .; }
+
+ . = ALIGN(4096); /* Init code and data */
+ __init_begin = .;
+diff -ruN linux-2.6.17-vanilla/arch/sh/lib/CVS/Entries linux-2.6.17/arch/sh/lib/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/lib/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/lib/CVS/Entries 2006-07-12 16:54:22.000000000 +0000
+@@ -0,0 +1,13 @@
++/Makefile/1.9/Tue Jun 29 01:59:02 2004/-ko/
++/checksum.S/1.3/Fri Sep 2 23:02:18 2005/-ko/
++/delay.c/1.5/Mon Aug 29 21:01:18 2005/-ko/
++/div64-generic.c/1.2/Sat Sep 6 00:27:16 2003//
++/div64.S/1.2/Sat Jul 19 22:56:20 2003//
++/memchr.S/1.2/Wed Apr 7 20:18:39 2004/-ko/
++/memcpy-sh4.S/1.1/Tue Jun 29 01:59:02 2004/-ko/
++/memcpy.S/1.2/Wed Apr 7 20:18:39 2004/-ko/
++/memmove.S/1.4/Tue Apr 20 13:06:06 2004/-ko/
++/memset.S/1.3/Mon Jul 25 00:55:36 2005/-ko/
++/strlen.S/1.2/Wed Apr 7 20:18:39 2004/-ko/
++/udivdi3.c/1.2/Sat Jul 19 22:56:20 2003//
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/lib/CVS/Repository linux-2.6.17/arch/sh/lib/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/lib/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/lib/CVS/Repository 2006-07-12 16:54:22.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/lib
+diff -ruN linux-2.6.17-vanilla/arch/sh/lib/CVS/Root linux-2.6.17/arch/sh/lib/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/lib/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/lib/CVS/Root 2006-07-12 16:54:22.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/lib/checksum.S linux-2.6.17/arch/sh/lib/checksum.S
+--- linux-2.6.17-vanilla/arch/sh/lib/checksum.S 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/lib/checksum.S 2006-07-12 16:54:22.000000000 +0000
+@@ -202,8 +202,9 @@
+ cmp/pz r6 ! Jump if we had at least two bytes.
+ bt/s 1f
+ clrt
++ add #2,r6 ! r6 was < 2. Deal with it.
+ bra 4f
+- add #2,r6 ! r6 was < 2. Deal with it.
++ mov r6,r2
+
+ 3: ! Handle different src and dest alignments.
+ ! This is not common, so simple byte by byte copy will do.
+diff -ruN linux-2.6.17-vanilla/arch/sh/lib/memcpy-sh4.S linux-2.6.17/arch/sh/lib/memcpy-sh4.S
+--- linux-2.6.17-vanilla/arch/sh/lib/memcpy-sh4.S 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/lib/memcpy-sh4.S 2006-07-12 16:54:22.000000000 +0000
+@@ -20,7 +20,7 @@
+ !
+ ! GHIJ KLMN OPQR --> ...G HIJK LMNO PQR.
+ !
+-
++
+ ! Size is 16 or greater, and may have trailing bytes
+
+ .balign 32
+@@ -39,7 +39,7 @@
+ ! 6 cycles, 4 bytes per iteration
+ 3: mov.l @(r0,r5),r1 ! 21 LS (latency=2) ! NMLK
+ mov r7, r3 ! 5 MT (latency=0) ! RQPO
+-
++
+ cmp/hi r2,r0 ! 57 MT
+ shll16 r3 ! 103 EX
+
+@@ -48,7 +48,7 @@
+
+ shlr8 r6 ! 106 EX ! xNML
+ mov r1, r7 ! 5 MT (latency=0)
+-
++
+ or r6,r3 ! 82 EX ! ONML
+ bt/s 3b ! 109 BR
+
+@@ -81,7 +81,7 @@
+
+ 8: cmp/hi r2,r0 ! 57 MT
+ mov.b @(r0,r5),r1 ! 20 LS (latency=2)
+-
++
+ bt/s 8b ! 109 BR
+
+ mov.b r1,@-r0 ! 29 LS
+@@ -89,11 +89,11 @@
+ 9: rts
+ nop
+
+-
++
+ !
+ ! GHIJ KLMN OPQR --> .GHI JKLM NOPQ R...
+ !
+-
++
+ ! Size is 16 or greater, and may have trailing bytes
+
+ .balign 32
+@@ -112,7 +112,7 @@
+ ! 6 cycles, 4 bytes per iteration
+ 3: mov.l @(r0,r5),r1 ! 21 LS (latency=2) ! NMLK
+ mov r7, r3 ! 5 MT (latency=0) ! RQPO
+-
++
+ cmp/hi r2,r0 ! 57 MT
+ shll8 r3 ! 102 EX ! QPOx
+
+@@ -121,7 +121,7 @@
+
+ shlr8 r6 ! 106 EX ! xxxN
+ mov r1, r7 ! 5 MT (latency=0)
+-
++
+ or r6,r3 ! 82 EX ! QPON
+ bt/s 3b ! 109 BR
+
+@@ -149,14 +149,14 @@
+
+ 8: cmp/hi r2,r0 ! 57 MT
+ mov.b @(r0,r5),r1 ! 20 LS (latency=2)
+-
++
+ bt/s 8b ! 109 BR
+
+ mov.b r1,@-r0 ! 29 LS
+
+ 9: rts
+ nop
+-
++
+ ENTRY(memcpy)
+
+ ! Calculate the invariants which will be used in the remainder
+@@ -168,7 +168,7 @@
+ ! r0 --> [ ... ] r0+r5 --> [ ... ]
+ !
+ !
+-
++
+ ! Short circuit the common case of src, dst and len being 32 bit aligned
+ ! and test for zero length move
+
+@@ -201,7 +201,7 @@
+ ! 36 82 49-50 66-70 80-85
+ ! However the penalty for getting it 'wrong' is much higher for long word
+ ! aligned data (and this is more common), so use a value of 16.
+-
++
+ cmp/gt r6,r1 ! 56 MT
+
+ add #-1,r5 ! 50 EX
+@@ -212,7 +212,7 @@
+
+ mov.b @(r0,r5),r1 ! 20 LS (latency=2)
+ bf/s 4f ! 111 BR
+-
++
+ add #-1,r3 ! 50 EX
+ tst r6, r6 ! 86 MT
+
+@@ -247,7 +247,7 @@
+ bt/s 2f ! 111 BR
+ and r0,r3 ! 78 EX
+
+- ! 3 cycles, 1 byte per iteration
++ ! 3 cycles, 1 byte per iteration
+ 1: dt r3 ! 67 EX
+ mov.b @(r0,r5),r1 ! 19 LS (latency=2)
+
+@@ -257,10 +257,10 @@
+ mov.b r1,@-r0 ! 28 LS
+
+ 2: add #1, r5 ! 79 EX
+-
++
+ ! Now select the appropriate bulk transfer code based on relative
+ ! alignment of src and dst.
+-
++
+ mov r0, r3 ! 5 MT (latency=0)
+
+ mov r5, r0 ! 5 MT (latency=0)
+@@ -270,7 +270,7 @@
+ mov #64, r7 ! 6 EX
+
+ ! bit 0 clear
+-
++
+ cmp/ge r7, r6 ! 55 MT
+
+ bt/s 2f ! 111 BR
+@@ -289,7 +289,7 @@
+
+ bra .Lcase2b
+ nop
+-
++
+ ! bit 0 set
+ 1: tst #2, r0 ! 87 MT
+
+@@ -298,7 +298,7 @@
+
+ bra .Lcase3
+ nop
+-
++
+
+ !
+ ! GHIJ KLMN OPQR --> GHIJ KLMN OPQR
+@@ -306,7 +306,7 @@
+
+ ! src, dst and size are all long word aligned
+ ! size is non-zero
+-
++
+ .balign 32
+ .Lcase00:
+ mov #64, r1 ! 6 EX
+@@ -319,7 +319,7 @@
+ shlr2 r6 ! 105 EX
+
+ shlr r6 ! 104 EX
+- mov.l @(r0, r5), r1 ! 21 LS (latency=2)
++ mov.l @(r0, r5), r1 ! 21 LS (latency=2)
+
+ bf/s 4f ! 111 BR
+ add #-8, r3 ! 50 EX
+@@ -343,7 +343,7 @@
+ 5: rts
+ nop
+
+-
++
+ ! Size is 16 or greater and less than 64, but may have trailing bytes
+
+ .balign 32
+@@ -351,7 +351,7 @@
+ add #-4, r5 ! 50 EX
+ mov r4, r7 ! 5 MT (latency=0)
+
+- mov.l @(r0, r5), r1 ! 21 LS (latency=2)
++ mov.l @(r0, r5), r1 ! 21 LS (latency=2)
+ mov #4, r2 ! 6 EX
+
+ add #11, r7 ! 50 EX
+@@ -377,7 +377,7 @@
+ ! Copy the final 0-3 bytes
+
+ add #3,r5 ! 50 EX
+-
++
+ cmp/eq r0, r4 ! 54 MT
+ add #-10, r7 ! 50 EX
+
+@@ -386,7 +386,7 @@
+ ! 3 cycles, 1 byte per iteration
+ 1: mov.b @(r0,r5),r1 ! 19 LS
+ cmp/hi r7,r0 ! 57 MT
+-
++
+ bt/s 1b ! 111 BR
+ mov.b r1,@-r0 ! 28 LS
+
+@@ -427,10 +427,10 @@
+ add #8, r3 ! 50 EX
+
+ tst #0x18, r0 ! 87 MT
+-
++
+ bt/s 1f ! 109 BR
+ mov.l r1,@-r0 ! 30 LS
+-
++
+ ! 4 cycles, 2 long words per iteration
+ 3: mov.l @(r0, r5), r1 ! 21 LS (latency=2)
+
+@@ -450,7 +450,7 @@
+ ! We could do this with the four scratch registers, but if src
+ ! and dest hit the same cache line, this will thrash, so make
+ ! use of additional registers.
+- !
++ !
+ ! We also need r0 as a temporary (for movca), so 'undo' the invariant:
+ ! r5: src (was r0+r5)
+ ! r1: dest (was r0)
+@@ -459,14 +459,14 @@
+ !
+ 1: mov.l r8, @-r15 ! 30 LS
+ add r0, r5 ! 49 EX
+-
++
+ mov.l r9, @-r15 ! 30 LS
+ mov r0, r1 ! 5 MT (latency=0)
+-
++
+ mov.l r10, @-r15 ! 30 LS
+ add #-0x1c, r5 ! 50 EX
+-
+- mov.l r11, @-r15 ! 30 LS
++
++ mov.l r11, @-r15 ! 30 LS
+
+ ! 16 cycles, 32 bytes per iteration
+ 2: mov.l @(0x00,r5),r0 ! 18 LS (latency=2)
+@@ -510,10 +510,10 @@
+ sub r4, r1 ! 75 EX (len remaining)
+
+ ! number of trailing bytes is non-zero
+- !
++ !
+ ! invariants restored (r5 already decremented by 4)
+ ! also r1=num bytes remaining
+-
++
+ mov #4, r2 ! 6 EX
+ mov r4, r7 ! 5 MT (latency=0)
+
+@@ -523,7 +523,7 @@
+ bf/s 5f ! 108 BR
+ add #11, r7 ! 50 EX
+
+- mov.l @(r0, r5), r6 ! 21 LS (latency=2)
++ mov.l @(r0, r5), r6 ! 21 LS (latency=2)
+ tst r2, r1 ! 86 MT
+
+ mov r5, r3 ! 5 MT (latency=0)
+@@ -553,11 +553,11 @@
+
+ bt 9f ! 110 BR
+ add #3,r5 ! 50 EX
+-
++
+ ! 3 cycles, 1 byte per iteration
+ 1: mov.b @(r0,r5),r1 ! 19 LS
+ cmp/hi r7,r0 ! 57 MT
+-
++
+ bt/s 1b ! 111 BR
+ mov.b r1,@-r0 ! 28 LS
+
+@@ -567,7 +567,7 @@
+ !
+ ! GHIJ KLMN OPQR --> ..GH IJKL MNOP QR..
+ !
+-
++
+ .balign 32
+ .Lcase2:
+ ! Size is 16 or greater and less then 64, but may have trailing bytes
+@@ -608,21 +608,21 @@
+
+ cmp/eq r3, r0 ! 54 MT
+ add #0x1f, r2 ! 50 EX
+-
++
+ add #-2, r5 ! 50 EX
+ bt/s 1f ! 110 BR
+ and r1, r2 ! 78 EX
+-
++
+ ! Copy a short word one at a time until we are cache line aligned
+ ! Normal values: r0, r2, r3, r4
+ ! Unused: r1, r6, r7
+ ! Mod: r5 (=r5-2)
+ !
+ add #2, r3 ! 50 EX
+-
++
+ 2: mov.w @(r0,r5),r1 ! 20 LS (latency=2)
+ cmp/eq r3,r0 ! 54 MT
+-
++
+ bf/s 2b ! 111 BR
+
+ mov.w r1,@-r0 ! 29 LS
+@@ -635,7 +635,7 @@
+ ! We could do this with the four scratch registers, but if src
+ ! and dest hit the same cache line, this will thrash, so make
+ ! use of additional registers.
+- !
++ !
+ ! We also need r0 as a temporary (for movca), so 'undo' the invariant:
+ ! r5: src (was r0+r5)
+ ! r1: dest (was r0)
+@@ -644,16 +644,16 @@
+ !
+ 1: mov.l r8, @-r15 ! 30 LS
+ add r0, r5 ! 49 EX
+-
++
+ mov.l r9, @-r15 ! 30 LS
+ mov r0, r1 ! 5 MT (latency=0)
+-
++
+ mov.l r10, @-r15 ! 30 LS
+ add #-0x1e, r5 ! 50 EX
+-
+- mov.l r11, @-r15 ! 30 LS
+-
+- mov.l r12, @-r15 ! 30 LS
++
++ mov.l r11, @-r15 ! 30 LS
++
++ mov.l r12, @-r15 ! 30 LS
+
+ ! 17 cycles, 32 bytes per iteration
+ #ifdef CONFIG_CPU_LITTLE_ENDIAN
+@@ -690,7 +690,7 @@
+ xtrct r12, r11 ! 48 EX
+
+ mov.l r6, @(0x08,r1) ! 33 LS
+-
++
+ mov.l r7, @(0x0c,r1) ! 33 LS
+
+ mov.l r8, @(0x10,r1) ! 33 LS
+@@ -739,7 +739,7 @@
+
+ mov.l r6, @(0x18,r1) ! 33 LS
+ xtrct r12, r11 ! 48 EX
+-
++
+ mov.l r7, @(0x14,r1) ! 33 LS
+
+ mov.l r8, @(0x10,r1) ! 33 LS
+@@ -770,7 +770,7 @@
+ 1: mov.l @r15+, r8 ! 15 LS
+
+ add #0x1e, r5 ! 50 EX
+-
++
+ ! Finish off a short word at a time
+ ! r5 must be invariant - 2
+ 10: mov r4,r2 ! 5 MT (latency=0)
+@@ -780,7 +780,7 @@
+ bf/s 1f ! 109 BR
+
+ add #2, r2 ! 50 EX
+-
++
+ 3: mov.w @(r0,r5),r1 ! 20 LS
+ cmp/hi r2,r0 ! 57 MT
+
+@@ -788,7 +788,7 @@
+
+ mov.w r1,@-r0 ! 29 LS
+ 1:
+-
++
+ !
+ ! Finally, copy the last byte if necessary
+ cmp/eq r4,r0 ! 54 MT
+diff -ruN linux-2.6.17-vanilla/arch/sh/lib/memmove.S linux-2.6.17/arch/sh/lib/memmove.S
+--- linux-2.6.17-vanilla/arch/sh/lib/memmove.S 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/lib/memmove.S 2006-07-12 16:54:22.000000000 +0000
+@@ -1,4 +1,4 @@
+-/* $Id: memmove.S,v 1.2 2001/07/27 11:51:09 gniibe Exp $
++/* $Id: memmove.S,v 1.3 2003/05/04 19:29:54 lethal Exp $
+ *
+ * "memmove" implementation of SuperH
+ *
+diff -ruN linux-2.6.17-vanilla/arch/sh/lib/memset.S linux-2.6.17/arch/sh/lib/memset.S
+--- linux-2.6.17-vanilla/arch/sh/lib/memset.S 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/lib/memset.S 2006-07-12 16:54:23.000000000 +0000
+@@ -29,6 +29,7 @@
+ bf/s 1b
+ mov.b r5,@-r4
+ 2: ! make VVVV
++ extu.b r5,r5
+ swap.b r5,r0 ! V0
+ or r0,r5 ! VV
+ swap.w r5,r0 ! VV00
+diff -ruN linux-2.6.17-vanilla/arch/sh/math-emu/CVS/Entries linux-2.6.17/arch/sh/math-emu/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/math-emu/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/math-emu/CVS/Entries 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1,4 @@
++/Makefile/1.1/Wed Jul 12 10:35:55 2006/-ko/
++/math.c/1.1/Wed Jul 12 10:35:55 2006/-ko/
++/sfp-util.h/1.1/Wed Jul 12 10:35:55 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/math-emu/CVS/Repository linux-2.6.17/arch/sh/math-emu/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/math-emu/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/math-emu/CVS/Repository 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/math-emu
+diff -ruN linux-2.6.17-vanilla/arch/sh/math-emu/CVS/Root linux-2.6.17/arch/sh/math-emu/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/math-emu/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/math-emu/CVS/Root 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/math-emu/Makefile linux-2.6.17/arch/sh/math-emu/Makefile
+--- linux-2.6.17-vanilla/arch/sh/math-emu/Makefile 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/math-emu/Makefile 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++obj-y := math.o
+diff -ruN linux-2.6.17-vanilla/arch/sh/math-emu/math.c linux-2.6.17/arch/sh/math-emu/math.c
+--- linux-2.6.17-vanilla/arch/sh/math-emu/math.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/math-emu/math.c 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1,624 @@
++/*
++ * arch/sh/math-emu/math.c
++ *
++ * Copyright (C) 2006 Takashi YOSHII <takasi-y@ops.dti.ne.jp>
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ */
++#include <linux/config.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/types.h>
++#include <linux/sched.h>
++#include <linux/signal.h>
++
++#include <asm/system.h>
++#include <asm/uaccess.h>
++#include <asm/processor.h>
++#include <asm/io.h>
++
++#include "sfp-util.h"
++#include <math-emu/soft-fp.h>
++#include <math-emu/single.h>
++#include <math-emu/double.h>
++
++#define FPUL (fregs->fpul)
++#define FPSCR (fregs->fpscr)
++#define FPSCR_RM (FPSCR&3)
++#define FPSCR_DN ((FPSCR>>18)&1)
++#define FPSCR_PR ((FPSCR>>19)&1)
++#define FPSCR_SZ ((FPSCR>>20)&1)
++#define FPSCR_FR ((FPSCR>>21)&1)
++#define FPSCR_MASK 0x003fffffUL
++
++#define BANK(n) (n^(FPSCR_FR?16:0))
++#define FR ((unsigned long*)(fregs->fp_regs))
++#define FR0 (FR[BANK(0)])
++#define FRn (FR[BANK(n)])
++#define FRm (FR[BANK(m)])
++#define DR ((unsigned long long*)(fregs->fp_regs))
++#define DRn (DR[BANK(n)/2])
++#define DRm (DR[BANK(m)/2])
++
++#define XREG(n) (n^16)
++#define XFn (FR[BANK(XREG(n))])
++#define XFm (FR[BANK(XREG(m))])
++#define XDn (DR[BANK(XREG(n))/2])
++#define XDm (DR[BANK(XREG(m))/2])
++
++#define R0 (regs->regs[0])
++#define Rn (regs->regs[n])
++#define Rm (regs->regs[m])
++
++#define WRITE(d,a) ({if(put_user(d, (typeof (d)*)a)) return -EFAULT;})
++#define READ(d,a) ({if(get_user(d, (typeof (d)*)a)) return -EFAULT;})
++
++#define PACK_S(r,f) FP_PACK_SP(&r,f)
++#define UNPACK_S(f,r) FP_UNPACK_SP(f,&r)
++#define PACK_D(r,f) \
++ {u32 t[2]; FP_PACK_DP(t,f); ((u32*)&r)[0]=t[1]; ((u32*)&r)[1]=t[0];}
++#define UNPACK_D(f,r) \
++ {u32 t[2]; t[0]=((u32*)&r)[1]; t[1]=((u32*)&r)[0]; FP_UNPACK_DP(f,t);}
++
++// 2 args instructions.
++#define BOTH_PRmn(op,x) \
++ FP_DECL_EX; if(FPSCR_PR) op(D,x,DRm,DRn); else op(S,x,FRm,FRn);
++
++#define CMP_X(SZ,R,M,N) do{ \
++ FP_DECL_##SZ(Fm); FP_DECL_##SZ(Fn); \
++ UNPACK_##SZ(Fm, M); UNPACK_##SZ(Fn, N); \
++ FP_CMP_##SZ(R, Fn, Fm, 2); }while(0)
++#define EQ_X(SZ,R,M,N) do{ \
++ FP_DECL_##SZ(Fm); FP_DECL_##SZ(Fn); \
++ UNPACK_##SZ(Fm, M); UNPACK_##SZ(Fn, N); \
++ FP_CMP_EQ_##SZ(R, Fn, Fm); }while(0)
++#define CMP(OP) ({ int r; BOTH_PRmn(OP##_X,r); r; })
++
++static int
++fcmp_gt(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, int n)
++{
++ if (CMP(CMP) > 0)
++ regs->sr |= 1;
++ else
++ regs->sr &= ~1;
++
++ return 0;
++}
++
++static int
++fcmp_eq(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, int n)
++{
++ if (CMP(CMP /*EQ*/) == 0)
++ regs->sr |= 1;
++ else
++ regs->sr &= ~1;
++ return 0;
++}
++
++#define ARITH_X(SZ,OP,M,N) do{ \
++ FP_DECL_##SZ(Fm); FP_DECL_##SZ(Fn); FP_DECL_##SZ(Fr); \
++ UNPACK_##SZ(Fm, M); UNPACK_##SZ(Fn, N); \
++ FP_##OP##_##SZ(Fr, Fn, Fm); \
++ PACK_##SZ(N, Fr); }while(0)
++
++static int
++fadd(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, int n)
++{
++ BOTH_PRmn(ARITH_X, ADD);
++ return 0;
++}
++
++static int
++fsub(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, int n)
++{
++ BOTH_PRmn(ARITH_X, SUB);
++ return 0;
++}
++
++static int
++fmul(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, int n)
++{
++ BOTH_PRmn(ARITH_X, MUL);
++ return 0;
++}
++
++static int
++fdiv(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, int n)
++{
++ BOTH_PRmn(ARITH_X, DIV);
++ return 0;
++}
++
++static int
++fmac(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, int n)
++{
++ FP_DECL_EX;
++ FP_DECL_S(Fr);
++ FP_DECL_S(Ft);
++ FP_DECL_S(F0);
++ FP_DECL_S(Fm);
++ FP_DECL_S(Fn);
++ UNPACK_S(F0, FR0);
++ UNPACK_S(Fm, FRm);
++ UNPACK_S(Fn, FRn);
++ FP_MUL_S(Ft, Fm, F0);
++ FP_ADD_S(Fr, Fn, Ft);
++ PACK_S(FRn, Fr);
++ return 0;
++}
++
++// to process fmov's extention (odd n for DR access XD).
++#define FMOV_EXT(x) if(x&1) x+=16-1
++
++static int
++fmov_idx_reg(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m,
++ int n)
++{
++ if (FPSCR_SZ) {
++ FMOV_EXT(n);
++ READ(FRn, Rm + R0 + 4);
++ n++;
++ READ(FRn, Rm + R0);
++ } else {
++ READ(FRn, Rm + R0);
++ }
++
++ return 0;
++}
++
++static int
++fmov_mem_reg(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m,
++ int n)
++{
++ if (FPSCR_SZ) {
++ FMOV_EXT(n);
++ READ(FRn, Rm + 4);
++ n++;
++ READ(FRn, Rm);
++ } else {
++ READ(FRn, Rm);
++ }
++
++ return 0;
++}
++
++static int
++fmov_inc_reg(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m,
++ int n)
++{
++ if (FPSCR_SZ) {
++ FMOV_EXT(n);
++ READ(FRn, Rm + 4);
++ n++;
++ READ(FRn, Rm);
++ Rm += 8;
++ } else {
++ READ(FRn, Rm);
++ Rm += 4;
++ }
++
++ return 0;
++}
++
++static int
++fmov_reg_idx(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m,
++ int n)
++{
++ if (FPSCR_SZ) {
++ FMOV_EXT(m);
++ WRITE(FRm, Rn + R0 + 4);
++ m++;
++ WRITE(FRm, Rn + R0);
++ } else {
++ WRITE(FRm, Rn + R0);
++ }
++
++ return 0;
++}
++
++static int
++fmov_reg_mem(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m,
++ int n)
++{
++ if (FPSCR_SZ) {
++ FMOV_EXT(m);
++ WRITE(FRm, Rn + 4);
++ m++;
++ WRITE(FRm, Rn);
++ } else {
++ WRITE(FRm, Rn);
++ }
++
++ return 0;
++}
++
++static int
++fmov_reg_dec(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m,
++ int n)
++{
++ if (FPSCR_SZ) {
++ FMOV_EXT(m);
++ Rn -= 8;
++ WRITE(FRm, Rn + 4);
++ m++;
++ WRITE(FRm, Rn);
++ } else {
++ Rn -= 4;
++ WRITE(FRm, Rn);
++ }
++
++ return 0;
++}
++
++static int
++fmov_reg_reg(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m,
++ int n)
++{
++ if (FPSCR_SZ) {
++ FMOV_EXT(m);
++ FMOV_EXT(n);
++ DRn = DRm;
++ } else {
++ FRn = FRm;
++ }
++
++ return 0;
++}
++
++static int
++fnop_mn(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int m, int n)
++{
++ return -EINVAL;
++}
++
++// 1 arg instructions.
++#define NOTYETn(i) static int i(struct sh_fpu_soft_struct *fregs, int n) \
++ { printk( #i " not yet done.\n"); return 0; }
++
++NOTYETn(ftrv)
++NOTYETn(fsqrt)
++NOTYETn(fipr)
++NOTYETn(fsca)
++NOTYETn(fsrra)
++
++#define EMU_FLOAT_X(SZ,N) do { \
++ FP_DECL_##SZ(Fn); \
++ FP_FROM_INT_##SZ(Fn, FPUL, 32, int); \
++ PACK_##SZ(N, Fn); }while(0)
++static int ffloat(struct sh_fpu_soft_struct *fregs, int n)
++{
++ FP_DECL_EX;
++
++ if (FPSCR_PR)
++ EMU_FLOAT_X(D, DRn);
++ else
++ EMU_FLOAT_X(S, FRn);
++
++ return 0;
++}
++
++#define EMU_FTRC_X(SZ,N) do { \
++ FP_DECL_##SZ(Fn); \
++ UNPACK_##SZ(Fn, N); \
++ FP_TO_INT_##SZ(FPUL, Fn, 32, 1); }while(0)
++static int ftrc(struct sh_fpu_soft_struct *fregs, int n)
++{
++ FP_DECL_EX;
++
++ if (FPSCR_PR)
++ EMU_FTRC_X(D, DRn);
++ else
++ EMU_FTRC_X(S, FRn);
++
++ return 0;
++}
++
++static int fcnvsd(struct sh_fpu_soft_struct *fregs, int n)
++{
++ FP_DECL_EX;
++ FP_DECL_S(Fn);
++ FP_DECL_D(Fr);
++ UNPACK_S(Fn, FPUL);
++ FP_CONV(D, S, 2, 1, Fr, Fn);
++ PACK_D(DRn, Fr);
++ return 0;
++}
++
++static int fcnvds(struct sh_fpu_soft_struct *fregs, int n)
++{
++ FP_DECL_EX;
++ FP_DECL_D(Fn);
++ FP_DECL_S(Fr);
++ UNPACK_D(Fn, DRn);
++ FP_CONV(S, D, 1, 2, Fr, Fn);
++ PACK_S(FPUL, Fr);
++ return 0;
++}
++
++static int fxchg(struct sh_fpu_soft_struct *fregs, int flag)
++{
++ FPSCR ^= flag;
++ return 0;
++}
++
++static int fsts(struct sh_fpu_soft_struct *fregs, int n)
++{
++ FRn = FPUL;
++ return 0;
++}
++
++static int flds(struct sh_fpu_soft_struct *fregs, int n)
++{
++ FPUL = FRn;
++ return 0;
++}
++
++static int fneg(struct sh_fpu_soft_struct *fregs, int n)
++{
++ FRn ^= (1 << (_FP_W_TYPE_SIZE - 1));
++ return 0;
++}
++
++static int fabs(struct sh_fpu_soft_struct *fregs, int n)
++{
++ FRn &= ~(1 << (_FP_W_TYPE_SIZE - 1));
++ return 0;
++}
++
++static int fld0(struct sh_fpu_soft_struct *fregs, int n)
++{
++ FRn = 0;
++ return 0;
++}
++
++static int fld1(struct sh_fpu_soft_struct *fregs, int n)
++{
++ FRn = (_FP_EXPBIAS_S << (_FP_FRACBITS_S - 1));
++ return 0;
++}
++
++static int fnop_n(struct sh_fpu_soft_struct *fregs, int n)
++{
++ return -EINVAL;
++}
++
++/// Instruction decoders.
++
++static int id_fxfd(struct sh_fpu_soft_struct *, int);
++static int id_fnxd(struct sh_fpu_soft_struct *, struct pt_regs *, int, int);
++
++static int (*fnxd[])(struct sh_fpu_soft_struct *, int) = {
++ fsts, flds, ffloat, ftrc, fneg, fabs, fsqrt, fsrra,
++ fld0, fld1, fcnvsd, fcnvds, fnop_n, fnop_n, fipr, id_fxfd
++};
++
++static int (*fnmx[])(struct sh_fpu_soft_struct *, struct pt_regs *, int, int) = {
++ fadd, fsub, fmul, fdiv, fcmp_eq, fcmp_gt, fmov_idx_reg, fmov_reg_idx,
++ fmov_mem_reg, fmov_inc_reg, fmov_reg_mem, fmov_reg_dec,
++ fmov_reg_reg, id_fnxd, fmac, fnop_mn};
++
++static int id_fxfd(struct sh_fpu_soft_struct *fregs, int x)
++{
++ const int flag[] = { FPSCR_SZ, FPSCR_PR, FPSCR_FR, 0 };
++ switch (x & 3) {
++ case 3:
++ fxchg(fregs, flag[x >> 2]);
++ break;
++ case 1:
++ ftrv(fregs, x - 1);
++ break;
++ default:
++ fsca(fregs, x);
++ }
++ return 0;
++}
++
++static int
++id_fnxd(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, int x, int n)
++{
++ return (fnxd[x])(fregs, n);
++}
++
++static int
++id_fnmx(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, u16 code)
++{
++ int n = (code >> 8) & 0xf, m = (code >> 4) & 0xf, x = code & 0xf;
++ return (fnmx[x])(fregs, regs, m, n);
++}
++
++static int
++id_sys(struct sh_fpu_soft_struct *fregs, struct pt_regs *regs, u16 code)
++{
++ int n = ((code >> 8) & 0xf);
++ unsigned long *reg = (code & 0x0010) ? &FPUL : &FPSCR;
++
++ switch (code & 0xf0ff) {
++ case 0x005a:
++ case 0x006a:
++ Rn = *reg;
++ break;
++ case 0x405a:
++ case 0x406a:
++ *reg = Rn;
++ break;
++ case 0x4052:
++ case 0x4062:
++ Rn -= 4;
++ WRITE(*reg, Rn);
++ break;
++ case 0x4056:
++ case 0x4066:
++ READ(*reg, Rn);
++ Rn += 4;
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
++static int fpu_emulate(u16 code, struct sh_fpu_soft_struct *fregs, struct pt_regs *regs)
++{
++ if ((code & 0xf000) == 0xf000)
++ return id_fnmx(fregs, regs, code);
++ else
++ return id_sys(fregs, regs, code);
++}
++
++/**
++ * denormal_to_double - Given denormalized float number,
++ * store double float
++ *
++ * @fpu: Pointer to sh_fpu_hard structure
++ * @n: Index to FP register
++ */
++static void denormal_to_double(struct sh_fpu_hard_struct *fpu, int n)
++{
++ unsigned long du, dl;
++ unsigned long x = fpu->fpul;
++ int exp = 1023 - 126;
++
++ if (x != 0 && (x & 0x7f800000) == 0) {
++ du = (x & 0x80000000);
++ while ((x & 0x00800000) == 0) {
++ x <<= 1;
++ exp--;
++ }
++ x &= 0x007fffff;
++ du |= (exp << 20) | (x >> 3);
++ dl = x << 29;
++
++ fpu->fp_regs[n] = du;
++ fpu->fp_regs[n+1] = dl;
++ }
++}
++
++/**
++ * ieee_fpe_handler - Handle denormalized number exception
++ *
++ * @regs: Pointer to register structure
++ *
++ * Returns 1 when it's handled (should not cause exception).
++ */
++static int ieee_fpe_handler(struct pt_regs *regs)
++{
++ unsigned short insn = *(unsigned short *)regs->pc;
++ unsigned short finsn;
++ unsigned long nextpc;
++ int nib[4] = {
++ (insn >> 12) & 0xf,
++ (insn >> 8) & 0xf,
++ (insn >> 4) & 0xf,
++ insn & 0xf};
++
++ if (nib[0] == 0xb ||
++ (nib[0] == 0x4 && nib[2] == 0x0 && nib[3] == 0xb)) /* bsr & jsr */
++ regs->pr = regs->pc + 4;
++
++ if (nib[0] == 0xa || nib[0] == 0xb) { /* bra & bsr */
++ nextpc = regs->pc + 4 + ((short) ((insn & 0xfff) << 4) >> 3);
++ finsn = *(unsigned short *) (regs->pc + 2);
++ } else if (nib[0] == 0x8 && nib[1] == 0xd) { /* bt/s */
++ if (regs->sr & 1)
++ nextpc = regs->pc + 4 + ((char) (insn & 0xff) << 1);
++ else
++ nextpc = regs->pc + 4;
++ finsn = *(unsigned short *) (regs->pc + 2);
++ } else if (nib[0] == 0x8 && nib[1] == 0xf) { /* bf/s */
++ if (regs->sr & 1)
++ nextpc = regs->pc + 4;
++ else
++ nextpc = regs->pc + 4 + ((char) (insn & 0xff) << 1);
++ finsn = *(unsigned short *) (regs->pc + 2);
++ } else if (nib[0] == 0x4 && nib[3] == 0xb &&
++ (nib[2] == 0x0 || nib[2] == 0x2)) { /* jmp & jsr */
++ nextpc = regs->regs[nib[1]];
++ finsn = *(unsigned short *) (regs->pc + 2);
++ } else if (nib[0] == 0x0 && nib[3] == 0x3 &&
++ (nib[2] == 0x0 || nib[2] == 0x2)) { /* braf & bsrf */
++ nextpc = regs->pc + 4 + regs->regs[nib[1]];
++ finsn = *(unsigned short *) (regs->pc + 2);
++ } else if (insn == 0x000b) { /* rts */
++ nextpc = regs->pr;
++ finsn = *(unsigned short *) (regs->pc + 2);
++ } else {
++ nextpc = regs->pc + 2;
++ finsn = insn;
++ }
++
++ if ((finsn & 0xf1ff) == 0xf0ad) { /* fcnvsd */
++ struct task_struct *tsk = current;
++
++ if ((tsk->thread.fpu.hard.fpscr & (1 << 17))) {
++ /* FPU error */
++ denormal_to_double (&tsk->thread.fpu.hard,
++ (finsn >> 8) & 0xf);
++ tsk->thread.fpu.hard.fpscr &=
++ ~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK);
++ set_tsk_thread_flag(tsk, TIF_USEDFPU);
++ } else {
++ tsk->thread.trap_no = 11;
++ tsk->thread.error_code = 0;
++ force_sig(SIGFPE, tsk);
++ }
++
++ regs->pc = nextpc;
++ return 1;
++ }
++
++ return 0;
++}
++
++asmlinkage void do_fpu_error(unsigned long r4, unsigned long r5,
++ unsigned long r6, unsigned long r7,
++ struct pt_regs regs)
++{
++ struct task_struct *tsk = current;
++
++ if (ieee_fpe_handler (&regs))
++ return;
++
++ regs.pc += 2;
++ tsk->thread.trap_no = 11;
++ tsk->thread.error_code = 0;
++ force_sig(SIGFPE, tsk);
++}
++
++/**
++ * fpu_init - Initialize FPU registers
++ * @fpu: Pointer to software emulated FPU registers.
++ */
++static void fpu_init(struct sh_fpu_soft_struct *fpu)
++{
++ int i;
++
++ fpu->fpscr = FPSCR_INIT;
++ fpu->fpul = 0;
++
++ for (i = 0; i < 16; i++) {
++ fpu->fp_regs[i] = 0;
++ fpu->xfp_regs[i]= 0;
++ }
++}
++
++/**
++ * do_fpu_inst - Handle reserved instructions for FPU emulation
++ * @inst: instruction code.
++ * @regs: registers on stack.
++ */
++int do_fpu_inst(unsigned short inst, struct pt_regs *regs)
++{
++ struct task_struct *tsk = current;
++ struct sh_fpu_soft_struct *fpu = &(tsk->thread.fpu.soft);
++
++ if (!test_tsk_thread_flag(tsk, TIF_USEDFPU)) {
++ /* initialize once. */
++ fpu_init(fpu);
++ set_tsk_thread_flag(tsk, TIF_USEDFPU);
++ }
++
++ return fpu_emulate(inst, fpu, regs);
++}
+diff -ruN linux-2.6.17-vanilla/arch/sh/math-emu/sfp-util.h linux-2.6.17/arch/sh/math-emu/sfp-util.h
+--- linux-2.6.17-vanilla/arch/sh/math-emu/sfp-util.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/math-emu/sfp-util.h 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1,72 @@
++/*
++ * These are copied from glibc/stdlib/longlong.h
++ */
++
++#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
++ do { \
++ UWtype __x; \
++ __x = (al) + (bl); \
++ (sh) = (ah) + (bh) + (__x < (al)); \
++ (sl) = __x; \
++ } while (0)
++
++#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
++ do { \
++ UWtype __x; \
++ __x = (al) - (bl); \
++ (sh) = (ah) - (bh) - (__x > (al)); \
++ (sl) = __x; \
++ } while (0)
++
++#define umul_ppmm(w1, w0, u, v) \
++ __asm__ ("dmulu.l %2,%3\n\tsts macl,%1\n\tsts mach,%0" \
++ : "=r" ((u32)(w1)), "=r" ((u32)(w0)) \
++ : "r" ((u32)(u)), "r" ((u32)(v)) \
++ : "macl", "mach")
++
++#define __ll_B ((UWtype) 1 << (W_TYPE_SIZE / 2))
++#define __ll_lowpart(t) ((UWtype) (t) & (__ll_B - 1))
++#define __ll_highpart(t) ((UWtype) (t) >> (W_TYPE_SIZE / 2))
++
++#define udiv_qrnnd(q, r, n1, n0, d) \
++ do { \
++ UWtype __d1, __d0, __q1, __q0; \
++ UWtype __r1, __r0, __m; \
++ __d1 = __ll_highpart (d); \
++ __d0 = __ll_lowpart (d); \
++ \
++ __r1 = (n1) % __d1; \
++ __q1 = (n1) / __d1; \
++ __m = (UWtype) __q1 * __d0; \
++ __r1 = __r1 * __ll_B | __ll_highpart (n0); \
++ if (__r1 < __m) \
++ { \
++ __q1--, __r1 += (d); \
++ if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\
++ if (__r1 < __m) \
++ __q1--, __r1 += (d); \
++ } \
++ __r1 -= __m; \
++ \
++ __r0 = __r1 % __d1; \
++ __q0 = __r1 / __d1; \
++ __m = (UWtype) __q0 * __d0; \
++ __r0 = __r0 * __ll_B | __ll_lowpart (n0); \
++ if (__r0 < __m) \
++ { \
++ __q0--, __r0 += (d); \
++ if (__r0 >= (d)) \
++ if (__r0 < __m) \
++ __q0--, __r0 += (d); \
++ } \
++ __r0 -= __m; \
++ \
++ (q) = (UWtype) __q1 * __ll_B | __q0; \
++ (r) = __r0; \
++ } while (0)
++
++#define abort() return 0
++
++#define __BYTE_ORDER __LITTLE_ENDIAN
++
++
+diff -ruN linux-2.6.17-vanilla/arch/sh/mm/CVS/Entries linux-2.6.17/arch/sh/mm/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/mm/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/mm/CVS/Entries 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1,25 @@
++/Kconfig/1.10/Sun Jan 8 12:22:58 2006/-ko/
++/Makefile/1.14/Wed Jan 4 14:49:04 2006//
++/cache-sh2.c/1.5/Thu Jul 8 13:52:22 2004/-ko/
++/cache-sh3.c/1.11/Thu Jul 8 13:52:22 2004/-ko/
++/cache-sh4.c/1.38/Thu Oct 20 22:48:04 2005/-ko/
++/cache-sh7705.c/1.2/Tue Jun 21 04:15:48 2005/-ko/
++/clear_page.S/1.14/Sat Jul 2 13:00:24 2005/-ko/
++/copy_page.S/1.8/Mon Aug 25 17:03:10 2003//
++/extable.c/1.5/Tue Jun 15 18:40:43 2004/-ko/
++/fault-nommu.c/1.3/Mon Oct 25 10:41:02 2004/-ko/
++/fault.c/1.21/Mon Mar 27 21:06:14 2006/-ko/
++/ioremap.c/1.16/Wed Feb 8 13:21:41 2006/-ko/
++/pg-dma.c/1.4/Sat Mar 6 22:26:37 2004//
++/pg-nommu.c/1.1/Sat Oct 25 21:45:29 2003//
++/pg-sh4.c/1.5/Thu Sep 1 18:59:11 2005/-ko/
++/pg-sh7705.c/1.2/Tue Jun 21 04:15:48 2005/-ko/
++/pmb.c/1.2/Tue Jan 3 22:51:47 2006/-ko/
++/tlb-flush.c/1.1/Sat Dec 31 11:30:47 2005/-ko/
++/tlb-nommu.c/1.2/Sun May 4 19:29:55 2003/-ko/
++/tlb-sh3.c/1.7/Sat Aug 13 14:30:27 2005/-ko/
++/tlb-sh4.c/1.7/Sat Oct 8 22:08:39 2005/-ko/
++/consistent.c/1.10/Wed Jul 5 14:50:50 2006//
++/hugetlbpage.c/1.12/Wed Jul 5 14:50:50 2006/-ko/
++/init.c/1.28/Wed Jul 5 14:50:50 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/mm/CVS/Repository linux-2.6.17/arch/sh/mm/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/mm/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/mm/CVS/Repository 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/mm
+diff -ruN linux-2.6.17-vanilla/arch/sh/mm/CVS/Root linux-2.6.17/arch/sh/mm/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/mm/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/mm/CVS/Root 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/mm/Kconfig linux-2.6.17/arch/sh/mm/Kconfig
+--- linux-2.6.17-vanilla/arch/sh/mm/Kconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/mm/Kconfig 2006-07-12 16:54:23.000000000 +0000
+@@ -20,7 +20,6 @@
+ config CPU_SH4A
+ bool
+ select CPU_SH4
+- select CPU_HAS_INTC2_IRQ
+
+ config CPU_SUBTYPE_ST40
+ bool
+@@ -144,6 +143,7 @@
+ config CPU_SUBTYPE_SH7780
+ bool "Support SH7780 processor"
+ select CPU_SH4A
++ select CPU_HAS_INTC2_IRQ
+
+ endmenu
+
+diff -ruN linux-2.6.17-vanilla/arch/sh/mm/Makefile linux-2.6.17/arch/sh/mm/Makefile
+--- linux-2.6.17-vanilla/arch/sh/mm/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/mm/Makefile 2006-07-12 16:54:23.000000000 +0000
+@@ -12,14 +12,16 @@
+ obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o
+
+ mmu-y := fault-nommu.o tlb-nommu.o pg-nommu.o
+-mmu-$(CONFIG_MMU) := fault.o clear_page.o copy_page.o
++mmu-$(CONFIG_MMU) := fault.o clear_page.o copy_page.o tlb-flush.o \
++ ioremap.o
+
+ obj-y += $(mmu-y)
+
+ ifdef CONFIG_MMU
+-obj-$(CONFIG_CPU_SH3) += tlb-sh3.o
+-obj-$(CONFIG_CPU_SH4) += tlb-sh4.o ioremap.o
++obj-$(CONFIG_CPU_SH3) += tlb-sh3.o
++obj-$(CONFIG_CPU_SH4) += tlb-sh4.o
+ obj-$(CONFIG_SH7705_CACHE_32KB) += pg-sh7705.o
+ endif
+
+-obj-$(CONFIG_SH7705_CACHE_32KB) += cache-sh7705.o
++obj-$(CONFIG_SH7705_CACHE_32KB) += cache-sh7705.o
++obj-$(CONFIG_32BIT) += pmb.o
+diff -ruN linux-2.6.17-vanilla/arch/sh/mm/cache-sh4.c linux-2.6.17/arch/sh/mm/cache-sh4.c
+--- linux-2.6.17-vanilla/arch/sh/mm/cache-sh4.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/mm/cache-sh4.c 2006-07-12 16:54:23.000000000 +0000
+@@ -2,7 +2,7 @@
+ * arch/sh/mm/cache-sh4.c
+ *
+ * Copyright (C) 1999, 2000, 2002 Niibe Yutaka
+- * Copyright (C) 2001, 2002, 2003, 2004 Paul Mundt
++ * Copyright (C) 2001, 2002, 2003, 2004, 2005 Paul Mundt
+ * Copyright (C) 2003 Richard Curnow
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+@@ -26,26 +26,95 @@
+ #include <asm/mmu_context.h>
+ #include <asm/cacheflush.h>
+
+-extern void __flush_cache_4096_all(unsigned long start);
+-static void __flush_cache_4096_all_ex(unsigned long start);
+-extern void __flush_dcache_all(void);
+-static void __flush_dcache_all_ex(void);
++static void __flush_dcache_segment_1way(unsigned long start,
++ unsigned long extent);
++static void __flush_dcache_segment_2way(unsigned long start,
++ unsigned long extent);
++static void __flush_dcache_segment_4way(unsigned long start,
++ unsigned long extent);
++
++static void __flush_cache_4096(unsigned long addr, unsigned long phys,
++ unsigned long exec_offset);
++
++/*
++ * This is initialised here to ensure that it is not placed in the BSS. If
++ * that were to happen, note that cache_init gets called before the BSS is
++ * cleared, so this would get nulled out which would be hopeless.
++ */
++static void (*__flush_dcache_segment_fn)(unsigned long, unsigned long) =
++ (void (*)(unsigned long, unsigned long))0xdeadbeef;
++
++static void compute_alias(struct cache_info *c)
++{
++ c->alias_mask = ((c->sets - 1) << c->entry_shift) & ~(PAGE_SIZE - 1);
++ c->n_aliases = (c->alias_mask >> PAGE_SHIFT) + 1;
++}
++
++static void __init emit_cache_params(void)
++{
++ printk("PVR=%08x CVR=%08x PRR=%08x\n",
++ ctrl_inl(CCN_PVR),
++ ctrl_inl(CCN_CVR),
++ ctrl_inl(CCN_PRR));
++ printk("I-cache : n_ways=%d n_sets=%d way_incr=%d\n",
++ cpu_data->icache.ways,
++ cpu_data->icache.sets,
++ cpu_data->icache.way_incr);
++ printk("I-cache : entry_mask=0x%08x alias_mask=0x%08x n_aliases=%d\n",
++ cpu_data->icache.entry_mask,
++ cpu_data->icache.alias_mask,
++ cpu_data->icache.n_aliases);
++ printk("D-cache : n_ways=%d n_sets=%d way_incr=%d\n",
++ cpu_data->dcache.ways,
++ cpu_data->dcache.sets,
++ cpu_data->dcache.way_incr);
++ printk("D-cache : entry_mask=0x%08x alias_mask=0x%08x n_aliases=%d\n",
++ cpu_data->dcache.entry_mask,
++ cpu_data->dcache.alias_mask,
++ cpu_data->dcache.n_aliases);
++
++ if (!__flush_dcache_segment_fn)
++ panic("unknown number of cache ways\n");
++}
+
+ /*
+ * SH-4 has virtually indexed and physically tagged cache.
+ */
+
+-struct semaphore p3map_sem[4];
++/* Worst case assumed to be 64k cache, direct-mapped i.e. 4 synonym bits. */
++#define MAX_P3_SEMAPHORES 16
++
++struct semaphore p3map_sem[MAX_P3_SEMAPHORES];
+
+ void __init p3_cache_init(void)
+ {
+- if (remap_area_pages(P3SEG, 0, PAGE_SIZE*4, _PAGE_CACHABLE))
++ int i;
++
++ compute_alias(&cpu_data->icache);
++ compute_alias(&cpu_data->dcache);
++
++ switch (cpu_data->dcache.ways) {
++ case 1:
++ __flush_dcache_segment_fn = __flush_dcache_segment_1way;
++ break;
++ case 2:
++ __flush_dcache_segment_fn = __flush_dcache_segment_2way;
++ break;
++ case 4:
++ __flush_dcache_segment_fn = __flush_dcache_segment_4way;
++ break;
++ default:
++ __flush_dcache_segment_fn = NULL;
++ break;
++ }
++
++ emit_cache_params();
++
++ if (remap_area_pages(P3SEG, 0, PAGE_SIZE * 4, _PAGE_CACHABLE))
+ panic("%s failed.", __FUNCTION__);
+
+- sema_init (&p3map_sem[0], 1);
+- sema_init (&p3map_sem[1], 1);
+- sema_init (&p3map_sem[2], 1);
+- sema_init (&p3map_sem[3], 1);
++ for (i = 0; i < cpu_data->dcache.n_aliases; i++)
++ sema_init(&p3map_sem[i], 1);
+ }
+
+ /*
+@@ -90,7 +159,6 @@
+ }
+ }
+
+-
+ /*
+ * No write back please
+ */
+@@ -109,40 +177,6 @@
+ }
+ }
+
+-static void __flush_dcache_all_ex(void)
+-{
+- unsigned long addr, end_addr, entry_offset;
+-
+- end_addr = CACHE_OC_ADDRESS_ARRAY + (cpu_data->dcache.sets << cpu_data->dcache.entry_shift) * cpu_data->dcache.ways;
+- entry_offset = 1 << cpu_data->dcache.entry_shift;
+- for (addr = CACHE_OC_ADDRESS_ARRAY; addr < end_addr; addr += entry_offset) {
+- ctrl_outl(0, addr);
+- }
+-}
+-
+-static void __flush_cache_4096_all_ex(unsigned long start)
+-{
+- unsigned long addr, entry_offset;
+- int i;
+-
+- entry_offset = 1 << cpu_data->dcache.entry_shift;
+- for (i = 0; i < cpu_data->dcache.ways; i++, start += cpu_data->dcache.way_incr) {
+- for (addr = CACHE_OC_ADDRESS_ARRAY + start;
+- addr < CACHE_OC_ADDRESS_ARRAY + 4096 + start;
+- addr += entry_offset) {
+- ctrl_outl(0, addr);
+- }
+- }
+-}
+-
+-void flush_cache_4096_all(unsigned long start)
+-{
+- if (cpu_data->dcache.ways == 1)
+- __flush_cache_4096_all(start);
+- else
+- __flush_cache_4096_all_ex(start);
+-}
+-
+ /*
+ * Write back the range of D-cache, and purge the I-cache.
+ *
+@@ -154,14 +188,14 @@
+ }
+
+ /*
+- * Write back the D-cache and purge the I-cache for signal trampoline.
++ * Write back the D-cache and purge the I-cache for signal trampoline.
+ * .. which happens to be the same behavior as flush_icache_range().
+ * So, we simply flush out a line.
+ */
+ void flush_cache_sigtramp(unsigned long addr)
+ {
+ unsigned long v, index;
+- unsigned long flags;
++ unsigned long flags;
+ int i;
+
+ v = addr & ~(L1_CACHE_BYTES-1);
+@@ -173,29 +207,34 @@
+
+ local_irq_save(flags);
+ jump_to_P2();
+- for(i = 0; i < cpu_data->icache.ways; i++, index += cpu_data->icache.way_incr)
++
++ for (i = 0; i < cpu_data->icache.ways;
++ i++, index += cpu_data->icache.way_incr)
+ ctrl_outl(0, index); /* Clear out Valid-bit */
++
+ back_to_P1();
++ wmb();
+ local_irq_restore(flags);
+ }
+
+ static inline void flush_cache_4096(unsigned long start,
+ unsigned long phys)
+ {
+- unsigned long flags;
+- extern void __flush_cache_4096(unsigned long addr, unsigned long phys, unsigned long exec_offset);
++ unsigned long flags;
+
+ /*
+- * SH7751, SH7751R, and ST40 have no restriction to handle cache.
+- * (While SH7750 must do that at P2 area.)
++ * All types of SH-4 require PC to be in P2 to operate on the I-cache.
++ * Some types of SH-4 require PC to be in P2 to operate on the D-cache.
+ */
+ if ((cpu_data->flags & CPU_HAS_P2_FLUSH_BUG)
+ || start < CACHE_OC_ADDRESS_ARRAY) {
+ local_irq_save(flags);
+- __flush_cache_4096(start | SH_CACHE_ASSOC, P1SEGADDR(phys), 0x20000000);
++ __flush_cache_4096(start | SH_CACHE_ASSOC,
++ P1SEGADDR(phys), 0x20000000);
+ local_irq_restore(flags);
+ } else {
+- __flush_cache_4096(start | SH_CACHE_ASSOC, P1SEGADDR(phys), 0);
++ __flush_cache_4096(start | SH_CACHE_ASSOC,
++ P1SEGADDR(phys), 0);
+ }
+ }
+
+@@ -207,13 +246,16 @@
+ {
+ if (test_bit(PG_mapped, &page->flags)) {
+ unsigned long phys = PHYSADDR(page_address(page));
++ unsigned long addr = CACHE_OC_ADDRESS_ARRAY;
++ int i, n;
+
+ /* Loop all the D-cache */
+- flush_cache_4096(CACHE_OC_ADDRESS_ARRAY, phys);
+- flush_cache_4096(CACHE_OC_ADDRESS_ARRAY | 0x1000, phys);
+- flush_cache_4096(CACHE_OC_ADDRESS_ARRAY | 0x2000, phys);
+- flush_cache_4096(CACHE_OC_ADDRESS_ARRAY | 0x3000, phys);
++ n = cpu_data->dcache.n_aliases;
++ for (i = 0; i < n; i++, addr += PAGE_SIZE)
++ flush_cache_4096(addr, phys);
+ }
++
++ wmb();
+ }
+
+ static inline void flush_icache_all(void)
+@@ -228,32 +270,38 @@
+ ccr |= CCR_CACHE_ICI;
+ ctrl_outl(ccr, CCR);
+
++ /*
++ * back_to_P1() will take care of the barrier for us, don't add
++ * another one!
++ */
++
+ back_to_P1();
+ local_irq_restore(flags);
+ }
+
++void flush_dcache_all(void)
++{
++ (*__flush_dcache_segment_fn)(0UL, cpu_data->dcache.way_size);
++ wmb();
++}
++
+ void flush_cache_all(void)
+ {
+- if (cpu_data->dcache.ways == 1)
+- __flush_dcache_all();
+- else
+- __flush_dcache_all_ex();
++ flush_dcache_all();
+ flush_icache_all();
+ }
+
+ void flush_cache_mm(struct mm_struct *mm)
+ {
+- /* Is there any good way? */
+- /* XXX: possibly call flush_cache_range for each vm area */
+- /*
+- * FIXME: Really, the optimal solution here would be able to flush out
+- * individual lines created by the specified context, but this isn't
+- * feasible for a number of architectures (such as MIPS, and some
+- * SPARC) .. is this possible for SuperH?
+- *
+- * In the meantime, we'll just flush all of the caches.. this
+- * seems to be the simplest way to avoid at least a few wasted
+- * cache flushes. -Lethal
++ /*
++ * Note : (RPC) since the caches are physically tagged, the only point
++ * of flush_cache_mm for SH-4 is to get rid of aliases from the
++ * D-cache. The assumption elsewhere, e.g. flush_cache_range, is that
++ * lines can stay resident so long as the virtual address they were
++ * accessed with (hence cache set) is in accord with the physical
++ * address (i.e. tag). It's no different here. So I reckon we don't
++ * need to flush the I-cache, since aliases don't matter for that. We
++ * should try that.
+ */
+ flush_cache_all();
+ }
+@@ -267,24 +315,36 @@
+ void flush_cache_page(struct vm_area_struct *vma, unsigned long address, unsigned long pfn)
+ {
+ unsigned long phys = pfn << PAGE_SHIFT;
++ unsigned int alias_mask;
++
++ alias_mask = cpu_data->dcache.alias_mask;
+
+ /* We only need to flush D-cache when we have alias */
+- if ((address^phys) & CACHE_ALIAS) {
++ if ((address^phys) & alias_mask) {
+ /* Loop 4K of the D-cache */
+ flush_cache_4096(
+- CACHE_OC_ADDRESS_ARRAY | (address & CACHE_ALIAS),
++ CACHE_OC_ADDRESS_ARRAY | (address & alias_mask),
+ phys);
+ /* Loop another 4K of the D-cache */
+ flush_cache_4096(
+- CACHE_OC_ADDRESS_ARRAY | (phys & CACHE_ALIAS),
++ CACHE_OC_ADDRESS_ARRAY | (phys & alias_mask),
+ phys);
+ }
+
+- if (vma->vm_flags & VM_EXEC)
+- /* Loop 4K (half) of the I-cache */
++ alias_mask = cpu_data->icache.alias_mask;
++ if (vma->vm_flags & VM_EXEC) {
++ /*
++ * Evict entries from the portion of the cache from which code
++ * may have been executed at this address (virtual). There's
++ * no need to evict from the portion corresponding to the
++ * physical address as for the D-cache, because we know the
++ * kernel has never executed the code through its identity
++ * translation.
++ */
+ flush_cache_4096(
+- CACHE_IC_ADDRESS_ARRAY | (address & 0x1000),
++ CACHE_IC_ADDRESS_ARRAY | (address & alias_mask),
+ phys);
++ }
+ }
+
+ /*
+@@ -299,52 +359,96 @@
+ void flush_cache_range(struct vm_area_struct *vma, unsigned long start,
+ unsigned long end)
+ {
+- unsigned long p = start & PAGE_MASK;
++ unsigned long d = 0, p = start & PAGE_MASK;
++ unsigned long alias_mask = cpu_data->dcache.alias_mask;
++ unsigned long n_aliases = cpu_data->dcache.n_aliases;
++ unsigned long select_bit;
++ unsigned long all_aliases_mask;
++ unsigned long addr_offset;
++ unsigned long phys;
+ pgd_t *dir;
+ pmd_t *pmd;
++ pud_t *pud;
+ pte_t *pte;
+ pte_t entry;
+- unsigned long phys;
+- unsigned long d = 0;
++ int i;
++
++ /*
++ * If cache is only 4k-per-way, there are never any 'aliases'. Since
++ * the cache is physically tagged, the data can just be left in there.
++ */
++ if (n_aliases == 0)
++ return;
++
++ all_aliases_mask = (1 << n_aliases) - 1;
++
++ /*
++ * Don't bother with the lookup and alias check if we have a
++ * wide range to cover, just blow away the dcache in its
++ * entirety instead. -- PFM.
++ */
++ if (((end - start) >> PAGE_SHIFT) >= 64) {
++ flush_dcache_all();
++
++ if (vma->vm_flags & VM_EXEC)
++ flush_icache_all();
++
++ return;
++ }
+
+ dir = pgd_offset(vma->vm_mm, p);
+- pmd = pmd_offset(dir, p);
++ pud = pud_offset(dir, p);
++ pmd = pmd_offset(pud, p);
++ end = PAGE_ALIGN(end);
+
+ do {
+ if (pmd_none(*pmd) || pmd_bad(*pmd)) {
+- p &= ~((1 << PMD_SHIFT) -1);
++ p &= ~((1 << PMD_SHIFT) - 1);
+ p += (1 << PMD_SHIFT);
+ pmd++;
++
+ continue;
+ }
++
+ pte = pte_offset_kernel(pmd, p);
++
+ do {
+ entry = *pte;
++
+ if ((pte_val(entry) & _PAGE_PRESENT)) {
+- phys = pte_val(entry)&PTE_PHYS_MASK;
+- if ((p^phys) & CACHE_ALIAS) {
+- d |= 1 << ((p & CACHE_ALIAS)>>12);
+- d |= 1 << ((phys & CACHE_ALIAS)>>12);
+- if (d == 0x0f)
++ phys = pte_val(entry) & PTE_PHYS_MASK;
++
++ if ((p ^ phys) & alias_mask) {
++ d |= 1 << ((p & alias_mask) >> PAGE_SHIFT);
++ d |= 1 << ((phys & alias_mask) >> PAGE_SHIFT);
++
++ if (d == all_aliases_mask)
+ goto loop_exit;
+ }
+ }
++
+ pte++;
+ p += PAGE_SIZE;
+ } while (p < end && ((unsigned long)pte & ~PAGE_MASK));
+ pmd++;
+ } while (p < end);
+- loop_exit:
+- if (d & 1)
+- flush_cache_4096_all(0);
+- if (d & 2)
+- flush_cache_4096_all(0x1000);
+- if (d & 4)
+- flush_cache_4096_all(0x2000);
+- if (d & 8)
+- flush_cache_4096_all(0x3000);
+- if (vma->vm_flags & VM_EXEC)
++
++loop_exit:
++ for (i = 0, select_bit = 0x1, addr_offset = 0x0; i < n_aliases;
++ i++, select_bit <<= 1, addr_offset += PAGE_SIZE)
++ if (d & select_bit) {
++ (*__flush_dcache_segment_fn)(addr_offset, PAGE_SIZE);
++ wmb();
++ }
++
++ if (vma->vm_flags & VM_EXEC) {
++ /*
++ * TODO: Is this required??? Need to look at how I-cache
++ * coherency is assured when new programs are loaded to see if
++ * this matters.
++ */
+ flush_icache_all();
++ }
+ }
+
+ /*
+@@ -358,5 +462,274 @@
+ struct page *page, unsigned long addr, int len)
+ {
+ flush_cache_page(vma, addr, page_to_pfn(page));
++ mb();
++}
++
++/**
++ * __flush_cache_4096
++ *
++ * @addr: address in memory mapped cache array
++ * @phys: P1 address to flush (has to match tags if addr has 'A' bit
++ * set i.e. associative write)
++ * @exec_offset: set to 0x20000000 if flush has to be executed from P2
++ * region else 0x0
++ *
++ * The offset into the cache array implied by 'addr' selects the
++ * 'colour' of the virtual address range that will be flushed. The
++ * operation (purge/write-back) is selected by the lower 2 bits of
++ * 'phys'.
++ */
++static void __flush_cache_4096(unsigned long addr, unsigned long phys,
++ unsigned long exec_offset)
++{
++ int way_count;
++ unsigned long base_addr = addr;
++ struct cache_info *dcache;
++ unsigned long way_incr;
++ unsigned long a, ea, p;
++ unsigned long temp_pc;
++
++ dcache = &cpu_data->dcache;
++ /* Write this way for better assembly. */
++ way_count = dcache->ways;
++ way_incr = dcache->way_incr;
++
++ /*
++ * Apply exec_offset (i.e. branch to P2 if required.).
++ *
++ * FIXME:
++ *
++ * If I write "=r" for the (temp_pc), it puts this in r6 hence
++ * trashing exec_offset before it's been added on - why? Hence
++ * "=&r" as a 'workaround'
++ */
++ asm volatile("mov.l 1f, %0\n\t"
++ "add %1, %0\n\t"
++ "jmp @%0\n\t"
++ "nop\n\t"
++ ".balign 4\n\t"
++ "1: .long 2f\n\t"
++ "2:\n" : "=&r" (temp_pc) : "r" (exec_offset));
++
++ /*
++ * We know there will be >=1 iteration, so write as do-while to avoid
++ * pointless nead-of-loop check for 0 iterations.
++ */
++ do {
++ ea = base_addr + PAGE_SIZE;
++ a = base_addr;
++ p = phys;
++
++ do {
++ *(volatile unsigned long *)a = p;
++ /*
++ * Next line: intentionally not p+32, saves an add, p
++ * will do since only the cache tag bits need to
++ * match.
++ */
++ *(volatile unsigned long *)(a+32) = p;
++ a += 64;
++ p += 64;
++ } while (a < ea);
++
++ base_addr += way_incr;
++ } while (--way_count != 0);
++}
++
++/*
++ * Break the 1, 2 and 4 way variants of this out into separate functions to
++ * avoid nearly all the overhead of having the conditional stuff in the function
++ * bodies (+ the 1 and 2 way cases avoid saving any registers too).
++ */
++static void __flush_dcache_segment_1way(unsigned long start,
++ unsigned long extent_per_way)
++{
++ unsigned long orig_sr, sr_with_bl;
++ unsigned long base_addr;
++ unsigned long way_incr, linesz, way_size;
++ struct cache_info *dcache;
++ register unsigned long a0, a0e;
++
++ asm volatile("stc sr, %0" : "=r" (orig_sr));
++ sr_with_bl = orig_sr | (1<<28);
++ base_addr = ((unsigned long)&empty_zero_page[0]);
++
++ /*
++ * The previous code aligned base_addr to 16k, i.e. the way_size of all
++ * existing SH-4 D-caches. Whilst I don't see a need to have this
++ * aligned to any better than the cache line size (which it will be
++ * anyway by construction), let's align it to at least the way_size of
++ * any existing or conceivable SH-4 D-cache. -- RPC
++ */
++ base_addr = ((base_addr >> 16) << 16);
++ base_addr |= start;
++
++ dcache = &cpu_data->dcache;
++ linesz = dcache->linesz;
++ way_incr = dcache->way_incr;
++ way_size = dcache->way_size;
++
++ a0 = base_addr;
++ a0e = base_addr + extent_per_way;
++ do {
++ asm volatile("ldc %0, sr" : : "r" (sr_with_bl));
++ asm volatile("movca.l r0, @%0\n\t"
++ "ocbi @%0" : : "r" (a0));
++ a0 += linesz;
++ asm volatile("movca.l r0, @%0\n\t"
++ "ocbi @%0" : : "r" (a0));
++ a0 += linesz;
++ asm volatile("movca.l r0, @%0\n\t"
++ "ocbi @%0" : : "r" (a0));
++ a0 += linesz;
++ asm volatile("movca.l r0, @%0\n\t"
++ "ocbi @%0" : : "r" (a0));
++ asm volatile("ldc %0, sr" : : "r" (orig_sr));
++ a0 += linesz;
++ } while (a0 < a0e);
++}
++
++static void __flush_dcache_segment_2way(unsigned long start,
++ unsigned long extent_per_way)
++{
++ unsigned long orig_sr, sr_with_bl;
++ unsigned long base_addr;
++ unsigned long way_incr, linesz, way_size;
++ struct cache_info *dcache;
++ register unsigned long a0, a1, a0e;
++
++ asm volatile("stc sr, %0" : "=r" (orig_sr));
++ sr_with_bl = orig_sr | (1<<28);
++ base_addr = ((unsigned long)&empty_zero_page[0]);
++
++ /* See comment under 1-way above */
++ base_addr = ((base_addr >> 16) << 16);
++ base_addr |= start;
++
++ dcache = &cpu_data->dcache;
++ linesz = dcache->linesz;
++ way_incr = dcache->way_incr;
++ way_size = dcache->way_size;
++
++ a0 = base_addr;
++ a1 = a0 + way_incr;
++ a0e = base_addr + extent_per_way;
++ do {
++ asm volatile("ldc %0, sr" : : "r" (sr_with_bl));
++ asm volatile("movca.l r0, @%0\n\t"
++ "movca.l r0, @%1\n\t"
++ "ocbi @%0\n\t"
++ "ocbi @%1" : :
++ "r" (a0), "r" (a1));
++ a0 += linesz;
++ a1 += linesz;
++ asm volatile("movca.l r0, @%0\n\t"
++ "movca.l r0, @%1\n\t"
++ "ocbi @%0\n\t"
++ "ocbi @%1" : :
++ "r" (a0), "r" (a1));
++ a0 += linesz;
++ a1 += linesz;
++ asm volatile("movca.l r0, @%0\n\t"
++ "movca.l r0, @%1\n\t"
++ "ocbi @%0\n\t"
++ "ocbi @%1" : :
++ "r" (a0), "r" (a1));
++ a0 += linesz;
++ a1 += linesz;
++ asm volatile("movca.l r0, @%0\n\t"
++ "movca.l r0, @%1\n\t"
++ "ocbi @%0\n\t"
++ "ocbi @%1" : :
++ "r" (a0), "r" (a1));
++ asm volatile("ldc %0, sr" : : "r" (orig_sr));
++ a0 += linesz;
++ a1 += linesz;
++ } while (a0 < a0e);
++}
++
++static void __flush_dcache_segment_4way(unsigned long start,
++ unsigned long extent_per_way)
++{
++ unsigned long orig_sr, sr_with_bl;
++ unsigned long base_addr;
++ unsigned long way_incr, linesz, way_size;
++ struct cache_info *dcache;
++ register unsigned long a0, a1, a2, a3, a0e;
++
++ asm volatile("stc sr, %0" : "=r" (orig_sr));
++ sr_with_bl = orig_sr | (1<<28);
++ base_addr = ((unsigned long)&empty_zero_page[0]);
++
++ /* See comment under 1-way above */
++ base_addr = ((base_addr >> 16) << 16);
++ base_addr |= start;
++
++ dcache = &cpu_data->dcache;
++ linesz = dcache->linesz;
++ way_incr = dcache->way_incr;
++ way_size = dcache->way_size;
++
++ a0 = base_addr;
++ a1 = a0 + way_incr;
++ a2 = a1 + way_incr;
++ a3 = a2 + way_incr;
++ a0e = base_addr + extent_per_way;
++ do {
++ asm volatile("ldc %0, sr" : : "r" (sr_with_bl));
++ asm volatile("movca.l r0, @%0\n\t"
++ "movca.l r0, @%1\n\t"
++ "movca.l r0, @%2\n\t"
++ "movca.l r0, @%3\n\t"
++ "ocbi @%0\n\t"
++ "ocbi @%1\n\t"
++ "ocbi @%2\n\t"
++ "ocbi @%3\n\t" : :
++ "r" (a0), "r" (a1), "r" (a2), "r" (a3));
++ a0 += linesz;
++ a1 += linesz;
++ a2 += linesz;
++ a3 += linesz;
++ asm volatile("movca.l r0, @%0\n\t"
++ "movca.l r0, @%1\n\t"
++ "movca.l r0, @%2\n\t"
++ "movca.l r0, @%3\n\t"
++ "ocbi @%0\n\t"
++ "ocbi @%1\n\t"
++ "ocbi @%2\n\t"
++ "ocbi @%3\n\t" : :
++ "r" (a0), "r" (a1), "r" (a2), "r" (a3));
++ a0 += linesz;
++ a1 += linesz;
++ a2 += linesz;
++ a3 += linesz;
++ asm volatile("movca.l r0, @%0\n\t"
++ "movca.l r0, @%1\n\t"
++ "movca.l r0, @%2\n\t"
++ "movca.l r0, @%3\n\t"
++ "ocbi @%0\n\t"
++ "ocbi @%1\n\t"
++ "ocbi @%2\n\t"
++ "ocbi @%3\n\t" : :
++ "r" (a0), "r" (a1), "r" (a2), "r" (a3));
++ a0 += linesz;
++ a1 += linesz;
++ a2 += linesz;
++ a3 += linesz;
++ asm volatile("movca.l r0, @%0\n\t"
++ "movca.l r0, @%1\n\t"
++ "movca.l r0, @%2\n\t"
++ "movca.l r0, @%3\n\t"
++ "ocbi @%0\n\t"
++ "ocbi @%1\n\t"
++ "ocbi @%2\n\t"
++ "ocbi @%3\n\t" : :
++ "r" (a0), "r" (a1), "r" (a2), "r" (a3));
++ asm volatile("ldc %0, sr" : : "r" (orig_sr));
++ a0 += linesz;
++ a1 += linesz;
++ a2 += linesz;
++ a3 += linesz;
++ } while (a0 < a0e);
+ }
+
+diff -ruN linux-2.6.17-vanilla/arch/sh/mm/clear_page.S linux-2.6.17/arch/sh/mm/clear_page.S
+--- linux-2.6.17-vanilla/arch/sh/mm/clear_page.S 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/mm/clear_page.S 2006-07-12 16:54:23.000000000 +0000
+@@ -194,102 +194,5 @@
+ nop
+ .L4096: .word 4096
+
+-ENTRY(__flush_cache_4096)
+- mov.l 1f,r3
+- add r6,r3
+- mov r4,r0
+- mov #64,r2
+- shll r2
+- mov #64,r6
+- jmp @r3
+- mov #96,r7
+- .align 2
+-1: .long 2f
+-2:
+- .rept 32
+- mov.l r5,@r0
+- mov.l r5,@(32,r0)
+- mov.l r5,@(r0,r6)
+- mov.l r5,@(r0,r7)
+- add r2,r5
+- add r2,r0
+- .endr
+- nop
+- nop
+- nop
+- nop
+- nop
+- nop
+- nop
+- rts
+- nop
+-
+-ENTRY(__flush_dcache_all)
+- mov.l 2f,r0
+- mov.l 3f,r4
+- and r0,r4 ! r4 = (unsigned long)&empty_zero_page[0] & ~0xffffc000
+- stc sr,r1 ! save SR
+- mov.l 4f,r2
+- or r1,r2
+- mov #32,r3
+- shll2 r3
+-1:
+- ldc r2,sr ! set BL bit
+- movca.l r0,@r4
+- ocbi @r4
+- add #32,r4
+- movca.l r0,@r4
+- ocbi @r4
+- add #32,r4
+- movca.l r0,@r4
+- ocbi @r4
+- add #32,r4
+- movca.l r0,@r4
+- ocbi @r4
+- ldc r1,sr ! restore SR
+- dt r3
+- bf/s 1b
+- add #32,r4
+-
+- rts
+- nop
+- .align 2
+-2: .long 0xffffc000
+-3: .long empty_zero_page
+-4: .long 0x10000000 ! BL bit
+-
+-/* __flush_cache_4096_all(unsigned long addr) */
+-ENTRY(__flush_cache_4096_all)
+- mov.l 2f,r0
+- mov.l 3f,r2
+- and r0,r2
+- or r2,r4 ! r4 = addr | (unsigned long)&empty_zero_page[0] & ~0x3fff
+- stc sr,r1 ! save SR
+- mov.l 4f,r2
+- or r1,r2
+- mov #32,r3
+-1:
+- ldc r2,sr ! set BL bit
+- movca.l r0,@r4
+- ocbi @r4
+- add #32,r4
+- movca.l r0,@r4
+- ocbi @r4
+- add #32,r4
+- movca.l r0,@r4
+- ocbi @r4
+- add #32,r4
+- movca.l r0,@r4
+- ocbi @r4
+- ldc r1,sr ! restore SR
+- dt r3
+- bf/s 1b
+- add #32,r4
+-
+- rts
+- nop
+- .align 2
+-2: .long 0xffffc000
+-3: .long empty_zero_page
+-4: .long 0x10000000 ! BL bit
+ #endif
++
+diff -ruN linux-2.6.17-vanilla/arch/sh/mm/consistent.c linux-2.6.17/arch/sh/mm/consistent.c
+--- linux-2.6.17-vanilla/arch/sh/mm/consistent.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/mm/consistent.c 2006-07-12 16:54:23.000000000 +0000
+@@ -9,6 +9,8 @@
+ */
+ #include <linux/mm.h>
+ #include <linux/dma-mapping.h>
++#include <asm/cacheflush.h>
++#include <asm/addrspace.h>
+ #include <asm/io.h>
+
+ void *consistent_alloc(gfp_t gfp, size_t size, dma_addr_t *handle)
+diff -ruN linux-2.6.17-vanilla/arch/sh/mm/fault.c linux-2.6.17/arch/sh/mm/fault.c
+--- linux-2.6.17-vanilla/arch/sh/mm/fault.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/mm/fault.c 2006-07-12 16:54:23.000000000 +0000
+@@ -1,33 +1,21 @@
+-/* $Id: fault.c,v 1.14 2004/01/13 05:52:11 kkojima Exp $
++/*
++ * Page fault handler for SH with an MMU.
+ *
+- * linux/arch/sh/mm/fault.c
+ * Copyright (C) 1999 Niibe Yutaka
+ * Copyright (C) 2003 Paul Mundt
+ *
+ * Based on linux/arch/i386/mm/fault.c:
+ * Copyright (C) 1995 Linus Torvalds
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
+ */
+-
+-#include <linux/signal.h>
+-#include <linux/sched.h>
+ #include <linux/kernel.h>
+-#include <linux/errno.h>
+-#include <linux/string.h>
+-#include <linux/types.h>
+-#include <linux/ptrace.h>
+-#include <linux/mman.h>
+ #include <linux/mm.h>
+-#include <linux/smp.h>
+-#include <linux/smp_lock.h>
+-#include <linux/interrupt.h>
+-#include <linux/module.h>
+-
++#include <linux/hardirq.h>
+ #include <asm/system.h>
+-#include <asm/io.h>
+-#include <asm/uaccess.h>
+-#include <asm/pgalloc.h>
+ #include <asm/mmu_context.h>
+-#include <asm/cacheflush.h>
+ #include <asm/kgdb.h>
+
+ extern void die(const char *,struct pt_regs *,long);
+@@ -187,14 +175,25 @@
+ goto no_context;
+ }
+
++#ifdef CONFIG_SH_STORE_QUEUES
++/*
++ * This is a special case for the SH-4 store queues, as pages for this
++ * space still need to be faulted in before it's possible to flush the
++ * store queue cache for writeout to the remapped region.
++ */
++#define P3_ADDR_MAX (P4SEG_STORE_QUE + 0x04000000)
++#else
++#define P3_ADDR_MAX P4SEG
++#endif
++
+ /*
+- * Called with interrupt disabled.
++ * Called with interrupts disabled.
+ */
+ asmlinkage int __do_page_fault(struct pt_regs *regs, unsigned long writeaccess,
+ unsigned long address)
+ {
+- unsigned long addrmax = P4SEG;
+ pgd_t *pgd;
++ pud_t *pud;
+ pmd_t *pmd;
+ pte_t *pte;
+ pte_t entry;
+@@ -207,31 +206,37 @@
+ kgdb_bus_err_hook();
+ #endif
+
+-#ifdef CONFIG_SH_STORE_QUEUES
+- addrmax = P4SEG_STORE_QUE + 0x04000000;
+-#endif
+-
+- if (address >= P3SEG && address < addrmax) {
++ /*
++ * We don't take page faults for P1, P2, and parts of P4, these
++ * are always mapped, whether it be due to legacy behaviour in
++ * 29-bit mode, or due to PMB configuration in 32-bit mode.
++ */
++ if (address >= P3SEG && address < P3_ADDR_MAX) {
+ pgd = pgd_offset_k(address);
+ mm = NULL;
+- } else if (address >= TASK_SIZE)
+- return 1;
+- else if (!(mm = current->mm))
+- return 1;
+- else
+- pgd = pgd_offset(mm, address);
++ } else {
++ if (unlikely(address >= TASK_SIZE || !(mm = current->mm)))
++ return 1;
+
+- pmd = pmd_offset(pgd, address);
++ pgd = pgd_offset(current->mm, address);
++ }
++
++ pud = pud_offset(pgd, address);
++ if (pud_none_or_clear_bad(pud))
++ return 1;
++ pmd = pmd_offset(pud, address);
+ if (pmd_none_or_clear_bad(pmd))
+ return 1;
++
+ if (mm)
+ pte = pte_offset_map_lock(mm, pmd, address, &ptl);
+ else
+ pte = pte_offset_kernel(pmd, address);
+
+ entry = *pte;
+- if (pte_none(entry) || pte_not_present(entry)
+- || (writeaccess && !pte_write(entry)))
++ if (unlikely(pte_none(entry) || pte_not_present(entry)))
++ goto unlock;
++ if (unlikely(writeaccess && !pte_write(entry)))
+ goto unlock;
+
+ if (writeaccess)
+@@ -243,13 +248,7 @@
+ * ITLB is not affected by "ldtlb" instruction.
+ * So, we need to flush the entry by ourselves.
+ */
+-
+- {
+- unsigned long flags;
+- local_irq_save(flags);
+- __flush_tlb_page(get_asid(), address&PAGE_MASK);
+- local_irq_restore(flags);
+- }
++ __flush_tlb_page(get_asid(), address & PAGE_MASK);
+ #endif
+
+ set_pte(pte, entry);
+@@ -260,121 +259,3 @@
+ pte_unmap_unlock(pte, ptl);
+ return ret;
+ }
+-
+-void flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
+-{
+- if (vma->vm_mm && vma->vm_mm->context != NO_CONTEXT) {
+- unsigned long flags;
+- unsigned long asid;
+- unsigned long saved_asid = MMU_NO_ASID;
+-
+- asid = vma->vm_mm->context & MMU_CONTEXT_ASID_MASK;
+- page &= PAGE_MASK;
+-
+- local_irq_save(flags);
+- if (vma->vm_mm != current->mm) {
+- saved_asid = get_asid();
+- set_asid(asid);
+- }
+- __flush_tlb_page(asid, page);
+- if (saved_asid != MMU_NO_ASID)
+- set_asid(saved_asid);
+- local_irq_restore(flags);
+- }
+-}
+-
+-void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
+- unsigned long end)
+-{
+- struct mm_struct *mm = vma->vm_mm;
+-
+- if (mm->context != NO_CONTEXT) {
+- unsigned long flags;
+- int size;
+-
+- local_irq_save(flags);
+- size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
+- if (size > (MMU_NTLB_ENTRIES/4)) { /* Too many TLB to flush */
+- mm->context = NO_CONTEXT;
+- if (mm == current->mm)
+- activate_context(mm);
+- } else {
+- unsigned long asid = mm->context&MMU_CONTEXT_ASID_MASK;
+- unsigned long saved_asid = MMU_NO_ASID;
+-
+- start &= PAGE_MASK;
+- end += (PAGE_SIZE - 1);
+- end &= PAGE_MASK;
+- if (mm != current->mm) {
+- saved_asid = get_asid();
+- set_asid(asid);
+- }
+- while (start < end) {
+- __flush_tlb_page(asid, start);
+- start += PAGE_SIZE;
+- }
+- if (saved_asid != MMU_NO_ASID)
+- set_asid(saved_asid);
+- }
+- local_irq_restore(flags);
+- }
+-}
+-
+-void flush_tlb_kernel_range(unsigned long start, unsigned long end)
+-{
+- unsigned long flags;
+- int size;
+-
+- local_irq_save(flags);
+- size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
+- if (size > (MMU_NTLB_ENTRIES/4)) { /* Too many TLB to flush */
+- flush_tlb_all();
+- } else {
+- unsigned long asid = init_mm.context&MMU_CONTEXT_ASID_MASK;
+- unsigned long saved_asid = get_asid();
+-
+- start &= PAGE_MASK;
+- end += (PAGE_SIZE - 1);
+- end &= PAGE_MASK;
+- set_asid(asid);
+- while (start < end) {
+- __flush_tlb_page(asid, start);
+- start += PAGE_SIZE;
+- }
+- set_asid(saved_asid);
+- }
+- local_irq_restore(flags);
+-}
+-
+-void flush_tlb_mm(struct mm_struct *mm)
+-{
+- /* Invalidate all TLB of this process. */
+- /* Instead of invalidating each TLB, we get new MMU context. */
+- if (mm->context != NO_CONTEXT) {
+- unsigned long flags;
+-
+- local_irq_save(flags);
+- mm->context = NO_CONTEXT;
+- if (mm == current->mm)
+- activate_context(mm);
+- local_irq_restore(flags);
+- }
+-}
+-
+-void flush_tlb_all(void)
+-{
+- unsigned long flags, status;
+-
+- /*
+- * Flush all the TLB.
+- *
+- * Write to the MMU control register's bit:
+- * TF-bit for SH-3, TI-bit for SH-4.
+- * It's same position, bit #2.
+- */
+- local_irq_save(flags);
+- status = ctrl_inl(MMUCR);
+- status |= 0x04;
+- ctrl_outl(status, MMUCR);
+- local_irq_restore(flags);
+-}
+diff -ruN linux-2.6.17-vanilla/arch/sh/mm/hugetlbpage.c linux-2.6.17/arch/sh/mm/hugetlbpage.c
+--- linux-2.6.17-vanilla/arch/sh/mm/hugetlbpage.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/mm/hugetlbpage.c 2006-07-12 16:54:23.000000000 +0000
+@@ -27,61 +27,41 @@
+ pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
+ {
+ pgd_t *pgd;
++ pud_t *pud;
+ pmd_t *pmd;
+ pte_t *pte = NULL;
+
+ pgd = pgd_offset(mm, addr);
+ if (pgd) {
+- pmd = pmd_alloc(mm, pgd, addr);
+- if (pmd)
+- pte = pte_alloc_map(mm, pmd, addr);
++ pud = pud_alloc(mm, pgd, addr);
++ if (pud) {
++ pmd = pmd_alloc(mm, pud, addr);
++ if (pmd)
++ pte = pte_alloc_map(mm, pmd, addr);
++ }
+ }
++
+ return pte;
+ }
+
+ pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
+ {
+ pgd_t *pgd;
++ pud_t *pud;
+ pmd_t *pmd;
+ pte_t *pte = NULL;
+
+ pgd = pgd_offset(mm, addr);
+ if (pgd) {
+- pmd = pmd_offset(pgd, addr);
+- if (pmd)
+- pte = pte_offset_map(pmd, addr);
+- }
+- return pte;
+-}
+-
+-void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
+- pte_t *ptep, pte_t entry)
+-{
+- int i;
+-
+- for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) {
+- set_pte_at(mm, addr, ptep, entry);
+- ptep++;
+- addr += PAGE_SIZE;
+- pte_val(entry) += PAGE_SIZE;
++ pud = pud_offset(pgd, addr);
++ if (pud) {
++ pmd = pmd_offset(pud, addr);
++ if (pmd)
++ pte = pte_offset_map(pmd, addr);
++ }
+ }
+-}
+-
+-pte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
+- pte_t *ptep)
+-{
+- pte_t entry;
+- int i;
+-
+- entry = *ptep;
+
+- for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) {
+- pte_clear(mm, addr, ptep);
+- addr += PAGE_SIZE;
+- ptep++;
+- }
+-
+- return entry;
++ return pte;
+ }
+
+ struct page *follow_huge_addr(struct mm_struct *mm,
+diff -ruN linux-2.6.17-vanilla/arch/sh/mm/init.c linux-2.6.17/arch/sh/mm/init.c
+--- linux-2.6.17-vanilla/arch/sh/mm/init.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/mm/init.c 2006-07-12 16:54:23.000000000 +0000
+@@ -61,7 +61,7 @@
+
+ printk("Mem-info:\n");
+ show_free_areas();
+- printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
++ printk("Free swap: %6ldkB\n",nr_swap_pages<<(PAGE_SHIFT-10));
+ i = max_mapnr;
+ while (i-- > 0) {
+ total++;
+@@ -81,6 +81,7 @@
+ static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot)
+ {
+ pgd_t *pgd;
++ pud_t *pud;
+ pmd_t *pmd;
+ pte_t *pte;
+
+@@ -90,7 +91,17 @@
+ return;
+ }
+
+- pmd = pmd_offset(pgd, addr);
++ pud = pud_offset(pgd, addr);
++ if (pud_none(*pud)) {
++ pmd = (pmd_t *)get_zeroed_page(GFP_ATOMIC);
++ set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE | _PAGE_USER));
++ if (pmd != pmd_offset(pud, 0)) {
++ pud_ERROR(*pud);
++ return;
++ }
++ }
++
++ pmd = pmd_offset(pud, addr);
+ if (pmd_none(*pmd)) {
+ pte = (pte_t *)get_zeroed_page(GFP_ATOMIC);
+ set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE | _PAGE_USER));
+diff -ruN linux-2.6.17-vanilla/arch/sh/mm/ioremap.c linux-2.6.17/arch/sh/mm/ioremap.c
+--- linux-2.6.17-vanilla/arch/sh/mm/ioremap.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/mm/ioremap.c 2006-07-12 16:54:23.000000000 +0000
+@@ -15,6 +15,7 @@
+ #include <linux/vmalloc.h>
+ #include <linux/module.h>
+ #include <linux/mm.h>
++#include <linux/pci.h>
+ #include <asm/io.h>
+ #include <asm/page.h>
+ #include <asm/pgalloc.h>
+@@ -135,6 +136,20 @@
+ return (void __iomem *)phys_to_virt(phys_addr);
+
+ /*
++ * If we're on an SH7751 or SH7780 PCI controller, PCI memory is
++ * mapped at the end of the address space (typically 0xfd000000)
++ * in a non-translatable area, so mapping through page tables for
++ * this area is not only pointless, but also fundamentally
++ * broken. Just return the physical address instead.
++ *
++ * For boards that map a small PCI memory aperture somewhere in
++ * P1/P2 space, ioremap() will already do the right thing,
++ * and we'll never get this far.
++ */
++ if (is_pci_memaddr(phys_addr) && is_pci_memaddr(last_addr))
++ return (void __iomem *)phys_addr;
++
++ /*
+ * Don't allow anybody to remap normal RAM that we're using..
+ */
+ if (phys_addr < virt_to_phys(high_memory))
+@@ -192,7 +207,7 @@
+ unsigned long vaddr = (unsigned long __force)addr;
+ struct vm_struct *p;
+
+- if (PXSEG(vaddr) < P3SEG)
++ if (PXSEG(vaddr) < P3SEG || is_pci_memaddr(vaddr))
+ return;
+
+ #ifdef CONFIG_32BIT
+diff -ruN linux-2.6.17-vanilla/arch/sh/mm/pg-sh4.c linux-2.6.17/arch/sh/mm/pg-sh4.c
+--- linux-2.6.17-vanilla/arch/sh/mm/pg-sh4.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/mm/pg-sh4.c 2006-07-12 16:54:23.000000000 +0000
+@@ -2,7 +2,7 @@
+ * arch/sh/mm/pg-sh4.c
+ *
+ * Copyright (C) 1999, 2000, 2002 Niibe Yutaka
+- * Copyright (C) 2002 Paul Mundt
++ * Copyright (C) 2002 - 2005 Paul Mundt
+ *
+ * Released under the terms of the GNU GPL v2.0.
+ */
+@@ -24,6 +24,8 @@
+
+ extern struct semaphore p3map_sem[];
+
++#define CACHE_ALIAS (cpu_data->dcache.alias_mask)
++
+ /*
+ * clear_user_page
+ * @to: P1 address
+@@ -36,14 +38,15 @@
+ if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0)
+ clear_page(to);
+ else {
+- pgprot_t pgprot = __pgprot(_PAGE_PRESENT |
++ pgprot_t pgprot = __pgprot(_PAGE_PRESENT |
+ _PAGE_RW | _PAGE_CACHABLE |
+- _PAGE_DIRTY | _PAGE_ACCESSED |
++ _PAGE_DIRTY | _PAGE_ACCESSED |
+ _PAGE_HW_SHARED | _PAGE_FLAGS_HARD);
+ unsigned long phys_addr = PHYSADDR(to);
+ unsigned long p3_addr = P3SEG + (address & CACHE_ALIAS);
+- pgd_t *dir = pgd_offset_k(p3_addr);
+- pmd_t *pmd = pmd_offset(dir, p3_addr);
++ pgd_t *pgd = pgd_offset_k(p3_addr);
++ pud_t *pud = pud_offset(pgd, p3_addr);
++ pmd_t *pmd = pmd_offset(pud, p3_addr);
+ pte_t *pte = pte_offset_kernel(pmd, p3_addr);
+ pte_t entry;
+ unsigned long flags;
+@@ -68,21 +71,22 @@
+ * @address: U0 address to be mapped
+ * @page: page (virt_to_page(to))
+ */
+-void copy_user_page(void *to, void *from, unsigned long address,
++void copy_user_page(void *to, void *from, unsigned long address,
+ struct page *page)
+ {
+ __set_bit(PG_mapped, &page->flags);
+ if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0)
+ copy_page(to, from);
+ else {
+- pgprot_t pgprot = __pgprot(_PAGE_PRESENT |
++ pgprot_t pgprot = __pgprot(_PAGE_PRESENT |
+ _PAGE_RW | _PAGE_CACHABLE |
+- _PAGE_DIRTY | _PAGE_ACCESSED |
++ _PAGE_DIRTY | _PAGE_ACCESSED |
+ _PAGE_HW_SHARED | _PAGE_FLAGS_HARD);
+ unsigned long phys_addr = PHYSADDR(to);
+ unsigned long p3_addr = P3SEG + (address & CACHE_ALIAS);
+- pgd_t *dir = pgd_offset_k(p3_addr);
+- pmd_t *pmd = pmd_offset(dir, p3_addr);
++ pgd_t *pgd = pgd_offset_k(p3_addr);
++ pud_t *pud = pud_offset(pgd, p3_addr);
++ pmd_t *pmd = pmd_offset(pud, p3_addr);
+ pte_t *pte = pte_offset_kernel(pmd, p3_addr);
+ pte_t entry;
+ unsigned long flags;
+diff -ruN linux-2.6.17-vanilla/arch/sh/mm/pmb.c linux-2.6.17/arch/sh/mm/pmb.c
+--- linux-2.6.17-vanilla/arch/sh/mm/pmb.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/mm/pmb.c 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1,404 @@
++/*
++ * arch/sh/mm/pmb.c
++ *
++ * Privileged Space Mapping Buffer (PMB) Support.
++ *
++ * Copyright (C) 2005, 2006 Paul Mundt
++ *
++ * P1/P2 Section mapping definitions from map32.h, which was:
++ *
++ * Copyright 2003 (c) Lineo Solutions,Inc.
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ */
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/slab.h>
++#include <linux/bitops.h>
++#include <linux/debugfs.h>
++#include <linux/fs.h>
++#include <linux/seq_file.h>
++#include <linux/err.h>
++#include <asm/system.h>
++#include <asm/uaccess.h>
++#include <asm/pgtable.h>
++#include <asm/mmu.h>
++#include <asm/io.h>
++
++#define NR_PMB_ENTRIES 16
++
++static kmem_cache_t *pmb_cache;
++static unsigned long pmb_map;
++
++static struct pmb_entry pmb_init_map[] = {
++ /* vpn ppn flags (ub/sz/c/wt) */
++
++ /* P1 Section Mappings */
++ { 0x80000000, 0x00000000, PMB_SZ_64M | PMB_C, },
++ { 0x84000000, 0x04000000, PMB_SZ_64M | PMB_C, },
++ { 0x88000000, 0x08000000, PMB_SZ_128M | PMB_C, },
++ { 0x90000000, 0x10000000, PMB_SZ_64M | PMB_C, },
++ { 0x94000000, 0x14000000, PMB_SZ_64M | PMB_C, },
++ { 0x98000000, 0x18000000, PMB_SZ_64M | PMB_C, },
++
++ /* P2 Section Mappings */
++ { 0xa0000000, 0x00000000, PMB_UB | PMB_SZ_64M | PMB_WT, },
++ { 0xa4000000, 0x04000000, PMB_UB | PMB_SZ_64M | PMB_WT, },
++ { 0xa8000000, 0x08000000, PMB_UB | PMB_SZ_128M | PMB_WT, },
++ { 0xb0000000, 0x10000000, PMB_UB | PMB_SZ_64M | PMB_WT, },
++ { 0xb4000000, 0x14000000, PMB_UB | PMB_SZ_64M | PMB_WT, },
++ { 0xb8000000, 0x18000000, PMB_UB | PMB_SZ_64M | PMB_WT, },
++};
++
++static inline unsigned long mk_pmb_entry(unsigned int entry)
++{
++ return (entry & PMB_E_MASK) << PMB_E_SHIFT;
++}
++
++static inline unsigned long mk_pmb_addr(unsigned int entry)
++{
++ return mk_pmb_entry(entry) | PMB_ADDR;
++}
++
++static inline unsigned long mk_pmb_data(unsigned int entry)
++{
++ return mk_pmb_entry(entry) | PMB_DATA;
++}
++
++struct pmb_entry *pmb_alloc(unsigned long vpn, unsigned long ppn,
++ unsigned long flags)
++{
++ struct pmb_entry *pmbe;
++
++ pmbe = kmem_cache_alloc(pmb_cache, GFP_KERNEL);
++ if (!pmbe)
++ return ERR_PTR(-ENOMEM);
++
++ pmbe->vpn = vpn;
++ pmbe->ppn = ppn;
++ pmbe->flags = flags;
++
++ return pmbe;
++}
++
++void pmb_free(struct pmb_entry *pmbe)
++{
++ kmem_cache_free(pmb_cache, pmbe);
++}
++
++/*
++ * Must be in P2 for __set_pmb_entry()
++ */
++int __set_pmb_entry(unsigned long vpn, unsigned long ppn,
++ unsigned long flags, int *entry)
++{
++ unsigned int pos = *entry;
++
++ if (unlikely(pos == PMB_NO_ENTRY))
++ pos = find_first_zero_bit(&pmb_map, NR_PMB_ENTRIES);
++
++repeat:
++ if (unlikely(pos > NR_PMB_ENTRIES))
++ return -ENOSPC;
++
++ if (test_and_set_bit(pos, &pmb_map)) {
++ pos = find_first_zero_bit(&pmb_map, NR_PMB_ENTRIES);
++ goto repeat;
++ }
++
++ ctrl_outl(vpn | PMB_V, mk_pmb_addr(pos));
++
++#ifdef CONFIG_SH_WRITETHROUGH
++ /*
++ * When we are in 32-bit address extended mode, CCR.CB becomes
++ * invalid, so care must be taken to manually adjust cacheable
++ * translations.
++ */
++ if (likely(flags & PMB_C))
++ flags |= PMB_WT;
++#endif
++
++ ctrl_outl(ppn | flags | PMB_V, mk_pmb_data(pos));
++
++ *entry = pos;
++
++ return 0;
++}
++
++int set_pmb_entry(struct pmb_entry *pmbe)
++{
++ int ret;
++
++ jump_to_P2();
++ ret = __set_pmb_entry(pmbe->vpn, pmbe->ppn, pmbe->flags, &pmbe->entry);
++ back_to_P1();
++
++ return ret;
++}
++
++void clear_pmb_entry(struct pmb_entry *pmbe)
++{
++ unsigned int entry = pmbe->entry;
++ unsigned long addr;
++
++ /*
++ * Don't allow clearing of wired init entries, P1 or P2 access
++ * without a corresponding mapping in the PMB will lead to reset
++ * by the TLB.
++ */
++ if (unlikely(entry < ARRAY_SIZE(pmb_init_map) ||
++ entry >= NR_PMB_ENTRIES))
++ return;
++
++ jump_to_P2();
++
++ /* Clear V-bit */
++ addr = mk_pmb_addr(entry);
++ ctrl_outl(ctrl_inl(addr) & ~PMB_V, addr);
++
++ addr = mk_pmb_data(entry);
++ ctrl_outl(ctrl_inl(addr) & ~PMB_V, addr);
++
++ back_to_P1();
++
++ clear_bit(entry, &pmb_map);
++}
++
++static DEFINE_SPINLOCK(pmb_list_lock);
++static struct pmb_entry *pmb_list;
++
++static inline void pmb_list_add(struct pmb_entry *pmbe)
++{
++ struct pmb_entry **p, *tmp;
++
++ p = &pmb_list;
++ while ((tmp = *p) != NULL)
++ p = &tmp->next;
++
++ pmbe->next = tmp;
++ *p = pmbe;
++}
++
++static inline void pmb_list_del(struct pmb_entry *pmbe)
++{
++ struct pmb_entry **p, *tmp;
++
++ for (p = &pmb_list; (tmp = *p); p = &tmp->next)
++ if (tmp == pmbe) {
++ *p = tmp->next;
++ return;
++ }
++}
++
++static struct {
++ unsigned long size;
++ int flag;
++} pmb_sizes[] = {
++ { .size = 0x20000000, .flag = PMB_SZ_512M, },
++ { .size = 0x08000000, .flag = PMB_SZ_128M, },
++ { .size = 0x04000000, .flag = PMB_SZ_64M, },
++ { .size = 0x01000000, .flag = PMB_SZ_16M, },
++};
++
++long pmb_remap(unsigned long vaddr, unsigned long phys,
++ unsigned long size, unsigned long flags)
++{
++ struct pmb_entry *pmbp;
++ unsigned long wanted;
++ int pmb_flags, i;
++
++ /* Convert typical pgprot value to the PMB equivalent */
++ if (flags & _PAGE_CACHABLE) {
++ if (flags & _PAGE_WT)
++ pmb_flags = PMB_WT;
++ else
++ pmb_flags = PMB_C;
++ } else
++ pmb_flags = PMB_WT | PMB_UB;
++
++ pmbp = NULL;
++ wanted = size;
++
++again:
++ for (i = 0; i < ARRAY_SIZE(pmb_sizes); i++) {
++ struct pmb_entry *pmbe;
++ int ret;
++
++ if (size < pmb_sizes[i].size)
++ continue;
++
++ pmbe = pmb_alloc(vaddr, phys, pmb_flags | pmb_sizes[i].flag);
++ if (IS_ERR(pmbe))
++ return PTR_ERR(pmbe);
++
++ ret = set_pmb_entry(pmbe);
++ if (ret != 0) {
++ pmb_free(pmbe);
++ return -EBUSY;
++ }
++
++ phys += pmb_sizes[i].size;
++ vaddr += pmb_sizes[i].size;
++ size -= pmb_sizes[i].size;
++
++ /*
++ * Link adjacent entries that span multiple PMB entries
++ * for easier tear-down.
++ */
++ if (likely(pmbp))
++ pmbp->link = pmbe;
++
++ pmbp = pmbe;
++ }
++
++ if (size >= 0x1000000)
++ goto again;
++
++ return wanted - size;
++}
++
++void pmb_unmap(unsigned long addr)
++{
++ struct pmb_entry **p, *pmbe;
++
++ for (p = &pmb_list; (pmbe = *p); p = &pmbe->next)
++ if (pmbe->vpn == addr)
++ break;
++
++ if (unlikely(!pmbe))
++ return;
++
++ WARN_ON(!test_bit(pmbe->entry, &pmb_map));
++
++ do {
++ struct pmb_entry *pmblink = pmbe;
++
++ clear_pmb_entry(pmbe);
++ pmbe = pmblink->link;
++
++ pmb_free(pmblink);
++ } while (pmbe);
++}
++
++static void pmb_cache_ctor(void *pmb, kmem_cache_t *cachep, unsigned long flags)
++{
++ struct pmb_entry *pmbe = pmb;
++
++ memset(pmb, 0, sizeof(struct pmb_entry));
++
++ spin_lock_irq(&pmb_list_lock);
++
++ pmbe->entry = PMB_NO_ENTRY;
++ pmb_list_add(pmbe);
++
++ spin_unlock_irq(&pmb_list_lock);
++}
++
++static void pmb_cache_dtor(void *pmb, kmem_cache_t *cachep, unsigned long flags)
++{
++ spin_lock_irq(&pmb_list_lock);
++ pmb_list_del(pmb);
++ spin_unlock_irq(&pmb_list_lock);
++}
++
++static int __init pmb_init(void)
++{
++ unsigned int nr_entries = ARRAY_SIZE(pmb_init_map);
++ unsigned int entry;
++
++ BUG_ON(unlikely(nr_entries >= NR_PMB_ENTRIES));
++
++ pmb_cache = kmem_cache_create("pmb", sizeof(struct pmb_entry),
++ 0, 0, pmb_cache_ctor, pmb_cache_dtor);
++ BUG_ON(!pmb_cache);
++
++ jump_to_P2();
++
++ /*
++ * Ordering is important, P2 must be mapped in the PMB before we
++ * can set PMB.SE, and P1 must be mapped before we jump back to
++ * P1 space.
++ */
++ for (entry = 0; entry < nr_entries; entry++) {
++ struct pmb_entry *pmbe = pmb_init_map + entry;
++
++ __set_pmb_entry(pmbe->vpn, pmbe->ppn, pmbe->flags, &entry);
++ }
++
++ ctrl_outl(0, PMB_IRMCR);
++
++ /* PMB.SE and UB[7] */
++ ctrl_outl((1 << 31) | (1 << 7), PMB_PASCR);
++
++ back_to_P1();
++
++ return 0;
++}
++
++arch_initcall(pmb_init);
++
++#ifdef CONFIG_DEBUG_FS
++static int pmb_seq_show(struct seq_file *file, void *iter)
++{
++ int i;
++
++ seq_printf(file, "V: Valid, C: Cacheable, WT: Write-Through\n"
++ "CB: Copy-Back, B: Buffered, UB: Unbuffered\n");
++ seq_printf(file, "ety vpn ppn size flags\n");
++
++ for (i = 0; i < NR_PMB_ENTRIES; i++) {
++ unsigned long addr, data;
++ unsigned int size;
++ char *sz_str = NULL;
++
++ addr = ctrl_inl(mk_pmb_addr(i));
++ data = ctrl_inl(mk_pmb_data(i));
++
++ size = data & PMB_SZ_MASK;
++ sz_str = (size == PMB_SZ_16M) ? " 16MB":
++ (size == PMB_SZ_64M) ? " 64MB":
++ (size == PMB_SZ_128M) ? "128MB":
++ "512MB";
++
++ /* 02: V 0x88 0x08 128MB C CB B */
++ seq_printf(file, "%02d: %c 0x%02lx 0x%02lx %s %c %s %s\n",
++ i, ((addr & PMB_V) && (data & PMB_V)) ? 'V' : ' ',
++ (addr >> 24) & 0xff, (data >> 24) & 0xff,
++ sz_str, (data & PMB_C) ? 'C' : ' ',
++ (data & PMB_WT) ? "WT" : "CB",
++ (data & PMB_UB) ? "UB" : " B");
++ }
++
++ return 0;
++}
++
++static int pmb_debugfs_open(struct inode *inode, struct file *file)
++{
++ return single_open(file, pmb_seq_show, NULL);
++}
++
++static struct file_operations pmb_debugfs_fops = {
++ .owner = THIS_MODULE,
++ .open = pmb_debugfs_open,
++ .read = seq_read,
++ .llseek = seq_lseek,
++ .release = seq_release,
++};
++
++static int __init pmb_debugfs_init(void)
++{
++ struct dentry *dentry;
++
++ dentry = debugfs_create_file("pmb", S_IFREG | S_IRUGO,
++ NULL, NULL, &pmb_debugfs_fops);
++ if (IS_ERR(dentry))
++ return PTR_ERR(dentry);
++
++ return 0;
++}
++
++postcore_initcall(pmb_debugfs_init);
++#endif
+diff -ruN linux-2.6.17-vanilla/arch/sh/mm/tlb-flush.c linux-2.6.17/arch/sh/mm/tlb-flush.c
+--- linux-2.6.17-vanilla/arch/sh/mm/tlb-flush.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/mm/tlb-flush.c 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1,132 @@
++/*
++ * TLB flushing operations for SH with an MMU.
++ *
++ * Copyright (C) 1999 Niibe Yutaka
++ * Copyright (C) 2003 Paul Mundt
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ */
++#include <linux/mm.h>
++#include <asm/mmu_context.h>
++#include <asm/tlbflush.h>
++
++void flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
++{
++ if (vma->vm_mm && vma->vm_mm->context != NO_CONTEXT) {
++ unsigned long flags;
++ unsigned long asid;
++ unsigned long saved_asid = MMU_NO_ASID;
++
++ asid = vma->vm_mm->context & MMU_CONTEXT_ASID_MASK;
++ page &= PAGE_MASK;
++
++ local_irq_save(flags);
++ if (vma->vm_mm != current->mm) {
++ saved_asid = get_asid();
++ set_asid(asid);
++ }
++ __flush_tlb_page(asid, page);
++ if (saved_asid != MMU_NO_ASID)
++ set_asid(saved_asid);
++ local_irq_restore(flags);
++ }
++}
++
++void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
++ unsigned long end)
++{
++ struct mm_struct *mm = vma->vm_mm;
++
++ if (mm->context != NO_CONTEXT) {
++ unsigned long flags;
++ int size;
++
++ local_irq_save(flags);
++ size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
++ if (size > (MMU_NTLB_ENTRIES/4)) { /* Too many TLB to flush */
++ mm->context = NO_CONTEXT;
++ if (mm == current->mm)
++ activate_context(mm);
++ } else {
++ unsigned long asid = mm->context&MMU_CONTEXT_ASID_MASK;
++ unsigned long saved_asid = MMU_NO_ASID;
++
++ start &= PAGE_MASK;
++ end += (PAGE_SIZE - 1);
++ end &= PAGE_MASK;
++ if (mm != current->mm) {
++ saved_asid = get_asid();
++ set_asid(asid);
++ }
++ while (start < end) {
++ __flush_tlb_page(asid, start);
++ start += PAGE_SIZE;
++ }
++ if (saved_asid != MMU_NO_ASID)
++ set_asid(saved_asid);
++ }
++ local_irq_restore(flags);
++ }
++}
++
++void flush_tlb_kernel_range(unsigned long start, unsigned long end)
++{
++ unsigned long flags;
++ int size;
++
++ local_irq_save(flags);
++ size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
++ if (size > (MMU_NTLB_ENTRIES/4)) { /* Too many TLB to flush */
++ flush_tlb_all();
++ } else {
++ unsigned long asid = init_mm.context&MMU_CONTEXT_ASID_MASK;
++ unsigned long saved_asid = get_asid();
++
++ start &= PAGE_MASK;
++ end += (PAGE_SIZE - 1);
++ end &= PAGE_MASK;
++ set_asid(asid);
++ while (start < end) {
++ __flush_tlb_page(asid, start);
++ start += PAGE_SIZE;
++ }
++ set_asid(saved_asid);
++ }
++ local_irq_restore(flags);
++}
++
++void flush_tlb_mm(struct mm_struct *mm)
++{
++ /* Invalidate all TLB of this process. */
++ /* Instead of invalidating each TLB, we get new MMU context. */
++ if (mm->context != NO_CONTEXT) {
++ unsigned long flags;
++
++ local_irq_save(flags);
++ mm->context = NO_CONTEXT;
++ if (mm == current->mm)
++ activate_context(mm);
++ local_irq_restore(flags);
++ }
++}
++
++void flush_tlb_all(void)
++{
++ unsigned long flags, status;
++
++ /*
++ * Flush all the TLB.
++ *
++ * Write to the MMU control register's bit:
++ * TF-bit for SH-3, TI-bit for SH-4.
++ * It's same position, bit #2.
++ */
++ local_irq_save(flags);
++ status = ctrl_inl(MMUCR);
++ status |= 0x04;
++ ctrl_outl(status, MMUCR);
++ ctrl_barrier();
++ local_irq_restore(flags);
++}
+diff -ruN linux-2.6.17-vanilla/arch/sh/mm/tlb-sh4.c linux-2.6.17/arch/sh/mm/tlb-sh4.c
+--- linux-2.6.17-vanilla/arch/sh/mm/tlb-sh4.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/mm/tlb-sh4.c 2006-07-12 16:54:23.000000000 +0000
+@@ -36,7 +36,6 @@
+ unsigned long vpn;
+ struct page *page;
+ unsigned long pfn;
+- unsigned long ptea;
+
+ /* Ptrace may call this routine. */
+ if (vma && current->active_mm != vma->vm_mm)
+@@ -59,10 +58,11 @@
+ ctrl_outl(vpn, MMU_PTEH);
+
+ pteval = pte_val(pte);
++
+ /* Set PTEA register */
+- /* TODO: make this look less hacky */
+- ptea = ((pteval >> 28) & 0xe) | (pteval & 0x1);
+- ctrl_outl(ptea, MMU_PTEA);
++ if (cpu_data->flags & CPU_HAS_PTEA)
++ /* TODO: make this look less hacky */
++ ctrl_outl(((pteval >> 28) & 0xe) | (pteval & 0x1), MMU_PTEA);
+
+ /* Set PTEL register */
+ pteval &= _PAGE_FLAGS_HARDWARE_MASK; /* drop software flags */
+diff -ruN linux-2.6.17-vanilla/arch/sh/oprofile/CVS/Entries linux-2.6.17/arch/sh/oprofile/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/oprofile/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/oprofile/CVS/Entries 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1,5 @@
++/Kconfig/1.1/Sun Oct 12 21:34:48 2003//
++/Makefile/1.4/Sun Aug 21 23:08:54 2005//
++/op_model_null.c/1.2/Wed Mar 2 13:02:56 2005//
++/op_model_sh7750.c/1.2/Wed Mar 2 13:02:57 2005/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/oprofile/CVS/Repository linux-2.6.17/arch/sh/oprofile/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/oprofile/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/oprofile/CVS/Repository 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/oprofile
+diff -ruN linux-2.6.17-vanilla/arch/sh/oprofile/CVS/Root linux-2.6.17/arch/sh/oprofile/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/oprofile/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/oprofile/CVS/Root 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/oprofile/Makefile linux-2.6.17/arch/sh/oprofile/Makefile
+--- linux-2.6.17-vanilla/arch/sh/oprofile/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/oprofile/Makefile 2006-07-12 16:54:23.000000000 +0000
+@@ -7,7 +7,11 @@
+ timer_int.o )
+
+ profdrvr-y := op_model_null.o
++
++# SH7750-style performance counters exist across 7750/7750S and 7091.
++profdrvr-$(CONFIG_CPU_SUBTYPE_SH7750S) := op_model_sh7750.o
+ profdrvr-$(CONFIG_CPU_SUBTYPE_SH7750) := op_model_sh7750.o
++profdrvr-$(CONFIG_CPU_SUBTYPE_SH7091) := op_model_sh7750.o
+
+ oprofile-y := $(DRIVER_OBJS) $(profdrvr-y)
+
+diff -ruN linux-2.6.17-vanilla/arch/sh/tools/CVS/Entries linux-2.6.17/arch/sh/tools/CVS/Entries
+--- linux-2.6.17-vanilla/arch/sh/tools/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/tools/CVS/Entries 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1,4 @@
++/Makefile/1.2/Fri Sep 24 15:12:43 2004//
++/gen-mach-types/1.1/Fri Sep 24 15:12:45 2004/-ko/
++/mach-types/1.15/Thu Jul 6 12:38:12 2006//
++D
+diff -ruN linux-2.6.17-vanilla/arch/sh/tools/CVS/Repository linux-2.6.17/arch/sh/tools/CVS/Repository
+--- linux-2.6.17-vanilla/arch/sh/tools/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/tools/CVS/Repository 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++linux/arch/sh/tools
+diff -ruN linux-2.6.17-vanilla/arch/sh/tools/CVS/Root linux-2.6.17/arch/sh/tools/CVS/Root
+--- linux-2.6.17-vanilla/arch/sh/tools/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/arch/sh/tools/CVS/Root 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/arch/sh/tools/mach-types linux-2.6.17/arch/sh/tools/mach-types
+--- linux-2.6.17-vanilla/arch/sh/tools/mach-types 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/arch/sh/tools/mach-types 2006-07-12 16:54:23.000000000 +0000
+@@ -7,7 +7,7 @@
+ #
+ SE SH_SOLUTION_ENGINE
+ 7751SE SH_7751_SOLUTION_ENGINE
+-7300SE SH_7300_SOLUTION_ENGINE
++7300SE SH_7300_SOLUTION_ENGINE
+ 73180SE SH_73180_SOLUTION_ENGINE
+ 7751SYSTEMH SH_7751_SYSTEMH
+ HP6XX SH_HP6XX
+@@ -25,4 +25,7 @@
+ EDOSK7705 SH_EDOSK7705
+ SH4202_MICRODEV SH_SH4202_MICRODEV
+ SH03 SH_SH03
+-
++LANDISK SH_LANDISK
++R7780RP SH_R7780RP
++R7780MP SH_R7780MP
++TITAN SH_TITAN
+diff -ruN linux-2.6.17-vanilla/drivers/CVS/Entries linux-2.6.17/drivers/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/CVS/Entries 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1,12 @@
++D/char////
++D/i2c////
++D/ide////
++D/input////
++D/mtd////
++D/net////
++D/pcmcia////
++D/serial////
++D/sh////
++D/usb////
++D/video////
++D/rtc////
+diff -ruN linux-2.6.17-vanilla/drivers/CVS/Repository linux-2.6.17/drivers/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/CVS/Repository 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers
+diff -ruN linux-2.6.17-vanilla/drivers/CVS/Root linux-2.6.17/drivers/CVS/Root
+--- linux-2.6.17-vanilla/drivers/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/CVS/Root 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/char/CVS/Entries linux-2.6.17/drivers/char/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/char/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/char/CVS/Entries 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1,8 @@
++/rs5c313_rtc.c/1.1/Thu Sep 29 07:19:20 2005/-ko/
++/rtc.c/1.8/Mon Mar 27 21:06:14 2006/-ko/
++/rtc9701_rtc.c/1.2/Mon May 30 06:24:28 2005/-ko/
++/sh03rtc.c/1.3/Wed Jan 18 05:37:19 2006/-ko/
++D/watchdog////
++/Kconfig/1.15/Wed Jul 5 14:50:58 2006/-ko/
++/Makefile/1.50/Wed Jul 5 14:50:59 2006/-ko/
++/sysrq.c/1.17/Wed Jul 5 14:50:59 2006/-ko/
+diff -ruN linux-2.6.17-vanilla/drivers/char/CVS/Repository linux-2.6.17/drivers/char/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/char/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/char/CVS/Repository 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/char
+diff -ruN linux-2.6.17-vanilla/drivers/char/CVS/Root linux-2.6.17/drivers/char/CVS/Root
+--- linux-2.6.17-vanilla/drivers/char/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/char/CVS/Root 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/char/Kconfig linux-2.6.17/drivers/char/Kconfig
+--- linux-2.6.17-vanilla/drivers/char/Kconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/char/Kconfig 2006-07-12 16:54:23.000000000 +0000
+@@ -737,6 +737,22 @@
+ To compile this driver as a module, choose M here: the
+ module will be called rtc.
+
++config SH03_RTC
++ tristate "Enhanced Real Time Clock (SH03) Support"
++ depends on SH_SH03
++
++config RS5C313_RTC
++ tristate "RICHO RS5C313 RTC Support for LANDISK"
++ depends on SH_LANDISK
++ help
++ Selecting this option will support RICHO RS5C313 RTC for LANDISK.
++
++config RTC_9701JE
++ tristate "EPSON RTC-9701JE support"
++ depends on SH_RTS7751R2D
++ help
++ Selecting this option will support EPSON RTC-9701JE.
++
+ config SGI_DS1286
+ tristate "SGI DS1286 RTC support"
+ depends on SGI_IP22
+diff -ruN linux-2.6.17-vanilla/drivers/char/Makefile linux-2.6.17/drivers/char/Makefile
+--- linux-2.6.17-vanilla/drivers/char/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/char/Makefile 2006-07-12 16:54:23.000000000 +0000
+@@ -67,6 +67,9 @@
+ obj-$(CONFIG_SGI_IP27_RTC) += ip27-rtc.o
+ obj-$(CONFIG_DS1302) += ds1302.o
+ obj-$(CONFIG_S3C2410_RTC) += s3c2410-rtc.o
++obj-$(CONFIG_RTC_9701JE) += rtc9701_rtc.o
++obj-$(CONFIG_RS5C313_RTC) += rs5c313_rtc.o
++obj-$(CONFIG_SH03_RTC) += sh03rtc.o
+ ifeq ($(CONFIG_GENERIC_NVRAM),y)
+ obj-$(CONFIG_NVRAM) += generic_nvram.o
+ else
+diff -ruN linux-2.6.17-vanilla/drivers/char/rs5c313_rtc.c linux-2.6.17/drivers/char/rs5c313_rtc.c
+--- linux-2.6.17-vanilla/drivers/char/rs5c313_rtc.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/char/rs5c313_rtc.c 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1,855 @@
++/*
++ * RICHO RS5C313 Real Time Clock interface for Linux
++ *
++ * 2005-09-19 modifed by kogiidena
++ *
++ * Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org>
++ * Copyright (C) 1999 Tetsuya Okada & Niibe Yutaka
++ *
++ * Based on code written by Paul Gortmaker.
++ * Copyright (C) 1996 Paul Gortmaker
++ *
++ * This driver allows use of the real time clock (built into
++ * nearly all computers) from user space. It exports the /dev/rtc
++ * interface supporting various ioctl() and also the
++ * /proc/driver/rtc pseudo-file for status information.
++ *
++ * The ioctls can be used to set the interrupt behaviour and
++ * generation rate from the RTC via IRQ 8. Then the /dev/rtc
++ * interface can be used to make use of these timer interrupts,
++ * be they interval or alarm based.
++ *
++ * The /dev/rtc interface will block on reads until an interrupt
++ * has been received. If a RTC interrupt has already happened,
++ * it will output an unsigned long and then block. The output value
++ * contains the interrupt status in the low byte and the number of
++ * interrupts since the last read in the remaining high bytes. The
++ * /dev/rtc interface can also be used with the select(2) call.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version
++ * 2 of the License, or (at your option) any later version.
++ *
++ * Based on other minimal char device drivers, like Alan's
++ * watchdog, Ted's random, etc. etc.
++ *
++ * 1.07 Paul Gortmaker.
++ * 1.08 Miquel van Smoorenburg: disallow certain things on the
++ * DEC Alpha as the CMOS clock is also used for other things.
++ * 1.09 Nikita Schmidt: epoch support and some Alpha cleanup.
++ * 1.09a Pete Zaitcev: Sun SPARC
++ * 1.09b Jeff Garzik: Modularize, init cleanup
++ * 1.09c Jeff Garzik: SMP cleanup
++ * 1.10 Paul Barton-Davis: add support for async I/O
++ * 1.10a Andrea Arcangeli: Alpha updates
++ * 1.10b Andrew Morton: SMP lock fix
++ * 1.10c Cesar Barros: SMP locking fixes and cleanup
++ * 1.10d Paul Gortmaker: delete paranoia check in rtc_exit
++ * 1.10e Maciej W. Rozycki: Handle DECstation's year weirdness.
++ * 1.11 Takashi Iwai: Kernel access functions
++ * rtc_register/rtc_unregister/rtc_control
++ * 1.11a Daniele Bellucci: Audit create_proc_read_entry in rtc_init
++ * 1.12 Venkatesh Pallipadi: Hooks for emulating rtc on HPET base-timer
++ * CONFIG_HPET_EMULATE_RTC
++ *
++ */
++
++#define RTC_VERSION "1.12"
++
++#include <linux/config.h>
++#include <linux/delay.h>
++#include <linux/bcd.h>
++#include <linux/interrupt.h>
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/miscdevice.h>
++#include <linux/ioport.h>
++#include <linux/fcntl.h>
++#include <linux/mc146818rtc.h>
++#include <linux/init.h>
++#include <linux/poll.h>
++#include <linux/proc_fs.h>
++#include <linux/seq_file.h>
++#include <linux/spinlock.h>
++#include <linux/sysctl.h>
++#include <linux/wait.h>
++#include <asm/current.h>
++#include <asm/uaccess.h>
++#include <asm/system.h>
++#include <asm/io.h>
++
++
++#ifndef CONFIG_SH_LANDISK
++#error rs5c313 read and write function not defined
++#endif
++
++#ifdef CONFIG_SH_LANDISK
++/*****************************************************/
++/* LANDISK dependence part of RS5C313 */
++/*****************************************************/
++
++#define SCSMR1 0xFFE00000
++#define SCSCR1 0xFFE00008
++#define SCSMR1_CA 0x80
++#define SCSCR1_CKE 0x03
++#define SCSPTR1 0xFFE0001C
++#define SCSPTR1_EIO 0x80
++#define SCSPTR1_SPB1IO 0x08
++#define SCSPTR1_SPB1DT 0x04
++#define SCSPTR1_SPB0IO 0x02
++#define SCSPTR1_SPB0DT 0x01
++
++#define SDA_OEN SCSPTR1_SPB1IO
++#define SDA SCSPTR1_SPB1DT
++#define SCL_OEN SCSPTR1_SPB0IO
++#define SCL SCSPTR1_SPB0DT
++
++/* RICOH RS5C313 CE port */
++#define RS5C313_CE 0xB0000003
++
++/* RICOH RS5C313 CE port bit */
++#define RS5C313_CE_RTCCE 0x02
++
++/* SCSPTR1 data */
++unsigned char scsptr1_data;
++
++#define RS5C313_CEENABLE ctrl_outb(RS5C313_CE_RTCCE, RS5C313_CE);
++#define RS5C313_CEDISABLE ctrl_outb(0x00, RS5C313_CE)
++#define RS5C313_MISCOP ctrl_outb(0x02, 0xB0000008)
++
++static void rs5c313_initialize(void)
++{
++ /* Set SCK as I/O port and Initialize SCSPTR1 data & I/O port. */
++ ctrl_outb(ctrl_inb(SCSMR1) & ~SCSMR1_CA, SCSMR1);
++ ctrl_outb(ctrl_inb(SCSCR1) & ~SCSCR1_CKE, SCSCR1);
++
++ /* And Initialize SCL for RS5C313 clock */
++ scsptr1_data = ctrl_inb(SCSPTR1) | SCL; /* SCL:H */
++ ctrl_outb(scsptr1_data, SCSPTR1);
++ scsptr1_data = ctrl_inb(SCSPTR1) | SCL_OEN; /* SCL output enable */
++ ctrl_outb(scsptr1_data, SCSPTR1);
++ RS5C313_CEDISABLE; /* CE:L */
++}
++
++static void rs5c313_write(unsigned char data)
++{
++ int i;
++
++ for (i = 0; i < 8; i++) {
++ /* SDA:Write Data */
++ scsptr1_data = (scsptr1_data & ~SDA)
++ | ((((0x80 >> i) & data) >> (7 - i)) << 2);
++ ctrl_outb(scsptr1_data, SCSPTR1);
++ if (i == 0) {
++ scsptr1_data |= SDA_OEN; /* SDA:output enable */
++ ctrl_outb(scsptr1_data, SCSPTR1);
++ }
++ ndelay(700);
++ scsptr1_data &= ~SCL; /* SCL:L */
++ ctrl_outb(scsptr1_data, SCSPTR1);
++ ndelay(700);
++ scsptr1_data |= SCL; /* SCL:H */
++ ctrl_outb(scsptr1_data, SCSPTR1);
++ }
++
++ scsptr1_data &= ~SDA_OEN; /* SDA:output disable */
++ ctrl_outb(scsptr1_data, SCSPTR1);
++
++}
++
++static unsigned char rs5c313_read_data(void)
++{
++ int i;
++ unsigned char data = 0;
++
++ for (i = 0; i < 8; i++) {
++ ndelay(700);
++ /* SDA:Read Data */
++ data |= ((ctrl_inb(SCSPTR1) & SDA) >> 2) << (7 - i);
++ scsptr1_data &= ~SCL; /* SCL:L */
++ ctrl_outb(scsptr1_data, SCSPTR1);
++ ndelay(700);
++ scsptr1_data |= SCL; /* SCL:H */
++ ctrl_outb(scsptr1_data, SCSPTR1);
++ }
++ return data & 0x0F;
++}
++
++#endif /* CONFIG_SH_LANDISK */
++
++
++/*****************************************************/
++/* machine independence part of RS5C313 */
++/*****************************************************/
++
++/* RICOH RS5C313 address */
++#define RS5C313_ADDR_SEC 0x00
++#define RS5C313_ADDR_SEC10 0x01
++#define RS5C313_ADDR_MIN 0x02
++#define RS5C313_ADDR_MIN10 0x03
++#define RS5C313_ADDR_HOUR 0x04
++#define RS5C313_ADDR_HOUR10 0x05
++#define RS5C313_ADDR_WEEK 0x06
++#define RS5C313_ADDR_INTINTVREG 0x07
++#define RS5C313_ADDR_DAY 0x08
++#define RS5C313_ADDR_DAY10 0x09
++#define RS5C313_ADDR_MON 0x0A
++#define RS5C313_ADDR_MON10 0x0B
++#define RS5C313_ADDR_YEAR 0x0C
++#define RS5C313_ADDR_YEAR10 0x0D
++#define RS5C313_ADDR_CNTREG 0x0E
++#define RS5C313_ADDR_TESTREG 0x0F
++
++/* RICOH RS5C313 control register */
++#define RS5C313_CNTREG_ADJ_BSY 0x01
++#define RS5C313_CNTREG_WTEN_XSTP 0x02
++#define RS5C313_CNTREG_12_24 0x04
++#define RS5C313_CNTREG_CTFG 0x08
++
++/* RICOH RS5C313 test register */
++#define RS5C313_TESTREG_TEST 0x01
++
++/* RICOH RS5C313 control bit */
++#define RS5C313_CNTBIT_READ 0x40
++#define RS5C313_CNTBIT_AD 0x20
++#define RS5C313_CNTBIT_DT 0x10
++
++static unsigned char rs5c313_read_reg(unsigned char addr)
++{
++
++ rs5c313_write(addr | RS5C313_CNTBIT_READ | RS5C313_CNTBIT_AD);
++ return rs5c313_read_data();
++
++}
++
++static void rs5c313_write_reg(unsigned char addr, unsigned char data)
++{
++ data &= 0x0f;
++ rs5c313_write(addr | RS5C313_CNTBIT_AD);
++ rs5c313_write(data | RS5C313_CNTBIT_DT);
++ return;
++}
++
++#define rs5c313_read_cntreg() rs5c313_read_reg(RS5C313_ADDR_CNTREG)
++#define rs5c313_write_cntreg(data) rs5c313_write_reg(RS5C313_ADDR_CNTREG,data)
++#define rs5c313_write_intintvreg(data) rs5c313_write_reg(RS5C313_ADDR_INTINTVREG,data)
++
++
++static void rs5c313_get_cur_time(unsigned char *sec, unsigned char *min,
++ unsigned char *hr,
++ unsigned char *day, unsigned char *mon,
++ unsigned char *yr)
++{
++
++ while (1) {
++ RS5C313_CEENABLE; /* CE:H */
++
++ /* Initialize control reg. 24 hour */
++ rs5c313_write_cntreg(0x04);
++
++ if (!(rs5c313_read_cntreg() & RS5C313_CNTREG_ADJ_BSY))
++ break;
++ RS5C313_MISCOP;
++ RS5C313_CEDISABLE;
++ ndelay(700); /* CE:L */
++ }
++
++ *sec = rs5c313_read_reg(RS5C313_ADDR_SEC);
++ *sec |= (rs5c313_read_reg(RS5C313_ADDR_SEC10) << 4);
++
++ *min = rs5c313_read_reg(RS5C313_ADDR_MIN);
++ *min |= (rs5c313_read_reg(RS5C313_ADDR_MIN10) << 4);
++
++ *hr = rs5c313_read_reg(RS5C313_ADDR_HOUR);
++ *hr |= (rs5c313_read_reg(RS5C313_ADDR_HOUR10) << 4);
++
++ *day = rs5c313_read_reg(RS5C313_ADDR_DAY);
++ *day |= (rs5c313_read_reg(RS5C313_ADDR_DAY10) << 4);
++
++ *mon = rs5c313_read_reg(RS5C313_ADDR_MON);
++ *mon |= (rs5c313_read_reg(RS5C313_ADDR_MON10) << 4);
++
++ *yr = rs5c313_read_reg(RS5C313_ADDR_YEAR);
++ *yr |= (rs5c313_read_reg(RS5C313_ADDR_YEAR10) << 4);
++
++ RS5C313_CEDISABLE;
++ ndelay(700); /* CE:L */
++
++}
++
++static void rs5c313_set_cur_time(unsigned char sec, unsigned char min,
++ unsigned char hr,
++ unsigned char day, unsigned char mon,
++ unsigned char yr)
++{
++
++ /* bysy check. */
++ while (1) {
++ RS5C313_CEENABLE; /* CE:H */
++
++ /* Initialize control reg. 24 hour */
++ rs5c313_write_cntreg(0x04);
++
++ if (!(rs5c313_read_cntreg() & RS5C313_CNTREG_ADJ_BSY))
++ break;
++ RS5C313_MISCOP;
++ RS5C313_CEDISABLE;
++ ndelay(700); /* CE:L */
++ }
++
++ rs5c313_write_reg(RS5C313_ADDR_SEC, sec);
++ rs5c313_write_reg(RS5C313_ADDR_SEC10, (sec >> 4));
++
++ rs5c313_write_reg(RS5C313_ADDR_MIN, min);
++ rs5c313_write_reg(RS5C313_ADDR_MIN10, (min >> 4));
++
++ rs5c313_write_reg(RS5C313_ADDR_HOUR, hr);
++ rs5c313_write_reg(RS5C313_ADDR_HOUR10, (hr >> 4));
++
++ rs5c313_write_reg(RS5C313_ADDR_DAY, day);
++ rs5c313_write_reg(RS5C313_ADDR_DAY10,(day >> 4));
++
++ rs5c313_write_reg(RS5C313_ADDR_MON, mon);
++ rs5c313_write_reg(RS5C313_ADDR_MON10, (mon >> 4));
++
++ rs5c313_write_reg(RS5C313_ADDR_YEAR, yr);
++ rs5c313_write_reg(RS5C313_ADDR_YEAR10, (yr >> 4));
++
++ RS5C313_CEDISABLE;
++ ndelay(700); /* CE:H */
++
++}
++
++unsigned long rs5c313_get_cmos_time(
++ unsigned int *BCD_yr, unsigned int *BCD_mon,
++ unsigned int *BCD_day, unsigned int *BCD_hr,
++ unsigned int *BCD_min, unsigned int *BCD_sec)
++{
++
++ unsigned int sec128, sec, min, hr, day, mon, yr, yr100;
++ int clkstop = 0;
++
++ /* Set SCK as I/O port and Initialize SCSPTR1 data & I/O port. */
++ /* And Initialize SCL for RS5C313 clock */
++ rs5c313_initialize();
++
++ again:
++ /* check XSTP bit for clock stoped */
++ RS5C313_CEENABLE; /* CE:H */
++ if (rs5c313_read_cntreg() & RS5C313_CNTREG_WTEN_XSTP) {
++ /* INT interval reg. OFF */
++ rs5c313_write_intintvreg(0x00);
++ /* Initialize control reg. 24 hour & adjust */
++ rs5c313_write_cntreg(0x07);
++ /* bysy check. */
++ while (rs5c313_read_cntreg() & RS5C313_CNTREG_ADJ_BSY)
++ RS5C313_MISCOP;
++ /* Initialize control reg. 24 hour */
++ rs5c313_write_cntreg(0x04);
++ clkstop = 1;
++ } else {
++ clkstop = 0;
++ }
++ RS5C313_CEDISABLE;
++ ndelay(700); /* CE:L */
++
++ /* Get current time. */
++ sec = 0;
++ min = 0;
++ hr = 0;
++ day = 0;
++ mon = 0;
++ yr = 0;
++ rs5c313_get_cur_time((unsigned char *)&sec,
++ (unsigned char *)&min, (unsigned char *)&hr,
++ (unsigned char *)&day,
++ (unsigned char *)&mon, (unsigned char *)&yr);
++
++ /* S-3531A count year from 2000 to 2099. */
++ yr100 = 0x20;
++ /* S-3531A can't get sec128. */
++ sec128 = 0;
++
++ *BCD_yr = yr;
++ *BCD_mon = mon;
++ *BCD_day = day;
++ *BCD_hr = hr;
++ *BCD_min = min;
++ *BCD_sec = sec;
++
++ yr100 = BCD2BIN(yr100);
++ yr = BCD2BIN(yr);
++ mon = BCD2BIN(mon);
++ day = BCD2BIN(day);
++ hr = BCD2BIN(hr);
++ min = BCD2BIN(min);
++ sec = BCD2BIN(sec);
++
++ if (yr > 99 || mon < 1 || mon > 12 || day > 31 || day < 1 ||
++ hr > 23 || min > 59 || sec > 59 || clkstop) {
++ printk(KERN_ERR
++ "RICHO RS5C313: invalid value, resetting to 1 Jan 2000\n");
++ /* Reset S-3531A set (20)00year/01month/01day */
++ /* 00hour 00minute 00second */
++ sec = 0;
++ min = 0;
++ hr = 0;
++ day = 1;
++ mon = 1;
++ yr = 00;
++ rs5c313_set_cur_time((unsigned char)sec,
++ (unsigned char)min, (unsigned char)hr,
++ (unsigned char)day,
++ (unsigned char)mon, (unsigned char)yr);
++
++ goto again;
++ }
++
++ return mktime(yr100 * 100 + yr, mon, day, hr, min, sec);
++}
++
++void rs5c313_set_cmos_time(unsigned int BCD_yr, unsigned int BCD_mon,
++ unsigned int BCD_day, unsigned int BCD_hr,
++ unsigned int BCD_min, unsigned int BCD_sec)
++{
++
++ rs5c313_set_cur_time((unsigned char)BCD_sec,
++ (unsigned char)BCD_min,
++ (unsigned char)BCD_hr,
++ (unsigned char)BCD_day,
++ (unsigned char)BCD_mon, (unsigned char)BCD_yr);
++
++}
++
++/*****************************************************/
++/* machine independence part of RTC driver */
++/*****************************************************/
++
++#define RTC_IO_EXTENT 0x8
++
++static struct fasync_struct *rtc_async_queue;
++static DECLARE_WAIT_QUEUE_HEAD(rtc_wait);
++static ssize_t rtc_read(struct file *file, char __user *buf,
++ size_t count, loff_t *ppos);
++static int rtc_ioctl(struct inode *inode, struct file *file,
++ unsigned int cmd, unsigned long arg);
++static int rtc_proc_open(struct inode *inode, struct file *file);
++
++/*
++ * Bits in rtc_status. (6 bits of room for future expansion)
++ */
++
++#define RTC_IS_OPEN 0x01 /* means /dev/rtc is in use */
++#define RTC_TIMER_ON 0x02 /* missed irq timer active */
++
++/*
++ * rtc_status is never changed by rtc_interrupt, and ioctl/open/close is
++ * protected by the big kernel lock. However, ioctl can still disable the timer
++ * in rtc_status and then with del_timer after the interrupt has read
++ * rtc_status but before mod_timer is called, which would then reenable the
++ * timer (but you would need to have an awful timing before you'd trip on it)
++ */
++static unsigned long rtc_status = 0; /* bitmapped status byte. */
++static unsigned long rtc_freq = 0; /* Current periodic IRQ rate */
++static unsigned long rtc_irq_data = 0; /* our output to the world */
++static unsigned long rtc_max_user_freq = 64; /* > this, need CAP_SYS_RESOURCE */
++
++/*
++ * If this driver ever becomes modularised, it will be really nice
++ * to make the epoch retain its value across module reload...
++ */
++
++static unsigned long epoch = 1900; /* year corresponding to 0x00 */
++
++static const unsigned char days_in_mo[] =
++{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
++
++/*
++ * sysctl-tuning infrastructure.
++ */
++static ctl_table rtc_table[] = {
++ {
++ .ctl_name = 1,
++ .procname = "max-user-freq",
++ .data = &rtc_max_user_freq,
++ .maxlen = sizeof(int),
++ .mode = 0644,
++ .proc_handler = &proc_dointvec,
++ },
++ { .ctl_name = 0 }
++};
++
++static ctl_table rtc_root[] = {
++ {
++ .ctl_name = 1,
++ .procname = "rtc",
++ .maxlen = 0,
++ .mode = 0555,
++ .child = rtc_table,
++ },
++ { .ctl_name = 0 }
++};
++
++static ctl_table dev_root[] = {
++ {
++ .ctl_name = CTL_DEV,
++ .procname = "dev",
++ .maxlen = 0,
++ .mode = 0555,
++ .child = rtc_root,
++ },
++ { .ctl_name = 0 }
++};
++
++static struct ctl_table_header *sysctl_header;
++
++static int __init init_sysctl(void)
++{
++ sysctl_header = register_sysctl_table(dev_root, 0);
++ return 0;
++}
++
++static void __exit cleanup_sysctl(void)
++{
++ unregister_sysctl_table(sysctl_header);
++}
++
++/*
++ * Now all the various file operations that we export.
++ */
++
++static ssize_t rtc_read(struct file *file, char __user *buf,
++ size_t count, loff_t *ppos)
++{
++ return -EIO;
++}
++
++static int rtc_do_ioctl(unsigned int cmd, unsigned long arg, int kernel)
++{
++ struct rtc_time wtime;
++
++ switch (cmd) {
++ case RTC_RD_TIME: /* Read the time/date from RTC */
++ {
++ memset(&wtime, 0, sizeof(struct rtc_time));
++ rtc_get_rtc_time(&wtime);
++ break;
++ }
++ case RTC_SET_TIME: /* Set the RTC */
++ {
++ struct rtc_time rtc_tm;
++ unsigned char mon, day, hrs, min, sec, leap_yr;
++ unsigned int yrs;
++
++ if (!capable(CAP_SYS_TIME))
++ return -EACCES;
++
++ if (copy_from_user(&rtc_tm, (struct rtc_time __user *)arg,
++ sizeof(struct rtc_time)))
++ return -EFAULT;
++
++ yrs = rtc_tm.tm_year + 1900;
++ mon = rtc_tm.tm_mon + 1; /* tm_mon starts at zero */
++ day = rtc_tm.tm_mday;
++ hrs = rtc_tm.tm_hour;
++ min = rtc_tm.tm_min;
++ sec = rtc_tm.tm_sec;
++
++ if (yrs < 1970)
++ return -EINVAL;
++
++ leap_yr = ((!(yrs % 4) && (yrs % 100)) || !(yrs % 400));
++
++ if ((mon > 12) || (day == 0))
++ return -EINVAL;
++
++ if (day > (days_in_mo[mon] + ((mon == 2) && leap_yr)))
++ return -EINVAL;
++
++ if ((hrs >= 24) || (min >= 60) || (sec >= 60))
++ return -EINVAL;
++
++ if ((yrs -= epoch) > 255) /* They are unsigned */
++ return -EINVAL;
++
++ /* These limits and adjustments are independent of
++ * whether the chip is in binary mode or not.
++ */
++ if (yrs > 169) {
++ return -EINVAL;
++ }
++ if (yrs >= 100)
++ yrs -= 100;
++
++ sec = BIN2BCD(sec);
++ min = BIN2BCD(min);
++ hrs = BIN2BCD(hrs);
++ day = BIN2BCD(day);
++ mon = BIN2BCD(mon);
++ yrs = BIN2BCD(yrs);
++
++ spin_lock_irq(&rtc_lock);
++ rs5c313_set_cmos_time(yrs, mon, day, hrs, min, sec);
++ spin_unlock_irq(&rtc_lock);
++
++ return 0;
++ }
++ case RTC_EPOCH_READ: /* Read the epoch. */
++ {
++ return put_user (epoch, (unsigned long __user *)arg);
++ }
++ case RTC_EPOCH_SET: /* Set the epoch. */
++ {
++ /*
++ * There were no RTC clocks before 1900.
++ */
++ if (arg < 1900)
++ return -EINVAL;
++
++ if (!capable(CAP_SYS_TIME))
++ return -EACCES;
++
++ epoch = arg;
++ return 0;
++ }
++ default:
++ return -ENOTTY;
++ }
++ return copy_to_user((void __user *)arg, &wtime, sizeof wtime) ? -EFAULT : 0;
++}
++
++static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
++ unsigned long arg)
++{
++ return rtc_do_ioctl(cmd, arg, 0);
++}
++
++/*
++ * We enforce only one user at a time here with the open/close.
++ * Also clear the previous interrupt data on an open, and clean
++ * up things on a close.
++ */
++
++/* We use rtc_lock to protect against concurrent opens. So the BKL is not
++ * needed here. Or anywhere else in this driver. */
++static int rtc_open(struct inode *inode, struct file *file)
++{
++ spin_lock_irq (&rtc_lock);
++
++ if(rtc_status & RTC_IS_OPEN)
++ goto out_busy;
++
++ rtc_status |= RTC_IS_OPEN;
++
++ rtc_irq_data = 0;
++ spin_unlock_irq (&rtc_lock);
++ return 0;
++
++out_busy:
++ spin_unlock_irq (&rtc_lock);
++ return -EBUSY;
++}
++
++static int rtc_fasync (int fd, struct file *filp, int on)
++
++{
++ return fasync_helper (fd, filp, on, &rtc_async_queue);
++}
++
++static int rtc_release(struct inode *inode, struct file *file)
++{
++ spin_lock_irq (&rtc_lock);
++ rtc_irq_data = 0;
++ rtc_status &= ~RTC_IS_OPEN;
++ spin_unlock_irq (&rtc_lock);
++ return 0;
++}
++
++
++/*
++ * exported stuffs
++ */
++
++EXPORT_SYMBOL(rtc_register);
++EXPORT_SYMBOL(rtc_unregister);
++EXPORT_SYMBOL(rtc_control);
++
++int rtc_register(rtc_task_t *task)
++{
++ return -EIO;
++}
++
++int rtc_unregister(rtc_task_t *task)
++{
++ return -EIO;
++}
++
++int rtc_control(rtc_task_t *task, unsigned int cmd, unsigned long arg)
++{
++ return -EIO;
++}
++
++
++/*
++ * The various file operations we support.
++ */
++
++static struct file_operations rtc_fops = {
++ .owner = THIS_MODULE,
++ .llseek = no_llseek,
++ .read = rtc_read,
++ .ioctl = rtc_ioctl,
++ .open = rtc_open,
++ .release = rtc_release,
++ .fasync = rtc_fasync,
++};
++
++static struct miscdevice rtc_dev = {
++ .minor = RTC_MINOR,
++ .name = "rtc",
++ .fops = &rtc_fops,
++};
++
++static struct file_operations rtc_proc_fops = {
++ .owner = THIS_MODULE,
++ .open = rtc_proc_open,
++ .read = seq_read,
++ .llseek = seq_lseek,
++ .release = single_release,
++};
++
++
++static int __init rtc_init(void)
++{
++ struct proc_dir_entry *ent;
++
++ if (!request_region(RTC_PORT(0), RTC_IO_EXTENT, "rtc")) {
++ printk(KERN_ERR "rtc: I/O port %d is not free.\n", RTC_PORT (0));
++ return -EIO;
++ }
++
++ if (misc_register(&rtc_dev)) {
++ release_region(RTC_PORT(0), RTC_IO_EXTENT);
++ return -ENODEV;
++ }
++
++ ent = create_proc_entry("driver/rtc", 0, NULL);
++ if (!ent) {
++ release_region(RTC_PORT(0), RTC_IO_EXTENT);
++ misc_deregister(&rtc_dev);
++ return -ENOMEM;
++ }
++ ent->proc_fops = &rtc_proc_fops;
++ (void) init_sysctl();
++
++ printk(KERN_INFO "RICHO RS5C313 Real Time Clock Driver v" RTC_VERSION "\n");
++
++ return 0;
++}
++
++static void __exit rtc_exit (void)
++{
++ cleanup_sysctl();
++ remove_proc_entry ("driver/rtc", NULL);
++ misc_deregister(&rtc_dev);
++ release_region (RTC_PORT (0), RTC_IO_EXTENT);
++}
++
++module_init(rtc_init);
++module_exit(rtc_exit);
++
++
++/*
++ * Info exported via "/proc/driver/rtc".
++ */
++
++static int rtc_proc_show(struct seq_file *seq, void *v)
++{
++#define YN(bit) ((ctrl & bit) ? "yes" : "no")
++#define NY(bit) ((ctrl & bit) ? "no" : "yes")
++ struct rtc_time tm;
++ unsigned char batt, ctrl;
++ unsigned long freq;
++
++ batt = 1;
++ freq = rtc_freq;
++ ctrl = RTC_24H;
++
++ rtc_get_rtc_time(&tm);
++
++ /*
++ * There is no way to tell if the luser has the RTC set for local
++ * time or for Universal Standard Time (GMT). Probably local though.
++ */
++ seq_printf(seq,
++ "rtc_time\t: %02d:%02d:%02d\n"
++ "rtc_date\t: %04d-%02d-%02d\n"
++ "rtc_epoch\t: %04lu\n",
++ tm.tm_hour, tm.tm_min, tm.tm_sec,
++ tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, epoch);
++
++ seq_puts(seq, "alarm\t\t: **:**:**\n");
++
++ seq_printf(seq,
++ "DST_enable\t: %s\n"
++ "BCD\t\t: %s\n"
++ "24hr\t\t: %s\n"
++ "square_wave\t: %s\n"
++ "alarm_IRQ\t: %s\n"
++ "update_IRQ\t: %s\n"
++ "periodic_IRQ\t: %s\n"
++ "periodic_freq\t: %ld\n"
++ "batt_status\t: %s\n",
++ YN(RTC_DST_EN),
++ NY(RTC_DM_BINARY),
++ YN(RTC_24H),
++ YN(RTC_SQWE),
++ YN(RTC_AIE),
++ YN(RTC_UIE),
++ YN(RTC_PIE),
++ freq,
++ batt ? "okay" : "dead");
++
++ return 0;
++#undef YN
++#undef NY
++}
++
++static int rtc_proc_open(struct inode *inode, struct file *file)
++{
++ return single_open(file, rtc_proc_show, NULL);
++}
++
++void rtc_get_rtc_time(struct rtc_time *rtc_tm)
++{
++ unsigned int BCD_yr, BCD_mon, BCD_day, BCD_hr, BCD_min, BCD_sec;
++
++ spin_lock_irq(&rtc_lock);
++ rs5c313_get_cmos_time(&BCD_yr, &BCD_mon, &BCD_day,
++ &BCD_hr, &BCD_min, &BCD_sec);
++ spin_unlock_irq(&rtc_lock);
++
++ rtc_tm->tm_sec = BCD2BIN(BCD_sec);
++ rtc_tm->tm_min = BCD2BIN(BCD_min);
++ rtc_tm->tm_hour = BCD2BIN(BCD_hr);
++ rtc_tm->tm_mday = BCD2BIN(BCD_day);
++ rtc_tm->tm_mon = BCD2BIN(BCD_mon);
++ rtc_tm->tm_year = BCD2BIN(BCD_yr);
++
++ /*
++ * Account for differences between how the RTC uses the values
++ * and how they are defined in a struct rtc_time;
++ */
++ if ((rtc_tm->tm_year += (epoch - 1900)) <= 69)
++ rtc_tm->tm_year += 100;
++
++ rtc_tm->tm_mon--;
++}
++
++
++MODULE_AUTHOR("kogiidena");
++MODULE_LICENSE("GPL");
++MODULE_ALIAS_MISCDEV(RTC_MINOR);
++
+diff -ruN linux-2.6.17-vanilla/drivers/char/rtc.c linux-2.6.17/drivers/char/rtc.c
+--- linux-2.6.17-vanilla/drivers/char/rtc.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/char/rtc.c 2006-07-12 16:54:23.000000000 +0000
+@@ -104,7 +104,7 @@
+ #endif
+
+ #ifdef RTC_IRQ
+-static int rtc_has_irq = 1;
++static int rtc_has_irq = RTC_IRQ;
+ #endif
+
+ #ifndef CONFIG_HPET_EMULATE_RTC
+diff -ruN linux-2.6.17-vanilla/drivers/char/rtc9701_rtc.c linux-2.6.17/drivers/char/rtc9701_rtc.c
+--- linux-2.6.17-vanilla/drivers/char/rtc9701_rtc.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/char/rtc9701_rtc.c 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1,888 @@
++/*
++ * linux/drivers/char/rtc9701_rtc.c
++ *
++ * Real Time Clock interface for Linux
++ * EPSON RTC-9701JE support
++ *
++ */
++#include <linux/config.h>
++#include <linux/module.h>
++#include <linux/fs.h>
++#include <linux/miscdevice.h>
++#include <linux/delay.h>
++#include <asm/delay.h>
++#include <linux/string.h>
++#include <linux/interrupt.h>
++#include <linux/init.h>
++#include <linux/poll.h>
++#ifdef CONFIG_PROC_FS
++#include <linux/proc_fs.h>
++#endif
++
++#include <asm/io.h>
++#include <asm/rts7751r2d/rts7751r2d.h>
++
++#include <linux/rtc.h>
++
++/* define to 1 enable copious debugging info */
++#undef RTC9701_DEBUG
++#undef RTC9701_DEBUG_IO
++#undef RTC9701_DEBUG_INTR
++
++#ifndef BCD_TO_BIN
++#define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10)
++#endif
++
++#ifndef BIN_TO_BCD
++#define BIN_TO_BCD(val) ((val)=(((val)/10)<<4) + (val)%10)
++#endif
++
++#define DRIVER_VERSION "0.02"
++
++#define RSECCNT 0x00 /* Second Counter */
++#define RMINCNT 0x01 /* Minute Counter */
++#define RHRCNT 0x02 /* Hour Counter */
++#define RWKCNT 0x03 /* Week Counter */
++#define RDAYCNT 0x04 /* Day Counter */
++#define RMONCNT 0x05 /* Month Counter */
++#define RYRCNT 0x06 /* Year Counter */
++#define R100CNT 0x07 /* Y100 Counter */
++#define RMINAR 0x08 /* Minute Alarm */
++#define RHRAR 0x09 /* Hour Alarm */
++#define RWKAR 0x0a /* Week/Day Alarm */
++#define RTIMCNT 0x0c /* Interval Timer */
++#define REXT 0x0d /* Extension Register */
++#define RFLAG 0x0e /* RTC Flag Register */
++#define RCR 0x0f /* RTC Control Register */
++
++#define WRITE_CMD 0x00 /* Write Command */
++#define READ_CMD 0x08 /* Read Command */
++
++#define SCSMR1 0xffe00000 /* Serial Mode Register(SCI) */
++#define SCSCR1 0xffe00008 /* Serial Control Register(SCI) */
++#define SCSPTR1 0xffe0001c /* Serial Port Register(SCI) */
++
++static int rtc_usage;
++static int rtc_irq_data;
++
++static struct fasync_struct* rtc_async_queue;
++
++static DECLARE_WAIT_QUEUE_HEAD(rtc_wait);
++extern spinlock_t rtc_lock;
++static unsigned int epoch = 1900; /* year corresponding to 0x00 */
++
++static const unsigned char days_in_mo[] =
++{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
++
++static __inline__ unsigned char rtc9701_inb(unsigned long addr)
++{
++ unsigned char data, retval;
++ int i;
++
++ ctrl_outw(0x0001, PA_RTCCE); /* CE=1 */
++ ndelay(170); /* 170ns delay (tZR) */
++ ctrl_outb(0x8c, SCSPTR1);
++ for (i=0 ; i<18 ; i++)
++ if (ctrl_inb(SCSPTR1) & 0x01) /* Check ready */
++ break;
++ else
++ mdelay(1); /* 1ms delay */
++//#ifdef RTC9701_DEBUG_IO
++ if (i >= 18)
++ printk("RTC-9701JE Read Time out ready wait\n");
++//#endif
++ ndelay(65); /* 65ns delay (tRDY) */
++
++ for (i=0 ; i<4 ; i++) { /* Command Set */
++ if ((READ_CMD << i) & 0x08)
++ data = 0x8b; /* DATA=1 */
++ else
++ data = 0x8a; /* DATA=0 */
++ ctrl_outb(data, SCSPTR1); /* CLK=0, DATA */
++ ndelay(250); /* 250ns delay (tWL) */
++ data |= 0x04;
++ ctrl_outb(data, SCSPTR1); /* CLK=1 */
++ ndelay(250); /* 250ns delay (tWH) */
++ }
++
++ for (i=0 ; i<4 ; i++) { /* Address Set */
++ if ((addr << i) & 0x08)
++ data = 0x8b; /* DATA=1 */
++ else
++ data = 0x8a; /* DATA=0 */
++ ctrl_outb(data, SCSPTR1); /* CLK=0, DATA */
++ ndelay(250); /* 250ns delay (tWL) */
++ data |= 0x04;
++ ctrl_outb(data, SCSPTR1); /* CLK=1 */
++ ndelay(250); /* 250ns delay (tWH) */
++ }
++
++#if 0
++ /* Dummy clock */
++ ctrl_outb(0x88, SCSPTR1); /* CLK=0 */
++ ndelay(250); /* 250ns delay (tWL) */
++ ctrl_inb(SCSPTR1); /* Dummy read */
++ ctrl_outb(0x8c, SCSPTR1); /* CLK=1 */
++ ndelay(250); /* 250ns delay (tWH) */
++#endif
++
++ retval = 0;
++ for (i=0 ; i<8 ; i++) { /* DATA Read */
++ ctrl_outb(0x88, SCSPTR1); /* CLK=0 */
++#if 0
++ if (i == 0)
++ ndelay(200); /* 200ns delay (tZR) */
++#endif
++ ndelay(250); /* 250ns delay (tWL) */
++ retval <<= 1;
++ retval &= 0xfe;
++ if (ctrl_inb(SCSPTR1) & 0x01)
++ retval |= 0x01;
++ ctrl_outb(0x8c, SCSPTR1); /* CLK=1 */
++ ndelay(250); /* 250ns delay (tWH) */
++ }
++
++ ctrl_outw(0x0000, PA_RTCCE); /* CE=0 */
++#if 0
++ mdelay(1); /* 1ms delay (tCR) */
++#endif
++
++#ifdef RTC9701_DEBUG_IO
++ printk("rtc9701_inb addr=%x value=%x\n", (unsigned int)addr, retval);
++#endif
++ return retval;
++}
++
++static __inline__ void rtc9701_outb(unsigned char b, unsigned long addr)
++{
++ int i;
++ unsigned char data;
++
++#ifdef RTC9701_DEBUG_IO
++ printk("rtc9701_outb addr=%x value=%x\n", (unsigned int)addr, b);
++#endif
++ ctrl_outw(0x0001, PA_RTCCE); /* CE=1 */
++ ndelay(170); /* 170ns delay (tZR) */
++ ctrl_outb(0x8c, SCSPTR1);
++ for (i=0 ; i<18 ; i++)
++ if (ctrl_inb(SCSPTR1) & 0x01) /* Check ready */
++ break;
++ else
++ mdelay(1); /* 1ms delay */
++//#ifdef RTC9701_DEBUG_IO
++ if (i >= 18)
++ printk("RTC-9701JE Write Time out ready wait\n");
++//#endif
++ ndelay(65); /* 65ns delay (tRDY) */
++
++ for (i=0 ; i<4 ; i++) { /* Command Set */
++ if ((WRITE_CMD << i) & 0x08)
++ data = 0x8b; /* DATA=1 */
++ else
++ data = 0x8a; /* DATA=0 */
++ ctrl_outb(data, SCSPTR1); /* CLK=0, DATA */
++ ndelay(250); /* 250ns delay (tWL) */
++ data |= 0x04;
++ ctrl_outb(data, SCSPTR1); /* CLK=1 */
++ ndelay(250); /* 250ns delay (tWH) */
++ }
++
++ for (i=0 ; i<4 ; i++) { /* Address Set */
++ if ((addr << i) & 0x08)
++ data = 0x8b; /* DATA=1 */
++ else
++ data = 0x8a; /* DATA=0 */
++ ctrl_outb(data, SCSPTR1); /* CLK=0, DATA */
++ ndelay(250); /* 250ns delay (tWL) */
++ data |= 0x04;
++ ctrl_outb(data, SCSPTR1); /* CLK=1 */
++ ndelay(250); /* 250ns delay (tWH) */
++ }
++
++ for (i=0 ; i<8 ; i++) { /* DATA Write */
++ if ((b << i ) & 0x80)
++ data = 0x8b; /* DATA=1 */
++ else
++ data = 0x8a; /* DATA=0 */
++ ctrl_outb(data, SCSPTR1); /* CLK=0, DATA */
++ ndelay(250); /* 250ns delay (tWL) */
++ data |= 0x04;
++ ctrl_outb(data, SCSPTR1); /* CLK=1 */
++ ndelay(250); /* 250ns delay (tWH) */
++ }
++
++ ctrl_outw(0x0000, PA_RTCCE); /* CE=0 */
++#if 0
++ mdelay(1); /* 1ms delay (tCR) */
++#endif
++}
++
++static irqreturn_t rtc9701_rtc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
++{
++ unsigned char wk;
++
++#ifdef RTC9701_DEBUG
++ printk("RTC-9701JE Interrupt irq=%d\n", irq);
++#endif
++ spin_lock(&rtc_lock);
++
++ if (irq == IRQ_RTCALM) {
++ wk = rtc9701_inb(RFLAG);
++#ifdef RTC9701_DEBUG_INTR
++ printk("RTC-9701JE Interrupt alarm flag=%02x\n", wk);
++#endif
++ if (wk & 0x08) {
++ wk &= 0xb6;
++ rtc9701_outb(wk, RFLAG);
++ rtc_irq_data = 1;
++ }
++ } else if (irq == IRQ_RTCTIME) {
++ wk = rtc9701_inb(RFLAG);
++#ifdef RTC9701_DEBUG_INTR
++ printk("RTC-9701JE Interrupt timer flag=%02x\n", wk);
++#endif
++ if (wk & 0x10) { /* Interval timer */
++ wk &= 0xae;
++ rtc9701_outb(wk, RFLAG);
++ rtc_irq_data = 2;
++ }
++ if (wk & 0x20) { /* Update time */
++ wk &= 0x9e;
++ rtc9701_outb(wk, RFLAG);
++ rtc_irq_data = 2;
++ }
++ }
++
++ spin_unlock(&rtc_lock);
++#if 0
++ mdelay(20);
++#endif
++ wake_up_interruptible(&rtc_wait);
++
++ kill_fasync(&rtc_async_queue, SIGIO, POLL_IN);
++
++ return IRQ_HANDLED;
++}
++
++static int rtc9701_rtc_open(struct inode *minode, struct file *mfile)
++{
++ if (rtc_usage != 0)
++ return -EBUSY;
++
++ rtc_usage = 1;
++
++ return 0;
++}
++
++static int rtc9701_rtc_release(struct inode *minode, struct file *mfile)
++{
++ rtc_usage = 0;
++
++ return 0;
++}
++
++static int rtc9701_rtc_fasync(int fd, struct file *filp, int on)
++{
++ return fasync_helper(fd, filp, on, &rtc_async_queue);
++}
++
++static loff_t rtc9701_rtc_llseek(struct file *file, loff_t offset, int origin)
++{
++ return -ESPIPE;
++}
++
++static ssize_t rtc9701_rtc_read(struct file* file,
++ char* buf,
++ size_t count,
++ loff_t* ppos)
++{
++ DECLARE_WAITQUEUE(wait, current);
++ unsigned long data = 1;
++ ssize_t retval;
++
++ if (count < sizeof(unsigned long))
++ return -EINVAL;
++
++ add_wait_queue(&rtc_wait, &wait);
++
++ current->state = TASK_INTERRUPTIBLE;
++
++ do {
++ spin_lock_irq (&rtc_lock);
++ data = rtc_irq_data;
++ spin_unlock_irq (&rtc_lock);
++
++ if (data != 0) {
++ rtc_irq_data = 0;
++ break;
++ }
++
++ if (file->f_flags & O_NONBLOCK) {
++ retval = -EAGAIN;
++ goto out;
++ }
++ if (signal_pending(current)) {
++ retval = -ERESTARTSYS;
++ goto out;
++ }
++ schedule();
++ } while (1);
++
++ retval = put_user(data, (unsigned long *)buf);
++ if (!retval)
++ retval = sizeof(unsigned long);
++out:
++ current->state = TASK_RUNNING;
++ remove_wait_queue(&rtc_wait, &wait);
++
++ return retval;
++}
++
++static void rtc_set_timer(unsigned long value)
++{
++ unsigned char time;
++
++ time = (unsigned char)value | 0x80;
++ rtc9701_outb(time, RTIMCNT);
++#ifdef RTC9701_DEBUG
++ time = rtc9701_inb(RTIMCNT);
++ printk("RTC-9701JE Set timer value=%x\n", time);
++#endif
++}
++
++static unsigned long rtc_read_timer(void)
++{
++ unsigned char time;
++
++ time = rtc9701_inb(RTIMCNT);
++#ifdef RTC9701_DEBUG
++ printk("RTC-9701JE Read timer value=%x\n", time);
++#endif
++ return (unsigned long)time;
++}
++
++static void control_periodic_irq(int mode)
++{
++ unsigned char wk;
++ unsigned char rcr;
++
++ if (mode == 0) { /* OFF */
++ rcr = rtc9701_inb(RCR);
++ wk = rcr & 0x2e;
++ rtc9701_outb(wk, RCR);
++ } else { /* ON */
++ rcr = rtc9701_inb(RCR);
++ wk = rcr | 0x10;
++ rtc9701_outb(wk, RCR);
++ }
++
++ rtc_irq_data = 0;
++}
++
++static void control_alarm_irq(int mode)
++{
++ unsigned char rcr;
++
++ if (mode == 0) { /* AIE = OFF */
++ rcr = rtc9701_inb(RCR);
++ rcr &= 0x36;
++ rtc9701_outb(rcr, RCR);
++ } else { /* AIE = ON */
++ rcr = rtc9701_inb(RCR);
++ rcr |= 0x08;
++ rtc9701_outb(rcr, RCR);
++ }
++
++ rtc_irq_data = 0;
++}
++
++static void get_rtc_data(struct rtc_time *tm)
++{
++ unsigned char wk;
++
++ tm->tm_sec = 0;
++ tm->tm_min = 0;
++ tm->tm_hour = 0;
++ tm->tm_mday = 0;
++ tm->tm_mon = 0;
++ tm->tm_year = 0;
++ tm->tm_wday = 0;
++ tm->tm_yday = 0;
++ tm->tm_isdst = 0;
++
++ wk = rtc9701_inb(RSECCNT);
++ wk &= 0x7f;
++ BCD_TO_BIN(wk);
++ tm->tm_sec = wk;
++
++ wk = rtc9701_inb(RMINCNT);
++ wk &= 0x7f;
++ BCD_TO_BIN(wk);
++ tm->tm_min = wk;
++
++ wk = rtc9701_inb(RHRCNT);
++ wk &= 0x7f;
++ BCD_TO_BIN(wk);
++ tm->tm_hour = wk;
++
++ wk = rtc9701_inb(RWKCNT);
++ wk &= 0x7f;
++ tm->tm_wday = wk - 1;
++
++ wk = rtc9701_inb(RDAYCNT);
++ wk &= 0x7f;
++ BCD_TO_BIN(wk);
++ tm->tm_mday = wk;
++
++ wk = rtc9701_inb(RMONCNT);
++ wk &= 0x7f;
++ BCD_TO_BIN(wk);
++ tm->tm_mon = wk - 1;
++
++ wk = rtc9701_inb(RYRCNT);
++ BCD_TO_BIN(wk);
++ tm->tm_year = wk + 100;
++}
++
++static void get_rtc_alarm_data(struct rtc_time *tm)
++{
++ unsigned char wk;
++ unsigned char rflag, rcr;
++
++ tm->tm_sec = 0;
++ tm->tm_min = 0;
++ tm->tm_hour = 0;
++ tm->tm_mday = 0;
++ tm->tm_mon = 0;
++ tm->tm_year = 0;
++ tm->tm_wday = 0;
++ tm->tm_yday = 0;
++ tm->tm_isdst = 0;
++
++ rflag = rtc9701_inb(RFLAG);
++ wk = rflag & 0xf7;
++ rtc9701_outb(wk, RFLAG); /* AF=0 */
++ rcr = rtc9701_inb(RCR);
++ wk = rcr & 0xf7;
++ rtc9701_outb(wk, RCR); /* AIE=0 */
++
++ wk = rtc9701_inb(RMINAR);
++ wk &= 0x7f;
++ BCD_TO_BIN(wk);
++ tm->tm_min = wk;
++
++ wk = rtc9701_inb(RHRAR);
++ wk &= 0x7f;
++ BCD_TO_BIN(wk);
++ tm->tm_hour = wk;
++
++ rtc9701_outb(rflag, RFLAG);
++ rtc9701_outb(rcr, RCR);
++#ifdef RTC9701_DEBUG
++ printk("get_rtc_alarm_data: hour:%x min:%x\n", tm->tm_hour, tm->tm_min);
++#endif
++}
++
++static void set_rtc_data(struct rtc_time *tm)
++{
++ unsigned char sec, min, hour, mday, wday, mon, year;
++
++#ifdef RTC9701_DEBUG
++ printk("set_rtc_data:%d/%d/%d %d:%d:%d\n", tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
++#endif
++ sec = tm->tm_sec;
++ min = tm->tm_min;
++ hour = tm->tm_hour;
++ mday = tm->tm_mday;
++ wday = tm->tm_wday;
++ mon = tm->tm_mon;
++
++ BIN_TO_BCD(sec);
++ rtc9701_outb(sec, RSECCNT);
++
++ BIN_TO_BCD(min);
++ rtc9701_outb(min, RMINCNT);
++
++ BIN_TO_BCD(hour);
++ rtc9701_outb(hour, RHRCNT);
++
++ rtc9701_outb(wday, RWKCNT);
++
++ BIN_TO_BCD(mday);
++ rtc9701_outb(mday, RDAYCNT);
++
++ BIN_TO_BCD(mon);
++ rtc9701_outb(mon, RMONCNT);
++
++ if (tm->tm_year > 100)
++ tm->tm_year -= 100;
++ year = tm->tm_year;
++ BIN_TO_BCD(year);
++ rtc9701_outb(year, RYRCNT);
++}
++
++static void set_rtc_alarm_data(struct rtc_time *tm)
++{
++ unsigned char wk;
++ unsigned char min, hour;
++
++#ifdef RTC9701_DEBUG
++ printk("set_rtc_alarm_data: hour:%x min:%x\n", tm->tm_hour, tm->tm_min);
++#endif
++ wk = rtc9701_inb(RFLAG);
++ wk &= 0xf7;
++ rtc9701_outb(wk, RFLAG); /* AF=0 */
++ wk = rtc9701_inb(RCR);
++ wk &= 0xf7;
++ rtc9701_outb(wk, RCR); /* AIE=0 */
++
++ min = tm->tm_min;
++ BIN_TO_BCD(min);
++ rtc9701_outb(min, RMINAR);
++
++ hour = tm->tm_hour;
++ BIN_TO_BCD(hour);
++ rtc9701_outb(hour, RHRAR);
++
++ wk = rtc9701_inb(RFLAG);
++ wk &= 0xf7;
++ rtc9701_outb(wk, RFLAG); /* AF=0 */
++}
++
++static int rtc9701_rtc_ioctl(struct inode* inode,
++ struct file* file,
++ unsigned int cmd,
++ unsigned long arg)
++{
++ struct rtc_time wtime, rtc_tm;
++ unsigned char mon, day, hrs, min, sec, week, leap_yr;
++ unsigned int yrs;
++ unsigned long value;
++
++ wtime.tm_sec = 0;
++ wtime.tm_min = 0;
++ wtime.tm_hour = 0;
++ wtime.tm_mday = 0;
++ wtime.tm_mon = 0;
++ wtime.tm_year = 0;
++ wtime.tm_wday = 0;
++ wtime.tm_yday = 0;
++ wtime.tm_isdst = 0;
++
++ switch (cmd) {
++ case RTC_AIE_OFF: /* =2:Alarm int. disable */
++ spin_lock_irq(&rtc_lock);
++ control_alarm_irq(0);
++ spin_unlock_irq(&rtc_lock);
++ mdelay(20);
++ return 0;
++
++ case RTC_AIE_ON: /* =1:Alarm int. enable */
++ spin_lock_irq(&rtc_lock);
++ control_alarm_irq(1);
++ spin_unlock_irq(&rtc_lock);
++ mdelay(20);
++ return 0;
++
++ case RTC_PIE_OFF: /* =6:Periodic int. disable */
++ spin_lock_irq(&rtc_lock);
++ control_periodic_irq(0);
++ spin_unlock_irq(&rtc_lock);
++ mdelay(20);
++ return 0;
++
++ case RTC_PIE_ON: /* =5:Periodic int. enable */
++ spin_lock_irq(&rtc_lock);
++ control_periodic_irq(1);
++ spin_unlock_irq(&rtc_lock);
++ mdelay(20);
++ return 0;
++
++ case RTC_IRQP_SET:
++ if (copy_from_user(&value, (unsigned long *)arg, sizeof(value)))
++ return -EFAULT;
++ rtc_set_timer(value);
++ mdelay(20);
++ return 0;
++
++ case RTC_IRQP_READ:
++ value = rtc_read_timer();
++ mdelay(20);
++ return put_user(value, (unsigned long *)arg);
++
++ case RTC_ALM_READ: /* =8:Read alarm time */
++ get_rtc_alarm_data(&wtime);
++ mdelay(20);
++ break;
++
++ case RTC_ALM_SET: /* =7:Set alarm time */
++ if (copy_from_user(&rtc_tm, (struct rtc_time*)arg,
++ sizeof(struct rtc_time)))
++ return -EFAULT;
++
++ hrs = rtc_tm.tm_hour;
++ min = rtc_tm.tm_min;
++
++ if ((hrs >= 24) || (min >= 60)) {
++ return -EINVAL;
++ }
++
++ /* update the alarm register */
++ spin_lock_irq(&rtc_lock);
++ wtime.tm_min = min;
++ wtime.tm_hour = hrs;
++ set_rtc_alarm_data(&wtime);
++ spin_unlock_irq(&rtc_lock);
++ mdelay(20);
++ return 0;
++
++ case RTC_RD_TIME: /* =9:Read RTC time */
++ spin_lock_irq(&rtc_lock);
++ get_rtc_data(&wtime);
++ spin_unlock_irq(&rtc_lock);
++ mdelay(20);
++ break;
++
++ case RTC_SET_TIME: /* =10:Set RTC time */
++ if (copy_from_user(&rtc_tm, (struct rtc_time*)arg,
++ sizeof(struct rtc_time)))
++ return -EFAULT;
++
++ yrs = rtc_tm.tm_year + epoch;
++ mon = rtc_tm.tm_mon+1;
++ day = rtc_tm.tm_mday;
++ hrs = rtc_tm.tm_hour;
++ min = rtc_tm.tm_min;
++ sec = rtc_tm.tm_sec;
++ week = rtc_tm.tm_wday+1;
++
++ if (yrs < epoch){
++ return -EINVAL;
++ }
++ leap_yr = ((!(yrs % 4) && (yrs % 100)) || !(yrs % 400));
++ if ((mon > 12) || (day == 0)){
++ return -EINVAL;
++ }
++ if (day > (days_in_mo[mon] + ((mon == 2) && leap_yr))){
++ return -EINVAL;
++ }
++ if ((hrs >= 24) || (min >= 60) || (sec >= 60) || (week > 64)){
++ return -EINVAL;
++ }
++ if ((yrs - epoch) > 255){
++ return -EINVAL;
++ }
++
++ spin_lock_irq(&rtc_lock);
++ wtime.tm_sec = sec;
++ wtime.tm_min = min;
++ wtime.tm_hour = hrs;
++ wtime.tm_mday = day;
++ wtime.tm_mon = mon;
++ wtime.tm_wday = week;
++ wtime.tm_year = yrs - epoch;
++ set_rtc_data(&wtime);
++ spin_unlock_irq(&rtc_lock);
++ mdelay(20);
++ return 0;
++
++ default:
++ return -EINVAL;
++ }
++
++ return copy_to_user((void*)arg, &wtime, sizeof(wtime)) ? -EFAULT : 0;
++}
++
++static unsigned int rtc9701_rtc_poll(struct file* file, poll_table* wait)
++{
++ unsigned long l;
++
++ poll_wait(file, &rtc_wait, wait);
++
++ spin_lock_irq(&rtc_lock);
++ l = rtc_irq_data;
++ spin_unlock_irq(&rtc_lock);
++
++ if (l != 0)
++ return POLLIN | POLLRDNORM;
++ else
++ return 0;
++}
++
++#ifdef CONFIG_PROC_FS
++
++static int rtc9701_rtc_proc_output(char *buf)
++{
++ char *p;
++ struct rtc_time tm;
++
++ get_rtc_data(&tm);
++ mdelay(20);
++
++ p = buf;
++ p += sprintf(p,
++ "rtc_time\t: %02d:%02d:%02d\n"
++ "rtc_date\t: %04d-%02d-%02d\n"
++ "rtc_epoch\t: %04lu\n",
++ tm.tm_hour, tm.tm_min, tm.tm_sec,
++ tm.tm_year + epoch, tm.tm_mon+1, tm.tm_mday,
++ (unsigned long)epoch);
++
++ get_rtc_alarm_data(&tm);
++ mdelay(20);
++
++ p += sprintf(p,
++ "alrm_time\t: %02d:%02d\n",
++ tm.tm_hour, tm.tm_min);
++
++ p += sprintf(p,"alarm_IRQ\t: %s\n",
++ (rtc9701_inb(RCR) & 0x08) ? "yes" : "no" );
++ mdelay(20);
++ p += sprintf(p,"periodic_IRQ\t: %s\n",
++ (rtc9701_inb(RCR) & 0x10) ? "yes" : "no" );
++ mdelay(20);
++
++ p += sprintf(p,"periodic_freq\t: 1\n");
++ p += sprintf(p,"batt_status\t: unsupported\n");
++
++ return (p - buf);
++}
++
++static int rtc9701_rtc_read_proc(char* page,
++ char** start,
++ off_t off,
++ int count,
++ int* eof,
++ void* data)
++{
++ int len = rtc9701_rtc_proc_output(page);
++
++ if (len <= off + count) { *eof = 1; }
++ *start = page + off;
++ len -= off;
++ if (len > count) { len = count; }
++ if (len < 0) { len = 0; }
++
++ return len;
++}
++
++#endif
++
++static void rtc9701_initial_check(void)
++{
++ unsigned int sec, min, hr, day, mon, yr;
++
++ sec = rtc9701_inb(RSECCNT) & 0x7f;
++ min = rtc9701_inb(RMINCNT) & 0x7f;
++ hr = rtc9701_inb(RHRCNT) & 0x7f;
++ day = rtc9701_inb(RDAYCNT) & 0x7f;
++ mon = rtc9701_inb(RMONCNT) & 0x7f;
++ yr = rtc9701_inb(RYRCNT) & 0x7f;
++
++ BCD_TO_BIN(sec);
++ BCD_TO_BIN(min);
++ BCD_TO_BIN(hr);
++ BCD_TO_BIN(day);
++ BCD_TO_BIN(mon);
++ BCD_TO_BIN(yr);
++
++ if (yr > 99 || mon < 1 || mon > 12 || day > 31 || day < 1 ||
++ hr > 23 || min > 59 || sec > 59) {
++ printk("Current RTC Time:%d-%d-%d %d:%d:%d\n", yr, mon, day, hr, min, sec);
++ printk(KERN_ERR "RTC-9701: invalid value, resetting to 1 Jan 2000\n");
++ rtc9701_outb(0, RSECCNT);
++ rtc9701_outb(0, RMINCNT);
++ rtc9701_outb(0, RHRCNT);
++ rtc9701_outb(0x40, RWKCNT);
++ rtc9701_outb(1, RDAYCNT);
++ rtc9701_outb(1, RMONCNT);
++ rtc9701_outb(0, RYRCNT);
++ }
++}
++
++static struct file_operations rtc_fops = {
++ .owner = THIS_MODULE,
++ .llseek = rtc9701_rtc_llseek,
++ .read = rtc9701_rtc_read,
++ .poll = rtc9701_rtc_poll,
++ .ioctl = rtc9701_rtc_ioctl,
++ .open = rtc9701_rtc_open,
++ .release = rtc9701_rtc_release,
++ .fasync = rtc9701_rtc_fasync,
++};
++
++
++static struct miscdevice rts7751r2drtc_miscdev = {
++ RTC_MINOR,
++ "rtc",
++ &rtc_fops
++};
++
++static void rtc9701_rtc_exit(void)
++{
++ spin_lock_irq(&rtc_lock);
++ rtc9701_outb(0x00, RCR);
++ spin_unlock_irq(&rtc_lock);
++ mdelay(20);
++
++ free_irq(IRQ_RTCALM, NULL);
++ free_irq(IRQ_RTCTIME, NULL);
++#ifdef CONFIG_PROC_FS
++ remove_proc_entry("driver/rtc", NULL);
++#endif
++
++ misc_deregister(&rts7751r2drtc_miscdev);
++}
++
++static int __init rtc9701_rtc_init(void)
++{
++ unsigned char val;
++
++ misc_register(&rts7751r2drtc_miscdev);
++
++#ifdef CONFIG_PROC_FS
++ create_proc_read_entry("driver/rtc", 0, 0, rtc9701_rtc_read_proc, NULL);
++#endif
++ ctrl_outb((ctrl_inb(SCSMR1) & 0x7f), SCSMR1);
++ ctrl_outb((ctrl_inb(SCSCR1) & 0x9c), SCSCR1);
++ ctrl_outw(0x0000, PA_RTCCE); /* CE=0 */
++ ctrl_outb(0x8c, SCSPTR1); /* EIO=1, SPB1IO=1, SPB1DT=1, SPB0IO=0 */
++
++ rtc9701_initial_check(); /* RTC Data Initial check */
++ mdelay(20);
++
++ rtc9701_outb(0x02, REXT); /* WADA=0, UDUTY=0, USEL=0, TSEL1=1, TSEL0=0 */
++ mdelay(20);
++ rtc9701_outb(0x00, RCR); /* UIE=0, TIE=0, AIE=0, EXIE=0, VLIE=0 */
++ mdelay(20);
++ rtc9701_outb(0x00, RFLAG);
++ mdelay(20);
++#if 0
++ val = rtc9701_inb(REXT);
++ val &= 0x33;
++ rtc9701_outb(val, REXT); /* WADA=0 */
++#endif
++ val = 0xff;
++ rtc9701_outb(val, RWKAR);
++ mdelay(20);
++
++ rtc9701_outb(0x00, RTIMCNT);
++ mdelay(20);
++
++ if (request_irq(IRQ_RTCALM, rtc9701_rtc_interrupt, SA_INTERRUPT, "rtc_alarm", NULL)) {
++ printk(KERN_ERR "rtc: IRQ %d already in use.\n", IRQ_RTCALM);
++ return -EIO;
++ }
++
++ if (request_irq(IRQ_RTCTIME, rtc9701_rtc_interrupt, SA_INTERRUPT, "rtc_timer", NULL)) {
++ printk(KERN_ERR "rtc: IRQ %d already in use.\n", IRQ_RTCTIME);
++ return -EIO;
++ }
++
++ printk(KERN_INFO "RTC-9701JE Real Time Clock Driver v" DRIVER_VERSION "\n");
++
++ return 0;
++}
++
++module_init(rtc9701_rtc_init);
++module_exit(rtc9701_rtc_exit);
+diff -ruN linux-2.6.17-vanilla/drivers/char/sh03rtc.c linux-2.6.17/drivers/char/sh03rtc.c
+--- linux-2.6.17-vanilla/drivers/char/sh03rtc.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/char/sh03rtc.c 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1,1185 @@
++/*
++ * Real Time Clock interface for Linux
++ *
++ * Copyright (C) 2004 Interface Corporation Saito.K
++ *
++ * Based on skelrton from the drivers/char/rtc.c
++ *
++ * This driver allows use of the real time clock (built into
++ * nearly all computers) from user space. It exports the /dev/rtc
++ * interface supporting various ioctl() and also the
++ * /proc/driver/rtc pseudo-file for status information.
++ *
++ * The ioctls can be used to set the interrupt behaviour and
++ * generation rate from the RTC via IRQ 8. Then the /dev/rtc
++ * interface can be used to make use of these timer interrupts,
++ * be they interval or alarm based.
++ *
++ * The /dev/rtc interface will block on reads until an interrupt
++ * has been received. If a RTC interrupt has already happened,
++ * it will output an unsigned long and then block. The output value
++ * contains the interrupt status in the low byte and the number of
++ * interrupts since the last read in the remaining high bytes. The
++ * /dev/rtc interface can also be used with the select(2) call.
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version
++ * 2 of the License, or (at your option) any later version.
++ *
++ * Based on other minimal char device drivers, like Alan's
++ * watchdog, Ted's random, etc. etc.
++ *
++ * 1.07 Paul Gortmaker.
++ * 1.08 Miquel van Smoorenburg: disallow certain things on the
++ * DEC Alpha as the CMOS clock is also used for other things.
++ * 1.09 Nikita Schmidt: epoch support and some Alpha cleanup.
++ * 1.09a Pete Zaitcev: Sun SPARC
++ * 1.09b Jeff Garzik: Modularize, init cleanup
++ * 1.09c Jeff Garzik: SMP cleanup
++ * 1.10 Paul Barton-Davis: add support for async I/O
++ * 1.10a Andrea Arcangeli: Alpha updates
++ * 1.10b Andrew Morton: SMP lock fix
++ * 1.10c Cesar Barros: SMP locking fixes and cleanup
++ * 1.10d Paul Gortmaker: delete paranoia check in rtc_exit
++ * 1.10e Maciej W. Rozycki: Handle DECstation's year weirdness.
++ * 1.11 Takashi Iwai: Kernel access functions
++ * rtc_register/rtc_unregister/rtc_control
++ * 1.11a Daniele Bellucci: Audit create_proc_read_entry in rtc_init
++ * 1.12 Venkatesh Pallipadi: Hooks for emulating rtc on HPET base-timer
++ * CONFIG_HPET_EMULATE_RTC
++ *
++ */
++
++#define SH03_RTC_VERSION "0.09"
++
++#define RTC_IO_EXTENT 0x8
++
++/*
++ * Note that *all* calls to CMOS_READ and CMOS_WRITE are done with
++ * interrupts disabled. Due to the index-port/data-port (0x70/0x71)
++ * design of the RTC, we don't want two different things trying to
++ * get to it at once. (e.g. the periodic 11 min sync from time.c vs.
++ * this driver.)
++ */
++
++#include <linux/config.h>
++#include <linux/interrupt.h>
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/miscdevice.h>
++#include <linux/ioport.h>
++#include <linux/fcntl.h>
++
++// @@@@@ 16.09.29 #include <linux/mc146818rtc.h>
++#include <linux/rtc.h>
++
++#include <linux/init.h>
++#include <linux/poll.h>
++#include <linux/proc_fs.h>
++#include <linux/spinlock.h>
++#include <linux/sysctl.h>
++#include <linux/wait.h>
++#include <linux/bcd.h>
++
++#include <asm/current.h>
++#include <asm/uaccess.h>
++#include <asm/system.h>
++#include <asm/io.h>
++
++extern spinlock_t rtc_lock;
++
++/*
++TODO: Timer
++*/
++#define SH03_RTC_IRQ 11
++
++#define RTC_BASE 0xb0000000
++#define RTC_SEC1 (RTC_BASE + 0)
++#define RTC_SEC10 (RTC_BASE + 1)
++#define RTC_MIN1 (RTC_BASE + 2)
++#define RTC_MIN10 (RTC_BASE + 3)
++#define RTC_HOU1 (RTC_BASE + 4)
++#define RTC_HOU10 (RTC_BASE + 5)
++#define RTC_WEE1 (RTC_BASE + 6)
++#define RTC_DAY1 (RTC_BASE + 7)
++#define RTC_DAY10 (RTC_BASE + 8)
++#define RTC_MON1 (RTC_BASE + 9)
++#define RTC_MON10 (RTC_BASE + 10)
++#define RTC_YEA1 (RTC_BASE + 11)
++#define RTC_YEA10 (RTC_BASE + 12)
++#define RTC_YEA100 (RTC_BASE + 13)
++#define RTC_YEA1000 (RTC_BASE + 14)
++#define RTC_CTL (RTC_BASE + 15)
++#define RTC_BUSY 1
++#define RTC_STOP 2
++#define RTC_BANK0 (0 << 2)
++#define RTC_BANK1 (1 << 2)
++#define RTC_BANK2 (2 << 2)
++
++#define RTC_ATCTL (RTC_BASE + 14)
++#define RTC_AIE 1
++#define RTC_AF 2
++
++#define RTC_TE_CLOCK (RTC_BASE + 8)
++#define RTC_TMCTL (RTC_BASE + 14)
++#define RTC_TIE 1
++#define RTC_TF 2
++
++#define SH03_RTC_PORT(n) ((RTC_BASE) + n)
++#define SH03_RTC_IO_EXTENT 0x10
++
++#ifndef BIN_TO_BCD
++#define BIN_TO_BCD(val) ((val)=(((val)/10)<<4) + (val)%10)
++#endif
++
++#define SELECT_BANK(n) ctrl_outb((n), RTC_CTL)
++
++#define READ_SECONDS ((ctrl_inb(RTC_SEC1) & 15) + (ctrl_inb(RTC_SEC10) & 7) * 10)
++#define READ_MINUTES ((ctrl_inb(RTC_MIN1) & 15) + (ctrl_inb(RTC_MIN10) & 7) * 10)
++#define READ_HOURS ((ctrl_inb(RTC_HOU1) & 15) + (ctrl_inb(RTC_HOU10) & 3) * 10)
++#define READ_WEEK (ctrl_inb(RTC_WEE1) & 7)
++#define READ_DAY ((ctrl_inb(RTC_DAY1) & 15) + (ctrl_inb(RTC_DAY10) & 3) * 10)
++#define READ_MONTH ((ctrl_inb(RTC_MON1) & 15) + (ctrl_inb(RTC_MON10) & 1) * 10)
++#define READ_YEAR ((ctrl_inb(RTC_YEA1) & 15) + (ctrl_inb(RTC_YEA10) & 15) * 10 \
++ + (ctrl_inb(RTC_YEA100) & 15) * 100 + (ctrl_inb(RTC_YEA1000) & 3) * 1000)
++
++#define WRITE_SECONDS(d) ctrl_outb((d) & 15, RTC_SEC1); ctrl_outb((d) >> 4, RTC_SEC10)
++#define WRITE_MINUTES(d) ctrl_outb((d) & 15, RTC_MIN1); ctrl_outb((d) >> 4, RTC_MIN10)
++#define WRITE_HOURS(d) ctrl_outb((d) & 15, RTC_HOU1); ctrl_outb((d) >> 4, RTC_HOU10)
++#define WRITE_WEEK(d) ctrl_outb((d) & 15, RTC_WEE1)
++#define WRITE_DAY(d) ctrl_outb((d) & 15, RTC_DAY1); ctrl_outb((d) >> 4, RTC_DAY10)
++#define WRITE_MONTH(d) ctrl_outb((d) & 15, RTC_MON1); ctrl_outb((d) >> 4, RTC_MON10)
++#define WRITE_YEAR_LOW(d) ctrl_outb((d) & 15, RTC_YEA1); ctrl_outb((d) >> 4, RTC_YEA10)
++#define WRITE_YEAR_HIGH(d) ctrl_outb((d) & 15, RTC_YEA100); ctrl_outb((d) >> 4, RTC_YEA1000)
++
++#define READ_ATCTL (ctrl_inb(RTC_ATCTL))
++#define WRITE_ATCTL(d) ctrl_outb((d), RTC_ATCTL)
++
++#define READ_TMCTL (ctrl_inb(RTC_TMCTL))
++#define WRITE_TMCTL(d) ctrl_outb((d), RTC_TMCTL)
++
++#define READ_CLOCK (ctrl_inb(RTC_TE_CLOCK))
++#define WRITE_CLOCK(d) ctrl_outb((d) & 15, RTC_TE_CLOCK)
++
++
++
++#ifdef SH03_RTC_IRQ
++static int sh03_rtc_has_irq = SH03_RTC_IRQ;
++#endif
++
++/*
++ * We sponge a minor off of the misc major. No need slurping
++ * up another valuable major dev number for this. If you add
++ * an ioctl, make sure you don't conflict with SPARC's RTC
++ * ioctls.
++ */
++
++static struct fasync_struct *sh03_rtc_async_queue;
++
++static DECLARE_WAIT_QUEUE_HEAD(sh03_rtc_wait);
++
++#ifdef SH03_RTC_IRQ
++static struct timer_list sh03_rtc_irq_timer;
++#endif
++
++static ssize_t sh03_rtc_read(struct file *file, char __user *buf,
++ size_t count, loff_t *ppos);
++
++static int sh03_rtc_ioctl(struct inode *inode, struct file *file,
++ unsigned int cmd, unsigned long arg);
++
++#ifdef SH03_RTC_IRQ
++static unsigned int sh03_rtc_poll(struct file *file, poll_table *wait);
++#endif
++
++void sh03_rtc_get_rtc_time(struct rtc_time *rtc_tm);
++static void sh03_get_rtc_alm_time (struct rtc_time *alm_tm);
++#ifdef SH03_RTC_IRQ
++static void sh03_rtc_dropped_irq(unsigned long data);
++
++static void sh03_set_rtc_irq_bit(unsigned int bit);
++static void sh03_mask_rtc_irq_bit(unsigned int bit);
++#endif
++
++static int sh03_rtc_read_proc(char *page, char **start, off_t off,
++ int count, int *eof, void *data);
++
++/*
++ * Bits in rtc_status. (6 bits of room for future expansion)
++ */
++
++#define RTC_IS_OPEN 0x01 /* means /dev/rtc is in use */
++#define RTC_TIMER_ON 0x02 /* missed irq timer active */
++
++/*
++ * rtc_status is never changed by rtc_interrupt, and ioctl/open/close is
++ * protected by the big kernel lock. However, ioctl can still disable the timer
++ * in rtc_status and then with del_timer after the interrupt has read
++ * rtc_status but before mod_timer is called, which would then reenable the
++ * timer (but you would need to have an awful timing before you'd trip on it)
++ */
++static unsigned long rtc_status = 0; /* bitmapped status byte. */
++static unsigned long rtc_freq = 0; /* Current periodic IRQ rate */
++static unsigned long rtc_irq_data = 0; /* our output to the world */
++static unsigned long rtc_max_user_freq = 64; /* > this, need CAP_SYS_RESOURCE */
++
++#ifdef SH03_RTC_IRQ
++/*
++ * rtc_task_lock nests inside rtc_lock.
++ */
++static spinlock_t rtc_task_lock = SPIN_LOCK_UNLOCKED;
++static rtc_task_t *rtc_callback = NULL;
++#endif
++
++/*
++ * If this driver ever becomes modularised, it will be really nice
++ * to make the epoch retain its value across module reload...
++ */
++
++static unsigned long epoch = 1900; /* year corresponding to 0x00 */
++
++static const unsigned char days_in_mo[] =
++{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
++
++#if 0 /* @@@@@ 16.09.29 TODO */
++/*
++ * Returns true if a clock update is in progress
++ */
++static inline unsigned char rtc_is_updating(void)
++{
++ unsigned char uip;
++
++ spin_lock_irq(&rtc_lock);
++ uip = (CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP);
++ spin_unlock_irq(&rtc_lock);
++ return uip;
++}
++#endif
++
++#ifdef SH03_RTC_IRQ
++/*
++ * A very tiny interrupt handler. It runs with SA_INTERRUPT set,
++ * but there is possibility of conflicting with the set_rtc_mmss()
++ * call (the rtc irq and the timer irq can easily run at the same
++ * time in two different CPUs). So we need to serialize
++ * accesses to the chip with the rtc_lock spinlock that each
++ * architecture should implement in the timer code.
++ * (See ./arch/XXXX/kernel/time.c for the set_rtc_mmss() function.)
++ */
++
++irqreturn_t sh03_rtc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
++{
++ /*
++ * Can be an alarm interrupt, update complete interrupt,
++ * or a periodic interrupt. We store the status in the
++ * low byte and the number of interrupts received since
++ * the last read in the remainder of rtc_irq_data.
++ */
++
++ spin_lock (&rtc_lock);
++ rtc_irq_data += 0x100;
++ rtc_irq_data &= ~0xff;
++ SELECT_BANK(RTC_BANK1);
++ rtc_irq_data |= (READ_ATCTL & RTC_AF) >> 1;
++ WRITE_ATCTL(READ_ATCTL & ~ RTC_AF);
++ SELECT_BANK(RTC_BANK2);
++ rtc_irq_data |= (READ_TMCTL & RTC_TF);
++ WRITE_TMCTL(READ_TMCTL & ~ RTC_TF);
++ SELECT_BANK(RTC_BANK0);
++
++ if (rtc_status & RTC_TIMER_ON)
++ mod_timer(&sh03_rtc_irq_timer, jiffies + HZ/rtc_freq + 2*HZ/100);
++
++ spin_unlock (&rtc_lock);
++
++ /* Now do the rest of the actions */
++ spin_lock(&rtc_task_lock);
++ if (rtc_callback)
++ rtc_callback->func(rtc_callback->private_data);
++ spin_unlock(&rtc_task_lock);
++ wake_up_interruptible(&sh03_rtc_wait);
++
++ kill_fasync (&sh03_rtc_async_queue, SIGIO, POLL_IN);
++
++ return IRQ_HANDLED;
++}
++#endif
++
++/*
++ * sysctl-tuning infrastructure.
++ */
++static ctl_table rtc_table[] = {
++ {
++ .ctl_name = 1,
++ .procname = "max-user-freq",
++ .data = &rtc_max_user_freq,
++ .maxlen = sizeof(int),
++ .mode = 0644,
++ .proc_handler = &proc_dointvec,
++ },
++ { .ctl_name = 0 }
++};
++
++static ctl_table rtc_root[] = {
++ {
++ .ctl_name = 1,
++ .procname = "rtc",
++ .maxlen = 0,
++ .mode = 0555,
++ .child = rtc_table,
++ },
++ { .ctl_name = 0 }
++};
++
++static ctl_table dev_root[] = {
++ {
++ .ctl_name = CTL_DEV,
++ .procname = "dev",
++ .maxlen = 0,
++ .mode = 0555,
++ .child = rtc_root,
++ },
++ { .ctl_name = 0 }
++};
++
++static struct ctl_table_header *sysctl_header;
++
++static int __init init_sysctl(void)
++{
++ sysctl_header = register_sysctl_table(dev_root, 0);
++ return 0;
++}
++
++static void __exit cleanup_sysctl(void)
++{
++ unregister_sysctl_table(sysctl_header);
++}
++
++/*
++ * Now all the various file operations that we export.
++ */
++
++static ssize_t sh03_rtc_read(struct file *file, char __user *buf,
++ size_t count, loff_t *ppos)
++{
++#ifndef SH03_RTC_IRQ
++ return -EIO;
++#else
++ DECLARE_WAITQUEUE(wait, current);
++ unsigned long data;
++ ssize_t retval;
++
++ if (sh03_rtc_has_irq == 0)
++ return -EIO;
++
++ if (count < sizeof(unsigned))
++ return -EINVAL;
++
++ add_wait_queue(&sh03_rtc_wait, &wait);
++
++ do {
++ /* First make it right. Then make it fast. Putting this whole
++ * block within the parentheses of a while would be too
++ * confusing. And no, xchg() is not the answer. */
++
++ __set_current_state(TASK_INTERRUPTIBLE);
++
++ spin_lock_irq (&rtc_lock);
++ data = rtc_irq_data;
++ rtc_irq_data = 0;
++ spin_unlock_irq (&rtc_lock);
++
++ if (data != 0)
++ break;
++
++ if (file->f_flags & O_NONBLOCK) {
++ retval = -EAGAIN;
++ goto out;
++ }
++ if (signal_pending(current)) {
++ retval = -ERESTARTSYS;
++ goto out;
++ }
++ schedule();
++ } while (1);
++
++ if (count < sizeof(unsigned long))
++ retval = put_user(data, (unsigned int __user *)buf) ?: sizeof(int);
++ else
++ retval = put_user(data, (unsigned long __user *)buf) ?: sizeof(long);
++ out:
++ current->state = TASK_RUNNING;
++ remove_wait_queue(&sh03_rtc_wait, &wait);
++
++ return retval;
++#endif
++}
++
++static int sh03_rtc_do_ioctl(unsigned int cmd, unsigned long arg, int kernel)
++{
++ struct rtc_time wtime;
++
++#ifdef SH03_RTC_IRQ
++ if (sh03_rtc_has_irq == 0) {
++ switch (cmd) {
++ case RTC_AIE_OFF:
++ case RTC_AIE_ON:
++ case RTC_PIE_OFF:
++ case RTC_PIE_ON:
++ case RTC_UIE_OFF:
++ case RTC_UIE_ON:
++ case RTC_IRQP_READ:
++ case RTC_IRQP_SET:
++ return -EINVAL;
++ };
++ }
++#endif
++
++ switch (cmd) {
++#ifdef SH03_RTC_IRQ
++ case RTC_AIE_OFF: /* Mask alarm int. enab. bit */
++ {
++ sh03_mask_rtc_irq_bit(RTC_AIE);
++ return 0;
++ }
++ case RTC_AIE_ON: /* Allow alarm interrupts. */
++ {
++ sh03_set_rtc_irq_bit(RTC_AIE);
++ return 0;
++ }
++ case RTC_PIE_OFF: /* Mask periodic int. enab. bit */
++ {
++ sh03_mask_rtc_irq_bit(RTC_PIE_OFF);
++ if (rtc_status & RTC_TIMER_ON) {
++ spin_lock_irq (&rtc_lock);
++ rtc_status &= ~RTC_TIMER_ON;
++ del_timer(&sh03_rtc_irq_timer);
++ spin_unlock_irq (&rtc_lock);
++ }
++ return 0;
++ }
++ case RTC_PIE_ON: /* Allow periodic ints */
++ {
++
++ /*
++ * We don't really want Joe User enabling more
++ * than 64Hz of interrupts on a multi-user machine.
++ */
++ if (!kernel && (rtc_freq > rtc_max_user_freq) &&
++ (!capable(CAP_SYS_RESOURCE)))
++ return -EACCES;
++
++ if (!(rtc_status & RTC_TIMER_ON)) {
++ spin_lock_irq (&rtc_lock);
++ sh03_rtc_irq_timer.expires = jiffies + HZ/rtc_freq + 2*HZ/100;
++ add_timer(&sh03_rtc_irq_timer);
++ rtc_status |= RTC_TIMER_ON;
++ spin_unlock_irq (&rtc_lock);
++ }
++ sh03_set_rtc_irq_bit(RTC_PIE_ON);
++ return 0;
++ }
++#if 1 /* @@@@@ 16.09.29 TODO */
++ case RTC_UIE_OFF: /* Mask ints from RTC updates. */
++ case RTC_UIE_ON: /* Allow ints for RTC updates. */
++ return -EINVAL;
++#else
++ case RTC_UIE_OFF: /* Mask ints from RTC updates. */
++ {
++ sh03_mask_rtc_irq_bit(RTC_UIE);
++ return 0;
++ }
++ case RTC_UIE_ON: /* Allow ints for RTC updates. */
++ {
++ sh03_set_rtc_irq_bit(RTC_UIE);
++ return 0;
++ }
++#endif
++#endif
++ case RTC_ALM_READ: /* Read the present alarm time */
++ {
++ /*
++ * This returns a struct rtc_time. Reading >= 0xc0
++ * means "don't care" or "match all". Only the tm_hour,
++ * tm_min, and tm_sec values are filled in.
++ */
++ memset(&wtime, 0, sizeof(struct rtc_time));
++ sh03_get_rtc_alm_time(&wtime);
++ break;
++ }
++ case RTC_ALM_SET: /* Store a time into the alarm */
++ {
++ /*
++ * This expects a struct rtc_time. Writing 0xff means
++ * "don't care" or "match all". Only the tm_hour,
++ * tm_min and tm_sec are used.
++ */
++ unsigned char day, week, hrs, min, sec;
++ struct rtc_time alm_tm;
++
++ if (copy_from_user(&alm_tm, (struct rtc_time __user *)arg,
++ sizeof(struct rtc_time)))
++ return -EFAULT;
++
++ day = alm_tm.tm_mday;
++ week = alm_tm.tm_wday;
++ hrs = alm_tm.tm_hour;
++ min = alm_tm.tm_min;
++ sec = alm_tm.tm_sec;
++ if (day >= 31)
++ day = 99;
++
++ if (week >= 7)
++ week = 9;
++
++ if (hrs >= 24)
++ hrs = 99;
++
++ if (min >= 60)
++ min = 99;
++
++ if (sec >= 60)
++ sec = 99;
++
++ spin_lock_irq(&rtc_lock);
++ BIN_TO_BCD(sec);
++ BIN_TO_BCD(min);
++ BIN_TO_BCD(hrs);
++ BIN_TO_BCD(day);
++ SELECT_BANK(RTC_BANK1);
++ WRITE_DAY(day);
++ WRITE_WEEK(week);
++ WRITE_HOURS(hrs);
++ WRITE_MINUTES(min);
++ WRITE_SECONDS(sec);
++ SELECT_BANK(RTC_BANK0);
++ spin_unlock_irq(&rtc_lock);
++
++ return 0;
++ }
++ case RTC_RD_TIME: /* Read the time/date from RTC */
++ {
++ memset(&wtime, 0, sizeof(struct rtc_time));
++ sh03_rtc_get_rtc_time(&wtime);
++ break;
++ }
++ case RTC_SET_TIME: /* Set the RTC */
++ {
++ struct rtc_time rtc_tm;
++ unsigned char mon, day, hrs, min, sec, leap_yr;
++ unsigned int yrs, yrs_low, yrs_high;
++
++ if (!capable(CAP_SYS_TIME))
++ return -EACCES;
++
++ if (copy_from_user(&rtc_tm, (struct rtc_time __user *)arg,
++ sizeof(struct rtc_time)))
++ return -EFAULT;
++
++ yrs = rtc_tm.tm_year + 1900;
++ mon = rtc_tm.tm_mon + 1; /* tm_mon starts at zero */
++ day = rtc_tm.tm_mday;
++ hrs = rtc_tm.tm_hour;
++ min = rtc_tm.tm_min;
++ sec = rtc_tm.tm_sec;
++
++ if (yrs < 1970)
++ return -EINVAL;
++
++ leap_yr = ((!(yrs % 4) && (yrs % 100)) || !(yrs % 400));
++
++ if ((mon > 12) || (day == 0))
++ return -EINVAL;
++
++ if (day > (days_in_mo[mon] + ((mon == 2) && leap_yr)))
++ return -EINVAL;
++
++ if ((hrs >= 24) || (min >= 60) || (sec >= 60))
++ return -EINVAL;
++
++ if ((yrs -= epoch) > 255) /* They are unsigned */
++ return -EINVAL;
++
++ spin_lock_irq(&rtc_lock);
++
++ /* These limits and adjustments are independent of
++ * whether the chip is in binary mode or not.
++ */
++ if (yrs > 169) {
++ spin_unlock_irq(&rtc_lock);
++ return -EINVAL;
++ }
++ if (yrs >= 100)
++ yrs -= 100;
++
++ yrs += epoch;
++ BIN_TO_BCD(sec);
++ BIN_TO_BCD(min);
++ BIN_TO_BCD(hrs);
++ BIN_TO_BCD(day);
++ BIN_TO_BCD(mon);
++ yrs_low = yrs % 100;
++ yrs_high = yrs / 100;
++ BIN_TO_BCD(yrs_low);
++ BIN_TO_BCD(yrs_high);
++
++ WRITE_YEAR_HIGH(yrs_high);
++ WRITE_YEAR_LOW(yrs_low);
++ WRITE_MONTH(mon);
++ WRITE_DAY(day);
++ WRITE_HOURS(hrs);
++ WRITE_MINUTES(min);
++ WRITE_SECONDS(sec);
++
++ spin_unlock_irq(&rtc_lock);
++ return 0;
++ }
++#ifdef SH03_RTC_IRQ
++ case RTC_IRQP_READ: /* Read the periodic IRQ rate. */
++ {
++ return put_user(rtc_freq, (unsigned long __user *)arg);
++ }
++ case RTC_IRQP_SET: /* Set periodic IRQ rate. */
++ {
++ int tmp = 0;
++
++ /*
++ * We don't really want Joe User generating more
++ * than 64Hz of interrupts on a multi-user machine.
++ */
++ if (!kernel && (arg > rtc_max_user_freq) && (!capable(CAP_SYS_RESOURCE)))
++ return -EACCES;
++
++ switch (arg) {
++ case 1: tmp = 2; break;
++ case 64: tmp = 1; break;
++ case 4096: tmp = 0; break;
++ default: return -EINVAL;
++ }
++
++ spin_lock_irq(&rtc_lock);
++ rtc_freq = arg;
++ SELECT_BANK(RTC_BANK2);
++ WRITE_CLOCK((READ_CLOCK & ~3) | tmp);
++ SELECT_BANK(RTC_BANK0);
++ spin_unlock_irq(&rtc_lock);
++ return 0;
++ }
++#endif
++ case RTC_EPOCH_READ: /* Read the epoch. */
++ {
++ return put_user (epoch, (unsigned long __user *)arg);
++ }
++ case RTC_EPOCH_SET: /* Set the epoch. */
++ {
++ /*
++ * There were no RTC clocks before 1900.
++ */
++ if (arg < 1900)
++ return -EINVAL;
++
++ if (!capable(CAP_SYS_TIME))
++ return -EACCES;
++
++ epoch = arg;
++ return 0;
++ }
++ default:
++ return -ENOTTY;
++ }
++ return copy_to_user((void __user *)arg, &wtime, sizeof wtime) ? -EFAULT : 0;
++}
++
++static int sh03_rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
++ unsigned long arg)
++{
++ return sh03_rtc_do_ioctl(cmd, arg, 0);
++}
++
++/*
++ * We enforce only one user at a time here with the open/close.
++ * Also clear the previous interrupt data on an open, and clean
++ * up things on a close.
++ */
++
++/* We use rtc_lock to protect against concurrent opens. So the BKL is not
++ * needed here. Or anywhere else in this driver. */
++static int sh03_rtc_open(struct inode *inode, struct file *file)
++{
++ spin_lock_irq (&rtc_lock);
++
++ if(rtc_status & RTC_IS_OPEN)
++ goto out_busy;
++
++ rtc_status |= RTC_IS_OPEN;
++
++ rtc_irq_data = 0;
++ spin_unlock_irq (&rtc_lock);
++ return 0;
++
++out_busy:
++ spin_unlock_irq (&rtc_lock);
++ return -EBUSY;
++}
++
++static int sh03_rtc_fasync (int fd, struct file *filp, int on)
++
++{
++ return fasync_helper (fd, filp, on, &sh03_rtc_async_queue);
++}
++
++static int sh03_rtc_release(struct inode *inode, struct file *file)
++{
++#ifdef SH03_RTC_IRQ
++ if (sh03_rtc_has_irq == 0)
++ goto no_irq;
++
++ /*
++ * Turn off all interrupts once the device is no longer
++ * in use, and clear the data.
++ */
++
++ spin_lock_irq(&rtc_lock);
++ SELECT_BANK(RTC_BANK1);
++ ctrl_outb(0, RTC_ATCTL);
++ SELECT_BANK(RTC_BANK2);
++ ctrl_outb(0, RTC_TMCTL);
++ SELECT_BANK(RTC_BANK0);
++
++ if (rtc_status & RTC_TIMER_ON) {
++ rtc_status &= ~RTC_TIMER_ON;
++ del_timer(&sh03_rtc_irq_timer);
++ }
++ spin_unlock_irq(&rtc_lock);
++
++ if (file->f_flags & FASYNC) {
++ sh03_rtc_fasync (-1, file, 0);
++ }
++no_irq:
++#endif
++
++ spin_lock_irq (&rtc_lock);
++ rtc_irq_data = 0;
++ rtc_status &= ~RTC_IS_OPEN;
++ spin_unlock_irq (&rtc_lock);
++ return 0;
++}
++
++#ifdef SH03_RTC_IRQ
++/* Called without the kernel lock - fine */
++static unsigned int sh03_rtc_poll(struct file *file, poll_table *wait)
++{
++ unsigned long l;
++
++ if (sh03_rtc_has_irq == 0)
++ return 0;
++
++ poll_wait(file, &sh03_rtc_wait, wait);
++
++ spin_lock_irq (&rtc_lock);
++ l = rtc_irq_data;
++ spin_unlock_irq (&rtc_lock);
++
++ if (l != 0)
++ return POLLIN | POLLRDNORM;
++ return 0;
++}
++#endif
++
++int rtc_control(rtc_task_t *task, unsigned int cmd, unsigned long arg)
++{
++#ifndef SH03_RTC_IRQ
++ return -EIO;
++#else
++ spin_lock_irq(&rtc_task_lock);
++ if (rtc_callback != task) {
++ spin_unlock_irq(&rtc_task_lock);
++ return -ENXIO;
++ }
++ spin_unlock_irq(&rtc_task_lock);
++ return sh03_rtc_do_ioctl(cmd, arg, 1);
++#endif
++}
++
++
++/*
++ * The various file operations we support.
++ */
++
++static struct file_operations sh03_rtc_fops = {
++ .owner = THIS_MODULE,
++ .llseek = no_llseek,
++ .read = sh03_rtc_read,
++#ifdef SH03_RTC_IRQ
++ .poll = sh03_rtc_poll,
++#endif
++ .ioctl = sh03_rtc_ioctl,
++ .open = sh03_rtc_open,
++ .release = sh03_rtc_release,
++ .fasync = sh03_rtc_fasync,
++};
++
++static struct miscdevice sh03_rtc_dev=
++{
++ RTC_MINOR,
++ "sh03-rtc",
++ &sh03_rtc_fops
++};
++
++#ifdef SH03_RTC_IRQ
++static irqreturn_t (*rtc_int_handler_ptr)(int irq, void *dev_id, struct pt_regs *regs);
++#endif
++
++static int __init sh03_rtc_init(void)
++{
++ if (!request_region(SH03_RTC_PORT(0), SH03_RTC_IO_EXTENT, "sh03-rtc")) {
++ printk(KERN_ERR "sh03-rtc: I/O port %d is not free.\n", SH03_RTC_PORT (0));
++ return -EIO;
++ }
++
++#ifdef SH03_RTC_IRQ
++ rtc_int_handler_ptr = sh03_rtc_interrupt;
++ if(request_irq(SH03_RTC_IRQ, rtc_int_handler_ptr, SA_INTERRUPT, "sh03-rtc", NULL)) {
++ /* Yeah right, seeing as irq 8 doesn't even hit the bus. */
++ printk(KERN_ERR "sh03-rtc: IRQ %d is not free.\n", RTC_IRQ);
++ release_region(SH03_RTC_PORT(0), SH03_RTC_IO_EXTENT);
++ return -EIO;
++ }
++#endif
++
++ if (misc_register(&sh03_rtc_dev)) {
++#ifdef SH03_RTC_IRQ
++ free_irq(SH03_RTC_IRQ, NULL);
++#endif
++ release_region(SH03_RTC_PORT(0), SH03_RTC_IO_EXTENT);
++ return -ENODEV;
++ }
++ if (!create_proc_read_entry ("driver/sh03-rtc", 0, NULL, sh03_rtc_read_proc, NULL)) {
++#ifdef SH03_RTC_IRQ
++ free_irq(SH03_RTC_IRQ, NULL);
++#endif
++ release_region(SH03_RTC_PORT(0), SH03_RTC_IO_EXTENT);
++ misc_deregister(&sh03_rtc_dev);
++ return -ENOMEM;
++ }
++
++#ifdef SH03_RTC_IRQ
++ if (sh03_rtc_has_irq == 0)
++ goto no_irq2;
++
++ init_timer(&sh03_rtc_irq_timer);
++ sh03_rtc_irq_timer.function = sh03_rtc_dropped_irq;
++ spin_lock_irq(&rtc_lock);
++ SELECT_BANK(RTC_BANK2);
++ WRITE_CLOCK(2);
++ SELECT_BANK(RTC_BANK0);
++ rtc_freq = 1;
++ spin_unlock_irq(&rtc_lock);
++no_irq2:
++#endif
++
++ (void) init_sysctl();
++
++ printk(KERN_INFO "CTP/PCI-SH03 Real Time Clock Driver v" SH03_RTC_VERSION "\n");
++
++ return 0;
++}
++
++static void __exit sh03_rtc_exit (void)
++{
++ cleanup_sysctl();
++ remove_proc_entry ("driver/sh03-rtc", NULL);
++ misc_deregister(&sh03_rtc_dev);
++ release_region (SH03_RTC_PORT (0), SH03_RTC_IO_EXTENT);
++#ifdef SH03_RTC_IRQ
++ if (sh03_rtc_has_irq)
++ free_irq (SH03_RTC_IRQ, NULL);
++#endif
++}
++
++module_init(sh03_rtc_init);
++module_exit(sh03_rtc_exit);
++
++#ifdef SH03_RTC_IRQ
++/*
++ * At IRQ rates >= 4096Hz, an interrupt may get lost altogether.
++ * (usually during an IDE disk interrupt, with IRQ unmasking off)
++ * Since the interrupt handler doesn't get called, the IRQ status
++ * byte doesn't get read, and the RTC stops generating interrupts.
++ * A timer is set, and will call this function if/when that happens.
++ * To get it out of this stalled state, we just read the status.
++ * At least a jiffy of interrupts (rtc_freq/HZ) will have been lost.
++ * (You *really* shouldn't be trying to use a non-realtime system
++ * for something that requires a steady > 1KHz signal anyways.)
++ */
++
++static void sh03_rtc_dropped_irq(unsigned long data)
++{
++ unsigned long freq;
++
++ spin_lock_irq (&rtc_lock);
++
++ /* Just in case someone disabled the timer from behind our back... */
++ if (rtc_status & RTC_TIMER_ON)
++ mod_timer(&sh03_rtc_irq_timer, jiffies + HZ/rtc_freq + 2*HZ/100);
++
++ rtc_irq_data += ((rtc_freq/HZ)<<8);
++ rtc_irq_data &= ~0xff;
++ SELECT_BANK(RTC_BANK1);
++ rtc_irq_data |= (READ_ATCTL & RTC_AF) >> 1;
++ SELECT_BANK(RTC_BANK2);
++ rtc_irq_data |= (READ_TMCTL & RTC_TF);
++ SELECT_BANK(RTC_BANK0);
++
++ freq = rtc_freq;
++
++ spin_unlock_irq(&rtc_lock);
++
++ printk(KERN_WARNING "sh03-rtc: lost some interrupts at %ldHz.\n", freq);
++
++ /* Now we have new data */
++ wake_up_interruptible(&sh03_rtc_wait);
++
++ kill_fasync (&sh03_rtc_async_queue, SIGIO, POLL_IN);
++}
++#endif
++
++/*
++ * Info exported via "/proc/driver/sh03-rtc".
++ */
++
++static int sh03_rtc_proc_output (char *buf)
++{
++#define YN(bit) ((bit) ? "yes" : "no")
++#define NY(bit) ((bit) ? "no" : "yes")
++ char *p;
++ struct rtc_time tm;
++ unsigned char aie, tie, af, tf;
++ unsigned long freq;
++ int sec_ae, min_ae, hour_ae, week_ae, day_ae;
++
++ spin_lock_irq(&rtc_lock);
++ SELECT_BANK(RTC_BANK1);
++ aie = READ_ATCTL & RTC_AIE;
++ af = READ_ATCTL & 2;
++ sec_ae = ctrl_inb(RTC_SEC10) & 8;
++ min_ae = ctrl_inb(RTC_MIN10) & 8;
++ hour_ae = ctrl_inb(RTC_HOU10) & 8;
++ week_ae = ctrl_inb(RTC_WEE1 ) & 8;
++ day_ae = ctrl_inb(RTC_DAY10) & 8;
++ SELECT_BANK(RTC_BANK2);
++ tie = READ_TMCTL & RTC_TIE;
++ tf = READ_TMCTL & 2;
++ SELECT_BANK(RTC_BANK0);
++ freq = rtc_freq;
++ spin_unlock_irq(&rtc_lock);
++
++ p = buf;
++
++ sh03_rtc_get_rtc_time(&tm);
++
++ /*
++ * There is no way to tell if the luser has the RTC set for local
++ * time or for Universal Standard Time (GMT). Probably local though.
++ */
++ p += sprintf(p,
++ "rtc_time\t: %02d:%02d:%02d\n"
++ "rtc_date\t: %04d-%02d-%02d\n"
++ "rtc_epoch\t: %04lu\n",
++ tm.tm_hour, tm.tm_min, tm.tm_sec,
++ tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, epoch);
++
++ sh03_get_rtc_alm_time(&tm);
++
++ /*
++ * We implicitly assume 24hr mode here. Alarm values >= 0xc0 will
++ * match any value for that particular field. Values that are
++ * greater than a valid time, but less than 0xc0 shouldn't appear.
++ */
++ p += sprintf(p, "alarm\t\t: ");
++ if (!day_ae)
++ p += sprintf(p, "%02d ", tm.tm_mday);
++ else
++ p += sprintf(p, "** ");
++ if (!week_ae)
++ p += sprintf(p, "%01d ", tm.tm_wday);
++ else
++ p += sprintf(p, "* ");
++ if (!hour_ae)
++ p += sprintf(p, "%02d:", tm.tm_hour);
++ else
++ p += sprintf(p, "**:");
++
++ if (!min_ae)
++ p += sprintf(p, "%02d:", tm.tm_min);
++ else
++ p += sprintf(p, "**:");
++
++ if (!sec_ae)
++ p += sprintf(p, "%02d\n", tm.tm_sec);
++ else
++ p += sprintf(p, "**\n");
++
++ p += sprintf(p,
++ "alarm_IRQ\t: %s-%s\n"
++ "periodic_IRQ\t: %s-%s\n"
++ "periodic_freq\t: %ld\n"
++ "FOS\t\t: %s\n"
++ "Control Reg\t: %x\n",
++ YN(aie),YN(af),
++ YN(tie),YN(tf),
++ freq,
++ ctrl_inb(RTC_SEC10) & 8 ? "on" : "off",
++ ctrl_inb(RTC_CTL) & 15);
++
++ return p - buf;
++#undef YN
++#undef NY
++}
++
++static int sh03_rtc_read_proc(char *page, char **start, off_t off,
++ int count, int *eof, void *data)
++{
++ int len = sh03_rtc_proc_output (page);
++ if (len <= off+count) *eof = 1;
++ *start = page + off;
++ len -= off;
++ if (len>count) len = count;
++ if (len<0) len = 0;
++ return len;
++}
++
++void sh03_rtc_get_rtc_time(struct rtc_time *rtc_tm)
++{
++// @@@@@ 16.09.29 TODO unsigned long uip_watchdog = jiffies;
++
++ /*
++ * read RTC once any update in progress is done. The update
++ * can take just over 2ms. We wait 10 to 20ms. There is no need to
++ * to poll-wait (up to 1s - eeccch) for the falling edge of RTC_UIP.
++ * If you need to know *exactly* when a second has started, enable
++ * periodic update complete interrupts, (via ioctl) and then
++ * immediately read /dev/rtc which will block until you get the IRQ.
++ * Once the read clears, read the RTC time (again via ioctl). Easy.
++ */
++
++#if 0 /* @@@@@ 16.09.29 TODO */
++ if (rtc_is_updating() != 0)
++ while (jiffies - uip_watchdog < 2*HZ/100) {
++ barrier();
++ cpu_relax();
++ }
++#endif
++ /*
++ * Only the values that we read from the RTC are set. We leave
++ * tm_wday, tm_yday and tm_isdst untouched. Even though the
++ * RTC has RTC_DAY_OF_WEEK, we ignore it, as it is only updated
++ * by the RTC when initially set to a non-zero value.
++ */
++ spin_lock_irq(&rtc_lock);
++ rtc_tm->tm_sec = READ_SECONDS;
++ rtc_tm->tm_min = READ_MINUTES;
++ rtc_tm->tm_hour = READ_HOURS;
++ rtc_tm->tm_wday = READ_WEEK;
++ rtc_tm->tm_mday = READ_DAY;
++ rtc_tm->tm_mon = READ_MONTH;
++ rtc_tm->tm_year = READ_YEAR - epoch;
++ spin_unlock_irq(&rtc_lock);
++
++ /*
++ * Account for differences between how the RTC uses the values
++ * and how they are defined in a struct rtc_time;
++ */
++ if ((rtc_tm->tm_year += (epoch - 1900)) <= 69)
++ rtc_tm->tm_year += 100;
++
++ rtc_tm->tm_mon--;
++}
++
++static void sh03_get_rtc_alm_time(struct rtc_time *alm_tm)
++{
++ /*
++ * Only the values that we read from the RTC are set. That
++ * means only tm_hour, tm_min, and tm_sec.
++ */
++ spin_lock_irq(&rtc_lock);
++ SELECT_BANK(RTC_BANK1);
++ alm_tm->tm_sec = READ_SECONDS;
++ alm_tm->tm_min = READ_MINUTES;
++ alm_tm->tm_hour = READ_HOURS;
++ alm_tm->tm_wday = READ_WEEK;
++ alm_tm->tm_mday = READ_DAY;
++ SELECT_BANK(RTC_BANK0);
++ spin_unlock_irq(&rtc_lock);
++}
++
++#ifdef SH03_RTC_IRQ
++/*
++ * Used to disable/enable interrupts for any one of UIE, AIE, PIE.
++ * Rumour has it that if you frob the interrupt enable/disable
++ * bits in RTC_CONTROL, you should read RTC_INTR_FLAGS, to
++ * ensure you actually start getting interrupts. Probably for
++ * compatibility with older/broken chipset RTC implementations.
++ * We also clear out any old irq data after an ioctl() that
++ * meddles with the interrupt enable/disable bits.
++ */
++
++static void sh03_mask_rtc_irq_bit(unsigned int bit)
++{
++ unsigned char val;
++
++ spin_lock_irq(&rtc_lock);
++ switch(bit) {
++ case RTC_AIE_OFF:
++ SELECT_BANK(RTC_BANK1);
++ val = READ_ATCTL;
++ val &= ~RTC_AIE;
++ WRITE_ATCTL(val);
++ SELECT_BANK(RTC_BANK0);
++ break;
++ case RTC_PIE_OFF:
++ SELECT_BANK(RTC_BANK2);
++ val = READ_TMCTL;
++ val &= ~RTC_TIE;
++ WRITE_TMCTL(val);
++ SELECT_BANK(RTC_BANK0);
++ break;
++ }
++
++ rtc_irq_data = 0;
++ spin_unlock_irq(&rtc_lock);
++}
++
++static void sh03_set_rtc_irq_bit(unsigned int bit)
++{
++ unsigned char val;
++
++ spin_lock_irq(&rtc_lock);
++ switch(bit) {
++ case RTC_AIE_ON:
++ SELECT_BANK(RTC_BANK1);
++ val = READ_ATCTL;
++ val |= RTC_AIE;
++ WRITE_ATCTL(val);
++ SELECT_BANK(RTC_BANK0);
++ break;
++ case RTC_PIE_ON:
++ SELECT_BANK(RTC_BANK2);
++ val = READ_TMCTL;
++ val |= RTC_TIE;
++ WRITE_TMCTL(val);
++ SELECT_BANK(RTC_BANK0);
++ break;
++ }
++
++ rtc_irq_data = 0;
++ spin_unlock_irq(&rtc_lock);
++}
++#endif
++
++MODULE_AUTHOR("Saito.K Interface Corporation");
++MODULE_LICENSE("GPL");
++MODULE_ALIAS_MISCDEV(RTC_MINOR);
++
+diff -ruN linux-2.6.17-vanilla/drivers/char/sysrq.c linux-2.6.17/drivers/char/sysrq.c
+--- linux-2.6.17-vanilla/drivers/char/sysrq.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/char/sysrq.c 2006-07-12 16:54:23.000000000 +0000
+@@ -38,6 +38,18 @@
+ #include <linux/kexec.h>
+
+ #include <asm/ptrace.h>
++#ifdef CONFIG_KGDB_SYSRQ
++#include <asm/kgdb.h>
++#define GDB_OP &kgdb_op
++static struct sysrq_key_op kgdb_op={
++ .handler = (void *)breakpoint,
++ .help_msg = "kGdb ",
++ .action_msg = "Debug breakpoint\n",
++};
++
++#else
++#define GDB_OP NULL
++#endif
+
+ /* Whether we react on sysrq keys or just ignore them */
+ int sysrq_enabled = 1;
+@@ -296,7 +308,7 @@
+ &sysrq_showlocks_op, /* d */
+ &sysrq_term_op, /* e */
+ &sysrq_moom_op, /* f */
+- NULL, /* g */
++ GDB_OP, /* g */
+ NULL, /* h */
+ &sysrq_kill_op, /* i */
+ NULL, /* j */
+diff -ruN linux-2.6.17-vanilla/drivers/char/watchdog/CVS/Entries linux-2.6.17/drivers/char/watchdog/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/char/watchdog/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/char/watchdog/CVS/Entries 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1,2 @@
++/shwdt.c/1.12/Mon Aug 29 21:01:18 2005/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/drivers/char/watchdog/CVS/Repository linux-2.6.17/drivers/char/watchdog/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/char/watchdog/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/char/watchdog/CVS/Repository 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/char/watchdog
+diff -ruN linux-2.6.17-vanilla/drivers/char/watchdog/CVS/Root linux-2.6.17/drivers/char/watchdog/CVS/Root
+--- linux-2.6.17-vanilla/drivers/char/watchdog/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/char/watchdog/CVS/Root 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/i2c/CVS/Entries linux-2.6.17/drivers/i2c/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/i2c/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/i2c/CVS/Entries 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1,2 @@
++D/algos////
++D/busses////
+diff -ruN linux-2.6.17-vanilla/drivers/i2c/CVS/Repository linux-2.6.17/drivers/i2c/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/i2c/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/i2c/CVS/Repository 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/i2c
+diff -ruN linux-2.6.17-vanilla/drivers/i2c/CVS/Root linux-2.6.17/drivers/i2c/CVS/Root
+--- linux-2.6.17-vanilla/drivers/i2c/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/i2c/CVS/Root 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/i2c/algos/CVS/Entries linux-2.6.17/drivers/i2c/algos/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/i2c/algos/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/i2c/algos/CVS/Entries 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1,5 @@
++/Kconfig/1.3/Wed Mar 2 13:02:57 2005/-ko/
++/Makefile/1.3/Wed Mar 2 13:02:57 2005/-ko/
++/i2c-algo-voyager.c/1.1/Wed Apr 21 00:09:16 2004/-ko/
++/i2c-algo-voyager.h/1.2/Wed Feb 8 22:08:10 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/drivers/i2c/algos/CVS/Repository linux-2.6.17/drivers/i2c/algos/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/i2c/algos/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/i2c/algos/CVS/Repository 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/i2c/algos
+diff -ruN linux-2.6.17-vanilla/drivers/i2c/algos/CVS/Root linux-2.6.17/drivers/i2c/algos/CVS/Root
+--- linux-2.6.17-vanilla/drivers/i2c/algos/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/i2c/algos/CVS/Root 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/i2c/algos/Kconfig linux-2.6.17/drivers/i2c/algos/Kconfig
+--- linux-2.6.17-vanilla/drivers/i2c/algos/Kconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/i2c/algos/Kconfig 2006-07-12 16:54:23.000000000 +0000
+@@ -53,6 +53,10 @@
+ tristate "MPC8xx CPM I2C interface"
+ depends on 8xx && I2C
+
++config I2C_ALGOVOYAGER
++ tristate "Silicon Motion Voyager GX Algorithm"
++ depends on SH_RTS7751R2D && I2C
++
+ config I2C_ALGO_SIBYTE
+ tristate "SiByte SMBus interface"
+ depends on SIBYTE_SB1xxx_SOC && I2C
+diff -ruN linux-2.6.17-vanilla/drivers/i2c/algos/Makefile linux-2.6.17/drivers/i2c/algos/Makefile
+--- linux-2.6.17-vanilla/drivers/i2c/algos/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/i2c/algos/Makefile 2006-07-12 16:54:23.000000000 +0000
+@@ -6,6 +6,7 @@
+ obj-$(CONFIG_I2C_ALGOPCF) += i2c-algo-pcf.o
+ obj-$(CONFIG_I2C_ALGOPCA) += i2c-algo-pca.o
+ obj-$(CONFIG_I2C_ALGOITE) += i2c-algo-ite.o
++obj-$(CONFIG_I2C_ALGOVOYAGER) += i2c-algo-voyager.o
+ obj-$(CONFIG_I2C_ALGO_SIBYTE) += i2c-algo-sibyte.o
+ obj-$(CONFIG_I2C_ALGO_SGI) += i2c-algo-sgi.o
+
+diff -ruN linux-2.6.17-vanilla/drivers/i2c/algos/i2c-algo-voyager.c linux-2.6.17/drivers/i2c/algos/i2c-algo-voyager.c
+--- linux-2.6.17-vanilla/drivers/i2c/algos/i2c-algo-voyager.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/i2c/algos/i2c-algo-voyager.c 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1,415 @@
++/* -------------------------------------------------------------------- */
++/* i2c-algo-voyagergx.c: */
++/* -------------------------------------------------------------------- */
++/*
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program; if not, write to the Free Software
++ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
++ Copyright 2003 (c) Lineo uSolutions,Inc.
++ Copyright 2004 (c) Paul Mundt
++*/
++/* -------------------------------------------------------------------- */
++
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/delay.h>
++#include <linux/slab.h>
++#include <linux/version.h>
++#include <linux/init.h>
++#include <asm/uaccess.h>
++#include <linux/ioport.h>
++#include <linux/errno.h>
++#include <linux/sched.h>
++
++#include <linux/i2c.h>
++#include "i2c-algo-voyager.h"
++
++/* ----- global defines ----------------------------------------------- */
++#define DEB(x) if (i2c_debug>=1) x
++#define DEB2(x) if (i2c_debug>=2) x
++#define DEB3(x) if (i2c_debug>=3) x /* print several statistical values*/
++#define DEBPROTO(x) if (i2c_debug>=9) x;
++ /* debug the protocol by showing transferred bits */
++#define DEF_TIMEOUT 16
++
++/* debugging - slow down transfer to have a look at the data .. */
++/* I use this with two leds&resistors, each one connected to sda,scl */
++/* respectively. This makes sure that the algorithm works. Some chips */
++/* might not like this, as they have an internal timeout of some mils */
++
++
++/* ----- global variables --------------------------------------------- */
++
++/* module parameters:
++ */
++static int i2c_debug=0;
++
++/* --- setting states on the bus with the right timing: --------------- */
++
++#define iic_outb(adap, reg, val) adap->setiic(adap->data, reg, val)
++#define iic_inb(adap, reg) adap->getiic(adap->data, reg)
++
++/* --- other auxiliary functions -------------------------------------- */
++
++static void iic_start(struct i2c_algo_iic_data *adap)
++{
++ unsigned char ctl;
++ ctl = iic_inb(adap, I2C_CONTROL);
++ ctl = (ctl | I2C_CONTROL_STATUS);
++ DEB(printk("iic_start I2C_CONTROL = 0x%x\n", ctl));
++ iic_outb(adap,I2C_CONTROL,ctl);
++}
++
++static void iic_stop(struct i2c_algo_iic_data *adap)
++{
++ unsigned char ctl;
++ ctl = iic_inb(adap, I2C_CONTROL);
++ ctl = (ctl & ~I2C_CONTROL_STATUS);
++ DEB(printk("iic_stop I2C_CONTROL = 0x%x\n", ctl));
++ iic_outb(adap,I2C_CONTROL,ctl);
++}
++
++static void iic_reset(struct i2c_algo_iic_data *adap)
++{
++ unsigned char ctl;
++ ctl = iic_inb(adap, I2C_RESET);
++ ctl = (ctl & ~I2C_RESET_ERROR);
++ DEB(printk("iic_reset I2C_CONTROL = 0x%x\n", ctl));
++ iic_outb(adap,I2C_RESET,ctl);
++}
++
++
++static int wait_for_bb(struct i2c_algo_iic_data *adap)
++{
++ int timeout = DEF_TIMEOUT;
++ char status;
++
++ status = iic_inb(adap, I2C_STATUS);
++#ifndef STUB_I2C
++ while (timeout-- && (status & I2C_STATUS_BUSY)) {
++ udelay(1000); /* How much is this? */
++ status = iic_inb(adap, I2C_STATUS);
++ }
++#endif
++ if (timeout<=0) {
++ printk(KERN_ERR "Timeout, host is busy (%d)\n",timeout);
++ iic_reset(adap);
++ }
++ return(timeout<=0);
++}
++
++/*
++ * Puts this process to sleep for a period equal to timeout
++ */
++static inline void iic_sleep(unsigned long timeout)
++{
++ schedule_timeout( timeout * HZ);
++}
++
++static int wait_for_pin(struct i2c_algo_iic_data *adap, char *status)
++{
++ int timeout = DEF_TIMEOUT;
++
++ timeout = wait_for_bb(adap);
++ if (timeout) {
++ DEB2(printk("Timeout waiting for host not busy\n");)
++ return -EIO;
++ }
++
++ timeout = DEF_TIMEOUT;
++
++ *status = iic_inb(adap, I2C_STATUS);
++ while (timeout-- && !(*status & I2C_STATUS_ACK)) {
++ adap->waitforpin();
++ *status = iic_inb(adap, I2C_STATUS);
++ }
++ if (timeout <= 0)
++ return(-1);
++ else
++ return(0);
++}
++
++/* Verify the device we want to talk to on the IIC bus really exists. */
++static inline int try_address(struct i2c_algo_iic_data *adap,
++ unsigned int addr, int retries)
++{
++ int i, ret = -1;
++ unsigned char status;
++
++ for (i=0;i<retries;i++) {
++ iic_outb(adap, I2C_SADDRESS, addr);
++ iic_start(adap);
++ if (wait_for_pin(adap, &status) == 0) {
++ ret=1;
++ break; /* success! */
++ }
++ iic_stop(adap);
++ udelay(adap->udelay);
++ }
++ DEB2(if (i) printk("try_address: needed %d retries for 0x%x\n",i,
++ addr));
++ return ret;
++}
++
++int iic_sendbytes(struct i2c_adapter *i2c_adap,const char *buf,
++ int count)
++{
++ struct i2c_algo_iic_data *adap = i2c_adap->algo_data;
++ int wrcount,timeout,i;
++ unsigned char *addr,status;
++
++ if (count != PACKET_SIZE)
++ return -EPROTO;
++
++ iic_outb(adap,I2C_BYTECOUNT,(unsigned char)(count - 1));
++ iic_outb(adap,I2C_SADDRESS,(unsigned char)SERIAL_WRITE_ADDR);
++
++ timeout = wait_for_bb(adap);
++ if (timeout)
++ return -ETIMEDOUT;
++
++ wrcount = 0;
++ addr = (unsigned char *)I2C_DATA;
++
++ for (i = 0;i < count;i++){
++ iic_outb(adap,(int)addr++,buf[wrcount++]);
++ }
++
++ iic_start(adap);
++
++ /* Wait for transmission to complete */
++ timeout = wait_for_pin(adap,&status);
++ if (timeout){
++ iic_stop(adap);
++ printk("iic_sendbytes: %s write timeout.\n", i2c_adap->name);
++ return -EREMOTEIO; /* got a better one ?? */
++ }
++
++ iic_stop(adap);
++
++ return wrcount;
++}
++
++static int iic_readbytes(struct i2c_adapter *i2c_adap, char *buf, int count,
++ int sread)
++{
++ struct i2c_algo_iic_data *adap = i2c_adap->algo_data;
++ int rdcount,timeout,i;
++ unsigned char *addr,wk,status;
++
++ iic_outb(adap,I2C_BYTECOUNT,(unsigned char)(PACKET_SIZE - 1));
++ iic_outb(adap,I2C_SADDRESS,(unsigned char)SERIAL_READ_ADDR);
++
++ rdcount = 0;
++ addr = (unsigned char *)I2C_DATA;
++
++ iic_start(adap);
++
++ timeout = wait_for_pin(adap,&status);
++ if (timeout){
++ iic_stop(adap);
++ printk("iic_readbytes: %s read timeout.\n", i2c_adap->name);
++ return -EREMOTEIO; /* got a better one ?? */
++ }
++
++ for (i = 0;i < PACKET_SIZE;i++){
++ wk = iic_inb(adap,(int)addr++);
++ buf[rdcount++] = wk;
++ }
++
++ iic_stop(adap);
++
++ return rdcount;
++}
++
++/* Whenever we initiate a transaction, the first byte clocked
++ * onto the bus after the start condition is the address (7 bit) of the
++ * device we want to talk to. This function manipulates the address specified
++ * so that it makes sense to the hardware when written to the IIC peripheral.
++ *
++ * Note: 10 bit addresses are not supported in this driver, although they are
++ * supported by the hardware. This functionality needs to be implemented.
++ */
++static inline int iic_doAddress(struct i2c_algo_iic_data *adap,
++ struct i2c_msg *msg, int retries)
++{
++ unsigned int addr;
++ int ret;
++
++ addr = ( msg->addr << 1 );
++
++ if (iic_inb(adap, I2C_SADDRESS) != addr) {
++ iic_outb(adap, I2C_SADDRESS, addr);
++ ret = try_address(adap, addr, retries);
++ if (ret!=1) {
++ printk("iic_doAddress: died at address code.\n");
++ return -EREMOTEIO;
++ }
++ }
++
++ return 0;
++}
++
++
++/* Description: Prepares the controller for a transaction (clearing status
++ * registers, data buffers, etc), and then calls either iic_readbytes or
++ * iic_sendbytes to do the actual transaction.
++ *
++ * still to be done: Before we issue a transaction, we should
++ * verify that the bus is not busy or in some unknown state.
++ */
++static int iic_xfer(struct i2c_adapter *i2c_adap,
++ struct i2c_msg msgs[],
++ int num)
++{
++ struct i2c_algo_iic_data *adap = i2c_adap->algo_data;
++ struct i2c_msg *pmsg;
++ int i = 0;
++ int ret, timeout;
++
++ pmsg = &msgs[i];
++
++ if(!pmsg->len) {
++ DEB2(printk("iic_xfer: read/write length is 0\n");)
++ return -EIO;
++ }
++
++ /* Wait for any pending transfers to complete */
++ timeout = wait_for_bb(adap);
++ if (timeout) {
++ DEB2(printk("iic_xfer: Timeout waiting for host not busy\n");)
++ return -EIO;
++ }
++
++ /* Load address */
++ ret = iic_doAddress(adap, pmsg, i2c_adap->retries);
++ if (ret)
++ return -EIO;
++
++ DEB3(printk("iic_xfer: Msg %d, addr=0x%x, flags=0x%x, len=%d\n",
++ i, msgs[i].addr, msgs[i].flags, msgs[i].len);)
++
++ if (pmsg->flags & I2C_M_RD) { /* Read */
++ ret = iic_readbytes(i2c_adap, pmsg->buf, pmsg->len, 0);
++ } else { /* Write */
++ udelay(1000);
++ ret = iic_sendbytes(i2c_adap, pmsg->buf, pmsg->len);
++ }
++
++ if (ret != pmsg->len) {
++ DEB3(printk("iic_xfer: error or fail on read/write %d bytes.\n",ret));
++ } else {
++ DEB3(printk("iic_xfer: read/write %d bytes.\n",ret));
++ }
++
++ return ret;
++}
++
++
++/* Implements device specific ioctls. Higher level ioctls can
++ * be found in i2c-core.c and are typical of any i2c controller (specifying
++ * slave address, timeouts, etc). These ioctls take advantage of any hardware
++ * features built into the controller for which this algorithm-adapter set
++ * was written. These ioctls allow you to take control of the data and clock
++ * lines and set the either high or low,
++ * similar to a GPIO pin.
++ */
++static int algo_control(struct i2c_adapter *adapter,
++ unsigned int cmd, unsigned long arg)
++{
++ struct i2c_iic_msg s_msg;
++ char *buf;
++ int ret;
++
++ if (cmd == I2C_SREAD) {
++ if(copy_from_user(&s_msg, (struct i2c_iic_msg *)arg,
++ sizeof(struct i2c_iic_msg)))
++ return -EFAULT;
++ buf = kmalloc(s_msg.len, GFP_KERNEL);
++ if (buf== NULL)
++ return -ENOMEM;
++
++ ret = iic_readbytes(adapter, buf, s_msg.len, 1);
++ if (ret>=0) {
++ if(copy_to_user( s_msg.buf, buf, s_msg.len) )
++ ret = -EFAULT;
++ }
++ kfree(buf);
++ }
++ return 0;
++}
++
++
++static u32 iic_func(struct i2c_adapter *adap)
++{
++ return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_10BIT_ADDR |
++ I2C_FUNC_PROTOCOL_MANGLING;
++}
++
++/* -----exported algorithm data: ------------------------------------- */
++
++static struct i2c_algorithm iic_algo = {
++ .name = "VoyagerGX I2C algorithm",
++ .id = I2C_ALGO_VOYAGER,
++ .master_xfer = iic_xfer,
++ .algo_control = algo_control,
++ .functionality = iic_func,
++};
++
++
++/*
++ * registering functions to load algorithms at runtime
++ */
++int i2c_voyager_add_bus(struct i2c_adapter *adap)
++{
++ DEB2(printk("i2c-algo-voyagergx: hw routines for %s registered.\n",
++ adap->name));
++
++ adap->id |= iic_algo.id;
++ adap->algo = &iic_algo;
++
++ adap->timeout = 100; /* default values, should */
++ adap->retries = 3; /* be replaced by defines */
++ adap->flags = 0;
++
++ return i2c_add_adapter(adap);
++}
++
++
++int i2c_voyager_del_bus(struct i2c_adapter *adap)
++{
++ return i2c_del_adapter(adap);
++}
++
++int __init i2c_algo_iic_init (void)
++{
++ printk(KERN_INFO "VoyagerGX iic (i2c) algorithm module\n");
++ return 0;
++}
++
++void i2c_algo_iic_exit(void)
++{
++}
++
++MODULE_AUTHOR("Lineo uSolutions,Inc. <www.lineo.co.jp>");
++MODULE_DESCRIPTION("VoyagerGX I2C algorithm");
++MODULE_LICENSE("GPL");
++
++MODULE_PARM(i2c_debug,"i");
++MODULE_PARM_DESC(i2c_debug,
++ "debug level - 0 off; 1 normal; 2,3 more verbose; 9 iic-protocol");
++
++module_init(i2c_algo_iic_init);
++module_exit(i2c_algo_iic_exit);
+diff -ruN linux-2.6.17-vanilla/drivers/i2c/algos/i2c-algo-voyager.h linux-2.6.17/drivers/i2c/algos/i2c-algo-voyager.h
+--- linux-2.6.17-vanilla/drivers/i2c/algos/i2c-algo-voyager.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/i2c/algos/i2c-algo-voyager.h 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1,99 @@
++/* ------------------------------------------------------------------------- */
++/* i2c-algo-ite.h i2c driver algorithms for ITE IIC adapters */
++/* ------------------------------------------------------------------------- */
++/* Copyright (C) 1995-97 Simon G. Vogl
++ 1998-99 Hans Berglund
++
++ This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program; if not, write to the Free Software
++ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
++/* ------------------------------------------------------------------------- */
++
++/* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and even
++ Frodo Looijaard <frodol@dds.nl> */
++
++/* Modifications by MontaVista Software, 2001
++ Changes made to support the ITE IIC peripheral */
++
++
++#ifndef I2C_ALGO_ITE_H
++#define I2C_ALGO_ITE_H 1
++
++#include <linux/i2c.h>
++#include <asm/mach/voyagergx_reg.h>
++
++/* Example of a sequential read request:
++ struct i2c_iic_msg s_msg;
++
++ s_msg.addr=device_address;
++ s_msg.len=length;
++ s_msg.buf=buffer;
++ s_msg.waddr=word_address;
++ ioctl(file,I2C_SREAD, &s_msg);
++ */
++#define I2C_SREAD 0x780 /* SREAD ioctl command */
++
++struct i2c_iic_msg {
++ __u16 addr; /* device address */
++ __u16 waddr; /* word address */
++ short len; /* msg length */
++ char *buf; /* pointer to msg data */
++};
++
++struct i2c_algo_iic_data {
++ void *data; /* private data for lolevel routines */
++ void (*setiic) (void *data, int ctl, int val);
++ int (*getiic) (void *data, int ctl);
++ int (*getown) (void *data);
++ int (*getclock) (void *data);
++ void (*waitforpin) (void);
++
++ /* local settings */
++ int udelay;
++ int mdelay;
++ int timeout;
++};
++
++int i2c_voyager_add_bus(struct i2c_adapter *);
++int i2c_voyager_del_bus(struct i2c_adapter *);
++
++//#define TC56XX
++#define OV7640
++//#define OV7141
++
++#if defined(TC56XX)
++#define PACKET_SIZE 4
++#define SERIAL_WRITE_ADDR ((0x56 << 1) + 0) //0xAC
++#define SERIAL_READ_ADDR ((0x56 << 1) + 1) //0xAD
++//#define SERIAL_WRITE_ADDR ((0x57 << 1) + 0) //0xAE
++//#define SERIAL_READ_ADDR ((0x57 << 1) + 0) //0xAF
++
++#elif defined(OV7640)
++#define PACKET_SIZE 2
++//#define SERIAL_WRITE_ADDR ((0x42 << 1) + 0)
++//#define SERIAL_READ_ADDR ((0x42 << 1) + 1)
++#define SERIAL_WRITE_ADDR (0x42)
++#define SERIAL_READ_ADDR (0x43)
++
++#elif defined(OV7141)
++#define PACKET_SIZE 2
++#define SERIAL_WRITE_ADDR ((0x42 << 1) + 0)
++#define SERIAL_READ_ADDR ((0x42 << 1) + 1)
++//#define SERIAL_WRITE_ADDR ((0x43 << 1) + 0)
++//#define SERIAL_READ_ADDR ((0x43 << 1) + 1)
++
++#else
++#define PACKET_SIZE 16
++#endif
++
++#endif /* I2C_ALGO_ITE_H */
+diff -ruN linux-2.6.17-vanilla/drivers/i2c/busses/CVS/Entries linux-2.6.17/drivers/i2c/busses/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/i2c/busses/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/i2c/busses/CVS/Entries 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1,4 @@
++/Makefile/1.9/Mon Mar 27 21:06:14 2006/-ko/
++/i2c-voyager.c/1.1/Wed Apr 21 00:09:16 2004/-ko/
++/Kconfig/1.12/Wed Jul 5 14:51:03 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/drivers/i2c/busses/CVS/Repository linux-2.6.17/drivers/i2c/busses/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/i2c/busses/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/i2c/busses/CVS/Repository 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/i2c/busses
+diff -ruN linux-2.6.17-vanilla/drivers/i2c/busses/CVS/Root linux-2.6.17/drivers/i2c/busses/CVS/Root
+--- linux-2.6.17-vanilla/drivers/i2c/busses/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/i2c/busses/CVS/Root 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/i2c/busses/Kconfig linux-2.6.17/drivers/i2c/busses/Kconfig
+--- linux-2.6.17-vanilla/drivers/i2c/busses/Kconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/i2c/busses/Kconfig 2006-07-12 16:54:23.000000000 +0000
+@@ -496,6 +496,16 @@
+ This driver can also be built as a module. If so, the module
+ will be called i2c-voodoo3.
+
++config I2C_VOYAGER
++ tristate "Silicon Motion Voyager GX"
++ depends on I2C && SH_RTS7751R2D
++ help
++ If you say yes to this option, support will be included for the
++ Silicon Motion SM501 of mainboard I2C interfaces.
++
++ This driver can also be built as a module. If so, the module
++ will be called i2c-voyager.
++
+ config I2C_PCA_ISA
+ tristate "PCA9564 on an ISA bus"
+ depends on I2C
+diff -ruN linux-2.6.17-vanilla/drivers/i2c/busses/Makefile linux-2.6.17/drivers/i2c/busses/Makefile
+--- linux-2.6.17-vanilla/drivers/i2c/busses/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/i2c/busses/Makefile 2006-07-12 16:54:23.000000000 +0000
+@@ -40,6 +40,7 @@
+ obj-$(CONFIG_I2C_VIA) += i2c-via.o
+ obj-$(CONFIG_I2C_VIAPRO) += i2c-viapro.o
+ obj-$(CONFIG_I2C_VOODOO3) += i2c-voodoo3.o
++obj-$(CONFIG_I2C_VOYAGER) += i2c-voyager.o
+ obj-$(CONFIG_SCx200_ACB) += scx200_acb.o
+ obj-$(CONFIG_SCx200_I2C) += scx200_i2c.o
+
+diff -ruN linux-2.6.17-vanilla/drivers/i2c/busses/i2c-voyager.c linux-2.6.17/drivers/i2c/busses/i2c-voyager.c
+--- linux-2.6.17-vanilla/drivers/i2c/busses/i2c-voyager.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/i2c/busses/i2c-voyager.c 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1,216 @@
++/* -------------------------------------------------------------------- */
++/* i2c-voyagergx.c: */
++/* -------------------------------------------------------------------- */
++/* This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program; if not, write to the Free Software
++ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
++ Copyright 2003 (c) Lineo uSolutions,Inc.
++ Copyright 2004 (c) Paul Mundt
++*/
++/* -------------------------------------------------------------------- */
++
++#include <linux/kernel.h>
++#include <linux/ioport.h>
++#include <linux/module.h>
++#include <linux/delay.h>
++#include <linux/slab.h>
++#include <linux/version.h>
++#include <linux/init.h>
++#include <linux/interrupt.h>
++#include <asm/irq.h>
++#include <asm/io.h>
++
++#include <linux/i2c.h>
++#include "../algos/i2c-algo-voyager.h"
++
++//#define I2C_USE_INTR
++
++#if defined(I2C_USE_INTR)
++#define DEFAULT_IRQ 10
++#else
++#define DEFAULT_IRQ 0
++#endif
++
++struct iic_voyagergx {
++ unsigned long iic_base;
++ int iic_irq;
++};
++static struct iic_voyagergx gpi;
++
++static wait_queue_head_t iic_wait;
++static int iic_pending;
++
++static void iic_voyagergx_setiic(void *data, int ctl, int val)
++{
++ outw(val,ctl);
++}
++
++static int iic_voyagergx_getiic(void *data, int ctl)
++{
++ return inw(ctl);
++}
++
++/* Put this process to sleep. We will wake up when the
++ * IIC controller interrupts.
++ */
++static void iic_voyagergx_waitforpin(void)
++{
++ int timeout = 2;
++
++ /* If interrupts are enabled (which they are), then put the process to
++ * sleep. This process will be awakened by two events -- either the
++ * the IIC peripheral interrupts or the timeout expires.
++ * If interrupts are not enabled then delay for a reasonable amount
++ * of time and return.
++ */
++ if (gpi.iic_irq > 0) {
++ local_irq_disable();
++
++ if (iic_pending == 0) {
++ interruptible_sleep_on_timeout(&iic_wait, timeout*HZ);
++ } else {
++ iic_pending = 0;
++ }
++
++ local_irq_enable();
++ } else {
++ udelay(100);
++ }
++}
++
++#if defined(I2C_USE_INTR)
++static irqreturn_t iic_voyagergx_handler(int this_irq, void *dev_id,
++ struct pt_regs *regs)
++{
++ iic_pending = 1;
++
++ pr_debug("iic_voyagergx_handler: in interrupt handler\n");
++ wake_up_interruptible(&iic_wait);
++
++ return IRQ_HANDLED;
++}
++#endif
++
++/* Lock the region of memory where I/O registers exist. Request our
++ * interrupt line and register its associated handler.
++ */
++static int iic_hw_resrc_init(void)
++{
++ unsigned char ctl;
++ unsigned long val;
++
++ // Power Mode Gate
++ val = inl(POWER_MODE0_GATE);
++ val |= 0x00000040;
++ outl(val, POWER_MODE0_GATE);
++ val = inl(POWER_MODE1_GATE);
++ val |= 0x00000040;
++ outl(val, POWER_MODE1_GATE);
++
++ // GPIO Control
++ val = inl( GPIO_MUX_HIGH);
++ val |= 0x0000c000;
++ outl(val, GPIO_MUX_HIGH);
++
++#if defined(I2C_USE_INTR)
++ // Interrupt Mask
++ val = inl(VOYAGER_INT_MASK);
++ val |= 0x00800000;
++ outl(val, VOYAGER_INT_MASK);
++#endif
++
++ // Enable I2c controller and select mode to high
++ ctl = inb(I2C_CONTROL);
++ outb((ctl | I2C_CONTROL_E | I2C_CONTROL_MODE), I2C_CONTROL);
++
++#if defined(I2C_USE_INTR)
++ if (gpi.iic_irq > 0) {
++ if (request_irq(gpi.iic_irq, iic_voyagergx_handler, 0,
++ "VoyagerGX IIC", 0) < 0) {
++ gpi.iic_irq = 0;
++ } else {
++ pr_debug("Enabled IIC IRQ %d\n", gpi.iic_irq);
++ }
++
++ enable_irq(gpi.iic_irq);
++ }
++#endif
++
++ return 0;
++}
++
++static struct i2c_algo_iic_data iic_voyagergx_data = {
++ .setiic = iic_voyagergx_setiic,
++ .getiic = iic_voyagergx_getiic,
++ .waitforpin = iic_voyagergx_waitforpin,
++ .udelay = 80,
++ .mdelay = 80,
++ .timeout = 100,
++};
++
++static struct i2c_adapter iic_voyagergx_ops = {
++ .owner = THIS_MODULE,
++ .name = "VoyagerGX I2C",
++ .id = I2C_HW_SMBUS_VOYAGER,
++ .class = I2C_ADAP_CLASS_SMBUS,
++ .algo_data = &iic_voyagergx_data,
++};
++
++static int __init iic_voyagergx_init(void)
++{
++ struct iic_voyagergx *piic = &gpi;
++
++ printk(KERN_INFO "Initialize VoyagerGX I2C module\n");
++
++ piic->iic_base = VOYAGER_BASE;
++ piic->iic_irq = DEFAULT_IRQ;
++
++ iic_voyagergx_data.data = (void *)piic;
++ init_waitqueue_head(&iic_wait);
++
++ if (iic_hw_resrc_init() == 0) {
++ if (i2c_voyager_add_bus(&iic_voyagergx_ops) < 0)
++ return -ENODEV;
++ } else {
++ return -ENODEV;
++ }
++
++#if defined(I2C_USE_INTR)
++ printk(KERN_INFO " found device at %#lx irq %d.\n",
++ piic->iic_base, piic->iic_irq);
++#else
++ printk(KERN_INFO " found device at %#lx\n", piic->iic_base);
++#endif
++
++ return 0;
++}
++
++
++static void iic_voyagergx_exit(void)
++{
++ if (gpi.iic_irq > 0) {
++ disable_irq(gpi.iic_irq);
++ free_irq(gpi.iic_irq, 0);
++ }
++
++ release_region(gpi.iic_base, 2);
++}
++
++MODULE_AUTHOR("Lineo uSolutions,Inc. <www.lineo.co.jp>");
++MODULE_DESCRIPTION("I2C-Bus adapter for VoyagerGX Silicon Motion, Inc.");
++MODULE_LICENSE("GPL");
++
++module_init(iic_voyagergx_init);
++module_exit(iic_voyagergx_exit);
++
+diff -ruN linux-2.6.17-vanilla/drivers/ide/CVS/Entries linux-2.6.17/drivers/ide/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/ide/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/ide/CVS/Entries 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,6 @@
++/Kconfig/1.28/Mon Mar 27 21:06:14 2006/-ko/
++/Makefile/1.7/Tue Jan 3 22:35:55 2006/-ko/
++D/legacy////
++D/pci////
++D/sh////
++/ide.c/1.11/Wed Jul 5 14:51:04 2006/-ko/
+diff -ruN linux-2.6.17-vanilla/drivers/ide/CVS/Repository linux-2.6.17/drivers/ide/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/ide/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/ide/CVS/Repository 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/ide
+diff -ruN linux-2.6.17-vanilla/drivers/ide/CVS/Root linux-2.6.17/drivers/ide/CVS/Root
+--- linux-2.6.17-vanilla/drivers/ide/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/ide/CVS/Root 2006-07-12 16:54:23.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/ide/Kconfig linux-2.6.17/drivers/ide/Kconfig
+--- linux-2.6.17-vanilla/drivers/ide/Kconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/ide/Kconfig 2006-07-12 16:54:24.000000000 +0000
+@@ -780,6 +780,9 @@
+ This option enables the use of the sleep LED as a hard drive
+ activity LED.
+
++config IDE_SH
++ def_bool SUPERH
++
+ config BLK_DEV_IDE_SWARM
+ tristate "IDE for Sibyte evaluation boards"
+ depends on SIBYTE_SB1xxx_SOC
+diff -ruN linux-2.6.17-vanilla/drivers/ide/Makefile linux-2.6.17/drivers/ide/Makefile
+--- linux-2.6.17-vanilla/drivers/ide/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/ide/Makefile 2006-07-12 16:54:24.000000000 +0000
+@@ -37,6 +37,8 @@
+ ide-core-$(CONFIG_BLK_DEV_MPC8xx_IDE) += ppc/mpc8xx.o
+ ide-core-$(CONFIG_BLK_DEV_IDE_PMAC) += ppc/pmac.o
+
++# built-in only drivers from sh/
++ide-core-$(CONFIG_IDE_SH) += sh/ide-sh.o
+ # built-in only drivers from h8300/
+ ide-core-$(CONFIG_H8300) += h8300/ide-h8300.o
+
+diff -ruN linux-2.6.17-vanilla/drivers/ide/ide.c linux-2.6.17/drivers/ide/ide.c
+--- linux-2.6.17-vanilla/drivers/ide/ide.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/ide/ide.c 2006-07-12 16:54:24.000000000 +0000
+@@ -1776,6 +1776,7 @@
+
+ extern void pnpide_init(void);
+ extern void h8300_ide_init(void);
++extern void ide_sh_init(void);
+
+ /*
+ * probe_for_hwifs() finds/initializes "known" IDE interfaces
+@@ -1840,6 +1841,9 @@
+ #ifdef CONFIG_H8300
+ h8300_ide_init();
+ #endif
++#ifdef CONFIG_IDE_SH
++ ide_sh_init();
++#endif
+ }
+
+ void ide_register_subdriver(ide_drive_t *drive, ide_driver_t *driver)
+diff -ruN linux-2.6.17-vanilla/drivers/ide/legacy/CVS/Entries linux-2.6.17/drivers/ide/legacy/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/ide/legacy/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/ide/legacy/CVS/Entries 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,2 @@
++/ide-cs.c/1.13/Thu Jul 6 12:38:14 2006//
++D
+diff -ruN linux-2.6.17-vanilla/drivers/ide/legacy/CVS/Repository linux-2.6.17/drivers/ide/legacy/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/ide/legacy/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/ide/legacy/CVS/Repository 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/ide/legacy
+diff -ruN linux-2.6.17-vanilla/drivers/ide/legacy/CVS/Root linux-2.6.17/drivers/ide/legacy/CVS/Root
+--- linux-2.6.17-vanilla/drivers/ide/legacy/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/ide/legacy/CVS/Root 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/ide/legacy/ide-cs.c linux-2.6.17/drivers/ide/legacy/ide-cs.c
+--- linux-2.6.17-vanilla/drivers/ide/legacy/ide-cs.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/ide/legacy/ide-cs.c 2006-07-12 16:54:24.000000000 +0000
+@@ -73,6 +73,11 @@
+ #define DEBUG(n, args...)
+ #endif
+
++
++#if defined(CONFIG_HD64461_PCMCIA) || defined(CONFIG_HD64461_PCMCIA_MODULE)
++#define USE_MEM 1
++#endif
++
+ /*====================================================================*/
+
+ static const char ide_major[] = {
+@@ -117,13 +122,19 @@
+ info->p_dev = link;
+ link->priv = info;
+
++#ifndef USE_MEM
+ link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
+ link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
+ link->io.IOAddrLines = 3;
++#endif
+ link->irq.Attributes = IRQ_TYPE_EXCLUSIVE;
+ link->irq.IRQInfo1 = IRQ_LEVEL_ID;
+ link->conf.Attributes = CONF_ENABLE_IRQ;
++#ifdef USE_MEM
++ link->conf.IntType = INT_MEMORY;
++#else
+ link->conf.IntType = INT_MEMORY_AND_IO;
++#endif
+
+ return ide_config(link);
+ } /* ide_attach */
+@@ -229,6 +240,22 @@
+ }
+ }
+
++#ifdef USE_MEM
++ if ((cfg->mem.nwin > 0) || (stk->dflt.mem.nwin > 0)) {
++ win_req_t wr;
++ wr.Attributes = WIN_ENABLE|WIN_MEMORY_TYPE_CM;
++ wr.Base = 0;
++ wr.Size = 0;
++ wr.AccessSpeed = 0;
++ link->win = (window_handle_t)link;
++ link->conf.ConfigIndex = cfg->index;
++ if (pcmcia_request_window(&link, &wr, &link->win) != 0)
++ goto next_entry;
++ io_base = wr.Base;
++ ctl_base = io_base + 0x0e;
++ break;
++ }
++#else
+ if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM))
+ link->conf.Vpp =
+ cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;
+@@ -262,6 +289,7 @@
+ /* If we've got this far, we're done */
+ break;
+ }
++#endif
+
+ next_entry:
+ if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
+@@ -278,12 +306,19 @@
+ CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
+ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
+
++#ifndef USE_MEM
++ /* deal with brain dead IDE resource management */
++ release_region(link->io.BasePort1, link->io.NumPorts1);
++ if (link->io.NumPorts2)
++ release_region(link->io.BasePort2, link->io.NumPorts2);
++
+ /* disable drive interrupts during IDE probe */
+ outb(0x02, ctl_base);
+
+ /* special setup for KXLC005 card */
+ if (is_kme)
+ outb(0x81, ctl_base+1);
++#endif
+
+ /* retry registration in case device is still spinning up */
+ for (hd = -1, i = 0; i < 10; i++) {
+@@ -352,6 +387,13 @@
+ -- need to investigate the required PCMCIA magic */
+ ide_unregister(info->hd);
+ }
++
++#ifndef USE_MEM
++ request_region(link->io.BasePort1, link->io.NumPorts1,"ide-cs");
++ if (link->io.NumPorts2)
++ request_region(link->io.BasePort2, link->io.NumPorts2,"ide-cs");
++#endif
++
+ info->ndev = 0;
+
+ pcmcia_disable_device(link);
+diff -ruN linux-2.6.17-vanilla/drivers/ide/pci/CVS/Entries linux-2.6.17/drivers/ide/pci/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/ide/pci/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/ide/pci/CVS/Entries 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,2 @@
++/alim15x3.c/1.16/Wed Jul 5 14:51:05 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/drivers/ide/pci/CVS/Repository linux-2.6.17/drivers/ide/pci/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/ide/pci/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/ide/pci/CVS/Repository 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/ide/pci
+diff -ruN linux-2.6.17-vanilla/drivers/ide/pci/CVS/Root linux-2.6.17/drivers/ide/pci/CVS/Root
+--- linux-2.6.17-vanilla/drivers/ide/pci/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/ide/pci/CVS/Root 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/ide/pci/alim15x3.c linux-2.6.17/drivers/ide/pci/alim15x3.c
+--- linux-2.6.17-vanilla/drivers/ide/pci/alim15x3.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/ide/pci/alim15x3.c 2006-07-12 16:54:24.000000000 +0000
+@@ -65,6 +65,16 @@
+ "PIO mode" };
+
+ static char *udmaT[8] = {
++#if defined(CONFIG_SH_MPC1211)
++ " 1T",
++ "1.5T",
++ " 2T",
++ " 3T",
++ " 4T",
++ "2.5T",
++ " 6T",
++ "3.5T"
++#else
+ "1.5T",
+ " 2T",
+ "2.5T",
+@@ -73,6 +83,7 @@
+ " 4T",
+ " 6T",
+ " 8T"
++#endif
+ };
+
+ static char *channel_status[8] = {
+@@ -303,7 +314,11 @@
+ u8 cd_dma_fifo = 0;
+ int unit = drive->select.b.unit & 1;
+
++#if defined(CONFIG_SH_MPC1211)
++ pio = ide_get_best_pio_mode(drive, pio, 0, &d);
++#else
+ pio = ide_get_best_pio_mode(drive, pio, 5, &d);
++#endif
+ s_time = ide_pio_timings[pio].setup_time;
+ a_time = ide_pio_timings[pio].active_time;
+ if ((s_clc = (s_time * bus_speed + 999) / 1000) >= 8)
+@@ -420,6 +435,10 @@
+ return 0;
+ }
+
++#ifdef CONFIG_SH_MPC1211
++ mode = 1;
++#endif
++
+ /*
+ * If the drive sees no suitable cable then UDMA 33
+ * is the highest permitted mode
+diff -ruN linux-2.6.17-vanilla/drivers/ide/sh/CVS/Entries linux-2.6.17/drivers/ide/sh/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/ide/sh/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/ide/sh/CVS/Entries 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,2 @@
++/ide-sh.c/1.2/Thu Mar 17 10:26:58 2005/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/drivers/ide/sh/CVS/Repository linux-2.6.17/drivers/ide/sh/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/ide/sh/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/ide/sh/CVS/Repository 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/ide/sh
+diff -ruN linux-2.6.17-vanilla/drivers/ide/sh/CVS/Root linux-2.6.17/drivers/ide/sh/CVS/Root
+--- linux-2.6.17-vanilla/drivers/ide/sh/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/ide/sh/CVS/Root 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/ide/sh/ide-sh.c linux-2.6.17/drivers/ide/sh/ide-sh.c
+--- linux-2.6.17-vanilla/drivers/ide/sh/ide-sh.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/ide/sh/ide-sh.c 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,95 @@
++/*
++ * SuperH default IDE host driver
++ *
++ * Copyright (C) 2004, 2005 Paul Mundt
++ *
++ * Based on the old include/asm-sh/ide.h
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ */
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/ide.h>
++
++#include <asm/irq.h>
++
++enum {
++ IDE_SH_CFCARD_IO = 0x1f0,
++ IDE_SH_PCMCIA_IO = 0x170,
++};
++
++static struct sh_ide_hwif {
++ unsigned long base;
++ int irq;
++} sh_ide_hwifs[] __initdata = {
++ { IDE_SH_CFCARD_IO, IRQ_CFCARD },
++ { IDE_SH_PCMCIA_IO, IRQ_PCMCIA },
++ { 0, },
++};
++
++static inline int __init hw_setup(hw_regs_t *hw, int idx)
++{
++ unsigned long base = sh_ide_hwifs[idx].base;
++
++ if (!request_region(base, 8, "ide-sh"))
++ return -EBUSY;
++ if (!request_region(base + 0x206, 1, "ide-sh")) {
++ release_region(base, 8);
++ return -EBUSY;
++ }
++
++ memset(hw, 0, sizeof(hw_regs_t));
++ ide_std_init_ports(hw, base, base + 0x206);
++
++ hw->irq = sh_ide_hwifs[idx].irq;
++ hw->chipset = ide_generic;
++
++ return 0;
++}
++
++static inline void __init hwif_setup(ide_hwif_t *hwif)
++{
++ hwif->mmio = 2;
++}
++
++void __init ide_sh_init(void)
++{
++ int i, idx;
++
++ printk(KERN_INFO "ide: SuperH generic IDE interface\n");
++
++ for (i = 0; i < MAX_HWIFS; i++) {
++ ide_hwif_t *hwif;
++ hw_regs_t hw;
++
++ if (!sh_ide_hwifs[i].base) {
++ printk(KERN_ERR "ide-sh: Attempting to register ide%d "
++ "when only %d interfaces are available.\n",
++ i, i - 1);
++ break;
++ }
++
++ if (hw_setup(&hw, i) < 0)
++ goto region_cleanup;
++
++ idx = ide_register_hw(&hw, &hwif);
++ if (idx == -1) {
++ printk(KERN_ERR "ide-sh: IDE interface registration failed\n");
++ i++; /* release this interface too */
++ goto region_cleanup;
++ }
++
++ hwif_setup(hwif);
++ }
++
++region_cleanup:
++ for (idx = 0; idx < i; idx++) {
++ unsigned long base = sh_ide_hwifs[idx].base;
++
++ release_region(base + 0x206, 1);
++ release_region(base, 8);
++ }
++}
++
+diff -ruN linux-2.6.17-vanilla/drivers/input/CVS/Entries linux-2.6.17/drivers/input/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/input/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/input/CVS/Entries 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,2 @@
++D/keyboard////
++D/touchscreen////
+diff -ruN linux-2.6.17-vanilla/drivers/input/CVS/Repository linux-2.6.17/drivers/input/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/input/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/input/CVS/Repository 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/input
+diff -ruN linux-2.6.17-vanilla/drivers/input/CVS/Root linux-2.6.17/drivers/input/CVS/Root
+--- linux-2.6.17-vanilla/drivers/input/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/input/CVS/Root 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/input/keyboard/CVS/Entries linux-2.6.17/drivers/input/keyboard/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/input/keyboard/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/input/keyboard/CVS/Entries 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,7 @@
++/Makefile/1.6/Thu Nov 10 14:20:52 2005/-ko/
++/hp620_keyb.c/1.2/Mon Jan 30 11:14:01 2006//
++/hp680_keyb.c/1.2/Mon Jan 30 11:14:01 2006//
++/scan_keyb.c/1.3/Mon Jan 30 11:14:01 2006/-ko/
++/scan_keyb.h/1.2/Mon Jan 30 11:14:01 2006/-ko/
++/Kconfig/1.14/Wed Jul 5 14:51:11 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/drivers/input/keyboard/CVS/Repository linux-2.6.17/drivers/input/keyboard/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/input/keyboard/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/input/keyboard/CVS/Repository 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/input/keyboard
+diff -ruN linux-2.6.17-vanilla/drivers/input/keyboard/CVS/Root linux-2.6.17/drivers/input/keyboard/CVS/Root
+--- linux-2.6.17-vanilla/drivers/input/keyboard/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/input/keyboard/CVS/Root 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/input/keyboard/Kconfig linux-2.6.17/drivers/input/keyboard/Kconfig
+--- linux-2.6.17-vanilla/drivers/input/keyboard/Kconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/input/keyboard/Kconfig 2006-07-12 16:54:24.000000000 +0000
+@@ -183,4 +183,21 @@
+ This driver implements support for HIL-keyboards attached
+ to your machine, so normally you should say Y here.
+
++choice
++ prompt "HP6XX keyboard"
++ depends on SH_HP6XX
++ default KEYBOARD_HP680
++
++config KEYBOARD_HP620
++ tristate "HP620 keyboard"
++ help
++ Say Y here if you are running Linux on HP Jornada 620.
++
++config KEYBOARD_HP680
++ tristate "HP680 keyboard"
++ help
++ Say Y here if you are running Linux on HP Jornada 680.
++
++endchoice
++
+ endif
+diff -ruN linux-2.6.17-vanilla/drivers/input/keyboard/Makefile linux-2.6.17/drivers/input/keyboard/Makefile
+--- linux-2.6.17-vanilla/drivers/input/keyboard/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/input/keyboard/Makefile 2006-07-12 16:54:24.000000000 +0000
+@@ -11,8 +11,11 @@
+ obj-$(CONFIG_KEYBOARD_AMIGA) += amikbd.o
+ obj-$(CONFIG_KEYBOARD_LOCOMO) += locomokbd.o
+ obj-$(CONFIG_KEYBOARD_NEWTON) += newtonkbd.o
++obj-$(CONFIG_KEYBOARD_98KBD) += 98kbd.o
+ obj-$(CONFIG_KEYBOARD_CORGI) += corgikbd.o
+ obj-$(CONFIG_KEYBOARD_SPITZ) += spitzkbd.o
+ obj-$(CONFIG_KEYBOARD_HIL) += hil_kbd.o
+ obj-$(CONFIG_KEYBOARD_HIL_OLD) += hilkbd.o
++obj-$(CONFIG_KEYBOARD_HP620) += scan_keyb.o hp620_keyb.o
++obj-$(CONFIG_KEYBOARD_HP680) += scan_keyb.o hp680_keyb.o
+
+diff -ruN linux-2.6.17-vanilla/drivers/input/keyboard/hp620_keyb.c linux-2.6.17/drivers/input/keyboard/hp620_keyb.c
+--- linux-2.6.17-vanilla/drivers/input/keyboard/hp620_keyb.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/input/keyboard/hp620_keyb.c 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,169 @@
++/*
++ * drivers/input/keyboard/hp680_keyb.c
++ *
++ * HP Jornada 620 scan keyboard
++ *
++ * Copyright (C) 2005 Andriy Skulysh
++ * Copyright (C) 2006 Paul Mundt
++ *
++ * Splited from drivers/input/keyboard/hp600_keyb.c
++ *
++ * Copyright (C) 2000 YAEGASHI Takeshi
++ * HP600 keyboard scan routine and translation table
++ * Copyright (C) 2000 Niibe Yutaka
++ * HP620 keyboard translation table
++ */
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <asm/delay.h>
++#include <asm/io.h>
++#include "scan_keyb.h"
++
++#define PCDR 0xa4000124
++#define PDDR 0xa4000126
++#define PEDR 0xa4000128
++#define PFDR 0xa400012a
++#define PGDR 0xa400012c
++#define PHDR 0xa400012e
++#define PJDR 0xa4000130
++#define PKDR 0xa4000132
++#define PLDR 0xa4000134
++
++/****************************************************************
++HP Jornada 620(Japanese version) keyboard scan matrix
++
++ PTC7 PTC6 PTC5 PTC4 PTC3 PTC2 PTC1 PTC0
++PTD1 EREC BS Ctrl on/off - 0 9
++PTD5 EREC BS Ctrl on/off ^ P O
++PTD7 EREC BS Ctrl on/off ] @ L
++PTE0 EREC BS Ctrl on/off Han/Zen [ ;
++PTE1 EREC BS Ctrl on/off Enter : /
++PTE3 EREC BS Ctrl on/off Right Up
++PTE6 EREC BS Ctrl on/off Down Left
++PTE7 EREC BS Ctrl on/off F8 F7
++
++ PTF7 PTF6 PTF5 PTF4 PTF3 PTF2 PTF1 PTF0
++PTD1 8 7 6 5 4 3 2 1
++PTD5 I U Y T R E W Q
++PTD7 K J H G F D S A
++PTE0 ESC Tab Shift
++PTE1 . V Caps Hira
++PTE3 , M N B Muhen C X
++PTE6 _ \ Henkan Space Alt Z
++PTE7 F6 F5 F4 F3 F2 F1 REC
++
++ PTH0
++* on/off
++
++ 7 6 5 4 3 2 1 0
++C: 0xffff 0xff IP IP IP IP IP IP IP IP
++D: 0x4404 0xaf O F O F F F O F
++E: 0x5045 0xff O O F F O F O O
++F: 0xffff 0xff IP IP IP IP IP IP IP IP
++G: 0xd5ff 0x00 IP O O O IP IP IP IP
++H: 0x63ff 0xd1 O I F IP IP IP IP IP
++J: 0x0004 0x02 F F F F F F O F
++K: 0x0401 0xff F F O F F F F O
++L: 0x0c00 0x20 F F IP F F F F F
++
++ADCSR: 0x08
++ADCR: 0x3f
++
++ ****************************************************************/
++
++/****************************************************************
++Japanese 109 keyboard scan code layout
++
++ E02A- E1-
++01 3B 3C 3D 3E 3F 40 41 42 43 44 57 58 E037 46 1045
++
++29 02 03 04 05 06 07 08 09 0A 0B 0C 0D 7D 0E E052 E047 E049 45 E035 37 4A
++0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C E053 E04F E051 47 48 49 4E
++3A 1E 1F 20 21 22 23 24 25 26 27 28 2B 4B 4C 4D
++2A 2C 2D 2E 2F 30 31 32 33 34 35 73 36 E048 4F 50 51 E0-
++1D DB 38 7B 39 79 70 E038 DC DD E01D E04B E050 E04D 52 53 1C
++
++****************************************************************/
++
++static const unsigned char hp620_japanese_table[] = {
++ /* PTD1 */
++ 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x0e, 0x00, 0x00,
++ 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
++ /* PTD5 */
++ 0x18, 0x19, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
++ /* PTD7 */
++ 0x26, 0x1a, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
++ /* PTE0 */
++ 0x27, 0x1b, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x2a, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
++ /* PTE1 */
++ 0x35, 0x28, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x70, 0x3a, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x34,
++ /* PTE3 */
++ 0x48, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x2d, 0x2e, 0x7b, 0x30, 0x31, 0x32, 0x33,
++ /* PTE6 */
++ 0x4b, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x2c, 0x38, 0x00, 0x39, 0x79, 0x7d, 0x73,
++ /* PTE7 */
++ 0x41, 0x42, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40,
++ /* **** */
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++};
++
++static int hp620_japanese_scan_kbd(unsigned char *s)
++{
++ int i;
++ unsigned char matrix_switch[] = {
++ 0xfd, 0xff, /* PTD1 */
++ 0xdf, 0xff, /* PTD5 */
++ 0x7f, 0xff, /* PTD7 */
++ 0xff, 0xfe, /* PTE0 */
++ 0xff, 0xfd, /* PTE1 */
++ 0xff, 0xf7, /* PTE3 */
++ 0xff, 0xbf, /* PTE6 */
++ 0xff, 0x7f, /* PTE7 */
++ }, *t=matrix_switch;
++
++ for(i=0; i<8; i++) {
++ ctrl_outb(*t++, PDDR);
++ ctrl_outb(*t++, PEDR);
++ udelay(50);
++ *s++=ctrl_inb(PCDR);
++ *s++=ctrl_inb(PFDR);
++ }
++
++ ctrl_outb(0xff, PDDR);
++ ctrl_outb(0xff, PEDR);
++
++ *s++=ctrl_inb(PGDR);
++ *s++=ctrl_inb(PHDR);
++
++ return 0;
++}
++
++static struct scan_keyboard hp620_kbd = {
++ .scan = hp620_japanese_scan_kbd,
++ .table = hp620_japanese_table,
++ .length = 18,
++};
++
++static int __init hp620_kbd_init_hw(void)
++{
++ printk(KERN_INFO "HP620 matrix scan keyboard registered\n");
++ return register_scan_keyboard(&hp620_kbd);
++}
++
++static void __exit hp620_kbd_exit_hw(void)
++{
++ unregister_scan_keyboard(&hp620_kbd);
++}
++
++module_init(hp620_kbd_init_hw);
++module_exit(hp620_kbd_exit_hw);
++MODULE_LICENSE("GPL");
+diff -ruN linux-2.6.17-vanilla/drivers/input/keyboard/hp680_keyb.c linux-2.6.17/drivers/input/keyboard/hp680_keyb.c
+--- linux-2.6.17-vanilla/drivers/input/keyboard/hp680_keyb.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/input/keyboard/hp680_keyb.c 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,152 @@
++/*
++ * drivers/input/keyboard/hp680_keyb.c
++ *
++ * HP Jornada 680/690 scan keyboard
++ *
++ * Copyright (C) 2005 Andriy Skulysh
++ * Copyright (C) 2006 Paul Mundt
++ *
++ * Splited from drivers/input/keyboard/hp600_keyb.c
++ *
++ * Copyright (C) 2000 YAEGASHI Takeshi
++ * HP600 keyboard scan routine and translation table
++ * Copyright (C) 2000 Niibe Yutaka
++ * HP620 keyboard translation table
++ */
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <asm/delay.h>
++#include <asm/io.h>
++#include "scan_keyb.h"
++
++#define PCDR 0xa4000124
++#define PDDR 0xa4000126
++#define PEDR 0xa4000128
++#define PFDR 0xa400012a
++#define PGDR 0xa400012c
++#define PHDR 0xa400012e
++#define PJDR 0xa4000130
++#define PKDR 0xa4000132
++#define PLDR 0xa4000134
++
++/****************************************************************
++HP Jornada 690(Japanese version) keyboard scan matrix
++
++ PTC7 PTC6 PTC5 PTC4 PTC3 PTC2 PTC1 PTC0
++PTD1 REC Escape on/off Han/Zen Hira Eisu
++PTD5 REC Z on/off Enter : /
++PTD7 REC Right Down
++PTE0 REC Windows on/off
++PTE1 REC A on/off ] [ ;
++PTE3 REC Tab on/off ShirtR \ Up
++PTE6 REC Q on/off BS @ P
++PTE7 REC 1 on/off ^ - 0
++
++ PTF7 PTF6 PTF5 PTF4 PTF3 PTF2 PTF1 PTF0
++PTD1 F5 F4 F6 F7 F8 F3 F2 F1
++PTD5 N B M , . V C X
++PTD7 Muhen Alt Left
++PTE0 Henkan _ Del Space Ctrl
++PTE1 H G J K L F D S
++PTE3 ShiftL
++PTE6 Y T U I O R E W
++PTE7 6 5 7 8 9 4 3 2
++
++ PTG5 PTG4 PTG3 PTG0 PTH0
++* REC REW FWW Cover on/off
++
++
++ 7 6 5 4 3 2 1 0
++C: 0xffff 0xdf IP IP IP IP IP IP IP IP
++D: 0x6786 0x59 O I O IP I F O I
++E: 0x5045 0x00 O O F F O F O O
++F: 0xffff 0xff IP IP IP IP IP IP IP IP
++G: 0xaffe 0xfd I I IP IP IP IP IP I
++H: 0x70f2 0x49 O IP F F IP IP F I
++J: 0x0704 0x22 F F O IP F F O F
++K: 0x0100 0x10 F F F O F F F F
++L: 0x0c3c 0x26 F F IP F F IP IP F
++
++****************************************************************/
++
++static const unsigned char hp680_japanese_table[] = {
++ /* PTD1 */
++ 0x3a, 0x70, 0x29, 0x00, 0x01, 0x00, 0x00, 0x00,
++ 0x3b, 0x3c, 0x3d, 0x42, 0x41, 0x40, 0x3e, 0x3f,
++ /* PTD5 */
++ 0x35, 0x28, 0x1c, 0x00, 0x2c, 0x00, 0x00, 0x00,
++ 0x2d, 0x2e, 0x2f, 0x34, 0x33, 0x32, 0x30, 0x31,
++ /* PTD7 */
++ 0x50, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x38, 0x7b,
++ /* PTE0 */
++ 0x00, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00,
++ 0x1d, 0x00, 0x39, 0x53, 0x73, 0xf9, 0x00, 0x00,
++ /* PTE1 */
++ 0x27, 0x1b, 0x2b, 0x00, 0x1e, 0x00, 0x00, 0x00,
++ 0x1f, 0x20, 0x21, 0x26, 0x25, 0x24, 0x22, 0x23,
++ /* PTE3 */
++ 0x48, 0x7d, 0x36, 0x00, 0x0f, 0x00, 0x00, 0x00,
++ 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ /* PTE6 */
++ 0x19, 0x1a, 0x0e, 0x00, 0x10, 0x00, 0x00, 0x00,
++ 0x11, 0x12, 0x13, 0x18, 0x17, 0x16, 0x14, 0x15,
++ /* PTE7 */
++ 0x0b, 0x0c, 0x0d, 0x00, 0x02, 0x00, 0x00, 0x00,
++ 0x03, 0x04, 0x05, 0x0a, 0x09, 0x08, 0x06, 0x07,
++ /* **** */
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++};
++
++static int hp680_japanese_scan_kbd(unsigned char *s)
++{
++ int i;
++ unsigned char matrix_switch[] = {
++ 0xfd, 0xff, /* PTD1 */
++ 0xdf, 0xff, /* PTD5 */
++ 0x7f, 0xff, /* PTD7 */
++ 0xff, 0xfe, /* PTE0 */
++ 0xff, 0xfd, /* PTE1 */
++ 0xff, 0xf7, /* PTE3 */
++ 0xff, 0xbf, /* PTE6 */
++ 0xff, 0x7f, /* PTE7 */
++ }, *t=matrix_switch;
++
++ for(i=0; i<8; i++) {
++ ctrl_outb(*t++, PDDR);
++ ctrl_outb(*t++, PEDR);
++ *s++=ctrl_inb(PCDR);
++ *s++=ctrl_inb(PFDR);
++ }
++
++ ctrl_outb(0xff, PDDR);
++ ctrl_outb(0xff, PEDR);
++
++ *s++=ctrl_inb(PGDR);
++ *s++=ctrl_inb(PHDR);
++
++ return 0;
++}
++
++static struct scan_keyboard hp680_kbd = {
++ .scan = hp680_japanese_scan_kbd,
++ .table = hp680_japanese_table,
++ .length = 18,
++};
++
++static int __init hp680_kbd_init_hw(void)
++{
++ printk(KERN_INFO "HP680 matrix scan keyboard registered\n");
++ return register_scan_keyboard(&hp680_kbd);
++}
++
++static void __exit hp680_kbd_exit_hw(void)
++{
++ unregister_scan_keyboard(&hp680_kbd);
++}
++
++module_init(hp680_kbd_init_hw);
++module_exit(hp680_kbd_exit_hw);
++MODULE_LICENSE("GPL");
+diff -ruN linux-2.6.17-vanilla/drivers/input/keyboard/scan_keyb.c linux-2.6.17/drivers/input/keyboard/scan_keyb.c
+--- linux-2.6.17-vanilla/drivers/input/keyboard/scan_keyb.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/input/keyboard/scan_keyb.c 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,148 @@
++/*
++ * Generic scan keyboard driver
++ *
++ * Copyright (C) 2000 YAEGASHI Takeshi
++ * Copyright (C) 2003 Andriy Skulysh
++ * Copyright (C) 2006 Paul Mundt
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ */
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/sched.h>
++#include <linux/init.h>
++#include <linux/slab.h>
++#include <linux/interrupt.h>
++#include <linux/kbd_kern.h>
++#include <linux/input.h>
++#include <linux/timer.h>
++#include "scan_keyb.h"
++
++#define SCANHZ (HZ/20)
++
++static int scan_jiffies;
++static struct scan_keyboard *keyboards;
++struct timer_list scan_timer;
++static char *hpkbd_name = "Hitachi scankeyboard";
++static char *hpkbd_phys = "input0";
++
++static void check_kbd(struct scan_keyboard *kbd,
++ unsigned char *new, unsigned char *old)
++{
++ const unsigned char *table = kbd->table;
++ int length = kbd->length;
++ int need_tasklet_schedule = 0;
++ unsigned int xor, bit;
++
++ while (length-- > 0) {
++ if ((xor = *new ^ *old) == 0)
++ table += 8;
++ else {
++ for (bit = 0x01; bit < 0x100; bit <<= 1) {
++ if (xor & bit) {
++ input_report_key(kbd->dev, *table,
++ !(*new & bit));
++ need_tasklet_schedule = 1;
++ }
++
++ table++;
++ }
++ }
++
++ new++;
++ old++;
++ }
++
++ if (need_tasklet_schedule) {
++ input_sync(kbd->dev);
++ tasklet_schedule(&keyboard_tasklet);
++ }
++}
++
++static void scan_kbd(unsigned long dummy)
++{
++ struct scan_keyboard *kbd;
++
++ scan_jiffies++;
++
++ for (kbd = keyboards; kbd != NULL; kbd = kbd->next) {
++ if (scan_jiffies & 1) {
++ if (!kbd->scan(kbd->s0))
++ check_kbd(kbd, kbd->s0, kbd->s1);
++ else
++ memcpy(kbd->s0, kbd->s1, kbd->length);
++ } else {
++ if (!kbd->scan(kbd->s1))
++ check_kbd(kbd, kbd->s1, kbd->s0);
++ else
++ memcpy(kbd->s1, kbd->s0, kbd->length);
++ }
++ }
++
++ mod_timer(&scan_timer, jiffies + SCANHZ);
++}
++
++int register_scan_keyboard(struct scan_keyboard *kbd)
++{
++ int i;
++
++ kbd->s0 = kmalloc(kbd->length, GFP_KERNEL);
++ if (kbd->s0 == NULL)
++ goto error;
++
++ kbd->s1 = kmalloc(kbd->length, GFP_KERNEL);
++ if (kbd->s1 == NULL)
++ goto error;
++
++ memset(kbd->s0, -1, kbd->length);
++ memset(kbd->s1, -1, kbd->length);
++
++ kbd->dev = input_allocate_device();
++ if (!kbd->dev)
++ goto error;
++
++ kbd->dev->name = hpkbd_name;
++ kbd->dev->phys = hpkbd_phys;
++ kbd->dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP);
++ init_input_dev(kbd->dev);
++ kbd->dev->keycode = (unsigned char *)kbd->table;
++ kbd->dev->keycodesize = sizeof(unsigned char);
++ kbd->dev->keycodemax = ARRAY_SIZE(kbd->table);
++
++ for (i = 0; i < 128; i++)
++ if (kbd->table[i])
++ set_bit(kbd->table[i], kbd->dev->keybit);
++
++ clear_bit(0, kbd->dev->keybit);
++ input_register_device(kbd->dev);
++
++ kbd->next = keyboards;
++ keyboards = kbd;
++
++ init_timer(&scan_timer);
++ scan_timer.expires = jiffies + SCANHZ;
++ scan_timer.data = 0;
++ scan_timer.function = scan_kbd;
++ add_timer(&scan_timer);
++
++ return 0;
++
++error:
++ kfree(kbd->s1);
++ kfree(kbd->s0);
++
++ return -ENOMEM;
++}
++EXPORT_SYMBOL_GPL(register_scan_keyboard);
++
++void unregister_scan_keyboard(struct scan_keyboard *kbd)
++{
++ del_timer_sync(&scan_timer);
++ keyboards = kbd->next;
++ input_unregister_device(kbd->dev);
++ input_free_device(kbd->dev);
++}
++EXPORT_SYMBOL_GPL(unregister_scan_keyboard);
+diff -ruN linux-2.6.17-vanilla/drivers/input/keyboard/scan_keyb.h linux-2.6.17/drivers/input/keyboard/scan_keyb.h
+--- linux-2.6.17-vanilla/drivers/input/keyboard/scan_keyb.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/input/keyboard/scan_keyb.h 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,16 @@
++#ifndef __DRIVER_CHAR_SCAN_KEYB_H
++#define __DRIVER_CHAR_SCAN_KEYB_H
++
++struct scan_keyboard {
++ struct scan_keyboard *next;
++ int (*scan)(unsigned char *buffer);
++ const unsigned char *table;
++ unsigned char *s0, *s1;
++ int length;
++ struct input_dev *dev;
++};
++
++int register_scan_keyboard(struct scan_keyboard *);
++void unregister_scan_keyboard(struct scan_keyboard *);
++
++#endif
+diff -ruN linux-2.6.17-vanilla/drivers/input/touchscreen/CVS/Entries linux-2.6.17/drivers/input/touchscreen/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/input/touchscreen/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/input/touchscreen/CVS/Entries 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,2 @@
++/hp680_ts_input.c/1.3/Sun Jan 29 22:13:39 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/drivers/input/touchscreen/CVS/Repository linux-2.6.17/drivers/input/touchscreen/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/input/touchscreen/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/input/touchscreen/CVS/Repository 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/input/touchscreen
+diff -ruN linux-2.6.17-vanilla/drivers/input/touchscreen/CVS/Root linux-2.6.17/drivers/input/touchscreen/CVS/Root
+--- linux-2.6.17-vanilla/drivers/input/touchscreen/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/input/touchscreen/CVS/Root 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/input/touchscreen/hp680_ts_input.c linux-2.6.17/drivers/input/touchscreen/hp680_ts_input.c
+--- linux-2.6.17-vanilla/drivers/input/touchscreen/hp680_ts_input.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/input/touchscreen/hp680_ts_input.c 2006-07-12 16:54:24.000000000 +0000
+@@ -15,7 +15,6 @@
+ #define HP680_TS_ABS_Y_MIN 80
+ #define HP680_TS_ABS_Y_MAX 910
+
+-#define SCPCR 0xa4000116
+ #define PHDR 0xa400012e
+ #define SCPDR 0xa4000136
+
+@@ -77,19 +76,6 @@
+
+ static int __init hp680_ts_init(void)
+ {
+- u8 scpdr;
+- u16 scpcr;
+-
+- scpdr = ctrl_inb(SCPDR);
+- scpdr |= SCPDR_TS_SCAN_X | SCPDR_TS_SCAN_Y;
+- scpdr &= ~SCPDR_TS_SCAN_ENABLE;
+- ctrl_outb(scpdr, SCPDR);
+-
+- scpcr = ctrl_inw(SCPCR);
+- scpcr &= ~SCPCR_TS_MASK;
+- scpcr |= SCPCR_TS_ENABLE;
+- ctrl_outw(scpcr, SCPCR);
+-
+ hp680_ts_dev = input_allocate_device();
+ if (!hp680_ts_dev)
+ return -ENOMEM;
+diff -ruN linux-2.6.17-vanilla/drivers/mtd/CVS/Entries linux-2.6.17/drivers/mtd/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/mtd/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/mtd/CVS/Entries 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,2 @@
++/mtdpart.c/1.11/Tue Jan 3 22:35:56 2006/-ko/
++D/maps////
+diff -ruN linux-2.6.17-vanilla/drivers/mtd/CVS/Repository linux-2.6.17/drivers/mtd/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/mtd/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/mtd/CVS/Repository 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/mtd
+diff -ruN linux-2.6.17-vanilla/drivers/mtd/CVS/Root linux-2.6.17/drivers/mtd/CVS/Root
+--- linux-2.6.17-vanilla/drivers/mtd/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/mtd/CVS/Root 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/mtd/maps/CVS/Entries linux-2.6.17/drivers/mtd/maps/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/mtd/maps/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/mtd/maps/CVS/Entries 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,5 @@
++/Kconfig/1.18/Mon Mar 27 21:06:14 2006/-ko/
++/Makefile/1.16/Mon Mar 27 21:06:14 2006/-ko/
++/microdev-flash.c/1.1/Thu Mar 17 11:42:48 2005/-ko/
++/rts7751r2d-flash.c/1.2/Thu Mar 17 11:42:48 2005/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/drivers/mtd/maps/CVS/Repository linux-2.6.17/drivers/mtd/maps/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/mtd/maps/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/mtd/maps/CVS/Repository 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/mtd/maps
+diff -ruN linux-2.6.17-vanilla/drivers/mtd/maps/CVS/Root linux-2.6.17/drivers/mtd/maps/CVS/Root
+--- linux-2.6.17-vanilla/drivers/mtd/maps/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/mtd/maps/CVS/Root 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/mtd/maps/Kconfig linux-2.6.17/drivers/mtd/maps/Kconfig
+--- linux-2.6.17-vanilla/drivers/mtd/maps/Kconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/mtd/maps/Kconfig 2006-07-12 16:54:24.000000000 +0000
+@@ -409,11 +409,37 @@
+
+ config MTD_SOLUTIONENGINE
+ tristate "CFI Flash device mapped on Hitachi SolutionEngine"
+- depends on SUPERH && MTD_CFI && MTD_REDBOOT_PARTS
++ depends on SUPERH && MTD_CFI
+ help
+ This enables access to the flash chips on the Hitachi SolutionEngine and
+ similar boards. Say 'Y' if you are building a kernel for such a board.
+
++config MTD_SUPERH_RESERVE
++ hex "Default reserved Flash size"
++ depends on MTD_SOLUTIONENGINE
++ default 300000
++ help
++ The reserved memory is used by kernel and ram disk themselves. It's
++ starting from 0.
++
++config MTD_MPC1211
++ tristate "CFI Flash device mapped on Interface MPC-1211"
++ depends on SUPERH && SH_MPC1211 && MTD_CFI
++ help
++ This enables access to the flash chips on the Interface MPC-1211(CTP/PCI/MPC-SH02).
++ Say 'Y' if you are building a kernel for such a board.
++
++config MTD_RTS7751R2D
++ tristate "CFI Flash device mapped on Renesas RTS7751R2D"
++ depends on SUPERH && SH_RTS7751R2D && MTD_CFI && MTD_PARTITIONS
++ help
++ This enables access to the flash chips on the Renesas Technology Sales RTS7751R2D.
++ Say 'Y' if you are building a kernel for such a board.
++
++config MTD_MICRODEV
++ tristate "CFI Flash device mapped on SuperH SH4-202 MicroDev"
++ depends on SUPERH && SH_SH4202_MICRODEV && MTD_CFI && MTD_PARTITIONS
++
+ config MTD_ARM_INTEGRATOR
+ tristate "CFI Flash device mapped on ARM Integrator/P720T"
+ depends on ARM && MTD_CFI
+diff -ruN linux-2.6.17-vanilla/drivers/mtd/maps/Makefile linux-2.6.17/drivers/mtd/maps/Makefile
+--- linux-2.6.17-vanilla/drivers/mtd/maps/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/mtd/maps/Makefile 2006-07-12 16:54:24.000000000 +0000
+@@ -62,6 +62,7 @@
+ obj-$(CONFIG_MTD_SBC8240) += sbc8240.o
+ obj-$(CONFIG_MTD_NOR_TOTO) += omap-toto-flash.o
+ obj-$(CONFIG_MTD_MPC1211) += mpc1211.o
++obj-$(CONFIG_MTD_RTS7751R2D) += rts7751r2d-flash.o
+ obj-$(CONFIG_MTD_IXP4XX) += ixp4xx.o
+ obj-$(CONFIG_MTD_IXP2000) += ixp2000.o
+ obj-$(CONFIG_MTD_WRSBC8260) += wr_sbc82xx_flash.o
+@@ -69,5 +70,6 @@
+ obj-$(CONFIG_MTD_SHARP_SL) += sharpsl-flash.o
+ obj-$(CONFIG_MTD_PLATRAM) += plat-ram.o
+ obj-$(CONFIG_MTD_OMAP_NOR) += omap_nor.o
++obj-$(CONFIG_MTD_MICRODEV) += microdev-flash.o
+ obj-$(CONFIG_MTD_MTX1) += mtx-1_flash.o
+ obj-$(CONFIG_MTD_TQM834x) += tqm834x.o
+diff -ruN linux-2.6.17-vanilla/drivers/mtd/maps/microdev-flash.c linux-2.6.17/drivers/mtd/maps/microdev-flash.c
+--- linux-2.6.17-vanilla/drivers/mtd/maps/microdev-flash.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/mtd/maps/microdev-flash.c 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,165 @@
++/*
++ * drivers/mtd/maps/microdev-flash.c
++ *
++ * Flash Mapping for the SuperH SH4-202 MicroDev.
++ *
++ * Copyright (C) 2004 SuperH, Inc.
++ * Copyright (C) 2004 Paul Mundt
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ */
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/mtd/mtd.h>
++#include <linux/mtd/map.h>
++#include <linux/mtd/partitions.h>
++#include <asm/io.h>
++
++/*
++ * The SH4-202 MicroDev has 32M of Intel StrataFlash mapped into the
++ * beginning of the FEMI address space (mapped to P0). MicroDev flash
++ * consists of 2x16M chips, mapped contiguously, and accessed with a
++ * 32-bit buswidth.
++ *
++ * Additionally, the MicroDev also supports booting from an EEPROM.
++ * In the event that the EEPROM is configured, it is mapped in the
++ * same address space window as the StrataFlash. As such, we can only
++ * use one at a time.
++ *
++ * Since the EEPROM is only accessible with an 8-bit buswidth, flash
++ * is preferrable as far as performance is concerned.
++ */
++struct map_info microdev_flash_map = {
++ .name = "MicroDev Flash",
++ .size = 0x02000000,
++ .bankwidth = 4,
++};
++
++struct map_info microdev_eeprom_map = {
++ .name = "MicroDev EEPROM",
++ .size = 0x00100000,
++ .bankwidth = 1,
++};
++
++static const char *probes[] = { "RedBoot", "cmdlinepart", NULL };
++static struct mtd_partition *parsed_parts;
++
++/*
++ * Default partition map.
++ */
++static struct mtd_partition microdev_partitions[] = {
++#ifdef CONFIG_MTD_PARTITIONS
++ {
++ .name = "bootloader",
++ .size = 0x00080000,
++ .mask_flags = MTD_WRITEABLE, /* force read-only */
++ }, {
++ .name = "User FS",
++ .offset = MTDPART_OFS_APPEND,
++ .size = MTDPART_SIZ_FULL,
++ },
++#endif
++};
++
++static struct mtd_info *microdev_flash;
++static struct mtd_info *microdev_eeprom;
++static struct mtd_info *microdev_mtd;
++
++static void show_map_info(struct map_info *info)
++{
++ unsigned long addr;
++
++ if (!info)
++ return;
++
++ addr = info->phys & 0x1fffffff;
++
++ printk(KERN_NOTICE "%s at 0x%08lx:0x%08lx, using a %d-bit bankwidth.\n",
++ info->name, addr, addr + info->size, info->bankwidth << 3);
++}
++
++static int __init microdev_map_init(void)
++{
++ struct mtd_partition *parts;
++ int nr_parts, parsed_nr_parts;
++
++ /* Flash mapped at FEMI area 0 */
++ microdev_flash_map.phys = 0;
++ microdev_flash_map.virt = (void __iomem *)P2SEGADDR(0);
++
++ /* EEPROM mapped in the same place */
++ microdev_eeprom_map.phys = 0;
++ microdev_eeprom_map.virt = (void __iomem *)P2SEGADDR(0);
++
++ simple_map_init(&microdev_flash_map);
++ simple_map_init(&microdev_eeprom_map);
++
++ /* Try the flash first */
++ printk(KERN_NOTICE "MicroDev flash: probing for flash chips at 0x00000000:\n");
++ microdev_flash = do_map_probe("cfi_probe", &microdev_flash_map);
++ if (!microdev_flash) {
++ printk(KERN_NOTICE "Flash chips not detected, probing for EEPROM\n");
++
++ /* No luck, try EEPROM */
++ microdev_eeprom = do_map_probe("map_rom", &microdev_eeprom_map);
++ if (!microdev_eeprom) {
++ /* Nope.. */
++ printk(KERN_ERR "nothing found\n");
++ return -ENXIO;
++ }
++ }
++
++ if (microdev_flash) {
++ microdev_mtd = microdev_flash;
++ show_map_info(&microdev_flash_map);
++ } else {
++ microdev_mtd = microdev_eeprom;
++ show_map_info(&microdev_eeprom_map);
++ }
++
++ microdev_mtd->owner = THIS_MODULE;
++
++ /* Start out with a static map.. */
++ parts = microdev_partitions;
++ nr_parts = ARRAY_SIZE(microdev_partitions);
++
++#ifdef CONFIG_MTD_PARTITIONS
++ /* Try to parse the partitions */
++ parsed_nr_parts = parse_mtd_partitions(microdev_mtd, probes, &parsed_parts, 0);
++ if (parsed_nr_parts > 0) {
++ parts = parsed_parts;
++ nr_parts = parsed_nr_parts;
++ }
++#endif
++
++ if (nr_parts > 0) {
++ add_mtd_partitions(microdev_mtd, parts, nr_parts);
++ } else {
++ add_mtd_device(microdev_mtd);
++ }
++
++ return 0;
++}
++
++static void __exit microdev_map_exit(void)
++{
++ if (parsed_parts) {
++ del_mtd_partitions(microdev_mtd);
++ } else {
++ del_mtd_device(microdev_mtd);
++ }
++
++ map_destroy(microdev_mtd);
++}
++
++module_init(microdev_map_init);
++module_exit(microdev_map_exit);
++
++MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>");
++MODULE_DESCRIPTION("MTD map driver for SuperH SH4-202 MicroDev");
++MODULE_LICENSE("GPL");
++
+diff -ruN linux-2.6.17-vanilla/drivers/mtd/maps/rts7751r2d-flash.c linux-2.6.17/drivers/mtd/maps/rts7751r2d-flash.c
+--- linux-2.6.17-vanilla/drivers/mtd/maps/rts7751r2d-flash.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/mtd/maps/rts7751r2d-flash.c 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,167 @@
++/* -------------------------------------------------------------------- */
++/* rts7751r2d-flash.c: */
++/* -------------------------------------------------------------------- */
++/* This program is free software; you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation; either version 2 of the License, or
++ (at your option) any later version.
++
++ This program is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with this program; if not, write to the Free Software
++ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
++ Copyright 2003 (c) Lineo uSolutions,Inc.
++*/
++/* -------------------------------------------------------------------- */
++
++#include <linux/config.h>
++#include <linux/module.h>
++#include <linux/types.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++
++#include <linux/mtd/mtd.h>
++#include <linux/mtd/map.h>
++#include <linux/mtd/partitions.h>
++
++#include <asm/io.h>
++
++#undef FLASH4M_16BIT
++#define FLASH16M_16BIT
++
++#if defined(FLASH4M_16BIT)
++#define RTS7751R2D_FLASH_SIZE 0x00100000
++#else
++#define RTS7751R2D_FLASH_SIZE 0x01000000
++#endif
++
++static struct map_info rts7751r2d_map = {
++ .name = "SH-Graphic flash",
++ .bankwidth = 2,
++ .size = RTS7751R2D_FLASH_SIZE,
++};
++
++/*
++ * Here are partition information for all known SH-Graphic based devices.
++ * See include/linux/mtd/partitions.h for definition of the mtd_partition
++ * structure.
++ *
++ * The *_max_flash_size is the maximum possible mapped flash size which
++ * is not necessarily the actual flash size. It must correspond to the
++ * value specified in the mapping definition defined by the
++ * "struct map_desc *_io_desc" for the corresponding machine.
++ */
++
++#if defined(FLASH4M_16BIT)
++static struct mtd_partition rts7751r2d_partitions[] = {
++ {
++ .name = "bootloader",
++ .size = 0x00080000,
++ .offset = 0xa0000000,
++ .mask_flags = MTD_WRITEABLE, /* force read-only */
++ },{
++ .name = "SH-Graphic jffs",
++ .size = 0x00080000,
++ .offset = 0xa0080000,
++ }
++};
++#else
++static struct mtd_partition rts7751r2d_partitions[] = {
++ {
++ .name = "bootloader",
++ .size = 0x00020000,
++ .offset = 0x00000000,
++ .mask_flags = MTD_WRITEABLE, /* force read-only */
++ },{
++ .name = "mtdblock1",
++ .size = 0x00300000,
++ .offset = 0x00020000,
++ },{
++ .name = "mtdblock2",
++ .size = 0x004e0000,
++ .offset = 0x00320000,
++ },{
++ .name = "mtdblock3",
++ .size = 0x00800000,
++ .offset = 0x00800000,
++ }
++};
++#endif
++
++static struct mtd_partition *parsed_parts;
++static struct mtd_info *mymtd;
++
++int __init rts7751r2d_mtd_init(void)
++{
++ struct mtd_partition *parts;
++ int nb_parts = 0;
++ int parsed_nr_parts = 0;
++ char *part_type;
++
++ /* Default flash buswidth */
++
++ /*
++ * Static partition definition selection
++ */
++ part_type = "static";
++ parts = rts7751r2d_partitions;
++
++ nb_parts = ARRAY_SIZE(rts7751r2d_partitions);
++ rts7751r2d_map.phys = 0;
++ rts7751r2d_map.virt = P2SEGADDR(0);
++
++ /*
++ * Now let's probe for the actual flash. Do it here since
++ * specific machine settings might have been set above.
++ */
++ printk(KERN_NOTICE "RTS7751R2D flash: probing %d-bit flash bus\n",
++ rts7751r2d_map.bankwidth*8);
++ simple_map_init(&rts7751r2d_map);
++
++ mymtd = do_map_probe("cfi_probe", &rts7751r2d_map);
++ if (!mymtd)
++ return -ENXIO;
++
++ mymtd->owner = THIS_MODULE;
++ mymtd->erasesize = 0x10000;
++
++ /*
++ * Dynamic partition selection stuff (might override the static ones)
++ */
++
++ if (parsed_nr_parts > 0) {
++ parts = parsed_parts;
++ nb_parts = parsed_nr_parts;
++ }
++
++ if (nb_parts == 0) {
++ printk(KERN_NOTICE "RTS7751R2D partition info available, registering whole flash at once\n");
++ add_mtd_device(mymtd);
++ } else {
++ printk(KERN_NOTICE "Using %s partition definition\n", part_type);
++ add_mtd_partitions(mymtd, parts, nb_parts);
++ }
++ return 0;
++}
++
++static void __exit rts7751r2d_mtd_cleanup(void)
++{
++ if (mymtd) {
++ del_mtd_partitions(mymtd);
++ map_destroy(mymtd);
++ if (parsed_parts)
++ kfree(parsed_parts);
++ }
++}
++
++module_init(rts7751r2d_mtd_init);
++module_exit(rts7751r2d_mtd_cleanup);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Lineo uSolutions,Inc.");
++MODULE_DESCRIPTION("MTD map driver for RTS7751R2D base board");
+diff -ruN linux-2.6.17-vanilla/drivers/mtd/mtdpart.c linux-2.6.17/drivers/mtd/mtdpart.c
+--- linux-2.6.17-vanilla/drivers/mtd/mtdpart.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/mtd/mtdpart.c 2006-07-12 16:54:24.000000000 +0000
+@@ -481,6 +481,14 @@
+ printk (KERN_NOTICE "0x%08x-0x%08x : \"%s\"\n", slave->offset,
+ slave->offset + slave->mtd.size, slave->mtd.name);
+
++#ifdef CONFIG_SUPERH
++ /*
++ * slave->offset contains a P2 address, this confuses the rest
++ * of the sanity checks, so kick it back down to P0.
++ */
++ slave->offset &= 0x1fffffff;
++#endif
++
+ /* let's do some sanity checks */
+ if (slave->offset >= master->size) {
+ /* let's register it anyway to preserve ordering */
+diff -ruN linux-2.6.17-vanilla/drivers/net/8139too.c linux-2.6.17/drivers/net/8139too.c
+--- linux-2.6.17-vanilla/drivers/net/8139too.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/net/8139too.c 2006-07-12 16:54:24.000000000 +0000
+@@ -257,7 +257,7 @@
+ {0x018a, 0x0106, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
+ {0x126c, 0x1211, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
+ {0x1743, 0x8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
+- {0x021b, 0x8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
++ {0x021b, 0x8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
+
+ #ifdef CONFIG_SH_SECUREEDGE5410
+ /* Bogus 8139 silicon reports 8129 without external PROM :-( */
+@@ -970,11 +970,17 @@
+ ioaddr = tp->mmio_addr;
+ assert (ioaddr != NULL);
+
++#ifdef CONFIG_SH_SECUREEDGE5410
++ /* Don't rely on the eeprom, get MAC from chip. */
++ for (i = 0; i < 6; i++)
++ dev->dev_addr[i] = readb(ioaddr + MAC0 + i);
++#else
+ addr_len = read_eeprom (ioaddr, 0, 8) == 0x8129 ? 8 : 6;
+ for (i = 0; i < 3; i++)
+ ((u16 *) (dev->dev_addr))[i] =
+ le16_to_cpu (read_eeprom (ioaddr, i + 7, addr_len));
+ memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
++#endif
+
+ /* The Rtl8139-specific entries in the device structure. */
+ dev->open = rtl8139_open;
+diff -ruN linux-2.6.17-vanilla/drivers/net/8390.c linux-2.6.17/drivers/net/8390.c
+--- linux-2.6.17-vanilla/drivers/net/8390.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/net/8390.c 2006-07-12 16:54:24.000000000 +0000
+@@ -108,6 +108,13 @@
+ int ei_debug = 1;
+ #endif
+
++#if defined(CONFIG_SH_RTS7751R2D) || defined(CONFIG_SH_R77703DRP) || defined(CONFIG_SH_R7780RP)
++#ifdef ETH_ZLEN
++#undef ETH_ZLEN
++#define ETH_ZLEN 64
++#endif
++#endif
++
+ /* Index to functions. */
+ static void ei_tx_intr(struct net_device *dev);
+ static void ei_tx_err(struct net_device *dev);
+@@ -938,7 +945,11 @@
+ */
+
+ if (netif_running(dev))
++#if defined(CONFIG_SH_RTS7751R2D) || defined(CONFIG_SH_R77703DRP) || defined(CONFIG_SH_R7780RP)
++ outb_p(E8390_RXCONFIG | 0x40, e8390_base + EN0_RXCR);
++#else
+ outb_p(E8390_RXCONFIG, e8390_base + EN0_RXCR);
++#endif
+ outb_p(E8390_NODMA + E8390_PAGE1, e8390_base + E8390_CMD);
+ for(i = 0; i < 8; i++)
+ {
+@@ -951,11 +962,23 @@
+ outb_p(E8390_NODMA + E8390_PAGE0, e8390_base + E8390_CMD);
+
+ if(dev->flags&IFF_PROMISC)
++#if defined(CONFIG_SH_RTS7751R2D) || defined(CONFIG_SH_R77703DRP) || defined(CONFIG_SH_R7780RP)
++ outb_p(E8390_RXCONFIG | 0x40 | 0x18, e8390_base + EN0_RXCR);
++#else
+ outb_p(E8390_RXCONFIG | 0x18, e8390_base + EN0_RXCR);
++#endif
+ else if(dev->flags&IFF_ALLMULTI || dev->mc_list)
++#if defined(CONFIG_SH_RTS7751R2D) || defined(CONFIG_SH_R77703DRP) || defined(CONFIG_SH_R7780RP)
++ outb_p(E8390_RXCONFIG | 0x40 | 0x08, e8390_base + EN0_RXCR);
++#else
+ outb_p(E8390_RXCONFIG | 0x08, e8390_base + EN0_RXCR);
++#endif
+ else
++#if defined(CONFIG_SH_RTS7751R2D) || defined(CONFIG_SH_R77703DRP) || defined(CONFIG_SH_R7780RP)
++ outb_p(E8390_RXCONFIG | 0x40, e8390_base + EN0_RXCR);
++#else
+ outb_p(E8390_RXCONFIG, e8390_base + EN0_RXCR);
++#endif
+ }
+
+ /*
+@@ -1029,8 +1052,13 @@
+ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev);
+ int i;
+ int endcfg = ei_local->word16
++#if defined(CONFIG_SH_RTS7751R2D) || defined(CONFIG_SH_R77703DRP) || defined(CONFIG_SH_R7780RP)
++ ? (0x00 | ENDCFG_WTS | (ei_local->bigendian ? ENDCFG_BOS : 0))
++ : 0x00;
++#else
+ ? (0x48 | ENDCFG_WTS | (ei_local->bigendian ? ENDCFG_BOS : 0))
+ : 0x48;
++#endif
+
+ if(sizeof(struct e8390_pkt_hdr)!=4)
+ panic("8390.c: header struct mispacked\n");
+@@ -1041,7 +1069,11 @@
+ outb_p(0x00, e8390_base + EN0_RCNTLO);
+ outb_p(0x00, e8390_base + EN0_RCNTHI);
+ /* Set to monitor and loopback mode -- this is vital!. */
++#if defined(CONFIG_SH_RTS7751R2D) || defined(CONFIG_SH_R77703DRP) || defined(CONFIG_SH_R7780RP)
++ outb_p(E8390_RXOFF | 0x40, e8390_base + EN0_RXCR); /* 0x20 */
++#else
+ outb_p(E8390_RXOFF, e8390_base + EN0_RXCR); /* 0x20 */
++#endif
+ outb_p(E8390_TXOFF, e8390_base + EN0_TXCR); /* 0x02 */
+ /* Set the transmit page and receive ring. */
+ outb_p(ei_local->tx_start_page, e8390_base + EN0_TPSR);
+@@ -1078,7 +1110,11 @@
+ outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base+E8390_CMD);
+ outb_p(E8390_TXCONFIG, e8390_base + EN0_TXCR); /* xmit on. */
+ /* 3c503 TechMan says rxconfig only after the NIC is started. */
++#if defined(CONFIG_SH_RTS7751R2D) || defined(CONFIG_SH_R77703DRP) || defined(CONFIG_SH_R7780RP)
++ outb_p(E8390_RXCONFIG | 0x40, e8390_base + EN0_RXCR); /* rx on, */
++#else
+ outb_p(E8390_RXCONFIG, e8390_base + EN0_RXCR); /* rx on, */
++#endif
+ do_set_multicast_list(dev); /* (re)load the mcast table */
+ }
+ }
+diff -ruN linux-2.6.17-vanilla/drivers/net/88796l.c linux-2.6.17/drivers/net/88796l.c
+--- linux-2.6.17-vanilla/drivers/net/88796l.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/net/88796l.c 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,95 @@
++#define NE_EEPROM 0x14
++
++static inline void delay(void);
++static unsigned char asix88796_eeprom_getbit(int ioaddr);
++static void asix88796_eeprom_send(int ioaddr, int value);
++static unsigned short asix88796_eeprom_get(int ioaddr);
++static void asix88796_eeprom_setaddr(int ioaddr, int addr);
++static void asix88796_eeprom_command(int ioaddr);
++static void asix88796_eeprom_read(int ioaddr, unsigned char *buff);
++
++static inline void delay(void)
++{
++ ctrl_inw(0xa0000000);
++}
++
++static unsigned char asix88796_eeprom_getbit(int ioaddr)
++{
++ unsigned char value;
++
++ outb(inb(ioaddr + NE_EEPROM) & 0x7f, ioaddr + NE_EEPROM);
++ delay();
++ value = (inb(ioaddr + NE_EEPROM) & 0x40) >> 6;
++ outb(inb(ioaddr + NE_EEPROM) | 0x80, ioaddr + NE_EEPROM);
++ delay();
++
++ return value;
++}
++
++static void asix88796_eeprom_send(int ioaddr, int value)
++{
++ if (value)
++ outb(inb(ioaddr + NE_EEPROM) | 0x20, ioaddr + NE_EEPROM);
++ else
++ outb(inb(ioaddr + NE_EEPROM) & 0xdf, ioaddr + NE_EEPROM);
++ outb(inb(ioaddr + NE_EEPROM) & 0x7f, ioaddr + NE_EEPROM);
++ delay();
++ outb(inb(ioaddr + NE_EEPROM) | 0x80, ioaddr + NE_EEPROM);
++ delay();
++ outb(inb(ioaddr + NE_EEPROM) & 0xdf, ioaddr + NE_EEPROM);
++}
++
++static unsigned short asix88796_eeprom_get(int ioaddr)
++{
++ unsigned short value = 0;
++ int i;
++
++ asix88796_eeprom_getbit(ioaddr);
++ for (i=0; i<16; i++) {
++ value <<= 1;
++ value |= asix88796_eeprom_getbit(ioaddr);
++ }
++
++ return value;
++}
++
++static void asix88796_eeprom_setaddr(int ioaddr, int addr)
++{
++ asix88796_eeprom_send(ioaddr, addr & 0x0080);
++ asix88796_eeprom_send(ioaddr, addr & 0x0040);
++ asix88796_eeprom_send(ioaddr, addr & 0x0020);
++ asix88796_eeprom_send(ioaddr, addr & 0x0010);
++ asix88796_eeprom_send(ioaddr, addr & 0x0008);
++ asix88796_eeprom_send(ioaddr, addr & 0x0004);
++ asix88796_eeprom_send(ioaddr, addr & 0x0002);
++ asix88796_eeprom_send(ioaddr, addr & 0x0001);
++}
++
++static void asix88796_eeprom_command(int ioaddr)
++{
++ asix88796_eeprom_send(ioaddr, 0);
++ asix88796_eeprom_send(ioaddr, 1);
++ asix88796_eeprom_send(ioaddr, 1);
++ asix88796_eeprom_send(ioaddr, 0);
++}
++
++static void asix88796_eeprom_read(int ioaddr, unsigned char *buff)
++{
++ int i;
++ int addr = 0;
++ unsigned short value;
++
++ for (i=0; i<3; i++) {
++ outb(inb(ioaddr + NE_EEPROM) | 0x10, ioaddr + NE_EEPROM);
++ outb(inb(ioaddr + NE_EEPROM) & 0xdf, ioaddr + NE_EEPROM);
++ delay();
++ asix88796_eeprom_command(ioaddr);
++ asix88796_eeprom_setaddr(ioaddr, addr++);
++ value = asix88796_eeprom_get(ioaddr);
++ *buff++ = (unsigned char)(value & 0xff);
++ *buff++ = (unsigned char)((value >> 8) & 0xff);
++ outb(inb(ioaddr + NE_EEPROM) & 0x7f, ioaddr + NE_EEPROM);
++ outb(inb(ioaddr + NE_EEPROM) & 0xdf, ioaddr + NE_EEPROM);
++ outb(inb(ioaddr + NE_EEPROM) & 0xef, ioaddr + NE_EEPROM);
++ }
++}
+diff -ruN linux-2.6.17-vanilla/drivers/net/CVS/Entries linux-2.6.17/drivers/net/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/net/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/net/CVS/Entries 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,7 @@
++/8390.c/1.9/Sat Jan 7 20:02:47 2006/-ko/
++/88796l.c/1.1/Sat Jan 7 20:02:47 2006/-ko/
++/stnic.c/1.7/Wed Jan 4 17:53:54 2006/-ko/
++/8139too.c/1.51/Wed Jul 5 14:51:19 2006/-ko/
++/Kconfig/1.27/Wed Jul 5 14:51:19 2006/-ko/
++/ne.c/1.10/Wed Jul 5 14:51:19 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/drivers/net/CVS/Repository linux-2.6.17/drivers/net/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/net/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/net/CVS/Repository 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/net
+diff -ruN linux-2.6.17-vanilla/drivers/net/CVS/Root linux-2.6.17/drivers/net/CVS/Root
+--- linux-2.6.17-vanilla/drivers/net/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/net/CVS/Root 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/net/Kconfig linux-2.6.17/drivers/net/Kconfig
+--- linux-2.6.17-vanilla/drivers/net/Kconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/net/Kconfig 2006-07-12 16:54:24.000000000 +0000
+@@ -1078,7 +1078,7 @@
+
+ config NE2000
+ tristate "NE2000/NE1000 support"
+- depends on NET_ISA || (Q40 && m) || M32R
++ depends on NET_ISA || (Q40 && m) || M32R || SUPERH
+ select CRC32
+ ---help---
+ If you have a network (Ethernet) card of this type, say Y and read
+diff -ruN linux-2.6.17-vanilla/drivers/net/ne.c linux-2.6.17/drivers/net/ne.c
+--- linux-2.6.17-vanilla/drivers/net/ne.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/net/ne.c 2006-07-12 16:54:24.000000000 +0000
+@@ -142,6 +142,10 @@
+ #elif defined(CONFIG_PLAT_OAKS32R) || \
+ defined(CONFIG_TOSHIBA_RBTX4927) || defined(CONFIG_TOSHIBA_RBTX4938)
+ # define DCR_VAL 0x48 /* 8-bit mode */
++#elif defined(CONFIG_SH_RTS7751R2D) || defined(CONFIG_SH_R77703DRP) || \
++ defined(CONFIG_SH_R7780RP)
++# include "88796l.c"
++# define DCR_VAL 0x01
+ #else
+ # define DCR_VAL 0x49
+ #endif
+@@ -191,6 +195,11 @@
+
+ SET_MODULE_OWNER(dev);
+
++#if defined(CONFIG_SH_RTS7751R2D) || defined(CONFIG_SH_R77703DRP) || defined(CONFIG_SH_R7780RP)
++ base_addr = AX88796L_IO_BASE;
++ dev->irq = IRQ_ONETH;
++#endif
++
+ /* First check any supplied i/o locations. User knows best. <cough> */
+ if (base_addr > 0x1ff) /* Check a single specified location. */
+ return ne_probe1(dev, base_addr);
+@@ -324,7 +333,11 @@
+ if (ei_debug && version_printed++ == 0)
+ printk(KERN_INFO "%s" KERN_INFO "%s", version1, version2);
+
++#if defined(CONFIG_SH_RTS7751R2D) || defined(CONFIG_SH_R77703DRP) || defined(CONFIG_SH_R7780RP)
++ printk(KERN_INFO "ASIX AX88796L ethercard probe at %#3x:", ioaddr);
++#else
+ printk(KERN_INFO "NE*000 ethercard probe at %#3x:", ioaddr);
++#endif
+
+ /* A user with a poor card that fails to ack the reset, or that
+ does not have a valid 0x57,0x57 signature can still use this
+@@ -365,12 +378,20 @@
+ struct {unsigned char value, offset; } program_seq[] =
+ {
+ {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/
++#if defined(CONFIG_SH_RTS7751R2D) || defined(CONFIG_SH_R77703DRP) || defined(CONFIG_SH_R7780RP)
++ {0x00, EN0_DCFG}, /* Set byte-wide (0x00) access. */
++#else
+ {0x48, EN0_DCFG}, /* Set byte-wide (0x48) access. */
++#endif
+ {0x00, EN0_RCNTLO}, /* Clear the count regs. */
+ {0x00, EN0_RCNTHI},
+ {0x00, EN0_IMR}, /* Mask completion irq. */
+ {0xFF, EN0_ISR},
++#if defined(CONFIG_SH_RTS7751R2D) || defined(CONFIG_SH_R77703DRP) || defined(CONFIG_SH_R7780RP)
++ {E8390_RXOFF|0x40, EN0_RXCR}, /* 0x60 Set to monitor */
++#else
+ {E8390_RXOFF, EN0_RXCR}, /* 0x20 Set to monitor */
++#endif
+ {E8390_TXOFF, EN0_TXCR}, /* 0x02 and loopback mode. */
+ {32, EN0_RCNTLO},
+ {0x00, EN0_RCNTHI},
+@@ -395,6 +416,9 @@
+ for (i = 0; i < 16; i++)
+ SA_prom[i] = SA_prom[i+i];
+ /* We must set the 8390 for word mode. */
++#if defined(CONFIG_SH_RTS7751R2D) || defined(CONFIG_SH_R77703DRP) || defined(CONFIG_SH_R7780RP)
++ asix88796_eeprom_read(ioaddr, SA_prom);
++#endif
+ outb_p(DCR_VAL, ioaddr + EN0_DCFG);
+ start_page = NESM_START_PG;
+
+@@ -426,7 +450,11 @@
+
+ /* Set up the rest of the parameters. */
+ if (neX000 || bad_card || copam) {
++#if defined(CONFIG_SH_RTS7751R2D) || defined(CONFIG_SH_R77703DRP) || defined(CONFIG_SH_R7780RP)
++ name = (wordlength == 2) ? "AX88796L" : "NE1000";
++#else
+ name = (wordlength == 2) ? "NE2000" : "NE1000";
++#endif
+ }
+ else if (ctron)
+ {
+diff -ruN linux-2.6.17-vanilla/drivers/net/stnic.c linux-2.6.17/drivers/net/stnic.c
+--- linux-2.6.17-vanilla/drivers/net/stnic.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/net/stnic.c 2006-07-12 16:54:24.000000000 +0000
+@@ -20,7 +20,7 @@
+
+ #include <asm/system.h>
+ #include <asm/io.h>
+-#include <asm/se/se.h>
++#include <asm/se.h>
+ #include <asm/machvec.h>
+ #ifdef CONFIG_SH_STANDARD_BIOS
+ #include <asm/sh_bios.h>
+diff -ruN linux-2.6.17-vanilla/drivers/pcmcia/CVS/Entries linux-2.6.17/drivers/pcmcia/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/pcmcia/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/pcmcia/CVS/Entries 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,5 @@
++/hd64461_ss.c/1.16/Mon Mar 27 23:59:10 2006/-ko/
++/yenta_socket.c/1.13/Mon Mar 27 21:06:14 2006/-ko/
++/Kconfig/1.12/Wed Jul 5 14:51:21 2006/-ko/
++/Makefile/1.11/Wed Jul 5 14:51:21 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/drivers/pcmcia/CVS/Repository linux-2.6.17/drivers/pcmcia/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/pcmcia/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/pcmcia/CVS/Repository 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/pcmcia
+diff -ruN linux-2.6.17-vanilla/drivers/pcmcia/CVS/Root linux-2.6.17/drivers/pcmcia/CVS/Root
+--- linux-2.6.17-vanilla/drivers/pcmcia/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/pcmcia/CVS/Root 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/pcmcia/Kconfig linux-2.6.17/drivers/pcmcia/Kconfig
+--- linux-2.6.17-vanilla/drivers/pcmcia/Kconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/pcmcia/Kconfig 2006-07-12 16:54:24.000000000 +0000
+@@ -179,6 +179,19 @@
+ "Bridge" is the name used for the hardware inside your computer that
+ PCMCIA cards are plugged into. If unsure, say N.
+
++config HD64461_PCMCIA
++ tristate "HD64461 host bridge support"
++ depends on HD64461 && PCMCIA
++
++config HD64461_PCMCIA_SOCKETS
++ int ' HD64461 PCMCIA sockets'
++ default 1
++ depends on HD64461_PCMCIA
++
++config HD64465_PCMCIA
++ tristate "HD64465 host bridge support"
++ depends on HD64465 && PCMCIA
++
+ config PCMCIA_M8XX
+ tristate "MPC8xx PCMCIA support"
+ depends on PCMCIA && PPC && 8xx
+@@ -189,10 +202,6 @@
+
+ This driver is also available as a module called m8xx_pcmcia.
+
+-config HD64465_PCMCIA
+- tristate "HD64465 host bridge support"
+- depends on HD64465 && PCMCIA
+-
+ config PCMCIA_AU1X00
+ tristate "Au1x00 pcmcia support"
+ depends on SOC_AU1X00 && PCMCIA
+diff -ruN linux-2.6.17-vanilla/drivers/pcmcia/Makefile linux-2.6.17/drivers/pcmcia/Makefile
+--- linux-2.6.17-vanilla/drivers/pcmcia/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/pcmcia/Makefile 2006-07-12 16:54:24.000000000 +0000
+@@ -25,8 +25,9 @@
+ obj-$(CONFIG_I82365) += i82365.o
+ obj-$(CONFIG_I82092) += i82092.o
+ obj-$(CONFIG_TCIC) += tcic.o
+-obj-$(CONFIG_PCMCIA_M8XX) += m8xx_pcmcia.o
++obj-$(CONFIG_HD64461_PCMCIA) += hd64461_ss.o
+ obj-$(CONFIG_HD64465_PCMCIA) += hd64465_ss.o
++obj-$(CONFIG_PCMCIA_M8XX) += m8xx_pcmcia.o
+ obj-$(CONFIG_PCMCIA_SA1100) += sa11xx_core.o sa1100_cs.o
+ obj-$(CONFIG_PCMCIA_SA1111) += sa11xx_core.o sa1111_cs.o
+ obj-$(CONFIG_PCMCIA_PXA2XX) += pxa2xx_core.o pxa2xx_cs.o
+diff -ruN linux-2.6.17-vanilla/drivers/pcmcia/hd64461_ss.c linux-2.6.17/drivers/pcmcia/hd64461_ss.c
+--- linux-2.6.17-vanilla/drivers/pcmcia/hd64461_ss.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/pcmcia/hd64461_ss.c 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,679 @@
++/*
++ * drivers/pcmcia/hd64461_ss.c
++ *
++ * PCMCIA support for Hitachi HD64461 companion chip
++ * by Andriy Skulysh <askulysh@image.kiev.ua> 2002, 2003, 2004
++ *
++ * based on hd64461_ss.c by Greg Banks <gbanks@pocketpenguins.com>
++ *
++ */
++#include <linux/config.h>
++#include <linux/types.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/string.h>
++#include <linux/kernel.h>
++#include <linux/ioport.h>
++#include <linux/mm.h>
++#include <linux/vmalloc.h>
++#include <linux/irq.h>
++#include <linux/interrupt.h>
++#include <linux/platform_device.h>
++#include <pcmcia/cs_types.h>
++#include <pcmcia/cs.h>
++#include <pcmcia/ss.h>
++#include <pcmcia/bulkmem.h>
++#include <pcmcia/cistpl.h>
++#include "cs_internal.h"
++#include <asm/io.h>
++#include <asm/hd64461.h>
++#include <asm/hp6xx/hp6xx.h>
++
++#define MODNAME "HD64461_ss"
++
++#ifdef DEBUG
++static int hd64461_pc_debug = 2;
++
++module_param_named(pc_debug, hd64461_pc_debug, int, 0644);
++
++#define DPRINTK(n, args...) \
++do { \
++ if (hd64461_pc_debug >= (n)) \
++ printk(args); \
++} while (0)
++#else
++#define DPRINTK(n, args...) do { } while (0)
++#endif
++
++#define HD64461_PCC(s,reg) \
++ ( CONFIG_HD64461_IOBASE-HD64461_STBCR+ ( (s) ? HD64461_PCC1##reg : \
++ HD64461_PCC0##reg ) )
++
++typedef struct hd64461_socket_t {
++ unsigned int irq;
++ unsigned long mem_base;
++ socket_state_t state;
++ pccard_mem_map mem_maps[MAX_WIN];
++ unsigned char IC_memory;
++ struct pcmcia_socket socket;
++ u8 cscier;
++} hd64461_socket_t;
++
++static hd64461_socket_t hd64461_sockets[CONFIG_HD64461_PCMCIA_SOCKETS];
++
++#define hd64461_sockno(sp) (sp - hd64461_sockets)
++
++static void hd64461_enable_int(unsigned int irq)
++{
++ u8 cscier;
++ u32 cscier_reg = HD64461_PCC(0, CSCIER);
++
++ cscier = ctrl_inb(cscier_reg);
++ cscier &= ~HD64461_PCCCSCIER_IREQE_MASK;
++ cscier |= HD64461_PCCCSCIER_IREQE_LEVEL;
++ ctrl_outb(cscier, cscier_reg);
++}
++
++static void hd64461_disable_int(unsigned int irq)
++{
++ u8 cscier;
++ u32 cscier_reg = HD64461_PCC(0, CSCIER);
++
++ cscier = ctrl_inb(cscier_reg);
++ cscier &= ~HD64461_PCCCSCIER_IREQE_MASK;
++ ctrl_outb(cscier, cscier_reg);
++}
++
++static void hd64461_enable_irq(unsigned int irq)
++{
++ DPRINTK(3, "hd64461_enable_irq(irq=%d)\n", irq);
++ hd64461_enable_int(irq);
++}
++
++static void hd64461_disable_irq(unsigned int irq)
++{
++ DPRINTK(3, "hd64461_disable_irq(irq=%d)\n", irq);
++ hd64461_disable_int(irq);
++}
++
++static unsigned int hd64461_startup_irq(unsigned int irq)
++{
++ DPRINTK(3, "hd64461_startup_irq(irq=%d)\n", irq);
++ hd64461_enable_irq(irq);
++ return 0;
++}
++
++static void hd64461_shutdown_irq(unsigned int irq)
++{
++ DPRINTK(3, "hd64461_shutdown_irq(irq=%d)\n", irq);
++ hd64461_disable_irq(irq);
++}
++
++static void hd64461_mask_and_ack_irq(unsigned int irq)
++{
++ DPRINTK(3, "hd64461_mask_and_ack_irq(irq=%d)\n", irq);
++ hd64461_disable_irq(irq);
++}
++
++static void hd64461_end_irq(unsigned int irq)
++{
++ DPRINTK(3, "hd64461_end_irq(irq=%d)\n", irq);
++ hd64461_enable_irq(irq);
++}
++
++static struct hw_interrupt_type hd64461_ss_irq_type = {
++ .typename = "HD64461_SS-IRQ",
++ .startup = hd64461_startup_irq,
++ .shutdown = hd64461_shutdown_irq,
++ .enable = hd64461_enable_irq,
++ .disable = hd64461_disable_irq,
++ .ack = hd64461_mask_and_ack_irq,
++ .end = hd64461_end_irq
++};
++
++static int hd64461_set_voltage(int sock, int Vcc, int Vpp)
++{
++ u8 gcr, scr;
++ u16 stbcr;
++ u32 gcr_reg = HD64461_PCC(sock, GCR);
++ u32 scr_reg = HD64461_PCC(sock, SCR);
++ DPRINTK(2, "hd64461_set_voltage(%d, %d, %d)\n", sock, Vcc, Vpp);
++
++ gcr = ctrl_inb(gcr_reg);
++ scr = ctrl_inb(scr_reg);
++
++ switch (Vcc) {
++ case 0:
++ gcr |= HD64461_PCCGCR_VCC0;
++ scr |= HD64461_PCCSCR_VCC1;
++ break;
++ case 33:
++ if (sock == 1) {
++ gcr &= ~HD64461_PCCGCR_VCC0;
++ scr &= ~HD64461_PCCSCR_VCC1;
++ } else {
++ gcr |= HD64461_PCCGCR_VCC0;
++ scr &= ~HD64461_PCCSCR_VCC1;
++ }
++ break;
++ case 50:
++ gcr &= ~HD64461_PCCGCR_VCC0;
++ scr &= ~HD64461_PCCSCR_VCC1;
++ break;
++ }
++
++ ctrl_outb(gcr, gcr_reg);
++ ctrl_outb(scr, scr_reg);
++
++ stbcr = inw(HD64461_STBCR);
++
++ if (Vcc > 0) {
++ stbcr &= ~(sock == 0 ? HD64461_STBCR_SPC0ST :
++ HD64461_STBCR_SPC1ST);
++ } else {
++ stbcr |= (sock == 0 ? HD64461_STBCR_SPC0ST :
++ HD64461_STBCR_SPC1ST);
++ }
++
++ outw(stbcr, HD64461_STBCR);
++
++ return 1;
++}
++
++static int hd64461_init(struct pcmcia_socket *s)
++{
++ u16 gpadr;
++ hd64461_socket_t *sp = container_of(s, struct hd64461_socket_t, socket);
++
++ DPRINTK(0, "hd64461_init(%d)\n", s->sock);
++
++ sp->state.Vcc = 0;
++ sp->state.Vpp = 0;
++ hd64461_set_voltage(s->sock, 0, 0);
++
++ if (mach_is_hp6xx() && s->sock == 0) {
++ gpadr = inw(HD64461_GPADR);
++ gpadr &= ~HD64461_GPADR_PCMCIA0;
++ outw(gpadr, HD64461_GPADR);
++ }
++
++ return 0;
++}
++
++static int hd64461_suspend(struct pcmcia_socket *s)
++{
++ u16 gpadr;
++ u8 gcr;
++ u32 gcr_reg = HD64461_PCC(s->sock, GCR);
++
++ DPRINTK(0, "hd64461_suspend(%d)\n", s->sock);
++
++ gcr = ctrl_inb(gcr_reg);
++ gcr &= ~HD64461_PCCGCR_DRVE;
++ ctrl_outb(gcr, gcr_reg);
++ hd64461_set_voltage(s->sock, 0, 0);
++
++ if ((mach_is_hp6xx())&&(s->sock == 0)) {
++ gpadr = inw(HD64461_GPADR);
++ gpadr |= HD64461_GPADR_PCMCIA0;
++ outw(gpadr, HD64461_GPADR);
++ }
++
++ return 0;
++}
++
++static int hd64461_get_status(struct pcmcia_socket *s, u32 * value)
++{
++ u8 isr;
++ u32 status = 0;
++ hd64461_socket_t *sp = container_of(s, struct hd64461_socket_t, socket);
++
++ isr = ctrl_inb(HD64461_PCC(s->sock, ISR));
++
++ if ((isr & HD64461_PCCISR_PCD_MASK) == 0) {
++ status |= SS_DETECT;
++
++ if (sp->IC_memory) {
++ switch (isr & HD64461_PCCISR_BVD_MASK) {
++ case HD64461_PCCISR_BVD_BATGOOD:
++ break;
++ case HD64461_PCCISR_BVD_BATWARN:
++ status |= SS_BATWARN;
++ break;
++ default:
++ status |= SS_BATDEAD;
++ break;
++ }
++
++ if (isr & HD64461_PCCISR_READY)
++ status |= SS_READY;
++ if (isr & HD64461_PCCISR_MWP)
++ status |= SS_WRPROT;
++ } else {
++ if (isr & HD64461_PCCISR_BVD1)
++ status |= SS_STSCHG;
++ }
++
++ switch (isr & (HD64461_PCCISR_VS2 | HD64461_PCCISR_VS1)) {
++ case HD64461_PCCISR_VS1:
++ printk(KERN_NOTICE MODNAME
++ ": cannot handle X.XV card, ignored\n");
++ status = 0;
++ break;
++ case 0:
++ case HD64461_PCCISR_VS2:
++ status |= SS_3VCARD;
++ break;
++ case HD64461_PCCISR_VS2 | HD64461_PCCISR_VS1:
++ break;
++ }
++
++ if ((sp->state.Vcc != 0) || (sp->state.Vpp != 0))
++ status |= SS_POWERON;
++ }
++ DPRINTK(0, "hd64461_get_status(%d) = %x\n", s->sock, status);
++
++ *value = status;
++ return 0;
++}
++
++static int hd64461_set_socket(struct pcmcia_socket *s, socket_state_t * state)
++{
++ u32 flags;
++ u32 changed;
++ u8 gcr, cscier;
++ hd64461_socket_t *sp = container_of(s, struct hd64461_socket_t, socket);
++ u32 gcr_reg = HD64461_PCC(s->sock, GCR);
++ u32 cscier_reg = HD64461_PCC(s->sock, CSCIER);
++
++ DPRINTK(0, "%s(sock=%d, flags=%x, csc_mask=%x, Vcc=%d, Vpp=%d, io_irq=%d)\n",
++ __FUNCTION__, s->sock, state->flags, state->csc_mask, state->Vcc,
++ state->Vpp, state->io_irq);
++
++ local_irq_save(flags);
++
++ if (state->Vpp != sp->state.Vpp || state->Vcc != sp->state.Vcc) {
++ if (!hd64461_set_voltage(s->sock, state->Vcc, state->Vpp)) {
++ local_irq_restore(flags);
++ return -EINVAL;
++ }
++ }
++
++ changed = sp->state.csc_mask ^ state->csc_mask;
++ cscier = ctrl_inb(cscier_reg);
++
++ if (changed & SS_DETECT) {
++ if (state->csc_mask & SS_DETECT)
++ cscier |= HD64461_PCCCSCIER_CDE;
++ else
++ cscier &= ~HD64461_PCCCSCIER_CDE;
++ }
++
++ if (changed & SS_READY) {
++ if (state->csc_mask & SS_READY)
++ cscier |= HD64461_PCCCSCIER_RE;
++ else
++ cscier &= ~HD64461_PCCCSCIER_RE;
++ }
++
++ if (changed & SS_BATDEAD) {
++ if (state->csc_mask & SS_BATDEAD)
++ cscier |= HD64461_PCCCSCIER_BDE;
++ else
++ cscier &= ~HD64461_PCCCSCIER_BDE;
++ }
++
++ if (changed & SS_BATWARN) {
++ if (state->csc_mask & SS_BATWARN)
++ cscier |= HD64461_PCCCSCIER_BWE;
++ else
++ cscier &= ~HD64461_PCCCSCIER_BWE;
++ }
++
++ if (changed & SS_STSCHG) {
++ if (state->csc_mask & SS_STSCHG)
++ cscier |= HD64461_PCCCSCIER_SCE;
++ else
++ cscier &= ~HD64461_PCCCSCIER_SCE;
++ }
++
++ ctrl_outb(cscier, cscier_reg);
++
++ changed = sp->state.flags ^ state->flags;
++
++ gcr = ctrl_inb(gcr_reg);
++
++ if (changed & SS_IOCARD) {
++ DPRINTK(0, "card type: %s\n",
++ (state->flags & SS_IOCARD ? "i/o" : "memory"));
++ if (state->flags & SS_IOCARD) {
++ if (s->sock == 1) {
++ printk(KERN_ERR
++ "socket 1 can be only IC Memory card\n");
++ } else {
++ gcr |= HD64461_PCCGCR_PCCT;
++ sp->IC_memory = 0;
++ }
++ } else {
++ gcr &= ~HD64461_PCCGCR_PCCT;
++ sp->IC_memory = 1;
++ }
++ }
++
++ if (changed & SS_RESET) {
++ DPRINTK(0, "%s reset card\n",
++ (state->flags & SS_RESET ? "start" : "stop"));
++ if (state->flags & SS_RESET)
++ gcr |= HD64461_PCCGCR_PCCR;
++ else
++ gcr &= ~HD64461_PCCGCR_PCCR;
++ }
++
++ if (changed & SS_OUTPUT_ENA) {
++ DPRINTK(0, "%sabling card output\n",
++ (state->flags & SS_OUTPUT_ENA ? "en" : "dis"));
++ if (state->flags & SS_OUTPUT_ENA)
++ gcr |= HD64461_PCCGCR_DRVE;
++ else
++ gcr &= ~HD64461_PCCGCR_DRVE;
++ }
++
++ DPRINTK(2, "cscier=%02x ", cscier);
++ DPRINTK(2, "gcr=%02x\n", gcr);
++ ctrl_outb(gcr, gcr_reg);
++
++ sp->state = *state;
++
++ local_irq_restore(flags);
++
++ return 0;
++}
++
++static int hd64461_set_io_map(struct pcmcia_socket *s, struct pccard_io_map *io)
++{
++ /* this is not needed due to static mappings */
++ DPRINTK(0, "hd64461_set_io_map(%d)\n", s->sock);
++
++ return 0;
++}
++
++static int hd64461_set_mem_map(struct pcmcia_socket *s,
++ struct pccard_mem_map *mem)
++{
++ hd64461_socket_t *sp = container_of(s, struct hd64461_socket_t, socket);
++ struct pccard_mem_map *smem;
++ int map = mem->map;
++ unsigned long saddr;
++
++ DPRINTK(0, "%s(sock=%d, map=%d, flags=0x%x,static_start=0x%08lx, card_start=0x%08x)\n",
++ __FUNCTION__, s->sock, map, mem->flags, mem->static_start, mem->card_start);
++
++ if (map >= MAX_WIN)
++ return -EINVAL;
++
++ smem = &sp->mem_maps[map];
++ saddr = sp->mem_base + mem->card_start;
++
++ if (!(mem->flags & MAP_ATTRIB))
++ saddr += HD64461_PCC_WINDOW;
++
++ mem->static_start = saddr;
++ *smem = *mem;
++
++ return 0;
++}
++
++static int hd64461_pcmcia_irq_demux(int irq, void *dev)
++{
++ hd64461_socket_t *sp = (hd64461_socket_t *) dev;
++ unsigned char cscr;
++ unsigned cscr_reg = HD64461_PCC(0, CSCR);
++
++ DPRINTK(3, "hd64461_pcmcia_irq_demux(irq= %d - ", irq);
++
++ cscr = ctrl_inb(cscr_reg);
++ if (cscr & HD64461_PCCCSCR_IREQ) {
++ cscr &= ~HD64461_PCCCSCR_IREQ;
++ ctrl_outb(cscr, cscr_reg);
++ irq = sp->socket.pci_irq;
++ }
++
++ DPRINTK(3, "%d)\n", irq);
++
++ return irq;
++}
++
++static irqreturn_t hd64461_interrupt(int irq, void *dev, struct pt_regs *regs)
++{
++ hd64461_socket_t *sp = (hd64461_socket_t *) dev;
++ unsigned events = 0;
++ unsigned char cscr;
++ unsigned cscr_reg = HD64461_PCC(hd64461_sockno(sp), CSCR);
++
++ cscr = ctrl_inb(cscr_reg);
++
++ DPRINTK(3, "hd64461_interrupt: cscr=%04x irq=%d\n", cscr, irq);
++
++ if (cscr & HD64461_PCCCSCR_CDC) {
++ cscr &= ~HD64461_PCCCSCR_CDC;
++ events |= SS_DETECT;
++
++ if ((ctrl_inb(HD64461_PCC(hd64461_sockno(sp), ISR)) &
++ HD64461_PCCISR_PCD_MASK) != 0) {
++ cscr &= ~(HD64461_PCCCSCR_RC | HD64461_PCCCSCR_BW |
++ HD64461_PCCCSCR_BD | HD64461_PCCCSCR_SC);
++ }
++ }
++
++ if (sp->IC_memory) {
++ if (cscr & HD64461_PCCCSCR_RC) {
++ cscr &= ~HD64461_PCCCSCR_RC;
++ events |= SS_READY;
++ }
++
++ if (cscr & HD64461_PCCCSCR_BW) {
++ cscr &= ~HD64461_PCCCSCR_BW;
++ events |= SS_BATWARN;
++ }
++
++ if (cscr & HD64461_PCCCSCR_BD) {
++ cscr &= ~HD64461_PCCCSCR_BD;
++ events |= SS_BATDEAD;
++ }
++ } else {
++ if (cscr & HD64461_PCCCSCR_SC) {
++ cscr &= ~HD64461_PCCCSCR_SC;
++ events |= SS_STSCHG;
++ }
++ }
++
++ ctrl_outb(cscr, cscr_reg);
++
++ if (events)
++ pcmcia_parse_events(&sp->socket, events);
++
++ return IRQ_HANDLED;
++}
++
++static struct pccard_operations hd64461_operations = {
++ .init = hd64461_init,
++ .suspend = hd64461_suspend,
++ .get_status = hd64461_get_status,
++ .set_socket = hd64461_set_socket,
++ .set_io_map = hd64461_set_io_map,
++ .set_mem_map = hd64461_set_mem_map,
++};
++
++int hd64461_init_socket(int sock, int irq, int io_irq, unsigned long mem_base,
++ unsigned short io_offset)
++{
++ hd64461_socket_t *sp = &hd64461_sockets[sock];
++ unsigned gcr_reg = HD64461_PCC(sock, GCR);
++ int irq_flags = (sock == 0) ? SA_INTERRUPT : SA_SHIRQ;
++ u8 gcr;
++ int i, err;
++
++ ctrl_outb(0, HD64461_PCC(sock, CSCIER));
++
++ memset(sp, 0, sizeof(*sp));
++ sp->IC_memory = 1;
++ sp->irq = irq;
++ sp->mem_base = mem_base;
++ sp->socket.features =
++ SS_CAP_PCCARD | SS_CAP_STATIC_MAP | SS_CAP_PAGE_REGS;
++ sp->socket.resource_ops = &pccard_static_ops;
++ sp->socket.map_size = HD64461_PCC_WINDOW; /* 16MB fixed window size */
++ sp->socket.pci_irq = io_irq;
++ sp->socket.io_offset = io_offset;
++ sp->socket.owner = THIS_MODULE;
++ sp->socket.ops = &hd64461_operations;
++
++ for (i = 0; i != MAX_WIN; i++)
++ sp->mem_maps[i].map = i;
++
++ if ((err =
++ request_irq(irq, hd64461_interrupt, irq_flags, MODNAME, sp)) < 0) {
++ printk(KERN_ERR
++ "HD64461 PCMCIA socket %d: can't request irq %d\n", sock,
++ sp->irq);
++ return err;
++ }
++
++ if (sock == 0) {
++ irq_desc[io_irq].handler = &hd64461_ss_irq_type;
++ hd64461_register_irq_demux(sp->irq, hd64461_pcmcia_irq_demux,
++ sp);
++ }
++
++ gcr = ctrl_inb(gcr_reg);
++ gcr |= HD64461_PCCGCR_PMMOD; /* 16MB mapping mode */
++ gcr &= ~(HD64461_PCCGCR_PA25 | HD64461_PCCGCR_PA24); /* lowest 16MB of Common */
++ ctrl_outb(gcr, gcr_reg);
++
++ return 0;
++}
++
++void hd64461_exit_socket(int sock)
++{
++ hd64461_socket_t *sp = &hd64461_sockets[sock];
++ unsigned cscier_reg = HD64461_PCC(sock, CSCIER);
++
++ ctrl_outb(0, cscier_reg);
++ hd64461_suspend(&sp->socket);
++
++ if (sp->irq) {
++ if (sock == 0)
++ hd64461_unregister_irq_demux(sp->irq);
++ free_irq(sp->irq, sp);
++ if (sock == 0)
++ irq_desc[sp->socket.pci_irq].handler = &no_irq_type;
++ }
++}
++
++static int __devexit hd64461_pcmcia_drv_remove(struct platform_device *dev)
++{
++ int i;
++
++ for (i = 0; i != CONFIG_HD64461_PCMCIA_SOCKETS; i++) {
++ pcmcia_unregister_socket(&hd64461_sockets[i].socket);
++ hd64461_exit_socket(i);
++ }
++
++ return 0;
++}
++
++#ifdef CONFIG_PM
++static int hd64461_pcmcia_drv_suspend(struct platform_device *dev, pm_message_t state)
++{
++ int ret = 0;
++ int i;
++
++ for (i = 0; i != CONFIG_HD64461_PCMCIA_SOCKETS; i++) {
++ u32 cscier_reg = HD64461_PCC(i, CSCIER);
++ hd64461_sockets[i].cscier = ctrl_inb(cscier_reg);
++ ctrl_outb(0, cscier_reg);
++ ret = pcmcia_socket_dev_suspend(&dev->dev, state);
++ }
++ return ret;
++ }
++
++static int hd64461_pcmcia_drv_resume(struct platform_device *dev)
++{
++ int ret = 0;
++ int i;
++
++ for (i = 0; i != CONFIG_HD64461_PCMCIA_SOCKETS; i++) {
++ u32 cscier_reg = HD64461_PCC(i, CSCIER);
++ ctrl_outb(hd64461_sockets[i].cscier, cscier_reg);
++ ret = pcmcia_socket_dev_resume(&dev->dev);
++ }
++
++ return ret;
++}
++#endif
++
++static struct platform_driver hd64461_pcmcia_driver = {
++ .remove = __devexit_p(hd64461_pcmcia_drv_remove),
++#ifdef CONFIG_PM
++ .suspend = hd64461_pcmcia_drv_suspend,
++ .resume = hd64461_pcmcia_drv_resume,
++#endif
++ .driver = {
++ .name = "hd64461-pcmcia",
++ },
++};
++
++static struct platform_device *hd64461_pcmcia_device;
++
++static int __init init_hd64461_ss(void)
++{
++ int i;
++
++ printk(KERN_INFO "HD64461 PCMCIA bridge.\n");
++ if (platform_driver_register(&hd64461_pcmcia_driver))
++ return -EINVAL;
++
++ i = hd64461_init_socket(0, HD64461_IRQ_PCC0, HD64461_IRQ_PCC0 + 1,
++ HD64461_PCC0_BASE, 0xf000);
++ if (i < 0) {
++ platform_driver_unregister(&hd64461_pcmcia_driver);
++ return i;
++ }
++#if CONFIG_HD64461_PCMCIA_SOCKETS==2
++ i = hd64461_init_socket(1, HD64461_IRQ_PCC1, HD64461_IRQ_PCC1,
++ HD64461_PCC1_BASE, 0);
++ if (i < 0) {
++ platform_driver_unregister(&hd64461_pcmcia_driver);
++ return i;
++ }
++#endif
++
++ hd64461_pcmcia_device = platform_device_register_simple("hd64461-pcmcia", -1, NULL, 0);
++ if (IS_ERR(hd64461_pcmcia_device)) {
++ platform_driver_unregister(&hd64461_pcmcia_driver);
++ return PTR_ERR(hd64461_pcmcia_device);
++ }
++
++ for (i = 0; i != CONFIG_HD64461_PCMCIA_SOCKETS; i++) {
++ unsigned int ret;
++ hd64461_sockets[i].socket.dev.dev = &hd64461_pcmcia_device->dev;
++ ret = pcmcia_register_socket(&hd64461_sockets[i].socket);
++ if (ret && i)
++ pcmcia_unregister_socket(&hd64461_sockets[0].socket);
++ }
++
++ return 0;
++}
++
++static void __exit exit_hd64461_ss(void)
++{
++ platform_device_unregister(hd64461_pcmcia_device);
++ platform_driver_unregister(&hd64461_pcmcia_driver);
++}
++
++module_init(init_hd64461_ss);
++module_exit(exit_hd64461_ss);
++
++MODULE_AUTHOR("Andriy Skulysh <askulysh@gmail.com>");
++MODULE_DESCRIPTION("PCMCIA driver for Hitachi HD64461 companion chip");
++MODULE_LICENSE("GPL");
+diff -ruN linux-2.6.17-vanilla/drivers/pcmcia/yenta_socket.c linux-2.6.17/drivers/pcmcia/yenta_socket.c
+--- linux-2.6.17-vanilla/drivers/pcmcia/yenta_socket.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/pcmcia/yenta_socket.c 2006-07-12 16:54:24.000000000 +0000
+@@ -49,6 +49,15 @@
+ #define to_cycles(ns) ((ns)/120)
+ #define to_ns(cycles) ((cycles)*120)
+
++#if defined(CONFIG_SH_HS7751RVOIP) || defined(CONFIG_SH_RTS7751R2D) || defined(CONFIG_SH_R7780RP)
++#define PCI_CB_SYSTEM_CONTROL 0x80 /* System Control Register */
++#define PCI_CB_MULTIFUNCTION 0x8c /* Multifunction Routing Register */
++#define PCI_CB_RETRY_STATUS 0x90 /* Retry Status Register */
++#define PCI_CB_CARD_CONTROL 0x91 /* Card Control Register */
++#define PCI_CB_DEVICE_CONTROL 0x92 /* Device Control Register */
++#define PCI_CB_DIAGNOSTIC 0x93 /* Diagnostic Register */
++#endif
++
+ /**
+ * yenta PCI irq probing.
+ * currently only used in the TI/EnE initialization code
+@@ -511,7 +520,12 @@
+ {
+ struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
+
++#if defined(CONFIG_SH_HS7751RVOIP) || defined(CONFIG_SH_RTS7751R2D) || defined(CONFIG_SH_R7780RP)
++ exca_writeb(socket, I365_GBLCTL, I365_GBL_CSC_LEV | I365_GBL_IRQ_0_LEV);
++ exca_writeb(socket, I365_INTCTL, I365_INTR_ENA);
++#else
+ exca_writeb(socket, I365_GBLCTL, 0x00);
++#endif
+ exca_writeb(socket, I365_GENCTL, 0x00);
+
+ /* Redo card voltage interrogation */
+@@ -996,6 +1010,38 @@
+ bridge &= ~(CB_BRIDGE_CRST | CB_BRIDGE_PREFETCH1 | CB_BRIDGE_ISAEN | CB_BRIDGE_VGAEN);
+ bridge |= CB_BRIDGE_PREFETCH0 | CB_BRIDGE_POSTEN;
+ config_writew(socket, CB_BRIDGE_CONTROL, bridge);
++#if defined(CONFIG_SH_HS7751RVOIP) || defined(CONFIG_SH_RTS7751R2D) || defined(CONFIG_SH_R7780RP)
++ /* System Contro Register
++ * SER_STEP=00, INTRTIE=1, RSVD=0, P2CCLK=1,
++ * SMIROUTE=0, SMISTATUS=0, SMIENB=0, RSVD=0,
++ * CBRSVD=0, VCCPROT=0, REDUCEZV=0, RSVD=0100,
++ * MRBURSTD=1, MRBURSTU=1, SOCACTIV=0, RSVD=1,
++ * PWRSTREAM=0, DELAYUP=0, DELAYCOWN=0, INTERROGATE=0,
++ * RSVD=0, PWRSAVINGS=1, SUBSYSRW=1, CB_DPAR=0,
++ * RSVD=0, EXCAPOWER=0, KEEPCLK=0, RIMUX=0
++ */
++ config_writel(socket, PCI_CB_SYSTEM_CONTROL, 0x28449060);
++ /* Retry Status Register
++ * PCIRETRY=0, CBRETRY=0, TEXP_CBB=0, RSVD=0,
++ * TEXP_CBA=0, RSVD=0, TEXP_PCI=0, RSVD=0
++ */
++ config_writeb(socket, PCI_CB_RETRY_STATUS, 0x00);
++ /* Device Control Register
++ * SKTPWR_LOCK=0, 3VCAPABLE=1, IO16V2=1, RSVD=0,
++ * TEST=0, INTMODE=01, RSVD=0
++ */
++ config_writeb(socket, PCI_CB_DEVICE_CONTROL, 0x62);
++ /* Siagnostic Register
++ * TRUE_VAL=0, RSVD=1, CSC=0, DIAG4=0,
++ * DIAG3=0, DIAG2=0, DIAG1=0, STDZVEN=0
++ */
++ config_writeb(socket, PCI_CB_DIAGNOSTIC, 0x40);
++ /* Multifucntion Routing Register
++ * RSVD=0000, MFUNC6=0000, MFUNC5=0000, MFUNC4=0000,
++ * MFUNC3=0001, MFUNC2=0000, MFUNC1=0000, MFUNC0=0010
++ */
++ config_writel(socket, PCI_CB_MULTIFUNCTION, 0x00001002);
++#endif
+ }
+
+ /*
+diff -ruN linux-2.6.17-vanilla/drivers/rtc/CVS/Entries linux-2.6.17/drivers/rtc/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/rtc/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/rtc/CVS/Entries 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,4 @@
++/Kconfig/1.1/Tue Jul 11 07:54:45 2006/-ko/
++/Makefile/1.1/Tue Jul 11 07:54:45 2006/-ko/
++/rtc-sh.c/1.1/Tue Jul 11 07:54:45 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/drivers/rtc/CVS/Repository linux-2.6.17/drivers/rtc/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/rtc/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/rtc/CVS/Repository 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/rtc
+diff -ruN linux-2.6.17-vanilla/drivers/rtc/CVS/Root linux-2.6.17/drivers/rtc/CVS/Root
+--- linux-2.6.17-vanilla/drivers/rtc/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/rtc/CVS/Root 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/rtc/Kconfig linux-2.6.17/drivers/rtc/Kconfig
+--- linux-2.6.17-vanilla/drivers/rtc/Kconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/rtc/Kconfig 2006-07-12 16:54:25.000000000 +0000
+@@ -147,6 +147,16 @@
+ To compile this driver as a module, choose M here: the
+ module will be called rtc-sa1100.
+
++config RTC_DRV_SH
++ tristate "SuperH On-Chip RTC"
++ depends on RTC_CLASS && SUPERH
++ help
++ Say Y here to enable support for the on-chip RTC found in
++ most SuperH processors.
++
++ To compile this driver as a module, choose M here: the
++ module will be called rtc-sh.
++
+ config RTC_DRV_VR41XX
+ tristate "NEC VR41XX"
+ depends on RTC_CLASS && CPU_VR41XX
+diff -ruN linux-2.6.17-vanilla/drivers/rtc/Makefile linux-2.6.17/drivers/rtc/Makefile
+--- linux-2.6.17-vanilla/drivers/rtc/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/rtc/Makefile 2006-07-12 16:54:25.000000000 +0000
+@@ -20,3 +20,4 @@
+ obj-$(CONFIG_RTC_DRV_EP93XX) += rtc-ep93xx.o
+ obj-$(CONFIG_RTC_DRV_SA1100) += rtc-sa1100.o
+ obj-$(CONFIG_RTC_DRV_VR41XX) += rtc-vr41xx.o
++obj-$(CONFIG_RTC_DRV_SH) += rtc-sh.o
+diff -ruN linux-2.6.17-vanilla/drivers/rtc/rtc-sh.c linux-2.6.17/drivers/rtc/rtc-sh.c
+--- linux-2.6.17-vanilla/drivers/rtc/rtc-sh.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/rtc/rtc-sh.c 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,467 @@
++/*
++ * SuperH On-Chip RTC Support
++ *
++ * Copyright (C) 2006 Paul Mundt
++ *
++ * Based on the old arch/sh/kernel/cpu/rtc.c by:
++ *
++ * Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org>
++ * Copyright (C) 1999 Tetsuya Okada & Niibe Yutaka
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ */
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/bcd.h>
++#include <linux/rtc.h>
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/seq_file.h>
++#include <linux/interrupt.h>
++#include <linux/spinlock.h>
++#include <asm/io.h>
++
++#ifdef CONFIG_CPU_SH3
++#define rtc_reg_size sizeof(u16)
++#define RTC_BIT_INVERTED 0 /* No bug on SH7708, SH7709A */
++#elif defined(CONFIG_CPU_SH4)
++#define rtc_reg_size sizeof(u32)
++#define RTC_BIT_INVERTED 0x40 /* bug on SH7750, SH7750S */
++#endif
++
++#define RTC_REG(r) ((r) * rtc_reg_size)
++
++#define R64CNT RTC_REG(0)
++#define RSECCNT RTC_REG(1)
++#define RMINCNT RTC_REG(2)
++#define RHRCNT RTC_REG(3)
++#define RWKCNT RTC_REG(4)
++#define RDAYCNT RTC_REG(5)
++#define RMONCNT RTC_REG(6)
++#define RYRCNT RTC_REG(7)
++#define RSECAR RTC_REG(8)
++#define RMINAR RTC_REG(9)
++#define RHRAR RTC_REG(10)
++#define RWKAR RTC_REG(11)
++#define RDAYAR RTC_REG(12)
++#define RMONAR RTC_REG(13)
++#define RCR1 RTC_REG(14)
++#define RCR2 RTC_REG(15)
++
++/* RCR1 Bits */
++#define RCR1_CF 0x80 /* Carry Flag */
++#define RCR1_CIE 0x10 /* Carry Interrupt Enable */
++#define RCR1_AIE 0x08 /* Alarm Interrupt Enable */
++#define RCR1_AF 0x01 /* Alarm Flag */
++
++/* RCR2 Bits */
++#define RCR2_PEF 0x80 /* PEriodic interrupt Flag */
++#define RCR2_PESMASK 0x70 /* Periodic interrupt Set */
++#define RCR2_RTCEN 0x08 /* ENable RTC */
++#define RCR2_ADJ 0x04 /* ADJustment (30-second) */
++#define RCR2_RESET 0x02 /* Reset bit */
++#define RCR2_START 0x01 /* Start bit */
++
++struct sh_rtc {
++ void __iomem *regbase;
++ unsigned long regsize;
++ struct resource *res;
++ unsigned int alarm_irq, periodic_irq, carry_irq;
++ struct rtc_device *rtc_dev;
++ spinlock_t lock;
++};
++
++static irqreturn_t sh_rtc_interrupt(int irq, void *id, struct pt_regs *regs)
++{
++ struct platform_device *pdev = id;
++ struct sh_rtc *rtc = platform_get_drvdata(pdev);
++ unsigned int tmp, events = 0;
++
++ spin_lock(&rtc->lock);
++
++ tmp = readb(rtc->regbase + RCR1);
++
++ if (tmp & RCR1_AF)
++ events |= RTC_AF | RTC_IRQF;
++
++ tmp &= ~(RCR1_CF | RCR1_AF);
++
++ writeb(tmp, rtc->regbase + RCR1);
++
++ rtc_update_irq(&rtc->rtc_dev->class_dev, 1, events);
++
++ spin_unlock(&rtc->lock);
++
++ return IRQ_HANDLED;
++}
++
++static irqreturn_t sh_rtc_periodic(int irq, void *id, struct pt_regs *regs)
++{
++ struct sh_rtc *rtc = dev_get_drvdata(id);
++
++ spin_lock(&rtc->lock);
++
++ rtc_update_irq(&rtc->rtc_dev->class_dev, 1, RTC_PF | RTC_IRQF);
++
++ spin_unlock(&rtc->lock);
++
++ return IRQ_HANDLED;
++}
++
++static inline void sh_rtc_setpie(struct device *dev, unsigned int enable)
++{
++ struct sh_rtc *rtc = dev_get_drvdata(dev);
++ unsigned int tmp;
++
++ spin_lock_irq(&rtc->lock);
++
++ tmp = readb(rtc->regbase + RCR2);
++
++ if (enable) {
++ tmp &= ~RCR2_PESMASK;
++ tmp |= RCR2_PEF | (2 << 4);
++ } else
++ tmp &= ~(RCR2_PESMASK | RCR2_PEF);
++
++ writeb(tmp, rtc->regbase + RCR2);
++
++ spin_unlock_irq(&rtc->lock);
++}
++
++static inline void sh_rtc_setaie(struct device *dev, unsigned int enable)
++{
++ struct sh_rtc *rtc = dev_get_drvdata(dev);
++ unsigned int tmp;
++
++ spin_lock_irq(&rtc->lock);
++
++ tmp = readb(rtc->regbase + RCR1);
++
++ if (enable)
++ tmp |= RCR1_AIE;
++ else
++ tmp &= ~RCR1_AIE;
++
++ writeb(tmp, rtc->regbase + RCR1);
++
++ spin_unlock_irq(&rtc->lock);
++}
++
++static int sh_rtc_open(struct device *dev)
++{
++ struct sh_rtc *rtc = dev_get_drvdata(dev);
++ unsigned int tmp;
++ int ret;
++
++ tmp = readb(rtc->regbase + RCR1);
++ tmp &= ~RCR1_CF;
++ tmp |= RCR1_CIE;
++ writeb(tmp, rtc->regbase + RCR1);
++
++ ret = request_irq(rtc->periodic_irq, sh_rtc_periodic, SA_INTERRUPT,
++ "sh-rtc period", dev);
++ if (unlikely(ret)) {
++ dev_err(dev, "request period IRQ failed with %d, IRQ %d\n",
++ ret, rtc->periodic_irq);
++ return ret;
++ }
++
++ ret = request_irq(rtc->carry_irq, sh_rtc_interrupt, SA_INTERRUPT,
++ "sh-rtc carry", dev);
++ if (unlikely(ret)) {
++ dev_err(dev, "request carry IRQ failed with %d, IRQ %d\n",
++ ret, rtc->carry_irq);
++ free_irq(rtc->periodic_irq, dev);
++ goto err_bad_carry;
++ }
++
++ ret = request_irq(rtc->alarm_irq, sh_rtc_interrupt, SA_INTERRUPT,
++ "sh-rtc alarm", dev);
++ if (unlikely(ret)) {
++ dev_err(dev, "request alarm IRQ failed with %d, IRQ %d\n",
++ ret, rtc->alarm_irq);
++ goto err_bad_alarm;
++ }
++
++ return 0;
++
++err_bad_alarm:
++ free_irq(rtc->carry_irq, dev);
++err_bad_carry:
++ free_irq(rtc->periodic_irq, dev);
++
++ return ret;
++}
++
++static void sh_rtc_release(struct device *dev)
++{
++ struct sh_rtc *rtc = dev_get_drvdata(dev);
++
++ sh_rtc_setpie(dev, 0);
++
++ free_irq(rtc->periodic_irq, dev);
++ free_irq(rtc->carry_irq, dev);
++ free_irq(rtc->alarm_irq, dev);
++}
++
++static int sh_rtc_proc(struct device *dev, struct seq_file *seq)
++{
++ struct sh_rtc *rtc = dev_get_drvdata(dev);
++ unsigned int tmp;
++
++ tmp = readb(rtc->regbase + RCR1);
++ seq_printf(seq, "alarm_IRQ\t: %s\n",
++ (tmp & RCR1_AIE) ? "yes" : "no");
++ seq_printf(seq, "carry_IRQ\t: %s\n",
++ (tmp & RCR1_CIE) ? "yes" : "no");
++
++ tmp = readb(rtc->regbase + RCR2);
++ seq_printf(seq, "periodic_IRQ\t: %s\n",
++ (tmp & RCR2_PEF) ? "yes" : "no");
++
++ return 0;
++}
++
++static int sh_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
++{
++ unsigned int ret = -ENOIOCTLCMD;
++
++ switch (cmd) {
++ case RTC_PIE_OFF:
++ case RTC_PIE_ON:
++ sh_rtc_setpie(dev, cmd == RTC_PIE_ON);
++ ret = 0;
++ break;
++ case RTC_AIE_OFF:
++ case RTC_AIE_ON:
++ sh_rtc_setaie(dev, cmd == RTC_AIE_ON);
++ ret = 0;
++ break;
++ }
++
++ return ret;
++}
++
++static int sh_rtc_read_time(struct device *dev, struct rtc_time *tm)
++{
++ struct platform_device *pdev = to_platform_device(dev);
++ struct sh_rtc *rtc = platform_get_drvdata(pdev);
++ unsigned int sec128, sec2, yr, yr100, cf_bit;
++
++ do {
++ unsigned int tmp;
++
++ spin_lock_irq(&rtc->lock);
++
++ tmp = readb(rtc->regbase + RCR1);
++ tmp &= ~RCR1_CF; /* Clear CF-bit */
++ tmp |= RCR1_CIE;
++ writeb(tmp, rtc->regbase + RCR1);
++
++ sec128 = readb(rtc->regbase + R64CNT);
++
++ tm->tm_sec = BCD2BIN(readb(rtc->regbase + RSECCNT));
++ tm->tm_min = BCD2BIN(readb(rtc->regbase + RMINCNT));
++ tm->tm_hour = BCD2BIN(readb(rtc->regbase + RHRCNT));
++ tm->tm_wday = BCD2BIN(readb(rtc->regbase + RWKCNT));
++ tm->tm_mday = BCD2BIN(readb(rtc->regbase + RDAYCNT));
++ tm->tm_mon = BCD2BIN(readb(rtc->regbase + RMONCNT));
++
++#if defined(CONFIG_CPU_SH4)
++ yr = readw(rtc->regbase + RYRCNT);
++ yr100 = BCD2BIN(yr >> 8);
++ yr &= 0xff;
++#else
++ yr = readb(rtc->regbase + RYRCNT);
++ yr100 = BCD2BIN((yr == 0x99) ? 0x19 : 0x20);
++#endif
++
++ tm->tm_year = (yr100 * 100 + BCD2BIN(yr)) - 1900;
++
++ sec2 = readb(rtc->regbase + R64CNT);
++ cf_bit = readb(rtc->regbase + RCR1) & RCR1_CF;
++
++ spin_unlock_irq(&rtc->lock);
++ } while (cf_bit != 0 || ((sec128 ^ sec2) & RTC_BIT_INVERTED) != 0);
++
++#if RTC_BIT_INVERTED != 0
++ if ((sec128 & RTC_BIT_INVERTED))
++ tm->tm_sec--;
++#endif
++
++ dev_dbg(&dev, "%s: tm is secs=%d, mins=%d, hours=%d, "
++ "mday=%d, mon=%d, year=%d, wday=%d\n",
++ __FUNCTION__,
++ tm->tm_sec, tm->tm_min, tm->tm_hour,
++ tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
++
++ if (rtc_valid_tm(tm) < 0)
++ dev_err(dev, "invalid date\n");
++
++ return 0;
++}
++
++static int sh_rtc_set_time(struct device *dev, struct rtc_time *tm)
++{
++ struct platform_device *pdev = to_platform_device(dev);
++ struct sh_rtc *rtc = platform_get_drvdata(pdev);
++ unsigned int tmp;
++ int year;
++
++ spin_lock_irq(&rtc->lock);
++
++ /* Reset pre-scaler & stop RTC */
++ tmp = readb(rtc->regbase + RCR2);
++ tmp |= RCR2_RESET;
++ writeb(tmp, rtc->regbase + RCR2);
++
++ writeb(BIN2BCD(tm->tm_sec), rtc->regbase + RSECCNT);
++ writeb(BIN2BCD(tm->tm_min), rtc->regbase + RMINCNT);
++ writeb(BIN2BCD(tm->tm_hour), rtc->regbase + RHRCNT);
++ writeb(BIN2BCD(tm->tm_wday), rtc->regbase + RWKCNT);
++ writeb(BIN2BCD(tm->tm_mday), rtc->regbase + RDAYCNT);
++ writeb(BIN2BCD(tm->tm_mon), rtc->regbase + RMONCNT);
++
++#ifdef CONFIG_CPU_SH3
++ year = tm->tm_year % 100;
++ writeb(BIN2BCD(year), rtc->regbase + RYRCNT);
++#else
++ year = (BIN2BCD((tm->tm_year + 1900) / 100) << 8) |
++ BIN2BCD(tm->tm_year % 100);
++ writew(year, rtc->regbase + RYRCNT);
++#endif
++
++ /* Start RTC */
++ tmp = readb(rtc->regbase + RCR2);
++ tmp &= ~RCR2_RESET;
++ tmp |= RCR2_RTCEN | RCR2_START;
++ writeb(tmp, rtc->regbase + RCR2);
++
++ spin_unlock_irq(&rtc->lock);
++
++ return 0;
++}
++
++static struct rtc_class_ops sh_rtc_ops = {
++ .open = sh_rtc_open,
++ .release = sh_rtc_release,
++ .ioctl = sh_rtc_ioctl,
++ .read_time = sh_rtc_read_time,
++ .set_time = sh_rtc_set_time,
++ .proc = sh_rtc_proc,
++};
++
++static int __devinit sh_rtc_probe(struct platform_device *pdev)
++{
++ struct sh_rtc *rtc;
++ struct resource *res;
++ int ret = -ENOENT;
++
++ rtc = kzalloc(sizeof(struct sh_rtc), GFP_KERNEL);
++ if (unlikely(!rtc))
++ return -ENOMEM;
++
++ spin_lock_init(&rtc->lock);
++
++ rtc->periodic_irq = platform_get_irq(pdev, 0);
++ if (unlikely(rtc->periodic_irq < 0)) {
++ dev_err(&pdev->dev, "No IRQ for period\n");
++ goto err_badres;
++ }
++
++ rtc->carry_irq = platform_get_irq(pdev, 1);
++ if (unlikely(rtc->carry_irq < 0)) {
++ dev_err(&pdev->dev, "No IRQ for carry\n");
++ goto err_badres;
++ }
++
++ rtc->alarm_irq = platform_get_irq(pdev, 2);
++ if (unlikely(rtc->alarm_irq < 0)) {
++ dev_err(&pdev->dev, "No IRQ for alarm\n");
++ goto err_badres;
++ }
++
++ res = platform_get_resource(pdev, IORESOURCE_IO, 0);
++ if (unlikely(res == NULL)) {
++ dev_err(&pdev->dev, "No IO resource\n");
++ goto err_badres;
++ }
++
++ rtc->regsize = res->end - res->start + 1;
++
++ rtc->res = request_mem_region(res->start, rtc->regsize, pdev->name);
++ if (unlikely(!rtc->res)) {
++ ret = -EBUSY;
++ goto err_badres;
++ }
++
++ rtc->regbase = (void __iomem *)rtc->res->start;
++ if (unlikely(!rtc->regbase)) {
++ ret = -EINVAL;
++ goto err_badmap;
++ }
++
++ rtc->rtc_dev = rtc_device_register("sh", &pdev->dev,
++ &sh_rtc_ops, THIS_MODULE);
++ if (IS_ERR(rtc)) {
++ ret = PTR_ERR(rtc->rtc_dev);
++ goto err_badmap;
++ }
++
++ platform_set_drvdata(pdev, rtc);
++
++ return 0;
++
++err_badmap:
++ release_resource(rtc->res);
++err_badres:
++ kfree(rtc);
++
++ return ret;
++}
++
++static int __devexit sh_rtc_remove(struct platform_device *pdev)
++{
++ struct sh_rtc *rtc = platform_get_drvdata(pdev);
++
++ if (likely(rtc->rtc_dev))
++ rtc_device_unregister(rtc->rtc_dev);
++
++ sh_rtc_setpie(&pdev->dev, 0);
++ sh_rtc_setaie(&pdev->dev, 0);
++
++ release_resource(rtc->res);
++
++ platform_set_drvdata(pdev, NULL);
++
++ kfree(rtc);
++
++ return 0;
++}
++static struct platform_driver sh_rtc_platform_driver = {
++ .driver = {
++ .name = "sh-rtc",
++ .owner = THIS_MODULE,
++ },
++ .probe = sh_rtc_probe,
++ .remove = __devexit_p(sh_rtc_remove),
++};
++
++static int __init sh_rtc_init(void)
++{
++ return platform_driver_register(&sh_rtc_platform_driver);
++}
++
++static void __exit sh_rtc_exit(void)
++{
++ platform_driver_unregister(&sh_rtc_platform_driver);
++}
++
++module_init(sh_rtc_init);
++module_exit(sh_rtc_exit);
++
++MODULE_DESCRIPTION("SuperH on-chip RTC driver");
++MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>");
++MODULE_LICENSE("GPL");
+diff -ruN linux-2.6.17-vanilla/drivers/serial/8250.c linux-2.6.17/drivers/serial/8250.c
+--- linux-2.6.17-vanilla/drivers/serial/8250.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/serial/8250.c 2006-07-12 16:54:24.000000000 +0000
+@@ -193,6 +193,9 @@
+ .fifo_size = 32,
+ .tx_loadsz = 16,
+ .fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_01 |
++#ifdef CONFIG_SH_RTS7751R2D
++ UART_FCR_TRIGGER_14 |
++#endif
+ UART_FCR_T_TRIG_00,
+ .flags = UART_CAP_FIFO | UART_CAP_EFR | UART_CAP_SLEEP,
+ },
+@@ -440,8 +443,13 @@
+ {
+ if (p->capabilities & UART_CAP_SLEEP) {
+ if (p->capabilities & UART_CAP_EFR) {
++ int efr = UART_EFR_ECB;
++
+ serial_outp(p, UART_LCR, 0xBF);
+- serial_outp(p, UART_EFR, UART_EFR_ECB);
++#ifdef CONFIG_SH_RTS7751R2D
++ efr |= UART_EFR_CTS | UART_EFR_RTS;
++#endif
++ serial_outp(p, UART_EFR, efr);
+ serial_outp(p, UART_LCR, 0);
+ }
+ serial_outp(p, UART_IER, sleep ? UART_IERX_SLEEP : 0);
+@@ -672,10 +680,16 @@
+ * since that's the technique that was sent to me in the
+ * serial driver update, but I'm not convinced this works.
+ * I've had problems doing this in the past. -TYT
++ *
++ * No, this won't work for everyone. At least in the RTS7751R2D
++ * case we have a '650 with a 64 byte FIFO, so this ends up breaking
++ * there. -PFM
+ */
++#ifndef CONFIG_SH_RTS7751R2D
+ if (size_fifo(up) == 64)
+ up->port.type = PORT_16654;
+ else
++#endif
+ up->port.type = PORT_16650V2;
+ }
+
+diff -ruN linux-2.6.17-vanilla/drivers/serial/CVS/Entries linux-2.6.17/drivers/serial/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/serial/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/serial/CVS/Entries 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,4 @@
++/sh-sci.c/1.43/Mon Mar 27 21:06:14 2006/-ko/
++/sh-sci.h/1.21/Wed Feb 8 12:24:41 2006/-ko/
++/8250.c/1.14/Wed Jul 5 14:51:22 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/drivers/serial/CVS/Repository linux-2.6.17/drivers/serial/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/serial/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/serial/CVS/Repository 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/serial
+diff -ruN linux-2.6.17-vanilla/drivers/serial/CVS/Root linux-2.6.17/drivers/serial/CVS/Root
+--- linux-2.6.17-vanilla/drivers/serial/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/serial/CVS/Root 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/serial/sh-sci.c linux-2.6.17/drivers/serial/sh-sci.c
+--- linux-2.6.17-vanilla/drivers/serial/sh-sci.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/serial/sh-sci.c 2006-07-12 16:54:24.000000000 +0000
+@@ -3,7 +3,7 @@
+ *
+ * SuperH on-chip serial module support. (SCI with no FIFO / with FIFO)
+ *
+- * Copyright (C) 2002, 2003, 2004 Paul Mundt
++ * Copyright (C) 2002 - 2006 Paul Mundt
+ *
+ * based off of the old drivers/char/sh-sci.c by:
+ *
+@@ -56,10 +56,8 @@
+
+ #if defined(CONFIG_SUPERH) && !defined(CONFIG_SUPERH64)
+ #include <asm/clock.h>
+-#endif
+-
+-#ifdef CONFIG_SH_STANDARD_BIOS
+ #include <asm/sh_bios.h>
++#include <asm/kgdb.h>
+ #endif
+
+ #if defined(CONFIG_SERIAL_SH_SCI_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
+@@ -69,25 +67,15 @@
+ #include "sh-sci.h"
+
+ #ifdef CONFIG_SH_KGDB
+-#include <asm/kgdb.h>
+-
+-static int kgdb_get_char(struct sci_port *port);
+-static void kgdb_put_char(struct sci_port *port, char c);
+-static void kgdb_handle_error(struct sci_port *port);
+ static struct sci_port *kgdb_sci_port;
+-#endif /* CONFIG_SH_KGDB */
++#endif
+
+ #ifdef CONFIG_SERIAL_SH_SCI_CONSOLE
+-static struct sci_port *serial_console_port = 0;
+-#endif /* CONFIG_SERIAL_SH_SCI_CONSOLE */
++static struct sci_port *serial_console_port;
++#endif
+
+ /* Function prototypes */
+ static void sci_stop_tx(struct uart_port *port);
+-static void sci_start_tx(struct uart_port *port);
+-static void sci_start_rx(struct uart_port *port, unsigned int tty_start);
+-static void sci_stop_rx(struct uart_port *port);
+-static int sci_request_irq(struct sci_port *port);
+-static void sci_free_irq(struct sci_port *port);
+
+ static struct sci_port sci_ports[];
+ static struct uart_driver sci_uart_driver;
+@@ -95,9 +83,9 @@
+ #define SCI_NPORTS sci_uart_driver.nr
+
+ #if defined(CONFIG_SH_STANDARD_BIOS) || defined(CONFIG_SH_KGDB)
+-
+-static void handle_error(struct uart_port *port)
+-{ /* Clear error flags */
++static inline void handle_error(struct uart_port *port)
++{
++ /* Clear error flags */
+ sci_out(port, SCxSR, SCxSR_ERROR_CLEAR(port));
+ }
+
+@@ -122,28 +110,9 @@
+
+ return c;
+ }
+-
+-/* Taken from sh-stub.c of GDB 4.18 */
+-static const char hexchars[] = "0123456789abcdef";
+-
+-static __inline__ char highhex(int x)
+-{
+- return hexchars[(x >> 4) & 0xf];
+-}
+-
+-static __inline__ char lowhex(int x)
+-{
+- return hexchars[x & 0xf];
+-}
+-
+ #endif /* CONFIG_SH_STANDARD_BIOS || CONFIG_SH_KGDB */
+
+-/*
+- * Send the packet in buffer. The host gets one chance to read it.
+- * This routine does not wait for a positive acknowledge.
+- */
+-
+-#ifdef CONFIG_SERIAL_SH_SCI_CONSOLE
++#if defined(CONFIG_SERIAL_SH_SCI_CONSOLE) || defined(CONFIG_SH_KGDB)
+ static void put_char(struct uart_port *port, char c)
+ {
+ unsigned long flags;
+@@ -161,7 +130,9 @@
+
+ local_irq_restore(flags);
+ }
++#endif
+
++#ifdef CONFIG_SERIAL_SH_SCI_CONSOLE
+ static void put_string(struct sci_port *sci_port, const char *buffer, int count)
+ {
+ struct uart_port *port = &sci_port->port;
+@@ -214,96 +185,28 @@
+ }
+ #endif /* CONFIG_SERIAL_SH_SCI_CONSOLE */
+
+-
+ #ifdef CONFIG_SH_KGDB
+-
+-/* Is the SCI ready, ie is there a char waiting? */
+-static int kgdb_is_char_ready(struct sci_port *port)
+-{
+- unsigned short status = sci_in(port, SCxSR);
+-
+- if (status & (SCxSR_ERRORS(port) | SCxSR_BRK(port)))
+- kgdb_handle_error(port);
+-
+- return (status & SCxSR_RDxF(port));
+-}
+-
+-/* Write a char */
+-static void kgdb_put_char(struct sci_port *port, char c)
+-{
+- unsigned short status;
+-
+- do
+- status = sci_in(port, SCxSR);
+- while (!(status & SCxSR_TDxE(port)));
+-
+- sci_out(port, SCxTDR, c);
+- sci_in(port, SCxSR); /* Dummy read */
+- sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port));
+-}
+-
+-/* Get a char if there is one, else ret -1 */
+-static int kgdb_get_char(struct sci_port *port)
+-{
+- int c;
+-
+- if (kgdb_is_char_ready(port) == 0)
+- c = -1;
+- else {
+- c = sci_in(port, SCxRDR);
+- sci_in(port, SCxSR); /* Dummy read */
+- sci_out(port, SCxSR, SCxSR_RDxF_CLEAR(port));
+- }
+-
+- return c;
+-}
+-
+-/* Called from kgdbstub.c to get a character, i.e. is blocking */
+ static int kgdb_sci_getchar(void)
+ {
+- volatile int c;
++ int c;
+
+ /* Keep trying to read a character, this could be neater */
+- while ((c = kgdb_get_char(kgdb_sci_port)) < 0);
++ while ((c = get_char(kgdb_sci_port)) < 0)
++ cpu_relax();
+
+ return c;
+ }
+
+-/* Called from kgdbstub.c to put a character, just a wrapper */
+-static void kgdb_sci_putchar(int c)
++static inline void kgdb_sci_putchar(int c)
+ {
+-
+- kgdb_put_char(kgdb_sci_port, c);
++ put_char(kgdb_sci_port, c);
+ }
+-
+-/* Clear any errors on the SCI */
+-static void kgdb_handle_error(struct sci_port *port)
+-{
+- sci_out(port, SCxSR, SCxSR_ERROR_CLEAR(port)); /* Clear error flags */
+-}
+-
+-/* Breakpoint if there's a break sent on the serial port */
+-static void kgdb_break_interrupt(int irq, void *ptr, struct pt_regs *regs)
+-{
+- struct sci_port *port = ptr;
+- unsigned short status = sci_in(port, SCxSR);
+-
+- if (status & SCxSR_BRK(port)) {
+-
+- /* Break into the debugger if a break is detected */
+- BREAKPOINT();
+-
+- /* Clear */
+- sci_out(port, SCxSR, SCxSR_BREAK_CLEAR(port));
+- }
+-}
+-
+ #endif /* CONFIG_SH_KGDB */
+
+ #if defined(__H8300S__)
+ enum { sci_disable, sci_enable };
+
+-static void h8300_sci_enable(struct uart_port* port, unsigned int ctrl)
++static void h8300_sci_config(struct uart_port* port, unsigned int ctrl)
+ {
+ volatile unsigned char *mstpcrl=(volatile unsigned char *)MSTPCRL;
+ int ch = (port->mapbase - SMR0) >> 3;
+@@ -315,6 +218,16 @@
+ *mstpcrl &= ~mask;
+ }
+ }
++
++static inline void h8300_sci_enable(struct uart_port *port)
++{
++ h8300_sci_config(port, sci_enable);
++}
++
++static inline void h8300_sci_disable(struct uart_port *port)
++{
++ h8300_sci_config(port, sci_disable);
++}
+ #endif
+
+ #if defined(SCI_ONLY) || defined(SCI_AND_SCIF)
+@@ -324,8 +237,13 @@
+ int ch = (port->mapbase - SMR0) >> 3;
+
+ /* set DDR regs */
+- H8300_GPIO_DDR(h8300_sci_pins[ch].port,h8300_sci_pins[ch].rx,H8300_GPIO_INPUT);
+- H8300_GPIO_DDR(h8300_sci_pins[ch].port,h8300_sci_pins[ch].tx,H8300_GPIO_OUTPUT);
++ H8300_GPIO_DDR(h8300_sci_pins[ch].port,
++ h8300_sci_pins[ch].rx,
++ H8300_GPIO_INPUT);
++ H8300_GPIO_DDR(h8300_sci_pins[ch].port,
++ h8300_sci_pins[ch].tx,
++ H8300_GPIO_OUTPUT);
++
+ /* tx mark output*/
+ H8300_SCI_DR(ch) |= h8300_sci_pins[ch].tx;
+ }
+@@ -380,7 +298,6 @@
+ }
+ #endif
+ #else
+-
+ /* For SH7750 */
+ static void sci_init_pins_scif(struct uart_port *port, unsigned int cflag)
+ {
+@@ -397,10 +314,41 @@
+ }
+ sci_out(port, SCFCR, fcr_val);
+ }
++#endif
++
++#if defined(CONFIG_CPU_SUBTYPE_SH7760) || defined(CONFIG_CPU_SUBTYPE_SH7780)
++static inline int scif_txroom(struct uart_port *port)
++{
++ return SCIF_TXROOM_MAX - (sci_in(port, SCTFDR) & 0x7f);
++}
++
++static inline int scif_rxroom(struct uart_port *port)
++{
++ return sci_in(port, SCRFDR) & 0x7f;
++}
++#else
++static inline int scif_txroom(struct uart_port *port)
++{
++ return SCIF_TXROOM_MAX - (sci_in(port, SCFDR) >> 8);
++}
+
++static inline int scif_rxroom(struct uart_port *port)
++{
++ return sci_in(port, SCFDR) & SCIF_RFDC_MASK;
++}
+ #endif
+ #endif /* SCIF_ONLY || SCI_AND_SCIF */
+
++static inline int sci_txroom(struct uart_port *port)
++{
++ return ((sci_in(port, SCxSR) & SCI_TDRE) != 0);
++}
++
++static inline int sci_rxroom(struct uart_port *port)
++{
++ return ((sci_in(port, SCxSR) & SCxSR_RDxF(port)) != 0);
++}
++
+ /* ********************************************************************** *
+ * the interrupt related routines *
+ * ********************************************************************** */
+@@ -412,7 +360,7 @@
+ unsigned long flags;
+ unsigned short status;
+ unsigned short ctrl;
+- int count, txroom;
++ int count;
+
+ status = sci_in(port, SCxSR);
+ if (!(status & SCxSR_TDxE(port))) {
+@@ -428,21 +376,12 @@
+ return;
+ }
+
+-#if !defined(SCI_ONLY)
+- if (port->type == PORT_SCIF) {
+-#if defined(CONFIG_CPU_SUBTYPE_SH7760) || defined(CONFIG_CPU_SUBTYPE_SH7780)
+- txroom = SCIF_TXROOM_MAX - (sci_in(port, SCTFDR) & 0x7f);
+-#else
+- txroom = SCIF_TXROOM_MAX - (sci_in(port, SCFDR)>>8);
+-#endif
+- } else {
+- txroom = (sci_in(port, SCxSR) & SCI_TDRE)?1:0;
+- }
+-#else
+- txroom = (sci_in(port, SCxSR) & SCI_TDRE)?1:0;
++#ifndef SCI_ONLY
++ if (port->type == PORT_SCIF)
++ count = scif_txroom(port);
++ else
+ #endif
+-
+- count = txroom;
++ count = sci_txroom(port);
+
+ do {
+ unsigned char c;
+@@ -491,6 +430,7 @@
+ static inline void sci_receive_chars(struct uart_port *port,
+ struct pt_regs *regs)
+ {
++ struct sci_port *sci_port = (struct sci_port *)port;
+ struct tty_struct *tty = port->info->tty;
+ int i, count, copied = 0;
+ unsigned short status;
+@@ -502,18 +442,11 @@
+
+ while (1) {
+ #if !defined(SCI_ONLY)
+- if (port->type == PORT_SCIF) {
+-#if defined(CONFIG_CPU_SUBTYPE_SH7760) || defined(CONFIG_CPU_SUBTYPE_SH7780)
+- count = sci_in(port, SCRFDR) & 0x7f;
+-#else
+- count = sci_in(port, SCFDR)&SCIF_RFDC_MASK ;
+-#endif
+- } else {
+- count = (sci_in(port, SCxSR)&SCxSR_RDxF(port))?1:0;
+- }
+-#else
+- count = (sci_in(port, SCxSR)&SCxSR_RDxF(port))?1:0;
++ if (port->type == PORT_SCIF)
++ count = scif_rxroom(port);
++ else
+ #endif
++ count = sci_rxroom(port);
+
+ /* Don't copy more bytes than there is room for in the buffer */
+ count = tty_buffer_request_room(tty, count);
+@@ -524,11 +457,10 @@
+
+ if (port->type == PORT_SCI) {
+ char c = sci_in(port, SCxRDR);
+- if(((struct sci_port *)port)->break_flag
+- || uart_handle_sysrq_char(port, c, regs)) {
++ if (uart_handle_sysrq_char(port, c, regs) || sci_port->break_flag)
+ count = 0;
+- } else {
+- tty_insert_flip_char(tty, c, TTY_NORMAL);
++ else {
++ tty_insert_flip_char(tty, c, TTY_NORMAL);
+ }
+ } else {
+ for (i=0; i<count; i++) {
+@@ -536,15 +468,17 @@
+ status = sci_in(port, SCxSR);
+ #if defined(CONFIG_CPU_SH3)
+ /* Skip "chars" during break */
+- if (((struct sci_port *)port)->break_flag) {
++ if (sci_port->break_flag) {
+ if ((c == 0) &&
+ (status & SCxSR_FER(port))) {
+ count--; i--;
+ continue;
+ }
++
+ /* Nonzero => end-of-break */
+ pr_debug("scif: debounce<%02x>\n", c);
+- ((struct sci_port *)port)->break_flag = 0;
++ sci_port->break_flag = 0;
++
+ if (STEPFN(c)) {
+ count--; i--;
+ continue;
+@@ -601,15 +535,17 @@
+ /* Ensure that two consecutive samples find the break over. */
+ static void sci_break_timer(unsigned long data)
+ {
+- struct sci_port * port = (struct sci_port *)data;
+- if(sci_rxd_in(&port->port) == 0) {
++ struct sci_port *port = (struct sci_port *)data;
++
++ if (sci_rxd_in(&port->port) == 0) {
+ port->break_flag = 1;
+- sci_schedule_break_timer(port);
+- } else if(port->break_flag == 1){
++ sci_schedule_break_timer(port);
++ } else if (port->break_flag == 1) {
+ /* break is over. */
+ port->break_flag = 2;
+- sci_schedule_break_timer(port);
+- } else port->break_flag = 0;
++ sci_schedule_break_timer(port);
++ } else
++ port->break_flag = 0;
+ }
+
+ static inline int sci_handle_errors(struct uart_port *port)
+@@ -618,40 +554,41 @@
+ unsigned short status = sci_in(port, SCxSR);
+ struct tty_struct *tty = port->info->tty;
+
+- if (status&SCxSR_ORER(port)) {
++ if (status & SCxSR_ORER(port)) {
+ /* overrun error */
+- if(tty_insert_flip_char(tty, 0, TTY_OVERRUN))
++ if (tty_insert_flip_char(tty, 0, TTY_OVERRUN))
+ copied++;
+ pr_debug("sci: overrun error\n");
+ }
+
+- if (status&SCxSR_FER(port)) {
++ if (status & SCxSR_FER(port)) {
+ if (sci_rxd_in(port) == 0) {
+ /* Notify of BREAK */
+- struct sci_port * sci_port = (struct sci_port *)port;
+- if(!sci_port->break_flag) {
+- sci_port->break_flag = 1;
+- sci_schedule_break_timer((struct sci_port *)port);
++ struct sci_port *sci_port = (struct sci_port *)port;
++
++ if (!sci_port->break_flag) {
++ sci_port->break_flag = 1;
++ sci_schedule_break_timer(sci_port);
++
+ /* Do sysrq handling. */
+- if(uart_handle_break(port))
++ if (uart_handle_break(port))
+ return 0;
+ pr_debug("sci: BREAK detected\n");
+- if(tty_insert_flip_char(tty, 0, TTY_BREAK))
++ if (tty_insert_flip_char(tty, 0, TTY_BREAK))
+ copied++;
+ }
+- }
+- else {
++ } else {
+ /* frame error */
+- if(tty_insert_flip_char(tty, 0, TTY_FRAME))
++ if (tty_insert_flip_char(tty, 0, TTY_FRAME))
+ copied++;
+ pr_debug("sci: frame error\n");
+ }
+ }
+
+- if (status&SCxSR_PER(port)) {
+- if(tty_insert_flip_char(tty, 0, TTY_PARITY))
+- copied++;
++ if (status & SCxSR_PER(port)) {
+ /* parity error */
++ if (tty_insert_flip_char(tty, 0, TTY_PARITY))
++ copied++;
+ pr_debug("sci: parity error\n");
+ }
+
+@@ -756,6 +693,12 @@
+
+ /* Handle BREAKs */
+ sci_handle_breaks(port);
++
++#ifdef CONFIG_SH_KGDB
++ /* Break into the debugger if a break is detected */
++ BREAKPOINT();
++#endif
++
+ sci_out(port, SCxSR, SCxSR_BREAK_CLEAR(port));
+
+ return IRQ_HANDLED;
+@@ -964,9 +907,8 @@
+ {
+ struct sci_port *s = &sci_ports[port->line];
+
+-#if defined(__H8300S__)
+- h8300_sci_enable(port, sci_enable);
+-#endif
++ if (s->enable)
++ s->enable(port);
+
+ sci_request_irq(s);
+ sci_start_tx(port);
+@@ -983,9 +925,8 @@
+ sci_stop_tx(port);
+ sci_free_irq(s);
+
+-#if defined(__H8300S__)
+- h8300_sci_enable(port, sci_disable);
+-#endif
++ if (s->disable)
++ s->disable(port);
+ }
+
+ static void sci_set_termios(struct uart_port *port, struct termios *termios,
+@@ -1434,6 +1375,8 @@
+ .type = PORT_SCI,
+ .irqs = H8S_SCI_IRQS0,
+ .init_pins = sci_init_pins_sci,
++ .enable = h8300_sci_enable,
++ .disable = h8300_sci_disable,
+ },
+ {
+ .port = {
+@@ -1448,6 +1391,8 @@
+ .type = PORT_SCI,
+ .irqs = H8S_SCI_IRQS1,
+ .init_pins = sci_init_pins_sci,
++ .enable = h8300_sci_enable,
++ .disable = h8300_sci_disable,
+ },
+ {
+ .port = {
+@@ -1462,6 +1407,8 @@
+ .type = PORT_SCI,
+ .irqs = H8S_SCI_IRQS2,
+ .init_pins = sci_init_pins_sci,
++ .enable = h8300_sci_enable,
++ .disable = h8300_sci_disable,
+ },
+ #elif defined(CONFIG_CPU_SUBTYPE_SH7770)
+ {
+@@ -1569,19 +1516,21 @@
+ sci_config_port(port, 0);
+ #endif
+
++ if (serial_console_port->enable)
++ serial_console_port->enable(port);
++
+ /*
+ * We need to set the initial uartclk here, since otherwise it will
+ * only ever be setup at sci_init() time.
+ */
+ #if defined(__H8300H__) || defined(__H8300S__)
+ port->uartclk = CONFIG_CPU_CLOCK;
+-
+-#if defined(__H8300S__)
+- h8300_sci_enable(port, sci_enable);
+-#endif
+ #elif defined(CONFIG_SUPERH64)
+ port->uartclk = current_cpu_info.module_clock * 16;
+ #else
++ /*
++ * XXX: Use a proper clock for SCI/SCIF
++ */
+ {
+ struct clk *clk = clk_get("module_clk");
+ port->uartclk = clk_get_rate(clk) * 16;
+@@ -1726,6 +1675,7 @@
+ #elif defined(CONFIG_SUPERH64)
+ sciport->port.uartclk = current_cpu_info.module_clock * 16;
+ #else
++ /* XXX: We should use a proper SCI/SCIF clock */
+ struct clk *clk = clk_get("module_clk");
+ sciport->port.uartclk = clk_get_rate(clk) * 16;
+ clk_put(clk);
+@@ -1762,3 +1712,4 @@
+ module_init(sci_init);
+ module_exit(sci_exit);
+
++MODULE_LICENSE("GPL");
+diff -ruN linux-2.6.17-vanilla/drivers/serial/sh-sci.h linux-2.6.17/drivers/serial/sh-sci.h
+--- linux-2.6.17-vanilla/drivers/serial/sh-sci.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/serial/sh-sci.h 2006-07-12 16:54:24.000000000 +0000
+@@ -279,6 +279,8 @@
+ int type;
+ unsigned char irqs[4]; /* ERI, RXI, TXI, BRI */
+ void (*init_pins)(struct uart_port *port, unsigned int cflag);
++ void (*enable)(struct uart_port *port);
++ void (*disable)(struct uart_port *port);
+ int break_flag;
+ struct timer_list break_timer;
+ };
+diff -ruN linux-2.6.17-vanilla/drivers/sh/CVS/Entries linux-2.6.17/drivers/sh/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/sh/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/sh/CVS/Entries 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,2 @@
++/Makefile/1.3/Thu Nov 10 14:20:52 2005/-ko/
++D/superhyway////
+diff -ruN linux-2.6.17-vanilla/drivers/sh/CVS/Repository linux-2.6.17/drivers/sh/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/sh/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/sh/CVS/Repository 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/sh
+diff -ruN linux-2.6.17-vanilla/drivers/sh/CVS/Root linux-2.6.17/drivers/sh/CVS/Root
+--- linux-2.6.17-vanilla/drivers/sh/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/sh/CVS/Root 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/sh/Makefile linux-2.6.17/drivers/sh/Makefile
+--- linux-2.6.17-vanilla/drivers/sh/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/sh/Makefile 2006-07-12 16:54:24.000000000 +0000
+@@ -2,5 +2,5 @@
+ # Makefile for the SuperH specific drivers.
+ #
+
+-obj-$(CONFIG_SUPERHYWAY) += superhyway/
++obj-$(CONFIG_SUPERHYWAY) += superhyway/
+
+diff -ruN linux-2.6.17-vanilla/drivers/sh/superhyway/CVS/Entries linux-2.6.17/drivers/sh/superhyway/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/sh/superhyway/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/sh/superhyway/CVS/Entries 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1,4 @@
++/Makefile/1.1/Fri Mar 4 18:56:52 2005/-ko/
++/superhyway-sysfs.c/1.3/Mon Aug 29 21:01:19 2005/-ko/
++/superhyway.c/1.4/Mon Mar 27 21:06:14 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/drivers/sh/superhyway/CVS/Repository linux-2.6.17/drivers/sh/superhyway/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/sh/superhyway/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/sh/superhyway/CVS/Repository 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/sh/superhyway
+diff -ruN linux-2.6.17-vanilla/drivers/sh/superhyway/CVS/Root linux-2.6.17/drivers/sh/superhyway/CVS/Root
+--- linux-2.6.17-vanilla/drivers/sh/superhyway/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/sh/superhyway/CVS/Root 2006-07-12 16:54:24.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/usb/CVS/Entries linux-2.6.17/drivers/usb/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/usb/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/usb/CVS/Entries 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,2 @@
++D/host////
++/Kconfig/1.3/Wed Jul 5 14:51:25 2006/-ko/
+diff -ruN linux-2.6.17-vanilla/drivers/usb/CVS/Repository linux-2.6.17/drivers/usb/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/usb/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/usb/CVS/Repository 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/usb
+diff -ruN linux-2.6.17-vanilla/drivers/usb/CVS/Root linux-2.6.17/drivers/usb/CVS/Root
+--- linux-2.6.17-vanilla/drivers/usb/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/usb/CVS/Root 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/usb/Kconfig linux-2.6.17/drivers/usb/Kconfig
+--- linux-2.6.17-vanilla/drivers/usb/Kconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/usb/Kconfig 2006-07-12 16:54:25.000000000 +0000
+@@ -29,6 +29,8 @@
+ default y if PPC_MPC52xx
+ # MIPS:
+ default y if SOC_AU1X00
++ # SH:
++ default y if VOYAGERGX
+ # more:
+ default PCI
+
+diff -ruN linux-2.6.17-vanilla/drivers/usb/host/CVS/Entries linux-2.6.17/drivers/usb/host/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/usb/host/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/usb/host/CVS/Entries 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,4 @@
++/ohci-voyagergx.c/1.4/Fri Jan 27 16:11:52 2006/-ko/
++/Kconfig/1.12/Wed Jul 5 14:51:27 2006/-ko/
++/ohci-hcd.c/1.14/Wed Jul 5 14:51:27 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/drivers/usb/host/CVS/Repository linux-2.6.17/drivers/usb/host/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/usb/host/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/usb/host/CVS/Repository 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/usb/host
+diff -ruN linux-2.6.17-vanilla/drivers/usb/host/CVS/Root linux-2.6.17/drivers/usb/host/CVS/Root
+--- linux-2.6.17-vanilla/drivers/usb/host/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/usb/host/CVS/Root 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/usb/host/Kconfig linux-2.6.17/drivers/usb/host/Kconfig
+--- linux-2.6.17-vanilla/drivers/usb/host/Kconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/usb/host/Kconfig 2006-07-12 16:54:25.000000000 +0000
+@@ -148,3 +148,13 @@
+ To compile this driver as a module, choose M here: the
+ module will be called "sl811_cs".
+
++config USB_SM501
++ tristate "USB Host Controller in SM501 support"
++ depends on USB && VOYAGERGX
++ help
++ Say Y here if you have SM501 USB host controller your system.
++
++ if you do not know what this is, please say N.
++
++ To compile this driver as a module, choose M here: the
++ module will be called SM501.
+diff -ruN linux-2.6.17-vanilla/drivers/usb/host/ohci-hcd.c linux-2.6.17/drivers/usb/host/ohci-hcd.c
+--- linux-2.6.17-vanilla/drivers/usb/host/ohci-hcd.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/usb/host/ohci-hcd.c 2006-07-12 16:54:25.000000000 +0000
+@@ -878,7 +878,9 @@
+ MODULE_DESCRIPTION (DRIVER_INFO);
+ MODULE_LICENSE ("GPL");
+
+-#ifdef CONFIG_PCI
++#ifdef CONFIG_USB_SM501
++#include "ohci-voyagergx.c"
++#elif defined(CONFIG_PCI)
+ #include "ohci-pci.c"
+ #endif
+
+@@ -923,6 +925,7 @@
+ || defined (CONFIG_SOC_AU1X00) \
+ || defined (CONFIG_USB_OHCI_HCD_PPC_SOC) \
+ || defined (CONFIG_ARCH_AT91RM9200) \
++ || defined (CONFIG_USB_SM501) \
+ )
+ #error "missing bus glue for ohci-hcd"
+ #endif
+diff -ruN linux-2.6.17-vanilla/drivers/usb/host/ohci-voyagergx.c linux-2.6.17/drivers/usb/host/ohci-voyagergx.c
+--- linux-2.6.17-vanilla/drivers/usb/host/ohci-voyagergx.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/usb/host/ohci-voyagergx.c 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,259 @@
++/*
++ * SM501 USB HCD for Linux Version.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ * Copyright 2003 (c) Lineo uSolutions,Inc.
++ * Copyright 2004 (c) Paul Mundt
++ */
++
++#include <linux/dma-mapping.h>
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/platform_device.h>
++#include <asm/mach/voyagergx_reg.h>
++
++extern int usb_disabled(void);
++
++static void usb_hcd_voyager_remove(struct usb_hcd *hcd, struct platform_device *pdev);
++static int __devinit ohci_voyager_start(struct usb_hcd *hcd);
++static int __init voyagergx_ohci_init(void);
++static void __exit voyagergx_ohci_exit(void);
++
++/*
++ * VoyagerGX USB, when not used as a PCI device.
++ */
++#define VOYAGER_OHCI_NAME "voyager-ohci"
++
++static void __init voyagergx_ohci_configure(void)
++{
++ unsigned long val;
++
++ // Power Mode 0 Gate
++ val = inl(POWER_MODE0_GATE);
++ outl((val | POWER_MODE0_GATE_UH), POWER_MODE0_GATE);
++
++ val = inl(POWER_MODE1_GATE);
++ outl((val | POWER_MODE1_GATE_UH), POWER_MODE1_GATE);
++
++ //Miscellaneous USB Clock Selsct
++ val = inl(MISC_CTRL);
++ val &= ~MISC_CTRL_USBCLK_48;
++ outl(val, MISC_CTRL);
++
++ // Interrupt Mask
++ val = inl(VOYAGER_INT_MASK);
++ val |= 0x00000040;
++ outl(val, VOYAGER_INT_MASK);
++}
++
++static int usb_hcd_voyager_probe(const struct hc_driver *driver,
++ struct platform_device *dev)
++{
++ struct usb_hcd *hcd;
++ struct ohci_hcd *ohci;
++ struct resource *res;
++ int retval, irq;
++
++ res = platform_get_resource(dev, IORESOURCE_MEM, 0);
++ if (!res) {
++ err("no IO resources defined");
++ return -ENODEV;
++ }
++ irq = platform_get_irq(dev, 0);
++
++ hcd = usb_create_hcd(driver, &dev->dev, "sm501");
++ if (PTR_ERR(hcd) == 0) {
++ err("usb_create_hcd failed");
++ return -ENOMEM;
++ }
++
++ hcd->rsrc_start = res->start;
++ hcd->rsrc_len = res->end - res->start + 1;
++ hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
++ if (PTR_ERR(hcd->regs) == 0) {
++ err("ioremap failed");
++ retval = -ENOMEM;
++ goto err1;
++ }
++
++ ohci = hcd_to_ohci(hcd);
++ ohci_hcd_init(ohci);
++
++ retval = hcd_buffer_create(hcd);
++ if (retval != 0) {
++ err("hcd_buffer_create failed, %d", retval);
++ goto err2;
++ }
++
++ retval = usb_add_hcd(hcd, irq, SA_INTERRUPT);
++ if (!retval)
++ return retval; /* all done */
++
++ /* error path */
++ hcd_buffer_destroy(hcd);
++err2:
++ iounmap(hcd->regs);
++err1:
++ usb_put_hcd(hcd);
++
++ return retval;
++}
++
++static void usb_hcd_voyager_remove(struct usb_hcd *hcd, struct platform_device *dev)
++{
++ hcd_buffer_destroy(hcd);
++ usb_remove_hcd(hcd);
++ iounmap(hcd->regs);
++ usb_put_hcd(hcd);
++}
++
++static int __devinit ohci_voyager_start(struct usb_hcd *hcd)
++{
++ struct ohci_hcd *ohci = hcd_to_ohci(hcd);
++ int ret;
++
++ if ((ret = ohci_init(ohci)) < 0)
++ return ret;
++
++ if ((ret = ohci_run(ohci)) < 0) {
++ err("can't start %s", hcd->self.bus_name);
++ ohci_stop(hcd);
++ return ret;
++ }
++
++ return 0;
++}
++
++static const struct hc_driver voyager_hc_driver = {
++ .description = hcd_name,
++ .product_desc = "SM501 OHCI",
++ .hcd_priv_size = sizeof(struct ohci_hcd),
++
++ /*
++ * generic hardware linkage
++ */
++ .irq = ohci_irq,
++ .flags = HCD_USB11,
++
++ /*
++ * basic lifecycle operations
++ */
++ .start = ohci_voyager_start,
++ .stop = ohci_stop,
++
++ /*
++ * managing i/o requests and associated device resources
++ */
++ .urb_enqueue = ohci_urb_enqueue,
++ .urb_dequeue = ohci_urb_dequeue,
++ .endpoint_disable = ohci_endpoint_disable,
++
++ /*
++ * scheduling support
++ */
++ .get_frame_number = ohci_get_frame,
++
++ /*
++ * root hub support
++ */
++ .hub_status_data = ohci_hub_status_data,
++ .hub_control = ohci_hub_control,
++#ifdef CONFIG_PM
++ .bus_suspend = ohci_bus_suspend,
++ .bus_resume = ohci_bus_resume,
++#endif
++ .start_port_reset = ohci_start_port_reset,
++};
++
++static int usb_hcd_voyager_drv_probe(struct platform_device *pdev)
++{
++ if (usb_disabled())
++ return -ENODEV;
++
++ return usb_hcd_voyager_probe(&voyager_hc_driver, pdev);
++}
++
++static int usb_hcd_voyager_drv_remove(struct platform_device *pdev)
++{
++ struct usb_hcd *hcd = platform_get_drvdata(pdev);
++
++ usb_hcd_voyager_remove(hcd, pdev);
++
++ return 0;
++}
++
++/*
++ * Driver definitions to register with SH Bus
++ */
++static struct platform_driver usb_hcd_voyager_driver = {
++ .driver = {
++ .owner = THIS_MODULE,
++ .name = VOYAGER_OHCI_NAME,
++ },
++ .probe = usb_hcd_voyager_drv_probe,
++ .remove = usb_hcd_voyager_drv_remove,
++};
++
++static struct resource voyager_hcd_res[] = {
++ [0] = {
++ .start = VOYAGER_USBH_BASE,
++ .end = VOYAGER_USBH_BASE + 0xfff,
++ .flags = IORESOURCE_MEM,
++ },
++ [1] = {
++ .start = VOYAGER_USBH_IRQ,
++ .end = VOYAGER_USBH_IRQ,
++ .flags = IORESOURCE_IRQ,
++ },
++};
++
++static struct platform_device usb_hcd_voyager_dev = {
++ .name = VOYAGER_OHCI_NAME,
++ .id = 0,
++ .resource = voyager_hcd_res,
++ .num_resources = ARRAY_SIZE(voyager_hcd_res),
++};
++
++static int __init voyagergx_ohci_init(void)
++{
++ int ret;
++
++ if (usb_disabled())
++ return -ENODEV;
++
++ voyagergx_ohci_configure();
++
++ ret = platform_driver_register(&usb_hcd_voyager_driver);
++ if (ret)
++ return -ENODEV;
++
++ ret = platform_device_register(&usb_hcd_voyager_dev);
++ if (ret) {
++ platform_driver_unregister(&usb_hcd_voyager_driver);
++ return -ENODEV;
++ }
++
++ return ret;
++}
++
++static void __exit voyagergx_ohci_exit(void)
++{
++ platform_device_unregister(&usb_hcd_voyager_dev);
++ platform_driver_unregister(&usb_hcd_voyager_driver);
++}
++
++module_init(voyagergx_ohci_init);
++module_exit(voyagergx_ohci_exit);
+diff -ruN linux-2.6.17-vanilla/drivers/video/CVS/Entries linux-2.6.17/drivers/video/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/video/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/video/CVS/Entries 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,7 @@
++/hitfb.c/1.22/Sun Jan 29 17:46:24 2006/-ko/
++/pvr2fb.c/1.27/Sun Jan 8 13:56:39 2006//
++D/backlight////
++D/console////
++D/voyager////
++/Kconfig/1.27/Wed Jul 5 14:51:28 2006/-ko/
++/Makefile/1.22/Wed Jul 5 14:51:28 2006/-ko/
+diff -ruN linux-2.6.17-vanilla/drivers/video/CVS/Repository linux-2.6.17/drivers/video/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/video/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/video/CVS/Repository 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/video
+diff -ruN linux-2.6.17-vanilla/drivers/video/CVS/Root linux-2.6.17/drivers/video/CVS/Root
+--- linux-2.6.17-vanilla/drivers/video/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/video/CVS/Root 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/video/Kconfig linux-2.6.17/drivers/video/Kconfig
+--- linux-2.6.17-vanilla/drivers/video/Kconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/video/Kconfig 2006-07-12 16:54:25.000000000 +0000
+@@ -151,6 +151,21 @@
+ help
+ Support the Permedia2 FIFO disconnect feature (see CONFIG_FB_PM2).
+
++config FB_VOYAGER_GX
++ bool "Silicon Motion Voyager GX support"
++ depends on FB && VOYAGERGX
++ select FB_CFB_FILLRECT
++ select FB_CFB_COPYAREA
++ select FB_CFB_IMAGEBLIT
++ help
++ Say Y to enable support for the Silicon Motion VoyagerGX framebuffer.
++
++config FB_VOYAGER_GX_MP
++ bool "Voyager multi plane support"
++ depends on FB_VOYAGER_GX
++ help
++ Say Y to enable support VoyagerGX multi plane.
++
+ config FB_ARMCLCD
+ tristate "ARM PrimeCell PL110 support"
+ depends on FB && ARM && ARM_AMBA
+diff -ruN linux-2.6.17-vanilla/drivers/video/Makefile linux-2.6.17/drivers/video/Makefile
+--- linux-2.6.17-vanilla/drivers/video/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/video/Makefile 2006-07-12 16:54:25.000000000 +0000
+@@ -38,6 +38,8 @@
+ obj-$(CONFIG_FB_KYRO) += kyro/
+ obj-$(CONFIG_FB_SAVAGE) += savage/
+ obj-$(CONFIG_FB_GEODE) += geode/
++obj-$(CONFIG_FB_VOYAGER_GX) += voyager/
++
+ obj-$(CONFIG_FB_I810) += vgastate.o
+ obj-$(CONFIG_FB_NEOMAGIC) += neofb.o vgastate.o
+ obj-$(CONFIG_FB_VIRGE) += virgefb.o
+diff -ruN linux-2.6.17-vanilla/drivers/video/backlight/CVS/Entries linux-2.6.17/drivers/video/backlight/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/video/backlight/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/video/backlight/CVS/Entries 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,3 @@
++/Kconfig/1.2/Wed Jul 5 14:51:29 2006//
++/hp680_bl.c/1.6/Wed Jul 12 16:51:58 2006//
++D
+diff -ruN linux-2.6.17-vanilla/drivers/video/backlight/CVS/Repository linux-2.6.17/drivers/video/backlight/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/video/backlight/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/video/backlight/CVS/Repository 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/video/backlight
+diff -ruN linux-2.6.17-vanilla/drivers/video/backlight/CVS/Root linux-2.6.17/drivers/video/backlight/CVS/Root
+--- linux-2.6.17-vanilla/drivers/video/backlight/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/video/backlight/CVS/Root 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/video/backlight/Kconfig linux-2.6.17/drivers/video/backlight/Kconfig
+--- linux-2.6.17-vanilla/drivers/video/backlight/Kconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/video/backlight/Kconfig 2006-07-12 16:54:25.000000000 +0000
+@@ -51,7 +51,7 @@
+ backlight driver.
+
+ config BACKLIGHT_HP680
+- tristate "HP Jornada 680 Backlight Driver"
++ tristate "HP Jornada 680 Backlight Driver "
+ depends on BACKLIGHT_DEVICE && SH_HP6XX
+ default y
+ help
+diff -ruN linux-2.6.17-vanilla/drivers/video/backlight/hp680_bl.c linux-2.6.17/drivers/video/backlight/hp680_bl.c
+--- linux-2.6.17-vanilla/drivers/video/backlight/hp680_bl.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/video/backlight/hp680_bl.c 2006-07-12 16:54:25.000000000 +0000
+@@ -1,7 +1,7 @@
+ /*
+ * Backlight Driver for HP Jornada 680
+ *
+- * Copyright (c) 2005 Andriy Skulysh
++ * Copyright (c) 2005 Andriy Skulysh
+ *
+ * Based on Sharp's Corgi Backlight Driver
+ *
+@@ -20,7 +20,7 @@
+
+ #include <asm/cpu/dac.h>
+ #include <asm/hp6xx/hp6xx.h>
+-#include <asm/hd64461/hd64461.h>
++#include <asm/hd64461.h>
+
+ #define HP680_MAX_INTENSITY 255
+ #define HP680_DEFAULT_INTENSITY 10
+@@ -64,7 +64,6 @@
+ current_intensity = intensity;
+ }
+
+-
+ #ifdef CONFIG_PM
+ static int hp680bl_suspend(struct platform_device *dev, pm_message_t state)
+ {
+@@ -102,6 +101,8 @@
+ .update_status = hp680bl_set_intensity,
+ };
+
++static struct backlight_device *hp680_backlight_device;
++
+ static int __init hp680bl_probe(struct platform_device *dev)
+ {
+ hp680_backlight_device = backlight_device_register ("hp680-bl",
+@@ -163,6 +164,6 @@
+ module_init(hp680bl_init);
+ module_exit(hp680bl_exit);
+
+-MODULE_AUTHOR("Andriy Skulysh <askulysh@image.kiev.ua>");
++MODULE_AUTHOR("Andriy Skulysh <askulysh@gmail.com>");
+ MODULE_DESCRIPTION("HP Jornada 680 Backlight Driver");
+ MODULE_LICENSE("GPL");
+diff -ruN linux-2.6.17-vanilla/drivers/video/console/CVS/Entries linux-2.6.17/drivers/video/console/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/video/console/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/video/console/CVS/Entries 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,2 @@
++/Kconfig/1.7/Wed Jul 5 14:51:30 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/drivers/video/console/CVS/Repository linux-2.6.17/drivers/video/console/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/video/console/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/video/console/CVS/Repository 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/video/console
+diff -ruN linux-2.6.17-vanilla/drivers/video/console/CVS/Root linux-2.6.17/drivers/video/console/CVS/Root
+--- linux-2.6.17-vanilla/drivers/video/console/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/video/console/CVS/Root 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/video/console/Kconfig linux-2.6.17/drivers/video/console/Kconfig
+--- linux-2.6.17-vanilla/drivers/video/console/Kconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/video/console/Kconfig 2006-07-12 16:54:25.000000000 +0000
+@@ -6,7 +6,7 @@
+
+ config VGA_CONSOLE
+ bool "VGA text console" if EMBEDDED || !X86
+- depends on !ARCH_ACORN && !ARCH_EBSA110 && !4xx && !8xx && !SPARC && !M68K && !PARISC && !FRV && !ARCH_VERSATILE
++ depends on !ARCH_ACORN && !ARCH_EBSA110 && !4xx && !8xx && !SPARC && !M68K && !PARISC && !FRV && !ARCH_VERSATILE && !SUPERH
+ default y
+ help
+ Saying Y here will allow you to use Linux in text mode through a
+diff -ruN linux-2.6.17-vanilla/drivers/video/hitfb.c linux-2.6.17/drivers/video/hitfb.c
+--- linux-2.6.17-vanilla/drivers/video/hitfb.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/video/hitfb.c 2006-07-12 16:54:25.000000000 +0000
+@@ -4,7 +4,7 @@
+ * (C) 1999 Mihai Spatar
+ * (C) 2000 YAEGASHI Takeshi
+ * (C) 2003, 2004 Paul Mundt
+- * (C) 2003, 2004 Andriy Skulysh
++ * (C) 2003, 2004, 2006 Andriy Skulysh
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of this archive for
+@@ -22,18 +22,16 @@
+ #include <linux/slab.h>
+ #include <linux/delay.h>
+ #include <linux/init.h>
++#include <linux/platform_device.h>
+ #include <linux/fb.h>
+
+ #include <asm/machvec.h>
+ #include <asm/uaccess.h>
+ #include <asm/pgtable.h>
+ #include <asm/io.h>
+-#include <asm/hd64461/hd64461.h>
+-
+-#ifdef MACH_HP600
++#include <asm/hd64461.h>
+ #include <asm/cpu/dac.h>
+ #include <asm/hp6xx/hp6xx.h>
+-#endif
+
+ #define WIDTH 640
+
+@@ -47,7 +45,6 @@
+ static struct fb_fix_screeninfo hitfb_fix __initdata = {
+ .id = "Hitachi HD64461",
+ .type = FB_TYPE_PACKED_PIXELS,
+- .ypanstep = 8,
+ .accel = FB_ACCEL_NONE,
+ };
+
+@@ -75,26 +72,14 @@
+ if (truecolor)
+ saddr <<= 1;
+
+- fb_writew(width, HD64461_BBTDWR);
+- fb_writew(height, HD64461_BBTDHR);
++ fb_writew(width-1, HD64461_BBTDWR);
++ fb_writew(height-1, HD64461_BBTDHR);
+
+ fb_writew(saddr & 0xffff, HD64461_BBTDSARL);
+ fb_writew(saddr >> 16, HD64461_BBTDSARH);
+
+ }
+
+-static inline void hitfb_accel_solidfill(int truecolor, u16 dx, u16 dy,
+- u16 width, u16 height, u16 color)
+-{
+- hitfb_accel_set_dest(truecolor, dx, dy, width, height);
+-
+- fb_writew(0x00f0, HD64461_BBTROPR);
+- fb_writew(16, HD64461_BBTMDR);
+- fb_writew(color, HD64461_GRSCR);
+-
+- hitfb_accel_start(truecolor);
+-}
+-
+ static inline void hitfb_accel_bitblt(int truecolor, u16 sx, u16 sy, u16 dx,
+ u16 dy, u16 width, u16 height, u16 rop,
+ u32 mask_addr)
+@@ -102,6 +87,8 @@
+ u32 saddr, daddr;
+ u32 maddr = 0;
+
++ height--;
++ width--;
+ fb_writew(rop, HD64461_BBTROPR);
+ if ((sy < dy) || ((sy == dy) && (sx <= dx))) {
+ saddr = WIDTH * (sy + height) + sx + width;
+@@ -148,6 +135,7 @@
+ if (rect->rop != ROP_COPY)
+ cfb_fillrect(p, rect);
+ else {
++ hitfb_accel_wait();
+ fb_writew(0x00f0, HD64461_BBTROPR);
+ fb_writew(16, HD64461_BBTMDR);
+
+@@ -163,16 +151,15 @@
+ rect->height);
+ hitfb_accel_start(0);
+ }
+- hitfb_accel_wait();
+ }
+ }
+
+ static void hitfb_copyarea(struct fb_info *p, const struct fb_copyarea *area)
+ {
++ hitfb_accel_wait();
+ hitfb_accel_bitblt(p->var.bits_per_pixel == 16, area->sx, area->sy,
+ area->dx, area->dy, area->width, area->height,
+ 0x00cc, 0);
+- hitfb_accel_wait();
+ }
+
+ static int hitfb_pan_display(struct fb_var_screeninfo *var,
+@@ -184,7 +171,7 @@
+ if (xoffset != 0)
+ return -EINVAL;
+
+- fb_writew(yoffset, HD64461_LCDCBAR);
++ fb_writew((yoffset*info->fix.line_length)>>10, HD64461_LCDCBAR);
+
+ return 0;
+ }
+@@ -194,12 +181,6 @@
+ unsigned short v;
+
+ if (blank_mode) {
+-#ifdef MACH_HP600
+- sh_dac_disable(DAC_LCD_BRIGHTNESS);
+- v = fb_readw(HD64461_GPBDR);
+- v |= HD64461_GPBDR_LCDOFF;
+- fb_writew(v, HD64461_GPBDR);
+-#endif
+ v = fb_readw(HD64461_LDR1);
+ v &= ~HD64461_LDR1_DON;
+ fb_writew(v, HD64461_LDR1);
+@@ -215,19 +196,18 @@
+ v = fb_readw(HD64461_STBCR);
+ v &= ~HD64461_STBCR_SLCDST;
+ fb_writew(v, HD64461_STBCR);
+-#ifdef MACH_HP600
+- sh_dac_enable(DAC_LCD_BRIGHTNESS);
+- v = fb_readw(HD64461_GPBDR);
+- v &= ~HD64461_GPBDR_LCDOFF;
+- fb_writew(v, HD64461_GPBDR);
+-#endif
+- v = fb_readw(HD64461_LDR1);
+- v |= HD64461_LDR1_DON;
+- fb_writew(v, HD64461_LDR1);
+
+ v = fb_readw(HD64461_LCDCCR);
+- v &= ~HD64461_LCDCCR_MOFF;
++ v &= ~(HD64461_LCDCCR_MOFF | HD64461_LCDCCR_STREQ);
+ fb_writew(v, HD64461_LCDCCR);
++
++ do {
++ v = fb_readw(HD64461_LCDCCR);
++ } while(v&HD64461_LCDCCR_STBACK);
++
++ v = fb_readw(HD64461_LDR1);
++ v |= HD64461_LDR1_DON;
++ fb_writew(v, HD64461_LDR1);
+ }
+ return 0;
+ }
+@@ -235,7 +215,7 @@
+ static int hitfb_setcolreg(unsigned regno, unsigned red, unsigned green,
+ unsigned blue, unsigned transp, struct fb_info *info)
+ {
+- if (regno >= info->cmap.len)
++ if (regno >= 256)
+ return 1;
+
+ switch (info->var.bits_per_pixel) {
+@@ -246,6 +226,8 @@
+ fb_writew(blue >> 10, HD64461_CPTWDR);
+ break;
+ case 16:
++ if (regno >= 16)
++ return 1;
+ ((u32 *) (info->pseudo_palette))[regno] =
+ ((red & 0xf800)) |
+ ((green & 0xfc00) >> 5) | ((blue & 0xf800) >> 11);
+@@ -254,26 +236,113 @@
+ return 0;
+ }
+
++static int hitfb_sync(struct fb_info *info)
++{
++ hitfb_accel_wait();
++
++ return 0;
++}
++
++static int hitfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
++{
++ int maxy;
++
++ var->xres = info->var.xres;
++ var->xres_virtual = info->var.xres;
++ var->yres = info->var.yres;
++
++ if ((var->bits_per_pixel != 8) && (var->bits_per_pixel != 16))
++ var->bits_per_pixel = info->var.bits_per_pixel;
++
++ if (var->yres_virtual < var->yres)
++ var->yres_virtual = var->yres;
++
++ maxy = info->fix.smem_len / var->xres;
++
++ if (var->bits_per_pixel == 16)
++ maxy /= 2;
++
++ if (var->yres_virtual > maxy)
++ var->yres_virtual = maxy;
++
++ var->xoffset = 0;
++ var->yoffset = 0;
++
++ switch (var->bits_per_pixel) {
++ case 8:
++ var->red.offset = 0;
++ var->red.length = 8;
++ var->green.offset = 0;
++ var->green.length = 8;
++ var->blue.offset = 0;
++ var->blue.length = 8;
++ var->transp.offset = 0;
++ var->transp.length = 0;
++ break;
++ case 16: /* RGB 565 */
++ var->red.offset = 11;
++ var->red.length = 5;
++ var->green.offset = 5;
++ var->green.length = 6;
++ var->blue.offset = 0;
++ var->blue.length = 5;
++ var->transp.offset = 0;
++ var->transp.length = 0;
++ break;
++ }
++
++ return 0;
++}
++
++static int hitfb_set_par(struct fb_info *info)
++{
++ unsigned short ldr3;
++
++ switch (info->var.bits_per_pixel) {
++ case 8:
++ info->fix.line_length = info->var.xres;
++ info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
++ info->fix.ypanstep = 16;
++ break;
++ case 16:
++ info->fix.line_length = info->var.xres*2;
++ info->fix.visual = FB_VISUAL_TRUECOLOR;
++ info->fix.ypanstep = 8;
++ break;
++ }
++
++ fb_writew(info->fix.line_length, HD64461_LCDCLOR);
++ ldr3 = fb_readw(HD64461_LDR3);
++ ldr3 &= ~15;
++ ldr3 |= (info->var.bits_per_pixel == 8) ? 4 : 8;
++ fb_writew(ldr3, HD64461_LDR3);
++ return 0;
++}
++
+ static struct fb_ops hitfb_ops = {
+ .owner = THIS_MODULE,
++ .fb_check_var = hitfb_check_var,
++ .fb_set_par = hitfb_set_par,
+ .fb_setcolreg = hitfb_setcolreg,
+ .fb_blank = hitfb_blank,
++ .fb_sync = hitfb_sync,
+ .fb_pan_display = hitfb_pan_display,
+ .fb_fillrect = hitfb_fillrect,
+ .fb_copyarea = hitfb_copyarea,
+ .fb_imageblit = cfb_imageblit,
+ };
+
+-int __init hitfb_init(void)
++static int __init hitfb_probe(struct platform_device *dev)
+ {
+ unsigned short lcdclor, ldr3, ldvndr;
+- int size;
+
+ if (fb_get_options("hitfb", NULL))
+ return -ENODEV;
+
++ hitfb_fix.mmio_start = CONFIG_HD64461_IOBASE+0x1000;
++ hitfb_fix.mmio_len = 0x1000;
+ hitfb_fix.smem_start = CONFIG_HD64461_IOBASE + 0x02000000;
+- hitfb_fix.smem_len = (MACH_HP690) ? 1024 * 1024 : 512 * 1024;
++ hitfb_fix.smem_len = 512 * 1024;
+
+ lcdclor = fb_readw(HD64461_LCDCLOR);
+ ldvndr = fb_readw(HD64461_LDVNDR);
+@@ -323,12 +392,12 @@
+ fb_info.var = hitfb_var;
+ fb_info.fix = hitfb_fix;
+ fb_info.pseudo_palette = pseudo_palette;
+- fb_info.flags = FBINFO_DEFAULT;
++ fb_info.flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN |
++ FBINFO_HWACCEL_FILLRECT | FBINFO_HWACCEL_COPYAREA;
+
+ fb_info.screen_base = (void *)hitfb_fix.smem_start;
+
+- size = (fb_info.var.bits_per_pixel == 8) ? 256 : 16;
+- fb_alloc_cmap(&fb_info.cmap, size, 0);
++ fb_alloc_cmap(&fb_info.cmap, 256, 0);
+
+ if (register_framebuffer(&fb_info) < 0)
+ return -EINVAL;
+@@ -338,9 +407,75 @@
+ return 0;
+ }
+
++static int __devexit hitfb_remove(struct platform_device *dev)
++{
++ return unregister_framebuffer(&fb_info);
++}
++
++#ifdef CONFIG_PM
++static int hitfb_suspend(struct platform_device *dev, pm_message_t state)
++{
++ u16 v;
++
++ hitfb_blank(1,0);
++ v = fb_readw(HD64461_STBCR);
++ v |= HD64461_STBCR_SLCKE_IST;
++ fb_writew(v, HD64461_STBCR);
++
++ return 0;
++}
++
++static int hitfb_resume(struct platform_device *dev)
++{
++ u16 v;
++
++ v = fb_readw(HD64461_STBCR);
++ v &= ~HD64461_STBCR_SLCKE_OST;
++ msleep(100);
++ v = fb_readw(HD64461_STBCR);
++ v &= ~HD64461_STBCR_SLCKE_IST;
++ fb_writew(v, HD64461_STBCR);
++ hitfb_blank(0,0);
++
++ return 0;
++}
++#endif
++
++static struct platform_driver hitfb_driver = {
++ .probe = hitfb_probe,
++ .remove = __devexit_p(hitfb_remove),
++#ifdef CONFIG_PM
++ .suspend = hitfb_suspend,
++ .resume = hitfb_resume,
++#endif
++ .driver = {
++ .name = "hitfb",
++ },
++};
++
++static struct platform_device hitfb_device = {
++ .name = "hitfb",
++ .id = -1,
++};
++
++static int __init hitfb_init(void)
++{
++ int ret;
++
++ ret = platform_driver_register(&hitfb_driver);
++ if (!ret) {
++ ret = platform_device_register(&hitfb_device);
++ if (ret)
++ platform_driver_unregister(&hitfb_driver);
++ }
++ return ret;
++}
++
++
+ static void __exit hitfb_exit(void)
+ {
+- unregister_framebuffer(&fb_info);
++ platform_device_unregister(&hitfb_device);
++ platform_driver_unregister(&hitfb_driver);
+ }
+
+ module_init(hitfb_init);
+diff -ruN linux-2.6.17-vanilla/drivers/video/pvr2fb.c linux-2.6.17/drivers/video/pvr2fb.c
+--- linux-2.6.17-vanilla/drivers/video/pvr2fb.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/video/pvr2fb.c 2006-07-12 16:54:25.000000000 +0000
+@@ -189,7 +189,7 @@
+ static unsigned int is_blanked = 0; /* Is the screen blanked? */
+
+ #ifdef CONFIG_SH_STORE_QUEUES
+-static struct sq_mapping *pvr2fb_map;
++static unsigned long pvr2fb_map;
+ #endif
+
+ #ifdef CONFIG_SH_DMA
+@@ -215,15 +215,17 @@
+ static int pvr2_init_cable(void);
+ static int pvr2_get_param(const struct pvr2_params *p, const char *s,
+ int val, int size);
++#ifdef CONFIG_SH_DMA
+ static ssize_t pvr2fb_write(struct file *file, const char *buf,
+ size_t count, loff_t *ppos);
++#endif
+
+ static struct fb_ops pvr2fb_ops = {
+- .owner = THIS_MODULE,
+- .fb_setcolreg = pvr2fb_setcolreg,
+- .fb_blank = pvr2fb_blank,
+- .fb_check_var = pvr2fb_check_var,
+- .fb_set_par = pvr2fb_set_par,
++ .owner = THIS_MODULE,
++ .fb_setcolreg = pvr2fb_setcolreg,
++ .fb_blank = pvr2fb_blank,
++ .fb_check_var = pvr2fb_check_var,
++ .fb_set_par = pvr2fb_set_par,
+ #ifdef CONFIG_SH_DMA
+ .fb_write = pvr2fb_write,
+ #endif
+@@ -785,7 +787,7 @@
+ goto out_err;
+ }
+
+- fb_memset((unsigned long)fb_info->screen_base, 0, pvr2_fix.smem_len);
++ fb_memset(fb_info->screen_base, 0, pvr2_fix.smem_len);
+
+ pvr2_fix.ypanstep = nopan ? 0 : 1;
+ pvr2_fix.ywrapstep = nowrap ? 0 : 1;
+@@ -822,7 +824,7 @@
+ modememused >> 10, (unsigned long)(fb_info->fix.smem_len >> 10));
+ printk("fb%d: Mode %dx%d-%d pitch = %ld cable: %s video output: %s\n",
+ fb_info->node, fb_info->var.xres, fb_info->var.yres,
+- fb_info->var.bits_per_pixel,
++ fb_info->var.bits_per_pixel,
+ get_line_length(fb_info->var.xres, fb_info->var.bits_per_pixel),
+ (char *)pvr2_get_param(cables, NULL, cable_type, 3),
+ (char *)pvr2_get_param(outputs, NULL, video_output, 3));
+@@ -831,10 +833,10 @@
+ printk(KERN_NOTICE "fb%d: registering with SQ API\n", fb_info->node);
+
+ pvr2fb_map = sq_remap(fb_info->fix.smem_start, fb_info->fix.smem_len,
+- fb_info->fix.id);
++ fb_info->fix.id, pgprot_val(PAGE_SHARED));
+
+ printk(KERN_NOTICE "fb%d: Mapped video memory to SQ addr 0x%lx\n",
+- fb_info->node, pvr2fb_map->sq_addr);
++ fb_info->node, pvr2fb_map);
+ #endif
+
+ return 0;
+diff -ruN linux-2.6.17-vanilla/drivers/video/voyager/CVS/Entries linux-2.6.17/drivers/video/voyager/CVS/Entries
+--- linux-2.6.17-vanilla/drivers/video/voyager/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/video/voyager/CVS/Entries 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,9 @@
++/Makefile/1.2/Tue May 31 14:19:09 2005/-ko/
++/voyager_alphafb.c/1.2/Wed Feb 8 22:08:10 2006/-ko/
++/voyager_crtcsrfb.c/1.2/Wed Feb 8 22:08:10 2006/-ko/
++/voyager_crtfb.c/1.2/Wed Feb 8 22:08:10 2006/-ko/
++/voyager_gxfb.c/1.4/Wed Feb 8 22:08:10 2006/-ko/
++/voyager_panelcsrfb.c/1.2/Wed Feb 8 22:08:10 2006/-ko/
++/voyager_valphafb.c/1.2/Wed Feb 8 22:08:10 2006/-ko/
++/voyager_videofb.c/1.2/Wed Feb 8 22:08:10 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/drivers/video/voyager/CVS/Repository linux-2.6.17/drivers/video/voyager/CVS/Repository
+--- linux-2.6.17-vanilla/drivers/video/voyager/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/video/voyager/CVS/Repository 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1 @@
++linux/drivers/video/voyager
+diff -ruN linux-2.6.17-vanilla/drivers/video/voyager/CVS/Root linux-2.6.17/drivers/video/voyager/CVS/Root
+--- linux-2.6.17-vanilla/drivers/video/voyager/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/video/voyager/CVS/Root 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/drivers/video/voyager/Makefile linux-2.6.17/drivers/video/voyager/Makefile
+--- linux-2.6.17-vanilla/drivers/video/voyager/Makefile 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/video/voyager/Makefile 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,13 @@
++#
++# Makefile for the VoyagerGX framebuffer driver
++#
++
++my-obj-$(CONFIG_FB_VOYAGER_GX_MP) += voyager_alphafb.o \
++ voyager_crtcsrfb.o \
++ voyager_crtfb.o \
++ voyager_panelcsrfb.o \
++ voyager_valphafb.o \
++ voyager_videofb.o
++
++obj-$(CONFIG_FB_VOYAGER_GX) += voyager_gxfb.o $(my-obj-y)
++
+diff -ruN linux-2.6.17-vanilla/drivers/video/voyager/voyager_alphafb.c linux-2.6.17/drivers/video/voyager/voyager_alphafb.c
+--- linux-2.6.17-vanilla/drivers/video/voyager/voyager_alphafb.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/video/voyager/voyager_alphafb.c 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,282 @@
++/*
++ * linux/drivers/video/voyager_alphafb.c -- voyager alpha frame buffer driver
++ *
++ * Copyright (C) 2003 Renesas Technology Sales Co.,Ltd.
++ * Copyright (C) 2003 Atom Create Engineering Co.,Ltd.
++ * Anthor : Atom Create Engineering Co.,Ltd.
++ * Kenichi Sakuma
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file COPYING in the main directory of this archive for
++ * more details.
++ *
++ * 1.00
++ * - initial version (ks)
++ * 1.01
++ * - Kernel 2.6 correspondence
++ */
++#include <linux/config.h>
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/string.h>
++#include <linux/mm.h>
++#include <linux/tty.h>
++#include <linux/slab.h>
++#include <linux/vmalloc.h>
++#include <linux/delay.h>
++#include <linux/interrupt.h>
++#include <linux/fb.h>
++#include <linux/init.h>
++#include <asm/io.h>
++#include <asm/irq.h>
++#include <asm/mach/voyagergx_reg.h>
++#include <video/voyager.h>
++
++static struct fb_info voyafb_info;
++
++int voyafb_init4(void);
++static int voyafb_check_var(struct fb_var_screeninfo *var,
++ struct fb_info *info);
++static int voyafb_set_par(struct fb_info *info);
++static int voyafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
++ u_int transp, struct fb_info *info);
++static int voyafb_blank(int blank, struct fb_info *info);
++static int voyafb_ioctl(struct inode*, struct file*,
++ unsigned int, unsigned long, struct fb_info*);
++static int change_mode(struct fb_var_screeninfo *var);
++
++static unsigned int pseudo_palette[16];
++
++static struct fb_ops voyafb_ops = {
++ .owner = THIS_MODULE,
++ .fb_check_var = voyafb_check_var,
++ .fb_set_par = voyafb_set_par,
++ .fb_setcolreg = voyafb_setcolreg,
++ .fb_blank = voyafb_blank,
++ .fb_fillrect = cfb_fillrect,
++ .fb_copyarea = cfb_copyarea,
++ .fb_imageblit = cfb_imageblit,
++ .fb_ioctl = voyafb_ioctl,
++};
++
++static struct fb_var_screeninfo voyafb_var __initdata = {
++ .xres = XRES,
++ .yres = YRES,
++ .xres_virtual = XRES,
++ .yres_virtual = YRES,
++ .bits_per_pixel = BPP,
++ .red = { 11,5,0 },
++ .green = { 5,6,0 },
++ .blue = { 0,5,0 },
++ .height = -1,
++ .width = -1,
++ .vmode = FB_VMODE_NONINTERLACED,
++ .pixclock = 10000,
++ .left_margin = 16,
++ .right_margin = 16,
++ .upper_margin = 16,
++ .lower_margin = 16,
++ .hsync_len = 8,
++ .vsync_len = 8,
++};
++
++static int voyafb_check_var(struct fb_var_screeninfo *var,
++ struct fb_info *info)
++{
++ if (var->xres > XRES || var->yres > YRES
++ || var->xres_virtual > XRES || var->yres_virtual > YRES
++ || var->bits_per_pixel != BPP
++ || var->nonstd
++ || (var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED)
++ return -EINVAL;
++
++ var->xres_virtual = XRES;
++ var->yres_virtual = YRES;
++
++ if(change_mode(var) != 0) {
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
++static int voyafb_set_par(struct fb_info *info)
++{
++ info->fix.line_length = XRES*2;
++ info->fix.visual = FB_VISUAL_TRUECOLOR;
++
++ info->var.red.offset = 11;
++ info->var.green.offset = 5;
++ info->var.blue.offset = 0;
++ info->var.red.length = info->var.blue.length = 5;
++ info->var.green.length = 6;
++ return 0;
++}
++
++static int voyafb_blank(int blank, struct fb_info *info)
++{
++ return 1;
++}
++
++static int voyafb_setcolreg(unsigned regno, unsigned red, unsigned green,
++ unsigned blue, unsigned transp,
++ struct fb_info* info)
++{
++ red >>= 11;
++ green >>= 11;
++ blue >>= 10;
++
++ if (regno < 16)
++ ((u32 *)(info->pseudo_palette))[regno] = ((red & 31) << 6) |
++ ((green & 31) << 11) |
++ ((blue & 63));
++ return 0;
++}
++
++static int voyafb_ioctl(struct inode* inode, struct file* file,
++ unsigned int cmd, unsigned long arg,
++ struct fb_info* info)
++{
++ if(cmd == VOYAGER_IOCTL_ENABLE) {
++ if(arg == 0) {
++ *(volatile unsigned long *)(ALPHA_DISPLAY_CTRL) &= 0xfffffffb;
++ }
++ else {
++ *(volatile unsigned long *)(ALPHA_DISPLAY_CTRL) |= 0x04;
++ }
++ return 0;
++ }
++ else if(cmd == VOYAGER_IOCTL_ENABLE_CK) {
++ if(arg == 0) {
++ *(volatile unsigned long *)(ALPHA_DISPLAY_CTRL) &= 0xfffffff7;
++ }
++ else {
++ *(volatile unsigned long *)(ALPHA_DISPLAY_CTRL) |= 0x00000008;
++ }
++ return 0;
++ }
++ else if(cmd == VOYAGER_IOCTL_ENABLE_AL) {
++ if(arg == 0) {
++ *(volatile unsigned long *)(ALPHA_DISPLAY_CTRL) &= 0xefffffff;
++ }
++ else {
++ *(volatile unsigned long *)(ALPHA_DISPLAY_CTRL) |= 0x10000000;
++ }
++ return 0;
++ }
++ else if(cmd == VOYAGER_IOCTL_CHKEY) {
++ *(volatile unsigned long *)(ALPHA_CHROMA_KEY) = arg;
++ return 0;
++ }
++ else if(cmd == VOYAGER_IOCTL_TYPE) {
++ *(volatile unsigned long *)(ALPHA_DISPLAY_CTRL) &= 0xfffffffc;
++ *(volatile unsigned long *)(ALPHA_DISPLAY_CTRL) |= (arg & 0x03);
++ return 0;
++ }
++ else if(cmd == VOYAGER_IOCTL_ALPHA) {
++ *(volatile unsigned long *)(ALPHA_DISPLAY_CTRL) &= 0xf0ffffff;
++ *(volatile unsigned long *)(ALPHA_DISPLAY_CTRL) |= (arg & 0x0f) << 24;
++ return 0;
++ }
++ return -EINVAL;
++}
++
++
++static void __init voya_hw_init(void)
++{
++ *(volatile unsigned long *)(ALPHA_FB_ADDRESS) = 0x80000000 + (VOY_VRAM_TOP4 & 0x00ffffff);
++ change_mode(&voyafb_var);
++ *(volatile unsigned long *)(ALPHA_CHROMA_KEY) = 0;
++
++ *(volatile unsigned long *)(ALPHA_DISPLAY_CTRL) &= 0xfffffff0;
++ *(volatile unsigned long *)(ALPHA_DISPLAY_CTRL) |= 0x01;
++
++}
++
++
++
++static struct fb_fix_screeninfo voyafb_fix __initdata = {
++ .id = "VOYAGER ALPHA",
++ .type = FB_TYPE_PACKED_PIXELS,
++ .visual = FB_VISUAL_TRUECOLOR,
++ .accel = FB_ACCEL_NONE,
++ .line_length = XRES*2,
++ .smem_len = MAX_FRAMEBUFFER_MEM_SIZE,
++};
++
++
++static void __init init_voya(struct fb_info *p, unsigned long addr)
++{
++ p->fix = voyafb_fix;
++ p->fix.smem_start = addr;
++
++ p->var = voyafb_var;
++
++ p->fbops = &voyafb_ops;
++ p->flags = FBINFO_FLAG_DEFAULT;
++ p->pseudo_palette = pseudo_palette;
++
++ fb_alloc_cmap(&p->cmap, 16, 0);
++
++ if (register_framebuffer(p) < 0) {
++ printk(KERN_ERR "VOYAGER GX ALPHA framebuffer failed to register\n");
++ return;
++ }
++
++ printk(KERN_INFO "fb%d: VOYAGER GX_ALPHA frame buffer (%dK RAM detected)\n",
++ p->node, p->fix.smem_len / 1024);
++
++ voya_hw_init();
++}
++
++int __init voyafb_init4(void)
++{
++ struct fb_info *p = &voyafb_info;
++ unsigned long addr, size;
++
++ addr = VOY_VRAM_TOP4;
++ size = MAX_FRAMEBUFFER_MEM_SIZE;
++ p->screen_base = ioremap((u_long)addr,
++ ALLOCATED_FB_MEM_SIZE);
++ if (p->screen_base == NULL) {
++ return -ENOMEM;
++ }
++ init_voya(p, addr);
++ memset(p->screen_base, 0, MAX_FRAMEBUFFER_MEM_SIZE);
++
++ return 0;
++}
++
++static void __exit voyafb_exit(void)
++{
++ *(volatile unsigned long *)(ALPHA_DISPLAY_CTRL) &= 0xfffffffb;
++}
++
++
++//------------------------------------------------------------------------------------
++static int change_mode(struct fb_var_screeninfo *var)
++{
++int x,ali;
++
++ if((var->xres < 0)||(var->xres > XRES)||
++ (var->yres < 0)||(var->yres > YRES)||
++ (var->xres_virtual < 0)||(var->xres_virtual > XRES)||
++ (var->yres_virtual < 0)||(var->yres_virtual > YRES)||
++ (var->xoffset < 0)||(var->xoffset > XRES)||
++ (var->yoffset < 0)||(var->yoffset > YRES))
++ {
++ return(-1);
++ }
++ x = var->xres_virtual * 2;
++ ali = x + (x % 16);
++ *(volatile unsigned long *)(ALPHA_FB_WIDTH) = (ali << 16) | ali;
++ *(volatile unsigned long *)(ALPHA_PLANE_TL) = (var->yoffset << 16) |
++ var->xoffset;
++ *(volatile unsigned long *)(ALPHA_PLANE_BR) =
++ ((var->yoffset + var->yres - 1) << 16) |
++ (var->xoffset + var->xres - 1);
++ return(0);
++}
++
++MODULE_LICENSE("GPL");
+diff -ruN linux-2.6.17-vanilla/drivers/video/voyager/voyager_crtcsrfb.c linux-2.6.17/drivers/video/voyager/voyager_crtcsrfb.c
+--- linux-2.6.17-vanilla/drivers/video/voyager/voyager_crtcsrfb.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/video/voyager/voyager_crtcsrfb.c 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,240 @@
++/*
++ * linux/drivers/video/voyager_crtcsrfb.c -- voyager crt HWC frame buffer driver
++ *
++ * Copyright (C) 2003 Renesas Technology Sales Co.,Ltd.
++ * Copyright (C) 2003 Atom Create Engineering Co.,Ltd.
++ * Anthor : Atom Create Engineering Co.,Ltd.
++ * Kenichi Sakuma
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file COPYING in the main directory of this archive for
++ * more details.
++ *
++ * 1.00
++ * - initial version (ks)
++ * 1.01
++ * - Kernel 2.6 correspondence
++ */
++#include <linux/config.h>
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/string.h>
++#include <linux/mm.h>
++#include <linux/tty.h>
++#include <linux/slab.h>
++#include <linux/vmalloc.h>
++#include <linux/delay.h>
++#include <linux/interrupt.h>
++#include <linux/fb.h>
++#include <linux/init.h>
++#include <asm/io.h>
++#include <asm/irq.h>
++#include <asm/mach/voyagergx_reg.h>
++#include <video/voyager.h>
++
++static struct fb_info voyafb_info;
++
++int voyafb_init7(void);
++static int voyafb_check_var(struct fb_var_screeninfo *var,
++ struct fb_info *info);
++static int voyafb_set_par(struct fb_info *info);
++static int voyafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
++ u_int transp, struct fb_info *info);
++static int voyafb_blank(int blank, struct fb_info *info);
++static int voyafb_ioctl(struct inode*, struct file*,
++ unsigned int, unsigned long, struct fb_info*);
++static int change_mode(struct fb_var_screeninfo *var);
++
++static unsigned int pseudo_palette[16];
++
++static struct fb_ops voyafb_ops = {
++ .owner = THIS_MODULE,
++ .fb_check_var = voyafb_check_var,
++ .fb_set_par = voyafb_set_par,
++ .fb_setcolreg = voyafb_setcolreg,
++ .fb_blank = voyafb_blank,
++ .fb_fillrect = cfb_fillrect,
++ .fb_copyarea = cfb_copyarea,
++ .fb_imageblit = cfb_imageblit,
++ .fb_ioctl = voyafb_ioctl,
++};
++
++static struct fb_var_screeninfo voyafb_var __initdata = {
++ .xres = CSR_XRES,
++ .yres = CSR_YRES,
++ .xres_virtual = CSR_XRES,
++ .yres_virtual = CSR_YRES,
++ .bits_per_pixel = CSR_BPP,
++ .red = { 11,5,0 },
++ .green = { 5,6,0 },
++ .blue = { 0,5,0 },
++ .height = -1,
++ .width = -1,
++ .vmode = FB_VMODE_NONINTERLACED,
++ .pixclock = 10000,
++ .left_margin = 16,
++ .right_margin = 16,
++ .upper_margin = 16,
++ .lower_margin = 16,
++ .hsync_len = 8,
++ .vsync_len = 8,
++};
++
++static int voyafb_check_var(struct fb_var_screeninfo *var,
++ struct fb_info *info)
++{
++ if (var->xres > CSR_XRES || var->yres > CSR_YRES
++ || var->xres_virtual > CSR_XRES || var->yres_virtual > CSR_YRES
++ || var->bits_per_pixel != CSR_BPP
++ || var->nonstd
++ || (var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED)
++ return -EINVAL;
++
++ var->xres = var->xres_virtual = CSR_XRES;
++ var->yres = var->yres_virtual = CSR_YRES;
++ if(change_mode(var) != 0) {
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
++static int voyafb_set_par(struct fb_info *info)
++{
++ info->fix.line_length = CSR_XRES/2;
++ info->fix.visual = FB_VISUAL_TRUECOLOR;
++
++ info->var.red.offset = 11;
++ info->var.green.offset = 5;
++ info->var.blue.offset = 0;
++ info->var.red.length = info->var.blue.length = 5;
++ info->var.green.length = 6;
++ return 0;
++}
++
++static int voyafb_blank(int blank, struct fb_info *info)
++{
++ return 1;
++}
++
++static int voyafb_setcolreg(unsigned regno, unsigned red, unsigned green,
++ unsigned blue, unsigned transp,
++ struct fb_info* info)
++{
++ red >>= 11;
++ green >>= 11;
++ blue >>= 10;
++
++ if (regno < 16)
++ ((u32 *)(info->pseudo_palette))[regno] = ((red & 31) << 6) |
++ ((green & 31) << 11) |
++ ((blue & 63));
++ return 0;
++}
++
++static int voyafb_ioctl(struct inode* inode, struct file* file,
++ unsigned int cmd, unsigned long arg,
++ struct fb_info* info)
++{
++ if(cmd == VOYAGER_IOCTL_ENABLE) {
++ if(arg == 0) {
++ *(volatile unsigned long *)(CRT_HWC_ADDRESS) &= 0x7fffffff;
++ }
++ else {
++ *(volatile unsigned long *)(CRT_HWC_ADDRESS) |= 0x80000000;
++ }
++ return 0;
++ }
++ else if(cmd == VOYAGER_IOCTL_COLOR_1) {
++ *(volatile unsigned long *)(CRT_HWC_COLOR_12) = arg;
++ return 0;
++ }
++ else if(cmd == VOYAGER_IOCTL_COLOR_2) {
++ *(volatile unsigned long *)(CRT_HWC_COLOR_3) = arg;
++ return 0;
++ }
++ return -EINVAL;
++}
++
++
++static void __init voya_hw_init(void)
++{
++ *(volatile unsigned long *)(CRT_HWC_ADDRESS) = (VOY_VRAM_TOP5 & 0x00ffffff);
++ *(volatile unsigned long *)(CRT_HWC_COLOR_12) = 0x5555aaaa;
++ *(volatile unsigned long *)(CRT_HWC_COLOR_3) = 0x0000ffff;
++ change_mode(&voyafb_var);
++}
++
++
++
++static struct fb_fix_screeninfo voyafb_fix __initdata = {
++ .id = "VOYAGER C_CSR",
++ .type = FB_TYPE_PACKED_PIXELS,
++ .visual = FB_VISUAL_TRUECOLOR,
++ .accel = FB_ACCEL_NONE,
++ .line_length = CSR_XRES/2,
++ .smem_len = MAX_HWC_MEM_SIZE,
++};
++
++
++static void __init init_voya(struct fb_info *p, unsigned long addr)
++{
++ p->fix = voyafb_fix;
++ p->fix.smem_start = addr;
++
++ p->var = voyafb_var;
++
++ p->fbops = &voyafb_ops;
++ p->flags = FBINFO_FLAG_DEFAULT;
++ p->pseudo_palette = pseudo_palette;
++
++ fb_alloc_cmap(&p->cmap, 16, 0);
++
++ if (register_framebuffer(p) < 0) {
++ printk(KERN_ERR "VOYAGER GX CRT CSR framebuffer failed to register\n");
++ return;
++ }
++
++ printk(KERN_INFO "fb%d: VOYAGER GX_CRT CSR frame buffer (%dK RAM detected)\n",
++ p->node, p->fix.smem_len / 1024);
++
++ voya_hw_init();
++}
++
++int __init voyafb_init7(void)
++{
++ struct fb_info *p = &voyafb_info;
++ unsigned long addr, size;
++
++ addr = VOY_VRAM_TOP6;
++ size = MAX_HWC_MEM_SIZE;
++ p->screen_base = ioremap((u_long)addr,
++ ALLOCATED_FB_MEM_SIZE);
++ if (p->screen_base == NULL) {
++ return -ENOMEM;
++ }
++ init_voya(p, addr);
++ memset(p->screen_base, 0, MAX_HWC_MEM_SIZE);
++
++ return 0;
++}
++
++static void __exit voyafb_exit(void)
++{
++ *(volatile unsigned long *)(CRT_HWC_ADDRESS) &= 0x7fffffff;
++}
++
++static int change_mode(struct fb_var_screeninfo *var)
++{
++ if((var->xoffset < 0)||(var->xoffset > XRES)||
++ (var->yoffset < 0)||(var->yoffset > YRES))
++ {
++ return(-1);
++ }
++ *(volatile unsigned long *)(CRT_HWC_LOCATION) = (var->yoffset << 16) |
++ var->xoffset;
++ return(0);
++}
++
++MODULE_LICENSE("GPL");
+diff -ruN linux-2.6.17-vanilla/drivers/video/voyager/voyager_crtfb.c linux-2.6.17/drivers/video/voyager/voyager_crtfb.c
+--- linux-2.6.17-vanilla/drivers/video/voyager/voyager_crtfb.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/video/voyager/voyager_crtfb.c 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,240 @@
++/*
++ * linux/drivers/video/voyager_crtfb.c -- voyager crt frame buffer driver
++ *
++ * Copyright (C) 2003 Renesas Technology Sales Co.,Ltd.
++ * Copyright (C) 2003 Atom Create Engineering Co.,Ltd.
++ * Anthor : Atom Create Engineering Co.,Ltd.
++ * Kenichi Sakuma
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file COPYING in the main directory of this archive for
++ * more details.
++ *
++ * 1.00
++ * - initial version (ks)
++ * 1.01
++ * - Kernel 2.6 correspondence
++ */
++#include <linux/config.h>
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/string.h>
++#include <linux/mm.h>
++#include <linux/tty.h>
++#include <linux/slab.h>
++#include <linux/vmalloc.h>
++#include <linux/delay.h>
++#include <linux/interrupt.h>
++#include <linux/fb.h>
++#include <linux/init.h>
++#include <asm/io.h>
++#include <asm/irq.h>
++#include <asm/mach/voyagergx_reg.h>
++#include <video/voyager.h>
++
++static struct fb_info voyafb_info;
++
++int voyafb_init6(void);
++static int voyafb_check_var(struct fb_var_screeninfo *var,
++ struct fb_info *info);
++static int voyafb_set_par(struct fb_info *info);
++static int voyafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
++ u_int transp, struct fb_info *info);
++static int voyafb_blank(int blank, struct fb_info *info);
++static int voyafb_ioctl(struct inode*, struct file*,
++ unsigned int, unsigned long, struct fb_info*);
++
++static unsigned int pseudo_palette[16];
++
++static struct fb_ops voyafb_ops = {
++ .owner = THIS_MODULE,
++ .fb_check_var = voyafb_check_var,
++ .fb_set_par = voyafb_set_par,
++ .fb_setcolreg = voyafb_setcolreg,
++ .fb_blank = voyafb_blank,
++ .fb_fillrect = cfb_fillrect,
++ .fb_copyarea = cfb_copyarea,
++ .fb_imageblit = cfb_imageblit,
++ .fb_ioctl = voyafb_ioctl,
++};
++
++static struct fb_var_screeninfo voyafb_var __initdata = {
++ .xres = XRES,
++ .yres = YRES,
++ .xres_virtual = XRES,
++ .yres_virtual = YRES,
++ .bits_per_pixel = BPP,
++ .red = { 11,5,0 },
++ .green = { 5,6,0 },
++ .blue = { 0,5,0 },
++ .height = -1,
++ .width = -1,
++ .vmode = FB_VMODE_NONINTERLACED,
++ .pixclock = 10000,
++ .left_margin = 16,
++ .right_margin = 16,
++ .upper_margin = 16,
++ .lower_margin = 16,
++ .hsync_len = 8,
++ .vsync_len = 8,
++};
++
++static int voyafb_check_var(struct fb_var_screeninfo *var,
++ struct fb_info *info)
++{
++ if (var->xres > XRES || var->yres > YRES
++ || var->xres_virtual > XRES || var->yres_virtual > YRES
++ || var->bits_per_pixel != BPP
++ || var->nonstd
++ || (var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED)
++ return -EINVAL;
++
++ var->xres = var->xres_virtual = XRES;
++ var->yres = var->yres_virtual = YRES;
++
++ return 0;
++}
++
++static int voyafb_set_par(struct fb_info *info)
++{
++ info->fix.line_length = XRES*2;
++ info->fix.visual = FB_VISUAL_TRUECOLOR;
++
++ info->var.red.offset = 11;
++ info->var.green.offset = 5;
++ info->var.blue.offset = 0;
++ info->var.red.length = info->var.blue.length = 5;
++ info->var.green.length = 6;
++ return 0;
++}
++
++static int voyafb_blank(int blank, struct fb_info *info)
++{
++ return 1;
++}
++
++static int voyafb_setcolreg(unsigned regno, unsigned red, unsigned green,
++ unsigned blue, unsigned transp,
++ struct fb_info* info)
++{
++ red >>= 11;
++ green >>= 11;
++ blue >>= 10;
++
++ if (regno < 16)
++ ((u32 *)(info->pseudo_palette))[regno] = ((red & 31) << 6) |
++ ((green & 31) << 11) |
++ ((blue & 63));
++ return 0;
++}
++
++static int voyafb_ioctl(struct inode* inode, struct file* file,
++ unsigned int cmd, unsigned long arg,
++ struct fb_info* info)
++{
++ if(cmd == VOYAGER_IOCTL_ENABLE) {
++ if(arg == 0) {
++ *(volatile unsigned long *)(CRT_DISPLAY_CTRL) &= 0xfffffffb;
++ }
++ else {
++ *(volatile unsigned long *)(CRT_DISPLAY_CTRL) |= 0x04;
++ }
++ return 0;
++ }
++ else if(cmd == VOYAGER_IOCTL_TYPE) {
++ *(volatile unsigned long *)(CRT_DISPLAY_CTRL) &= 0xfffffffc;
++ *(volatile unsigned long *)(CRT_DISPLAY_CTRL) |= (arg & 0x03);
++ return 0;
++ }
++ else if(cmd == VOYAGER_IOCTL_SELECT) {
++ if(arg == 0) {
++ *(volatile unsigned long *)(CRT_DISPLAY_CTRL) &= 0xfffffdff;
++ }
++ else {
++ *(volatile unsigned long *)(CRT_DISPLAY_CTRL) |= 0x00000200;
++ }
++ return 0;
++ }
++ return -EINVAL;
++}
++
++
++static void __init voya_hw_init(void)
++{
++int i;
++
++ *(volatile unsigned long *)(CRT_DISPLAY_CTRL) &= 0xfffffcf0;
++ *(volatile unsigned long *)(CRT_FB_ADDRESS) = 0x80000000 + (VOY_VRAM_TOP6 & 0x00ffffff);
++ *(volatile unsigned long *)(CRT_FB_WIDTH) = 0x5000500;
++ *(volatile unsigned long *)(CRT_HORIZONTAL_TOTAL) = 0x033f027f;
++ *(volatile unsigned long *)(CRT_HORIZONTAL_SYNC) = 0x4a028b;
++ *(volatile unsigned long *)(CRT_VERTICAL_TOTAL) = 0x20c01df;
++ *(volatile unsigned long *)(CRT_VERTICAL_SYNC) = 0x201e9;
++ *(volatile unsigned long *)(CRT_DISPLAY_CTRL) |= 0x70000105;
++ //palet initialize
++ for(i=0;i<256;i++) {
++ *(volatile unsigned long *)(CRT_PALETTE_RAM+(i*4)) = (i << 16)+(i << 8)+i;
++ }
++}
++
++
++
++static struct fb_fix_screeninfo voyafb_fix __initdata = {
++ .id = "VOYAGER CRT",
++ .type = FB_TYPE_PACKED_PIXELS,
++ .visual = FB_VISUAL_TRUECOLOR,
++ .accel = FB_ACCEL_NONE,
++ .line_length = XRES*2,
++ .smem_len = MAX_FRAMEBUFFER_MEM_SIZE,
++};
++
++
++static void __init init_voya(struct fb_info *p, unsigned long addr)
++{
++ p->fix = voyafb_fix;
++ p->fix.smem_start = addr;
++
++ p->var = voyafb_var;
++
++ p->fbops = &voyafb_ops;
++ p->flags = FBINFO_FLAG_DEFAULT;
++ p->pseudo_palette = pseudo_palette;
++
++ fb_alloc_cmap(&p->cmap, 16, 0);
++
++ if (register_framebuffer(p) < 0) {
++ printk(KERN_ERR "VOYAGER GX CRT framebuffer failed to register\n");
++ return;
++ }
++
++ printk(KERN_INFO "fb%d: VOYAGER GX_CRT frame buffer (%dK RAM detected)\n",
++ p->node, p->fix.smem_len / 1024);
++
++ voya_hw_init();
++}
++
++int __init voyafb_init6(void)
++{
++ struct fb_info *p = &voyafb_info;
++ unsigned long addr, size;
++
++ addr = VOY_VRAM_TOP6;
++ size = MAX_FRAMEBUFFER_MEM_SIZE;
++ p->screen_base = ioremap((u_long)addr,
++ ALLOCATED_FB_MEM_SIZE);
++ if (p->screen_base == NULL) {
++ return -ENOMEM;
++ }
++ init_voya(p, addr);
++ memset(p->screen_base, 0, MAX_FRAMEBUFFER_MEM_SIZE);
++
++ return 0;
++}
++
++static void __exit voyafb_exit(void)
++{
++ *(volatile unsigned long *)(CRT_DISPLAY_CTRL) &= 0xfffffffb;
++}
++
++MODULE_LICENSE("GPL");
+diff -ruN linux-2.6.17-vanilla/drivers/video/voyager/voyager_gxfb.c linux-2.6.17/drivers/video/voyager/voyager_gxfb.c
+--- linux-2.6.17-vanilla/drivers/video/voyager/voyager_gxfb.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/video/voyager/voyager_gxfb.c 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,441 @@
++/*
++ * linux/drivers/video/voyager_gxfb.c -- voyager panel frame buffer driver
++ *
++ * Copyright (C) 2003 Renesas Technology Sales Co.,Ltd.
++ * Copyright (C) 2003 Atom Create Engineering Co.,Ltd.
++ * Anthor : Atom Create Engineering Co.,Ltd.
++ * Kenichi Sakuma
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file COPYING in the main directory of this archive for
++ * more details.
++ *
++ * 1.00
++ * - initial version (ks)
++ * 1.01
++ * - Kernel 2.6 correspondence
++ */
++#include <linux/config.h>
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/string.h>
++#include <linux/mm.h>
++#include <linux/tty.h>
++#include <linux/slab.h>
++#include <linux/vmalloc.h>
++#include <linux/delay.h>
++#include <linux/interrupt.h>
++#include <linux/fb.h>
++#include <linux/init.h>
++#include <asm/io.h>
++#include <asm/irq.h>
++#include <asm/mach/voyagergx_reg.h>
++#include <video/voyager.h>
++
++#ifdef CONFIG_FB_VOYAGER_GX_MP
++#define MAX_VRAM MAX_FRAMEBUFFER_MEM_SIZE
++#else
++#define MAX_VRAM 1024*768*4
++#endif
++
++#ifdef CONFIG_FB_VOYAGER_GX_MP
++extern int voyafb_init2(void);
++extern int voyafb_init3(void);
++extern int voyafb_init4(void);
++extern int voyafb_init5(void);
++extern int voyafb_init6(void);
++extern int voyafb_init7(void);
++#endif
++
++static struct fb_info voyafb_info;
++
++static int voyafb_init(void);
++static int voyafbmem_init(void);
++static int voyafb_check_var(struct fb_var_screeninfo *var,
++ struct fb_info *info);
++static int voyafb_set_par(struct fb_info *info);
++static int voyafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
++ u_int transp, struct fb_info *info);
++static int voyafb_blank(int blank, struct fb_info *info);
++static int voyafb_ioctl(struct inode*, struct file*,
++ unsigned int, unsigned long, struct fb_info*);
++static int voyafb_pan_display(struct fb_var_screeninfo *var,
++ struct fb_info *info);
++static void vsyncwait(int delay);
++static int change_mode(void);
++
++typedef struct {
++ __u32 xres;
++ __u32 yres;
++ __u32 clock;
++ __u32 h_total;
++ __u32 h_sync;
++ __u32 v_total;
++ __u32 v_sync;
++} VOYA_CRT_DATA;
++
++static VOYA_CRT_DATA clock_data[] = {
++ { 640, 480, 0x10021801, 0x33f027f, 0x4a028b, 0x20c01df, 0x201e9, },
++ { 800, 600, 0x023a1801, 0x454031f, 0x9b0350, 0x2730257, 0x40258, },
++ {1024, 768, 0x283a1801, 0x5460400, 0x800438, 0x3340300, 0x3031b, },
++ {-1, -1, -1, -1, -1, -1, -1, },
++};
++static int clock_data_index = 0;
++static int clock_data_bpp = BPP;
++
++static unsigned int pseudo_palette[17];
++
++static struct fb_ops voyafb_ops = {
++ .owner = THIS_MODULE,
++ .fb_check_var = voyafb_check_var,
++ .fb_set_par = voyafb_set_par,
++ .fb_setcolreg = voyafb_setcolreg,
++ .fb_blank = voyafb_blank,
++ .fb_fillrect = cfb_fillrect,
++ .fb_copyarea = cfb_copyarea,
++ .fb_imageblit = cfb_imageblit,
++ .fb_ioctl = voyafb_ioctl,
++ .fb_pan_display = voyafb_pan_display,
++};
++
++static struct fb_var_screeninfo voyafb_var __initdata = {
++ .xres = XRES,
++ .yres = YRES,
++ .xres_virtual = XRES,
++ .yres_virtual = YRES,
++ .bits_per_pixel = BPP,
++ .red = { 11,5,0 },
++ .green = { 5,6,0 },
++ .blue = { 0,5,0 },
++ .height = -1,
++ .width = -1,
++ .vmode = FB_VMODE_NONINTERLACED,
++ .pixclock = 10000,
++ .left_margin = 0,
++ .right_margin = 0,
++ .upper_margin = 0,
++ .lower_margin = 0,
++ .hsync_len = 0,
++ .vsync_len = 0,
++};
++
++static int voyafb_pan_display(struct fb_var_screeninfo *var,
++ struct fb_info *info)
++{
++ info->var.xoffset = 0;
++ info->var.yoffset = 0;
++ info->var.vmode &= ~FB_VMODE_YWRAP;
++
++ return 0;
++}
++
++static int voyafb_check_var(struct fb_var_screeninfo *var,
++ struct fb_info *info)
++{
++#ifndef CONFIG_FB_VOYAGER_GX_MP
++ int i;
++#endif
++
++#ifdef CONFIG_FB_VOYAGER_GX_MP
++ if (var->xres > XRES || var->yres > YRES
++ || var->xres_virtual > XRES || var->yres_virtual > YRES
++ || var->bits_per_pixel != BPP
++ || var->nonstd
++ || (var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED)
++ return -EINVAL;
++
++ var->xres = var->xres_virtual = XRES;
++ var->yres = var->yres_virtual = YRES;
++#else
++ if ((var->bits_per_pixel != 8) &&
++ (var->bits_per_pixel != 16) &&
++ (var->bits_per_pixel != 32))
++ return -EINVAL;
++
++ for (i=0; clock_data[i].xres != -1; i++)
++ if ((clock_data[i].xres == var->xres) &&
++ (clock_data[i].yres == var->yres))
++ break;
++
++ if (clock_data[i].xres == -1)
++ return -EINVAL;
++
++ clock_data_index = i;
++ clock_data_bpp = var->bits_per_pixel;
++#endif
++
++ return 0;
++}
++
++static int voyafb_set_par(struct fb_info *info)
++{
++#ifdef CONFIG_FB_VOYAGER_GX_MP
++ info->fix.line_length = XRES * 2;
++ info->fix.visual = FB_VISUAL_TRUECOLOR;
++
++ info->var.bits_per_pixel = 16;
++ info->var.red.offset = 11;
++ info->var.green.offset = 5;
++ info->var.blue.offset = 0;
++ info->var.red.length = info->var.blue.length = 5;
++ info->var.green.length = 6;
++#else
++ if (clock_data_bpp == 8) {
++ info->fix.line_length = clock_data[clock_data_index].xres;
++ info->var.transp.offset = 0;
++ info->var.transp.length = 0;
++ info->var.red.length = info->var.blue.length = info->var.green.length = 8;
++ info->var.red.offset = info->var.blue.offset = info->var.green.offset = 0;
++ info->var.bits_per_pixel = 8;
++ info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
++ } else if (clock_data_bpp == 16) {
++ info->fix.line_length = clock_data[clock_data_index].xres * 2;
++ info->var.transp.offset = 0;
++ info->var.transp.length = 0;
++ info->var.red.length = 5;
++ info->var.blue.length = 5;
++ info->var.green.length = 6;
++ info->var.red.offset = 11;
++ info->var.green.offset = 5;
++ info->var.blue.offset = 0;
++ info->var.bits_per_pixel = 16;
++ info->fix.visual = FB_VISUAL_TRUECOLOR;
++ } else {
++ info->fix.line_length = clock_data[clock_data_index].xres * 4;
++ info->var.transp.offset = 24;
++ info->var.transp.length = 8;
++ info->var.red.length = 8;
++ info->var.blue.length = 8;
++ info->var.green.length = 8;
++ info->var.red.offset = 16;
++ info->var.green.offset = 8;
++ info->var.blue.offset = 0;
++ info->var.bits_per_pixel = 32;
++ info->fix.visual = FB_VISUAL_TRUECOLOR;
++ }
++ change_mode();
++#endif
++
++ return 0;
++}
++
++static int voyafb_blank(int blank, struct fb_info *info)
++{
++ return 0;
++}
++
++static int voyafb_setcolreg(unsigned regno, unsigned red, unsigned green,
++ unsigned blue, unsigned transp,
++ struct fb_info* info)
++{
++ int *palette;
++
++ if (regno > 256)
++ return 1;
++
++ palette = (int *)PANEL_PALETTE_RAM;
++ palette[regno] = (red & 0xff) << 16 | (green & 0xff) << 8 | (blue & 0xff);
++ ((u32 *)(info->pseudo_palette))[regno] = (red & 0xff) << 16 | (green & 0xff) << 8 | (blue & 0xff);
++
++ return 0;
++}
++
++static int voyafb_ioctl(struct inode* inode, struct file* file,
++ unsigned int cmd, unsigned long arg,
++ struct fb_info* info)
++{
++ static long *po;
++ int *wk;
++
++ if (cmd == VOYAGER_IOCTL_DEBUG_ADD) {
++ po = (long *)arg;
++ return 0;
++ } else if (cmd == VOYAGER_IOCTL_DEBUG_GET) {
++ wk = (int *)arg;
++ *wk = *po;
++ return 0;
++ } else if (cmd == VOYAGER_IOCTL_DEBUG_PUT) {
++ *po = arg;
++ return 0;
++ } else if (cmd == VOYAGER_IOCTL_ENABLE) {
++ if (arg == 0)
++ *(volatile unsigned long *)(PANEL_DISPLAY_CTRL) &= 0xfffffffb;
++ else
++ *(volatile unsigned long *)(PANEL_DISPLAY_CTRL) |= 0x04;
++ return 0;
++ } else if (cmd == VOYAGER_IOCTL_TYPE) {
++ *(volatile unsigned long *)(PANEL_DISPLAY_CTRL) &= 0xfffffffc;
++ *(volatile unsigned long *)(PANEL_DISPLAY_CTRL) |= (arg & 0x03);
++ return 0;
++ }
++
++ return -EINVAL;
++}
++
++static void __init voya_hw_init(void)
++{
++ int i;
++
++ //DAC enable
++ *(volatile unsigned long *)(MISC_CTRL) &= 0xffffefff;
++
++ //Power Gate
++ *(volatile unsigned long *)(POWER_MODE0_GATE) |= 0x7f;
++ *(volatile unsigned long *)(POWER_MODE1_GATE) |= 0x7f;
++
++ //Power Clock
++ *(volatile unsigned long *)(POWER_MODE0_CLOCK) = 0x10021801;
++ *(volatile unsigned long *)(POWER_MODE1_CLOCK) = 0x10021801;
++
++ //Power Mode Control
++ *(volatile unsigned long *)(POWER_MODE_CTRL) = 0;
++
++ //Miscellaneous Timing
++ *(volatile unsigned long *)(PANEL_DISPLAY_CTRL) &= 0xfffffffb;
++ *(volatile unsigned long *)(VIDEO_DISPLAY_CTRL) &= 0xfffffffb;
++ *(volatile unsigned long *)(VIDEO_ALPHA_DISPLAY_CTRL) &= 0xfffffffb;
++ *(volatile unsigned long *)(ALPHA_DISPLAY_CTRL) &= 0xfffffffb;
++ *(volatile unsigned long *)(PANEL_HWC_ADDRESS) &= 0x7fffffff;
++ *(volatile unsigned long *)(CRT_DISPLAY_CTRL) &= 0xfffffffb;
++ *(volatile unsigned long *)(CRT_HWC_ADDRESS) &= 0x7fffffff;
++
++ change_mode();
++
++ vsyncwait(4);
++ *(volatile unsigned long *)(PANEL_DISPLAY_CTRL) |= 0x1000000;
++ vsyncwait(4);
++ *(volatile unsigned long *)(PANEL_DISPLAY_CTRL) |= 0x3000000;
++ vsyncwait(4);
++ *(volatile unsigned long *)(PANEL_DISPLAY_CTRL) |= 0x7000000;
++
++ //palet initialize
++ for (i=0; i<256; i++) {
++ *(volatile unsigned long *)(PANEL_PALETTE_RAM+(i*4)) = (i << 16)+(i << 8)+i;
++ }
++}
++
++static struct fb_fix_screeninfo voyafb_fix __initdata = {
++ .id = "VOYAGER PANEL",
++ .type = FB_TYPE_PACKED_PIXELS,
++ .visual = FB_VISUAL_TRUECOLOR,
++ .accel = FB_ACCEL_NONE,
++ .line_length = XRES * (BPP / 8),
++ .smem_len = MAX_VRAM,
++};
++
++
++static void __init init_voya(struct fb_info *p, unsigned long addr)
++{
++ p->fix = voyafb_fix;
++ p->fix.smem_start = addr;
++
++ p->var = voyafb_var;
++
++ p->fbops = &voyafb_ops;
++ p->flags = FBINFO_DEFAULT;
++ p->pseudo_palette = pseudo_palette;
++
++ fb_alloc_cmap(&p->cmap, 16, 0);
++
++ if (register_framebuffer(p) < 0) {
++ printk(KERN_ERR "VOYAGER GX PANEL framebuffer failed to register\n");
++ return;
++ }
++
++ printk(KERN_INFO "fb%d: VOYAGER GX_PANEL frame buffer (%dK RAM detected)\n",
++ p->node, p->fix.smem_len / 1024);
++
++ voya_hw_init();
++}
++
++static int __init voyafb_init(void)
++{
++ struct fb_info *p = &voyafb_info;
++ unsigned long addr;
++
++ if (fb_get_options("voyager_panel_fb", NULL))
++ return -ENODEV;
++
++ addr = VOY_VRAM_TOP0;
++ p->screen_base = ioremap((u_long)addr, ALLOCATED_FB_MEM_SIZE);
++ if (p->screen_base == NULL)
++ return -ENOMEM;
++
++ init_voya(p, addr);
++
++ return 0;
++}
++
++static void __exit voyafb_exit(void)
++{
++ *(volatile unsigned long *)(PANEL_DISPLAY_CTRL) &= 0xfffffffb;
++}
++
++static int __init voyafbmem_init(void)
++{
++ voyafb_init();
++#ifdef CONFIG_FB_VOYAGER_GX_MP
++ voyafb_init2();
++ voyafb_init3();
++ voyafb_init4();
++ voyafb_init5();
++ voyafb_init6();
++ voyafb_init7();
++#endif
++
++ return 0;
++}
++
++module_init(voyafbmem_init);
++
++static void vsyncwait(int delay)
++{
++ int reg;
++
++ while(delay-- > 0) {
++ do {
++ reg = *(volatile unsigned long *)(CMD_INTPR_STATUS);
++ } while(reg & 0x1000);
++ do {
++ reg = *(volatile unsigned long *)(CMD_INTPR_STATUS);
++ } while(!reg & 0x1000);
++ }
++}
++
++static int change_mode()
++{
++ int size,xres,yres;
++
++ xres = clock_data[clock_data_index].xres;
++ yres = clock_data[clock_data_index].yres;
++ size = clock_data_bpp / 8;
++
++ //Power Clock
++ *(volatile unsigned long *)(POWER_MODE0_CLOCK) = clock_data[clock_data_index].clock;
++ *(volatile unsigned long *)(POWER_MODE1_CLOCK) = clock_data[clock_data_index].clock;
++ //PANEL register SET
++ *(volatile unsigned long *)(PANEL_FB_ADDRESS) = 0x80000000 + (VOY_VRAM_TOP0 & 0x00ffffff);
++ *(volatile unsigned long *)(PANEL_FB_WIDTH) = (xres * size) << 16 | (xres * size);
++ *(volatile unsigned long *)(PANEL_WINDOW_WIDTH) = (xres << 16);
++ *(volatile unsigned long *)(PANEL_WINDOW_HEIGHT) = (yres << 16);
++ *(volatile unsigned long *)(PANEL_PLANE_TL) = 0;
++ *(volatile unsigned long *)(PANEL_PLANE_BR) = ((yres-1) << 16) | (xres-1);
++ *(volatile unsigned long *)(PANEL_HORIZONTAL_TOTAL) = clock_data[clock_data_index].h_total;
++ *(volatile unsigned long *)(PANEL_HORIZONTAL_SYNC) = clock_data[clock_data_index].h_sync;
++ *(volatile unsigned long *)(PANEL_VERTICAL_TOTAL) = clock_data[clock_data_index].v_total;
++ *(volatile unsigned long *)(PANEL_VERTICAL_SYNC) = clock_data[clock_data_index].v_sync;
++
++ *(volatile unsigned long *)(PANEL_DISPLAY_CTRL) &= 0xffffcea8;
++ if (size == 1)
++ *(volatile unsigned long *)(PANEL_DISPLAY_CTRL) |= 0x3104;
++ else if (size == 2)
++ *(volatile unsigned long *)(PANEL_DISPLAY_CTRL) |= 0x3105;
++ else
++ *(volatile unsigned long *)(PANEL_DISPLAY_CTRL) |= 0x3106;
++
++ return(0);
++}
++
++MODULE_LICENSE("GPL");
++
+diff -ruN linux-2.6.17-vanilla/drivers/video/voyager/voyager_panelcsrfb.c linux-2.6.17/drivers/video/voyager/voyager_panelcsrfb.c
+--- linux-2.6.17-vanilla/drivers/video/voyager/voyager_panelcsrfb.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/video/voyager/voyager_panelcsrfb.c 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,240 @@
++/*
++ * linux/drivers/video/voyager_panelcsrfb.c -- voyager panel HWC frame buffer driver
++ *
++ * Copyright (C) 2003 Renesas Technology Sales Co.,Ltd.
++ * Copyright (C) 2003 Atom Create Engineering Co.,Ltd.
++ * Anthor : Atom Create Engineering Co.,Ltd.
++ * Kenichi Sakuma
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file COPYING in the main directory of this archive for
++ * more details.
++ *
++ * 1.00
++ * - initial version (ks)
++ * 1.01
++ * - Kernel 2.6 correspondence
++ */
++#include <linux/config.h>
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/string.h>
++#include <linux/mm.h>
++#include <linux/tty.h>
++#include <linux/slab.h>
++#include <linux/vmalloc.h>
++#include <linux/delay.h>
++#include <linux/interrupt.h>
++#include <linux/fb.h>
++#include <linux/init.h>
++#include <asm/io.h>
++#include <asm/irq.h>
++#include <asm/mach/voyagergx_reg.h>
++#include <video/voyager.h>
++
++static struct fb_info voyafb_info;
++
++int voyafb_init5(void);
++static int voyafb_check_var(struct fb_var_screeninfo *var,
++ struct fb_info *info);
++static int voyafb_set_par(struct fb_info *info);
++static int voyafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
++ u_int transp, struct fb_info *info);
++static int voyafb_blank(int blank, struct fb_info *info);
++static int voyafb_ioctl(struct inode*, struct file*,
++ unsigned int, unsigned long, struct fb_info*);
++static int change_mode(struct fb_var_screeninfo *var);
++
++static unsigned int pseudo_palette[16];
++
++static struct fb_ops voyafb_ops = {
++ .owner = THIS_MODULE,
++ .fb_check_var = voyafb_check_var,
++ .fb_set_par = voyafb_set_par,
++ .fb_setcolreg = voyafb_setcolreg,
++ .fb_blank = voyafb_blank,
++ .fb_fillrect = cfb_fillrect,
++ .fb_copyarea = cfb_copyarea,
++ .fb_imageblit = cfb_imageblit,
++ .fb_ioctl = voyafb_ioctl,
++};
++
++static struct fb_var_screeninfo voyafb_var __initdata = {
++ .xres = CSR_XRES,
++ .yres = CSR_YRES,
++ .xres_virtual = CSR_XRES,
++ .yres_virtual = CSR_YRES,
++ .bits_per_pixel = CSR_BPP,
++ .red = { 11,5,0 },
++ .green = { 5,6,0 },
++ .blue = { 0,5,0 },
++ .height = -1,
++ .width = -1,
++ .vmode = FB_VMODE_NONINTERLACED,
++ .pixclock = 10000,
++ .left_margin = 16,
++ .right_margin = 16,
++ .upper_margin = 16,
++ .lower_margin = 16,
++ .hsync_len = 8,
++ .vsync_len = 8,
++};
++
++static int voyafb_check_var(struct fb_var_screeninfo *var,
++ struct fb_info *info)
++{
++ if (var->xres > CSR_XRES || var->yres > CSR_YRES
++ || var->xres_virtual > CSR_XRES || var->yres_virtual > CSR_YRES
++ || var->bits_per_pixel != CSR_BPP
++ || var->nonstd
++ || (var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED)
++ return -EINVAL;
++
++ var->xres = var->xres_virtual = CSR_XRES;
++ var->yres = var->yres_virtual = CSR_YRES;
++ if(change_mode(var) != 0) {
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
++static int voyafb_set_par(struct fb_info *info)
++{
++ info->fix.line_length = CSR_XRES/2;
++ info->fix.visual = FB_VISUAL_TRUECOLOR;
++
++ info->var.red.offset = 11;
++ info->var.green.offset = 5;
++ info->var.blue.offset = 0;
++ info->var.red.length = info->var.blue.length = 5;
++ info->var.green.length = 6;
++ return 0;
++}
++
++static int voyafb_blank(int blank, struct fb_info *info)
++{
++ return 1;
++}
++
++static int voyafb_setcolreg(unsigned regno, unsigned red, unsigned green,
++ unsigned blue, unsigned transp,
++ struct fb_info* info)
++{
++ red >>= 11;
++ green >>= 11;
++ blue >>= 10;
++
++ if (regno < 16)
++ ((u32 *)(info->pseudo_palette))[regno] = ((red & 31) << 6) |
++ ((green & 31) << 11) |
++ ((blue & 63));
++ return 0;
++}
++
++static int voyafb_ioctl(struct inode* inode, struct file* file,
++ unsigned int cmd, unsigned long arg,
++ struct fb_info* info)
++{
++ if(cmd == VOYAGER_IOCTL_ENABLE) {
++ if(arg == 0) {
++ *(volatile unsigned long *)(PANEL_HWC_ADDRESS) &= 0x7fffffff;
++ }
++ else {
++ *(volatile unsigned long *)(PANEL_HWC_ADDRESS) |= 0x80000000;
++ }
++ return 0;
++ }
++ else if(cmd == VOYAGER_IOCTL_COLOR_1) {
++ *(volatile unsigned long *)(PANEL_HWC_COLOR_12) = arg;
++ return 0;
++ }
++ else if(cmd == VOYAGER_IOCTL_COLOR_2) {
++ *(volatile unsigned long *)(PANEL_HWC_COLOR_3) = arg;
++ return 0;
++ }
++ return -EINVAL;
++}
++
++
++static void __init voya_hw_init(void)
++{
++ *(volatile unsigned long *)(PANEL_HWC_ADDRESS) = (VOY_VRAM_TOP5 & 0x00ffffff);
++ *(volatile unsigned long *)(PANEL_HWC_COLOR_12) = 0x5555aaaa;
++ *(volatile unsigned long *)(PANEL_HWC_COLOR_3) = 0x0000ffff;
++ change_mode(&voyafb_var);
++}
++
++
++
++static struct fb_fix_screeninfo voyafb_fix __initdata = {
++ .id = "VOYAGER P_CSR",
++ .type = FB_TYPE_PACKED_PIXELS,
++ .visual = FB_VISUAL_TRUECOLOR,
++ .accel = FB_ACCEL_NONE,
++ .line_length = CSR_XRES/2,
++ .smem_len = MAX_HWC_MEM_SIZE,
++};
++
++
++static void __init init_voya(struct fb_info *p, unsigned long addr)
++{
++ p->fix = voyafb_fix;
++ p->fix.smem_start = addr;
++
++ p->var = voyafb_var;
++
++ p->fbops = &voyafb_ops;
++ p->flags = FBINFO_FLAG_DEFAULT;
++ p->pseudo_palette = pseudo_palette;
++
++ fb_alloc_cmap(&p->cmap, 16, 0);
++
++ if (register_framebuffer(p) < 0) {
++ printk(KERN_ERR "VOYAGER GX PANEL CSR framebuffer failed to register\n");
++ return;
++ }
++
++ printk(KERN_INFO "fb%d: VOYAGER GX_PANEL CSR frame buffer (%dK RAM detected)\n",
++ p->node, p->fix.smem_len / 1024);
++
++ voya_hw_init();
++}
++
++int __init voyafb_init5(void)
++{
++ struct fb_info *p = &voyafb_info;
++ unsigned long addr, size;
++
++ addr = VOY_VRAM_TOP6;
++ size = MAX_HWC_MEM_SIZE;
++ p->screen_base = ioremap((u_long)addr,
++ ALLOCATED_FB_MEM_SIZE);
++ if (p->screen_base == NULL) {
++ return -ENOMEM;
++ }
++ init_voya(p, addr);
++ memset(p->screen_base, 0, MAX_HWC_MEM_SIZE);
++
++ return 0;
++}
++
++static void __exit voyafb_exit(void)
++{
++ *(volatile unsigned long *)(PANEL_HWC_ADDRESS) &= 0x7fffffff;
++}
++
++static int change_mode(struct fb_var_screeninfo *var)
++{
++ if((var->xoffset < 0)||(var->xoffset > XRES)||
++ (var->yoffset < 0)||(var->yoffset > YRES))
++ {
++ return(-1);
++ }
++ *(volatile unsigned long *)(PANEL_HWC_LOCATION) = (var->yoffset << 16) |
++ var->xoffset;
++ return(0);
++}
++
++MODULE_LICENSE("GPL");
+diff -ruN linux-2.6.17-vanilla/drivers/video/voyager/voyager_valphafb.c linux-2.6.17/drivers/video/voyager/voyager_valphafb.c
+--- linux-2.6.17-vanilla/drivers/video/voyager/voyager_valphafb.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/video/voyager/voyager_valphafb.c 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,286 @@
++/*
++ * linux/drivers/video/voyager_valphafb.c -- voyager video alpha frame buffer driver
++ *
++ * Copyright (C) 2003 Renesas Technology Sales Co.,Ltd.
++ * Copyright (C) 2003 Atom Create Engineering Co.,Ltd.
++ * Anthor : Atom Create Engineering Co.,Ltd.
++ * Kenichi Sakuma
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file COPYING in the main directory of this archive for
++ * more details.
++ *
++ * 1.00
++ * - initial version (ks)
++ * 1.01
++ * - Kernel 2.6 correspondence
++ */
++#include <linux/config.h>
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/string.h>
++#include <linux/mm.h>
++#include <linux/tty.h>
++#include <linux/slab.h>
++#include <linux/vmalloc.h>
++#include <linux/delay.h>
++#include <linux/interrupt.h>
++#include <linux/fb.h>
++#include <linux/init.h>
++#include <asm/io.h>
++#include <asm/irq.h>
++#include <asm/mach/voyagergx_reg.h>
++#include <video/voyager.h>
++
++static struct fb_info voyafb_info;
++
++int voyafb_init3(void);
++static int voyafb_check_var(struct fb_var_screeninfo *var,
++ struct fb_info *info);
++static int voyafb_set_par(struct fb_info *info);
++static int voyafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
++ u_int transp, struct fb_info *info);
++static int voyafb_blank(int blank, struct fb_info *info);
++static int voyafb_ioctl(struct inode*, struct file*,
++ unsigned int, unsigned long, struct fb_info*);
++static int change_mode(struct fb_var_screeninfo *var);
++
++static unsigned int pseudo_palette[16];
++
++static struct fb_ops voyafb_ops = {
++ .owner = THIS_MODULE,
++ .fb_check_var = voyafb_check_var,
++ .fb_set_par = voyafb_set_par,
++ .fb_setcolreg = voyafb_setcolreg,
++ .fb_blank = voyafb_blank,
++ .fb_fillrect = cfb_fillrect,
++ .fb_copyarea = cfb_copyarea,
++ .fb_imageblit = cfb_imageblit,
++ .fb_ioctl = voyafb_ioctl,
++};
++
++static struct fb_var_screeninfo voyafb_var __initdata = {
++ .xres = XRES,
++ .yres = YRES,
++ .xres_virtual = XRES,
++ .yres_virtual = YRES,
++ .bits_per_pixel = BPP,
++ .red = { 11,5,0 },
++ .green = { 5,6,0 },
++ .blue = { 0,5,0 },
++ .height = -1,
++ .width = -1,
++ .vmode = FB_VMODE_NONINTERLACED,
++ .pixclock = 10000,
++ .left_margin = 16,
++ .right_margin = 16,
++ .upper_margin = 16,
++ .lower_margin = 16,
++ .hsync_len = 8,
++ .vsync_len = 8,
++};
++
++static int voyafb_check_var(struct fb_var_screeninfo *var,
++ struct fb_info *info)
++{
++ if (var->xres > XRES || var->yres > YRES
++ || var->xres_virtual > XRES || var->yres_virtual > YRES
++ || var->bits_per_pixel != BPP
++ || var->nonstd
++ || (var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED)
++ return -EINVAL;
++
++ var->xres_virtual = XRES;
++ var->yres_virtual = YRES;
++
++ if(change_mode(var) != 0) {
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
++static int voyafb_set_par(struct fb_info *info)
++{
++ info->fix.line_length = XRES*2;
++ info->fix.visual = FB_VISUAL_TRUECOLOR;
++
++ info->var.red.offset = 11;
++ info->var.green.offset = 5;
++ info->var.blue.offset = 0;
++ info->var.red.length = info->var.blue.length = 5;
++ info->var.green.length = 6;
++ return 0;
++}
++
++static int voyafb_blank(int blank, struct fb_info *info)
++{
++ return 1;
++}
++
++static int voyafb_setcolreg(unsigned regno, unsigned red, unsigned green,
++ unsigned blue, unsigned transp,
++ struct fb_info* info)
++{
++ red >>= 11;
++ green >>= 11;
++ blue >>= 10;
++
++ if (regno < 16)
++ ((u32 *)(info->pseudo_palette))[regno] = ((red & 31) << 6) |
++ ((green & 31) << 11) |
++ ((blue & 63));
++ return 0;
++}
++
++static int voyafb_ioctl(struct inode* inode, struct file* file,
++ unsigned int cmd, unsigned long arg,
++ struct fb_info* info)
++{
++ if(cmd == VOYAGER_IOCTL_ENABLE) {
++ if(arg == 0) {
++ *(volatile unsigned long *)(VIDEO_ALPHA_DISPLAY_CTRL) &= 0xfffffffb;
++ }
++ else {
++ *(volatile unsigned long *)(VIDEO_ALPHA_DISPLAY_CTRL) |= 0x04;
++ }
++ return 0;
++ }
++ else if(cmd == VOYAGER_IOCTL_ENABLE_CK) {
++ if(arg == 0) {
++ *(volatile unsigned long *)(VIDEO_ALPHA_DISPLAY_CTRL) &= 0xfffffff7;
++ }
++ else {
++ *(volatile unsigned long *)(VIDEO_ALPHA_DISPLAY_CTRL) |= 0x08;
++ }
++ return 0;
++ }
++ else if(cmd == VOYAGER_IOCTL_ENABLE_AL) {
++ if(arg == 0) {
++ *(volatile unsigned long *)(VIDEO_ALPHA_DISPLAY_CTRL) &= 0xefffffff;
++ }
++ else {
++ *(volatile unsigned long *)(VIDEO_ALPHA_DISPLAY_CTRL) |= 0x10000000;
++ }
++ return 0;
++ }
++ else if(cmd == VOYAGER_IOCTL_SCALE) {
++ *(volatile unsigned long *)(VIDEO_ALPHA_SCALE) = arg;
++ return 0;
++ }
++ else if(cmd == VOYAGER_IOCTL_CHKEY) {
++ *(volatile unsigned long *)(VIDEO_ALPHA_CHROMA_KEY) = arg;
++ return 0;
++ }
++ else if(cmd == VOYAGER_IOCTL_TYPE) {
++ *(volatile unsigned long *)(VIDEO_ALPHA_DISPLAY_CTRL) &= 0xfffffffc;
++ *(volatile unsigned long *)(VIDEO_ALPHA_DISPLAY_CTRL) |= (arg & 0x03);
++ return 0;
++ }
++ else if(cmd == VOYAGER_IOCTL_ALPHA) {
++ *(volatile unsigned long *)(VIDEO_ALPHA_DISPLAY_CTRL) &= 0xf0ffffff;
++ *(volatile unsigned long *)(VIDEO_ALPHA_DISPLAY_CTRL) |= (arg & 0x0f) << 24;
++ return 0;
++ }
++ return -EINVAL;
++}
++
++static void __init voya_hw_init(void)
++{
++ *(volatile unsigned long *)(VIDEO_ALPHA_FB_ADDRESS) = 0x80000000 + (VOY_VRAM_TOP3 & 0x00ffffff);
++ change_mode(&voyafb_var);
++ *(volatile unsigned long *)(VIDEO_ALPHA_SCALE) = 0;
++ *(volatile unsigned long *)(VIDEO_ALPHA_CHROMA_KEY) = 0;
++
++ *(volatile unsigned long *)(VIDEO_ALPHA_DISPLAY_CTRL) &= 0xfffffff0;
++// *(volatile unsigned long *)(VIDEO_ALPHA_DISPLAY_CTRL) |= 0x05;
++ *(volatile unsigned long *)(VIDEO_ALPHA_DISPLAY_CTRL) |= 0x01;
++}
++
++static struct fb_fix_screeninfo voyafb_fix __initdata = {
++ .id = "VOYAGER VALPHA",
++ .type = FB_TYPE_PACKED_PIXELS,
++ .visual = FB_VISUAL_TRUECOLOR,
++ .accel = FB_ACCEL_NONE,
++ .line_length = XRES*2,
++ .smem_len = MAX_FRAMEBUFFER_MEM_SIZE,
++};
++
++
++static void __init init_voya(struct fb_info *p, unsigned long addr)
++{
++ p->fix = voyafb_fix;
++ p->fix.smem_start = addr;
++
++ p->var = voyafb_var;
++
++ p->fbops = &voyafb_ops;
++ p->flags = FBINFO_FLAG_DEFAULT;
++ p->pseudo_palette = pseudo_palette;
++
++ fb_alloc_cmap(&p->cmap, 16, 0);
++
++ if (register_framebuffer(p) < 0) {
++ printk(KERN_ERR "VOYAGER GX VIDEO ALPHA framebuffer failed to register\n");
++ return;
++ }
++
++ printk(KERN_INFO "fb%d: VOYAGER GX_VIDEO_ALPHA frame buffer (%dK RAM detected)\n",
++ p->node, p->fix.smem_len / 1024);
++
++ voya_hw_init();
++}
++
++int __init voyafb_init3(void)
++{
++ struct fb_info *p = &voyafb_info;
++ unsigned long addr, size;
++
++ addr = VOY_VRAM_TOP3;
++ size = MAX_FRAMEBUFFER_MEM_SIZE;
++ p->screen_base = ioremap((u_long)addr,
++ ALLOCATED_FB_MEM_SIZE);
++ if (p->screen_base == NULL) {
++ return -ENOMEM;
++ }
++ init_voya(p, addr);
++ memset(p->screen_base, 0, MAX_FRAMEBUFFER_MEM_SIZE);
++
++ return 0;
++}
++
++static void __exit voyafb_exit(void)
++{
++ *(volatile unsigned long *)(VIDEO_ALPHA_DISPLAY_CTRL) &= 0xfffffffb;
++}
++
++
++//------------------------------------------------------------------------------------
++static int change_mode(struct fb_var_screeninfo *var)
++{
++int x,ali,size;
++
++ if((var->xres < 0)||(var->xres > XRES)||
++ (var->yres < 0)||(var->yres > YRES)||
++ (var->xres_virtual < 0)||(var->xres_virtual > XRES)||
++ (var->yres_virtual < 0)||(var->yres_virtual > YRES)||
++ (var->xoffset < 0)||(var->xoffset > XRES)||
++ (var->yoffset < 0)||(var->yoffset > YRES))
++ {
++ return(-1);
++ }
++ x = var->xres_virtual * 2;
++ ali = x + (x % 16);
++ *(volatile unsigned long *)(VIDEO_ALPHA_FB_WIDTH) = (ali << 16) | ali;
++ *(volatile unsigned long *)(VIDEO_ALPHA_PLANE_TL) = (var->yoffset << 16) |
++ var->xoffset;
++ *(volatile unsigned long *)(VIDEO_ALPHA_PLANE_BR) =
++ ((var->yoffset + var->yres - 1) << 16) |
++ (var->xoffset + var->xres - 1);
++ size = var->xres_virtual * var->yres_virtual * var->bits_per_pixel / 8;
++ *(volatile unsigned long *)(VIDEO_ALPHA_FB_LAST_ADDRESS) = 0x80000000 + (VOY_VRAM_TOP3 & 0x00ffffff) + size;
++ return(0);
++}
++
++MODULE_LICENSE("GPL");
+diff -ruN linux-2.6.17-vanilla/drivers/video/voyager/voyager_videofb.c linux-2.6.17/drivers/video/voyager/voyager_videofb.c
+--- linux-2.6.17-vanilla/drivers/video/voyager/voyager_videofb.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/drivers/video/voyager/voyager_videofb.c 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,273 @@
++/*
++ * linux/drivers/video/voyager_videofb.c -- voyager video frame buffer driver
++ *
++ * Copyright (C) 2003 Renesas Technology Sales Co.,Ltd.
++ * Copyright (C) 2003 Atom Create Engineering Co.,Ltd.
++ * Anthor : Atom Create Engineering Co.,Ltd.
++ * Kenichi Sakuma
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file COPYING in the main directory of this archive for
++ * more details.
++ *
++ * 1.00
++ * - initial version (ks)
++ * 1.01
++ * - Kernel 2.6 correspondence
++ */
++#include <linux/config.h>
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/string.h>
++#include <linux/mm.h>
++#include <linux/tty.h>
++#include <linux/slab.h>
++#include <linux/vmalloc.h>
++#include <linux/delay.h>
++#include <linux/interrupt.h>
++#include <linux/fb.h>
++#include <linux/init.h>
++#include <asm/io.h>
++#include <asm/irq.h>
++#include <asm/mach/voyagergx_reg.h>
++#include <video/voyager.h>
++
++static struct fb_info voyafb_info;
++
++int voyafb_init2(void);
++static int voyafb_check_var(struct fb_var_screeninfo *var,
++ struct fb_info *info);
++static int voyafb_set_par(struct fb_info *info);
++static int voyafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
++ u_int transp, struct fb_info *info);
++static int voyafb_blank(int blank, struct fb_info *info);
++static int voyafb_ioctl(struct inode*, struct file*,
++ unsigned int, unsigned long, struct fb_info*);
++static int change_mode(struct fb_var_screeninfo *var);
++
++static unsigned int pseudo_palette[16];
++
++static struct fb_ops voyafb_ops = {
++ .owner = THIS_MODULE,
++ .fb_check_var = voyafb_check_var,
++ .fb_set_par = voyafb_set_par,
++ .fb_setcolreg = voyafb_setcolreg,
++ .fb_blank = voyafb_blank,
++ .fb_fillrect = cfb_fillrect,
++ .fb_copyarea = cfb_copyarea,
++ .fb_imageblit = cfb_imageblit,
++ .fb_ioctl = voyafb_ioctl,
++};
++
++static struct fb_var_screeninfo voyafb_var __initdata = {
++ .xres = XRES,
++ .yres = YRES,
++ .xres_virtual = XRES,
++ .yres_virtual = YRES,
++ .bits_per_pixel = BPP,
++ .red = { 11,5,0 },
++ .green = { 5,6,0 },
++ .blue = { 0,5,0 },
++ .height = -1,
++ .width = -1,
++ .vmode = FB_VMODE_NONINTERLACED,
++ .pixclock = 10000,
++ .left_margin = 16,
++ .right_margin = 16,
++ .upper_margin = 16,
++ .lower_margin = 16,
++ .hsync_len = 8,
++ .vsync_len = 8,
++};
++
++static int voyafb_check_var(struct fb_var_screeninfo *var,
++ struct fb_info *info)
++{
++ if (var->xres > XRES || var->yres > YRES
++ || var->xres_virtual > XRES || var->yres_virtual > YRES
++ || var->bits_per_pixel != BPP
++ || var->nonstd
++ || (var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED)
++ return -EINVAL;
++
++ var->xres_virtual = XRES;
++ var->yres_virtual = YRES;
++
++ if(change_mode(var) != 0) {
++ return -EINVAL;
++ }
++
++ return 0;
++}
++
++static int voyafb_set_par(struct fb_info *info)
++{
++ info->fix.line_length = XRES*2;
++ info->fix.visual = FB_VISUAL_TRUECOLOR;
++
++ info->var.red.offset = 11;
++ info->var.green.offset = 5;
++ info->var.blue.offset = 0;
++ info->var.red.length = info->var.blue.length = 5;
++ info->var.green.length = 6;
++ return 0;
++}
++
++static int voyafb_blank(int blank, struct fb_info *info)
++{
++ return 1;
++}
++
++static int voyafb_setcolreg(unsigned regno, unsigned red, unsigned green,
++ unsigned blue, unsigned transp,
++ struct fb_info* info)
++{
++ red >>= 11;
++ green >>= 11;
++ blue >>= 10;
++
++ if (regno < 16)
++ ((u32 *)(info->pseudo_palette))[regno] = ((red & 31) << 6) |
++ ((green & 31) << 11) |
++ ((blue & 63));
++ return 0;
++}
++
++static int voyafb_ioctl(struct inode* inode, struct file* file,
++ unsigned int cmd, unsigned long arg,
++ struct fb_info* info)
++{
++ if(cmd == VOYAGER_IOCTL_ENABLE) {
++ if(arg == 0) {
++ *(volatile unsigned long *)(VIDEO_DISPLAY_CTRL) &= 0xfffffffb;
++ }
++ else {
++ *(volatile unsigned long *)(VIDEO_DISPLAY_CTRL) |= 0x04;
++ }
++ return 0;
++ }
++ else if(cmd == VOYAGER_IOCTL_ENABLE_CP) {
++ if(arg == 0) {
++ *(volatile unsigned long *)(VIDEO_DISPLAY_CTRL) &= 0xffffbfff;
++ }
++ else {
++ *(volatile unsigned long *)(VIDEO_DISPLAY_CTRL) |= 0x00004000;
++ }
++ return 0;
++ }
++ else if(cmd == VOYAGER_IOCTL_SCALE) {
++ *(volatile unsigned long *)(VIDEO_SCALE) = arg;
++ return 0;
++ }
++ else if(cmd == VOYAGER_IOCTL_TYPE) {
++ *(volatile unsigned long *)(VIDEO_DISPLAY_CTRL) &= 0xfffffffc;
++ *(volatile unsigned long *)(VIDEO_DISPLAY_CTRL) |= (arg & 0x03);
++ return 0;
++ }
++ return -EINVAL;
++}
++
++static void __init voya_hw_init(void)
++{
++int i;
++
++ *(volatile unsigned long *)(VIDEO_FB_0_ADDRESS) = 0x80000000 + (VOY_VRAM_TOP1 & 0x00ffffff);
++ *(volatile unsigned long *)(VIDEO_FB_1_ADDRESS) = 0x80000000 + (VOY_VRAM_TOP2 & 0x00ffffff);
++ change_mode(&voyafb_var);
++ *(volatile unsigned long *)(VIDEO_SCALE) = 0;
++
++ *(volatile unsigned long *)(VIDEO_DISPLAY_CTRL) &= 0xffffcea8;
++ *(volatile unsigned long *)(VIDEO_DISPLAY_CTRL) |= 0x10003;
++ //palet initialize
++ for(i=0;i<256;i++) {
++ *(volatile unsigned long *)(VIDEO_PALETTE_RAM+(i*4)) = (i << 16)+(i << 8)+i;
++ }
++}
++
++static struct fb_fix_screeninfo voyafb_fix __initdata = {
++ .id = "VOYAGER VIDEO",
++ .type = FB_TYPE_PACKED_PIXELS,
++ .visual = FB_VISUAL_TRUECOLOR,
++ .accel = FB_ACCEL_NONE,
++ .line_length = XRES*2,
++ .smem_len = MAX_FRAMEBUFFER_MEM_SIZE,
++};
++
++
++static void __init init_voya(struct fb_info *p, unsigned long addr)
++{
++ p->fix = voyafb_fix;
++ p->fix.smem_start = addr;
++
++ p->var = voyafb_var;
++
++ p->fbops = &voyafb_ops;
++ p->flags = FBINFO_FLAG_DEFAULT;
++ p->pseudo_palette = pseudo_palette;
++
++ fb_alloc_cmap(&p->cmap, 16, 0);
++
++ if (register_framebuffer(p) < 0) {
++ printk(KERN_ERR "VOYAGER GX VIDEO framebuffer failed to register\n");
++ return;
++ }
++
++ printk(KERN_INFO "fb%d: VOYAGER GX_VIDEO frame buffer (%dK RAM detected)\n",
++ p->node, p->fix.smem_len / 1024);
++
++ voya_hw_init();
++}
++
++int __init voyafb_init2(void)
++{
++ struct fb_info *p = &voyafb_info;
++ unsigned long addr, size;
++
++ addr = VOY_VRAM_TOP1;
++ size = MAX_FRAMEBUFFER_MEM_SIZE;
++ p->screen_base = ioremap((u_long)addr,
++ ALLOCATED_FB_MEM_SIZE);
++ if (p->screen_base == NULL) {
++ return -ENOMEM;
++ }
++ init_voya(p, addr);
++ memset(p->screen_base, 0, MAX_FRAMEBUFFER_MEM_SIZE);
++
++ return 0;
++}
++
++static void __exit voyafb_exit(void)
++{
++ *(volatile unsigned long *)(VIDEO_DISPLAY_CTRL) &= 0xfffffffb;
++}
++
++
++//------------------------------------------------------------------------------------
++static int change_mode(struct fb_var_screeninfo *var)
++{
++int x,ali,size;
++
++ if((var->xres < 0)||(var->xres > XRES)||
++ (var->yres < 0)||(var->yres > YRES)||
++ (var->xres_virtual < 0)||(var->xres_virtual > XRES)||
++ (var->yres_virtual < 0)||(var->yres_virtual > YRES)||
++ (var->xoffset < 0)||(var->xoffset > XRES)||
++ (var->yoffset < 0)||(var->yoffset > YRES))
++ {
++ return(-1);
++ }
++ x = var->xres_virtual * 2;
++ ali = x + (x % 16);
++ *(volatile unsigned long *)(VIDEO_FB_WIDTH) = (ali << 16) | ali;
++ *(volatile unsigned long *)(VIDEO_PLANE_TL) = (var->yoffset << 16) | var->xoffset;
++ *(volatile unsigned long *)(VIDEO_PLANE_BR) =
++ ((var->yoffset + var->yres - 1) << 16) |
++ (var->xoffset + var->xres - 1);
++ size = var->xres_virtual * var->yres_virtual * var->bits_per_pixel / 8;
++ *(volatile unsigned long *)(VIDEO_FB_0_LAST_ADDRESS) = 0x80000000 + (VOY_VRAM_TOP1 & 0x00ffffff) + size;
++ *(volatile unsigned long *)(VIDEO_FB_1_LAST_ADDRESS) = 0x80000000 + (VOY_VRAM_TOP2 & 0x00ffffff) + size;
++ return(0);
++}
++
++MODULE_LICENSE("GPL");
+diff -ruN linux-2.6.17-vanilla/include/CVS/Entries linux-2.6.17/include/CVS/Entries
+--- linux-2.6.17-vanilla/include/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/CVS/Entries 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,3 @@
++D/asm-sh////
++D/linux////
++D/video////
+diff -ruN linux-2.6.17-vanilla/include/CVS/Repository linux-2.6.17/include/CVS/Repository
+--- linux-2.6.17-vanilla/include/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/CVS/Repository 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1 @@
++linux/include
+diff -ruN linux-2.6.17-vanilla/include/CVS/Root linux-2.6.17/include/CVS/Root
+--- linux-2.6.17-vanilla/include/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/CVS/Root 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/CVS/Entries linux-2.6.17/include/asm-sh/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/CVS/Entries 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,114 @@
++/adc.h/1.2/Fri Sep 24 14:58:00 2004/-ko/
++/apm.h/1.1/Sun Jan 29 17:46:24 2006//
++/atomic.h/1.6/Mon Mar 27 21:06:15 2006/-ko/
++/bug.h/1.5/Tue Jun 21 04:15:52 2005//
++/bugs.h/1.8/Sun Aug 21 23:47:31 2005//
++/byteorder.h/1.4/Wed Feb 4 16:16:29 2004/-ko/
++/cache.h/1.11/Mon Mar 27 21:06:15 2006/-ko/
++/cacheflush.h/1.7/Sat Dec 31 11:30:47 2005//
++/checksum.h/1.9/Sat Jan 7 20:08:29 2006//
++/clock.h/1.2/Sun Nov 13 16:57:33 2005/-ko/
++/current.h/1.3/Sun May 4 19:30:00 2003/-ko/
++/delay.h/1.3/Tue May 6 23:33:19 2003/-ko/
++/div64.h/1.5/Mon Jul 21 13:36:14 2003/-ko/
++/dma-mapping.h/1.12/Wed Jan 4 13:24:06 2006//
++/dma.h/1.18/Sun Oct 16 18:27:54 2005//
++/elf.h/1.5/Tue Jan 3 22:35:58 2006/-ko/
++/fixmap.h/1.1/Tue Mar 30 01:02:55 2004//
++/flat.h/1.2/Wed Jun 16 15:21:48 2004/-ko/
++/floppy.h/1.3/Tue Jun 21 04:15:52 2005/-ko/
++/freq.h/1.4/Sat Mar 26 20:25:36 2005/-ko/
++/hardirq.h/1.10/Mon Jan 31 20:45:09 2005/-ko/
++/hd64461.h/1.4/Sun Jan 29 17:46:24 2006/-ko/
++/hw_irq.h/1.4/Sun May 4 19:30:01 2003//
++/ide.h/1.15/Tue Jan 3 22:35:58 2006/-ko/
++/io_generic.h/1.4/Wed Nov 23 15:47:38 2005/-ko/
++/ioctl.h/1.3/Mon Mar 27 21:06:15 2006/-ko/
++/ioctls.h/1.5/Sun Jan 22 17:35:31 2006/-ko/
++/ipc.h/1.5/Tue Jun 21 04:15:52 2005/-ko/
++/irq-sh73180.h/1.2/Sun Jan 8 12:22:58 2006//
++/keyboard.h/1.3/Fri May 16 17:19:08 2003/-ko/
++/kgdb.h/1.6/Sun Feb 5 12:27:59 2006//
++/kmap_types.h/1.3/Thu Mar 11 18:08:05 2004//
++/local.h/1.1/Sun Jul 27 20:21:41 2003//
++/machvec.h/1.13/Wed Jan 4 13:20:32 2006//
++/mc146818rtc.h/1.5/Wed Jan 4 18:42:42 2006//
++/microdev.h/1.1/Sat Dec 17 23:34:08 2005/-ko/
++/mman.h/1.5/Mon Mar 27 21:06:15 2006//
++/mmu.h/1.4/Tue Jan 3 22:51:48 2006//
++/mmu_context.h/1.12/Thu Oct 20 22:48:05 2005//
++/module.h/1.4/Sun Oct 26 23:34:34 2003//
++/namei.h/1.2/Wed Apr 7 20:19:00 2004/-ko/
++/param.h/1.4/Thu Mar 11 18:08:05 2004//
++/pci.h/1.19/Sun Feb 5 21:55:30 2006//
++/percpu.h/1.1/Sat Oct 19 07:31:03 2002//
++/pgalloc.h/1.20/Sat Dec 31 11:30:47 2005/-ko/
++/pgtable.h/1.33/Sun Jan 22 17:26:20 2006//
++/pm.h/1.1/Sun Jan 29 17:46:24 2006//
++/posix_types.h/1.3/Thu Oct 9 14:59:21 2003//
++/ptrace.h/1.13/Mon Mar 27 21:06:15 2006//
++/rwsem.h/1.2/Tue Jan 3 22:35:58 2006/-ko/
++/scatterlist.h/1.6/Sat Sep 3 20:05:39 2005/-ko/
++/se.h/1.1/Wed Jan 4 17:53:54 2006/-ko/
++/se7300.h/1.1/Wed Jan 4 17:25:52 2006/-ko/
++/se73180.h/1.1/Wed Jan 4 17:33:14 2006/-ko/
++/se7751.h/1.1/Wed Jan 4 18:13:24 2006/-ko/
++/sections.h/1.1/Sun Jul 27 21:05:50 2003//
++/segment.h/1.4/Wed Jul 16 03:58:49 2003//
++/semaphore.h/1.7/Tue Jan 3 22:35:58 2006//
++/serial.h/1.4/Mon Aug 29 21:01:19 2005/-ko/
++/shmparam.h/1.3/Fri Sep 24 14:58:00 2004//
++/sigcontext.h/1.4/Wed Apr 28 08:53:25 2004/-ko/
++/signal.h/1.7/Tue Jun 21 04:15:52 2005//
++/smc37c93x.h/1.3/Tue May 31 14:08:54 2005/-ko/
++/smp.h/1.6/Mon Aug 29 21:01:19 2005//
++/snapgear.h/1.1/Wed Jan 4 18:42:42 2006/-ko/
++/spinlock.h/1.8/Fri Oct 28 13:12:50 2005/-ko/
++/statfs.h/1.3/Sat Jun 28 15:44:06 2003//
++/system.h/1.24/Mon Mar 27 21:06:15 2006//
++/systemh7751.h/1.1/Wed Jan 4 18:52:50 2006/-ko/
++/timer.h/1.2/Sun Jan 29 17:46:24 2006/-ko/
++/timex.h/1.6/Tue Jun 21 04:15:52 2005//
++/titan.h/1.1/Tue Nov 29 04:01:49 2005//
++/tlb.h/1.5/Tue May 6 23:28:51 2003//
++/tlbflush.h/1.1/Fri Apr 12 04:26:29 2002//
++/ubc.h/1.4/Fri Sep 24 14:58:00 2004//
++/user.h/1.5/Fri Sep 24 14:58:00 2004/-ko/
++/watchdog.h/1.4/Fri Sep 24 14:58:00 2004/-ko/
++D/bigsur////
++D/cat68701////
++D/cpu-sh2////
++D/cpu-sh3////
++D/cpu-sh4////
++D/cqreek////
++D/dmida////
++D/dreamcast////
++D/ec3104////
++D/edosk7705////
++D/harp////
++D/hd64465////
++D/hp6xx////
++D/hs7751rvoip////
++D/landisk////
++D/mpc1211////
++D/overdrive////
++D/r7780rp////
++D/rts7751r2d////
++D/saturn////
++D/sh03////
++D/sh2000////
++/addrspace.h/1.4/Wed Jul 5 14:51:36 2006//
++/bitops.h/1.11/Wed Jul 5 14:51:36 2006/-ko/
++/io.h/1.20/Wed Jul 5 14:51:36 2006//
++/kexec.h/1.2/Wed Jul 5 14:51:36 2006/-ko/
++/page.h/1.15/Wed Jul 5 14:51:36 2006//
++/poll.h/1.3/Wed Jul 5 14:51:37 2006//
++/types.h/1.7/Wed Jul 5 14:51:37 2006/-ko/
++/processor.h/1.36/Fri Jul 7 10:15:20 2006/-ko/
++/thread_info.h/1.18/Fri Jul 7 10:15:20 2006/-ko/
++/uaccess.h/1.17/Fri Jul 7 10:15:20 2006/-ko/
++/unistd.h/1.29/Fri Jul 7 10:15:20 2006/-ko/
++/rtc.h/1.6/Sat Jul 8 20:16:14 2006/-ko/
++/irq-sh7780.h/1.3/Wed Jul 12 16:51:59 2006/-ko/
++/irq.h/1.31/Wed Jul 12 16:51:59 2006/-ko/
++/sfp-machine.h/1.1/Wed Jul 12 10:35:55 2006/-ko/
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/CVS/Repository linux-2.6.17/include/asm-sh/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/CVS/Repository 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/CVS/Root linux-2.6.17/include/asm-sh/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/CVS/Root 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/apm.h linux-2.6.17/include/asm-sh/apm.h
+--- linux-2.6.17-vanilla/include/asm-sh/apm.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/apm.h 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,46 @@
++/*
++ * Copyright 2006 (c) Andriy Skulysh <askulysh@gmail.com>
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ *
++ */
++
++#ifndef __ASM_SH_APM_H
++#define __ASM_SH_APM_H
++
++#define APM_AC_OFFLINE 0
++#define APM_AC_ONLINE 1
++#define APM_AC_BACKUP 2
++#define APM_AC_UNKNOWN 0xff
++
++#define APM_BATTERY_STATUS_HIGH 0
++#define APM_BATTERY_STATUS_LOW 1
++#define APM_BATTERY_STATUS_CRITICAL 2
++#define APM_BATTERY_STATUS_CHARGING 3
++#define APM_BATTERY_STATUS_NOT_PRESENT 4
++#define APM_BATTERY_STATUS_UNKNOWN 0xff
++
++#define APM_BATTERY_LIFE_UNKNOWN 0xFFFF
++#define APM_BATTERY_LIFE_MINUTES 0x8000
++#define APM_BATTERY_LIFE_VALUE_MASK 0x7FFF
++
++#define APM_BATTERY_FLAG_HIGH (1 << 0)
++#define APM_BATTERY_FLAG_LOW (1 << 1)
++#define APM_BATTERY_FLAG_CRITICAL (1 << 2)
++#define APM_BATTERY_FLAG_CHARGING (1 << 3)
++#define APM_BATTERY_FLAG_NOT_PRESENT (1 << 7)
++#define APM_BATTERY_FLAG_UNKNOWN 0xff
++
++#define APM_UNITS_MINS 0
++#define APM_UNITS_SECS 1
++#define APM_UNITS_UNKNOWN -1
++
++
++extern int (*apm_get_info)(char *buf, char **start, off_t fpos, int length);
++extern int apm_suspended;
++
++void apm_queue_event(apm_event_t event);
++
++#endif
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/atomic.h linux-2.6.17/include/asm-sh/atomic.h
+--- linux-2.6.17-vanilla/include/asm-sh/atomic.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/atomic.h 2006-07-12 16:54:25.000000000 +0000
+@@ -14,6 +14,7 @@
+ #define atomic_read(v) ((v)->counter)
+ #define atomic_set(v,i) ((v)->counter = (i))
+
++#include <linux/compiler.h>
+ #include <asm/system.h>
+
+ /*
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/bigsur/CVS/Entries linux-2.6.17/include/asm-sh/bigsur/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/bigsur/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/bigsur/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,4 @@
++/bigsur.h/1.2/Fri Nov 1 17:19:28 2002//
++/io.h/1.4/Mon Aug 4 01:38:06 2003//
++/serial.h/1.4/Mon Aug 29 21:01:19 2005//
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/bigsur/CVS/Repository linux-2.6.17/include/asm-sh/bigsur/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/bigsur/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/bigsur/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/bigsur
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/bigsur/CVS/Root linux-2.6.17/include/asm-sh/bigsur/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/bigsur/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/bigsur/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/bitops.h linux-2.6.17/include/asm-sh/bitops.h
+--- linux-2.6.17-vanilla/include/asm-sh/bitops.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/bitops.h 2006-07-12 16:54:25.000000000 +0000
+@@ -6,7 +6,7 @@
+ /* For __swab32 */
+ #include <asm/byteorder.h>
+
+-static __inline__ void set_bit(int nr, volatile void * addr)
++static inline void set_bit(int nr, volatile void * addr)
+ {
+ int mask;
+ volatile unsigned int *a = addr;
+@@ -24,7 +24,7 @@
+ */
+ #define smp_mb__before_clear_bit() barrier()
+ #define smp_mb__after_clear_bit() barrier()
+-static __inline__ void clear_bit(int nr, volatile void * addr)
++static inline void clear_bit(int nr, volatile void * addr)
+ {
+ int mask;
+ volatile unsigned int *a = addr;
+@@ -37,7 +37,7 @@
+ local_irq_restore(flags);
+ }
+
+-static __inline__ void change_bit(int nr, volatile void * addr)
++static inline void change_bit(int nr, volatile void * addr)
+ {
+ int mask;
+ volatile unsigned int *a = addr;
+@@ -50,7 +50,7 @@
+ local_irq_restore(flags);
+ }
+
+-static __inline__ int test_and_set_bit(int nr, volatile void * addr)
++static inline int test_and_set_bit(int nr, volatile void * addr)
+ {
+ int mask, retval;
+ volatile unsigned int *a = addr;
+@@ -66,7 +66,7 @@
+ return retval;
+ }
+
+-static __inline__ int test_and_clear_bit(int nr, volatile void * addr)
++static inline int test_and_clear_bit(int nr, volatile void * addr)
+ {
+ int mask, retval;
+ volatile unsigned int *a = addr;
+@@ -82,7 +82,7 @@
+ return retval;
+ }
+
+-static __inline__ int test_and_change_bit(int nr, volatile void * addr)
++static inline int test_and_change_bit(int nr, volatile void * addr)
+ {
+ int mask, retval;
+ volatile unsigned int *a = addr;
+@@ -100,7 +100,7 @@
+
+ #include <asm-generic/bitops/non-atomic.h>
+
+-static __inline__ unsigned long ffz(unsigned long word)
++static inline unsigned long ffz(unsigned long word)
+ {
+ unsigned long result;
+
+@@ -120,7 +120,7 @@
+ *
+ * Undefined if no bit exists, so code should check against 0 first.
+ */
+-static __inline__ unsigned long __ffs(unsigned long word)
++static inline unsigned long __ffs(unsigned long word)
+ {
+ unsigned long result;
+
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/bugs.h linux-2.6.17/include/asm-sh/bugs.h
+--- linux-2.6.17-vanilla/include/asm-sh/bugs.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/bugs.h 2006-07-12 16:54:25.000000000 +0000
+@@ -32,6 +32,10 @@
+ case CPU_SH7750 ... CPU_SH4_501:
+ *p++ = '4';
+ break;
++ case CPU_SH7770 ... CPU_SH7781:
++ *p++ = '4';
++ *p++ = 'a';
++ break;
+ default:
+ *p++ = '?';
+ *p++ = '!';
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cache.h linux-2.6.17/include/asm-sh/cache.h
+--- linux-2.6.17-vanilla/include/asm-sh/cache.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cache.h 2006-07-12 16:54:25.000000000 +0000
+@@ -10,7 +10,6 @@
+ #ifdef __KERNEL__
+
+ #include <asm/cpu/cache.h>
+-#include <asm/cpu/cacheflush.h>
+
+ #define SH_CACHE_VALID 1
+ #define SH_CACHE_UPDATED 2
+@@ -23,24 +22,31 @@
+ #define L1_CACHE_ALIGN(x) (((x)+(L1_CACHE_BYTES-1))&~(L1_CACHE_BYTES-1))
+
+ struct cache_info {
+- unsigned int ways;
+- unsigned int sets;
+- unsigned int linesz;
+-
++ unsigned int ways; /* Number of cache ways */
++ unsigned int sets; /* Number of cache sets */
++ unsigned int linesz; /* Cache line size (bytes) */
++
++ unsigned int way_size; /* sets * line size */
++
++ /*
++ * way_incr is the address offset for accessing the next way
++ * in memory mapped cache array ops.
++ */
+ unsigned int way_incr;
+-
+ unsigned int entry_shift;
+ unsigned int entry_mask;
+
++ /*
++ * Compute a mask which selects the address bits which overlap between
++ * 1. those used to select the cache set during indexing
++ * 2. those in the physical page number.
++ */
++ unsigned int alias_mask;
++
++ unsigned int n_aliases; /* Number of aliases */
++
+ unsigned long flags;
+ };
+
+-/* Flush (write-back only) a region (smaller than a page) */
+-extern void __flush_wback_region(void *start, int size);
+-/* Flush (write-back & invalidate) a region (smaller than a page) */
+-extern void __flush_purge_region(void *start, int size);
+-/* Flush (invalidate only) a region (smaller than a page) */
+-extern void __flush_invalidate_region(void *start, int size);
+-
+ #endif /* __KERNEL__ */
+ #endif /* __ASM_SH_CACHE_H */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cacheflush.h linux-2.6.17/include/asm-sh/cacheflush.h
+--- linux-2.6.17-vanilla/include/asm-sh/cacheflush.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cacheflush.h 2006-07-12 16:54:25.000000000 +0000
+@@ -2,6 +2,7 @@
+ #define __ASM_SH_CACHEFLUSH_H
+ #ifdef __KERNEL__
+
++#include <linux/mm.h>
+ #include <asm/cpu/cacheflush.h>
+
+ /* Flush (write-back only) a region (smaller than a page) */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cat68701/CVS/Entries linux-2.6.17/include/asm-sh/cat68701/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/cat68701/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cat68701/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,2 @@
++/io.h/1.4/Mon Aug 4 01:44:40 2003//
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cat68701/CVS/Repository linux-2.6.17/include/asm-sh/cat68701/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/cat68701/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cat68701/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/cat68701
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cat68701/CVS/Root linux-2.6.17/include/asm-sh/cat68701/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/cat68701/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cat68701/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/checksum.h linux-2.6.17/include/asm-sh/checksum.h
+--- linux-2.6.17-vanilla/include/asm-sh/checksum.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/checksum.h 2006-07-12 16:54:25.000000000 +0000
+@@ -160,6 +160,7 @@
+ }
+
+ #define _HAVE_ARCH_IPV6_CSUM
++#ifdef CONFIG_IPV6
+ static __inline__ unsigned short int csum_ipv6_magic(struct in6_addr *saddr,
+ struct in6_addr *daddr,
+ __u32 len,
+@@ -195,6 +196,7 @@
+
+ return csum_fold(sum);
+ }
++#endif
+
+ /*
+ * Copy and checksum to user
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cpu-sh2/CVS/Entries linux-2.6.17/include/asm-sh/cpu-sh2/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/cpu-sh2/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cpu-sh2/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,8 @@
++/addrspace.h/1.1/Fri Jul 4 13:01:46 2003//
++/cache.h/1.3/Wed Jul 16 04:08:29 2003/-ko/
++/cacheflush.h/1.4/Tue Jun 21 04:15:52 2005/-ko/
++/dma.h/1.1/Fri Jul 4 13:01:46 2003//
++/shmparam.h/1.1/Fri Jul 4 13:01:46 2003//
++/ubc.h/1.1/Fri Jul 4 13:01:46 2003//
++/watchdog.h/1.1/Sat May 24 19:12:09 2003//
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cpu-sh2/CVS/Repository linux-2.6.17/include/asm-sh/cpu-sh2/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/cpu-sh2/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cpu-sh2/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/cpu-sh2
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cpu-sh2/CVS/Root linux-2.6.17/include/asm-sh/cpu-sh2/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/cpu-sh2/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cpu-sh2/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cpu-sh3/CVS/Entries linux-2.6.17/include/asm-sh/cpu-sh3/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/cpu-sh3/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cpu-sh3/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,14 @@
++/adc.h/1.2/Sun Aug 15 16:59:32 2004/-ko/
++/addrspace.h/1.2/Sun May 4 19:30:07 2003/-ko/
++/cache.h/1.4/Mon Aug 30 12:55:32 2004/-ko/
++/cacheflush.h/1.8/Tue Jan 3 23:01:25 2006/-ko/
++/dac.h/1.2/Sat Jun 5 17:17:34 2004/-ko/
++/dma.h/1.7/Wed Jan 4 14:59:08 2006/-ko/
++/freq.h/1.4/Sun Jan 29 17:46:24 2006/-ko/
++/mmu_context.h/1.4/Sat Jan 7 20:05:01 2006/-ko/
++/rtc.h/1.2/Sun May 4 19:30:08 2003/-ko/
++/shmparam.h/1.2/Sun May 4 19:30:08 2003/-ko/
++/timer.h/1.3/Tue May 31 14:07:35 2005/-ko/
++/ubc.h/1.2/Sun May 4 19:30:08 2003/-ko/
++/watchdog.h/1.1/Sat May 24 19:12:09 2003//
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cpu-sh3/CVS/Repository linux-2.6.17/include/asm-sh/cpu-sh3/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/cpu-sh3/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cpu-sh3/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/cpu-sh3
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cpu-sh3/CVS/Root linux-2.6.17/include/asm-sh/cpu-sh3/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/cpu-sh3/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cpu-sh3/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cpu-sh3/cache.h linux-2.6.17/include/asm-sh/cpu-sh3/cache.h
+--- linux-2.6.17-vanilla/include/asm-sh/cpu-sh3/cache.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cpu-sh3/cache.h 2006-07-12 16:54:26.000000000 +0000
+@@ -26,7 +26,7 @@
+ #define CCR_CACHE_ENABLE CCR_CACHE_CE
+ #define CCR_CACHE_INVALIDATE CCR_CACHE_CF
+
+-#if defined(CONFIG_CPU_SUBTYPE_SH7705)
++#if defined(CONFIG_CPU_SUBTYPE_SH7705)
+ #define CCR3 0xa40000b4
+ #define CCR_CACHE_16KB 0x00010000
+ #define CCR_CACHE_32KB 0x00020000
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cpu-sh3/cacheflush.h linux-2.6.17/include/asm-sh/cpu-sh3/cacheflush.h
+--- linux-2.6.17-vanilla/include/asm-sh/cpu-sh3/cacheflush.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cpu-sh3/cacheflush.h 2006-07-12 16:54:26.000000000 +0000
+@@ -10,7 +10,7 @@
+ #ifndef __ASM_CPU_SH3_CACHEFLUSH_H
+ #define __ASM_CPU_SH3_CACHEFLUSH_H
+
+-/*
++/*
+ * Cache flushing:
+ *
+ * - flush_cache_all() flushes entire cache
+@@ -35,53 +35,41 @@
+ /* 32KB cache, 4kb PAGE sizes need to check bit 12 */
+ #define CACHE_ALIAS 0x00001000
+
+-struct page;
+-struct mm_struct;
+-struct vm_area_struct;
+-
+-extern void flush_cache_all(void);
+-extern void flush_cache_mm(struct mm_struct *mm);
+-extern void flush_cache_range(struct vm_area_struct *vma, unsigned long start,
+- unsigned long end);
+-extern void flush_cache_page(struct vm_area_struct *vma, unsigned long addr, unsigned long pfn);
+-extern void flush_dcache_page(struct page *pg);
+-extern void flush_icache_range(unsigned long start, unsigned long end);
+-extern void flush_icache_page(struct vm_area_struct *vma, struct page *page);
+-
+-#define flush_dcache_mmap_lock(mapping) do { } while (0)
+-#define flush_dcache_mmap_unlock(mapping) do { } while (0)
+-
+-/* SH3 has unified cache so no special action needed here */
+-#define flush_cache_sigtramp(vaddr) do { } while (0)
+-#define flush_page_to_ram(page) do { } while (0)
+-#define flush_icache_user_range(vma,pg,adr,len) do { } while (0)
+-
+-#define p3_cache_init() do { } while (0)
+-
+ #define PG_mapped PG_arch_1
+
+-/* We provide our own get_unmapped_area to avoid cache alias issue */
+-#define HAVE_ARCH_UNMAPPED_AREA
+-
++void flush_cache_all(void);
++void flush_cache_mm(struct mm_struct *mm);
++void flush_cache_range(struct vm_area_struct *vma, unsigned long start,
++ unsigned long end);
++void flush_cache_page(struct vm_area_struct *vma, unsigned long addr, unsigned long pfn);
++void flush_dcache_page(struct page *pg);
++void flush_icache_range(unsigned long start, unsigned long end);
++void flush_icache_page(struct vm_area_struct *vma, struct page *page);
+ #else
+-
+ #define flush_cache_all() do { } while (0)
+ #define flush_cache_mm(mm) do { } while (0)
+ #define flush_cache_range(vma, start, end) do { } while (0)
+ #define flush_cache_page(vma, vmaddr, pfn) do { } while (0)
+ #define flush_dcache_page(page) do { } while (0)
+-#define flush_dcache_mmap_lock(mapping) do { } while (0)
+-#define flush_dcache_mmap_unlock(mapping) do { } while (0)
+ #define flush_icache_range(start, end) do { } while (0)
+ #define flush_icache_page(vma,pg) do { } while (0)
+-#define flush_icache_user_range(vma,pg,adr,len) do { } while (0)
++#endif
++
++#define flush_dcache_mmap_lock(mapping) do { } while (0)
++#define flush_dcache_mmap_unlock(mapping) do { } while (0)
++
++/* SH3 has unified cache so no special action needed here */
+ #define flush_cache_sigtramp(vaddr) do { } while (0)
++#define flush_icache_user_range(vma,pg,adr,len) do { } while (0)
+
+ #define p3_cache_init() do { } while (0)
+
++/*
++ * We provide our own get_unmapped_area to avoid cache aliasing issues
++ * on SH7705 with a 32KB cache, and to page align addresses in the
++ * non-aliasing case.
++ */
+ #define HAVE_ARCH_UNMAPPED_AREA
+
+-#endif
+-
+ #endif /* __ASM_CPU_SH3_CACHEFLUSH_H */
+
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cpu-sh3/freq.h linux-2.6.17/include/asm-sh/cpu-sh3/freq.h
+--- linux-2.6.17-vanilla/include/asm-sh/cpu-sh3/freq.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cpu-sh3/freq.h 2006-07-12 16:54:26.000000000 +0000
+@@ -18,5 +18,9 @@
+ #define MIN_DIVISOR_NR 0
+ #define MAX_DIVISOR_NR 4
+
++#define FRQCR_CKOEN 0x0100
++#define FRQCR_PLLEN 0x0080
++#define FRQCR_PSTBY 0x0040
++
+ #endif /* __ASM_CPU_SH3_FREQ_H */
+
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cpu-sh3/timer.h linux-2.6.17/include/asm-sh/cpu-sh3/timer.h
+--- linux-2.6.17-vanilla/include/asm-sh/cpu-sh3/timer.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cpu-sh3/timer.h 2006-07-12 16:54:26.000000000 +0000
+@@ -23,6 +23,10 @@
+ * ---------------------------------------------------------------------------
+ */
+
++#if !defined(CONFIG_CPU_SUBTYPE_SH7727)
++#define TMU_TOCR 0xfffffe90 /* Byte access */
++#endif
++
+ #if defined(CONFIG_CPU_SUBTYPE_SH7300) || defined(CONFIG_CPU_SUBTYPE_SH7710)
+ #define TMU_TSTR 0xa412fe92 /* Byte access */
+
+@@ -39,9 +43,6 @@
+ #define TMU2_TCR 0xa412feb4 /* Word access */
+
+ #else
+-#if !defined(CONFIG_CPU_SUBTYPE_SH7727)
+-#define TMU_TOCR 0xfffffe90 /* Byte access */
+-#endif
+ #define TMU_TSTR 0xfffffe92 /* Byte access */
+
+ #define TMU0_TCOR 0xfffffe94 /* Long access */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cpu-sh4/CVS/Entries linux-2.6.17/include/asm-sh/cpu-sh4/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/cpu-sh4/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cpu-sh4/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,14 @@
++/addrspace.h/1.3/Wed Jan 18 05:43:01 2006/-ko/
++/cache.h/1.5/Sun Aug 21 23:47:31 2005/-ko/
++/cacheflush.h/1.6/Sat Dec 31 11:30:49 2005/-ko/
++/dma-sh7780.h/1.2/Sun Feb 5 15:29:22 2006/-ko/
++/dma.h/1.10/Sun Feb 5 15:29:22 2006/-ko/
++/freq.h/1.4/Sun Aug 21 23:47:31 2005/-ko/
++/mmu_context.h/1.5/Sat Jan 7 20:05:01 2006/-ko/
++/rtc.h/1.2/Sun May 4 19:30:12 2003/-ko/
++/shmparam.h/1.2/Sun May 4 19:30:13 2003/-ko/
++/sq.h/1.2/Sat Jan 7 13:14:44 2006//
++/timer.h/1.1/Thu Oct 14 12:22:25 2004/-ko/
++/ubc.h/1.2/Sun May 4 19:30:13 2003/-ko/
++/watchdog.h/1.1/Sat May 24 19:12:09 2003//
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cpu-sh4/CVS/Repository linux-2.6.17/include/asm-sh/cpu-sh4/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/cpu-sh4/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cpu-sh4/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/cpu-sh4
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cpu-sh4/CVS/Root linux-2.6.17/include/asm-sh/cpu-sh4/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/cpu-sh4/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cpu-sh4/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cpu-sh4/addrspace.h linux-2.6.17/include/asm-sh/cpu-sh4/addrspace.h
+--- linux-2.6.17-vanilla/include/asm-sh/cpu-sh4/addrspace.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cpu-sh4/addrspace.h 2006-07-12 16:54:26.000000000 +0000
+@@ -22,5 +22,8 @@
+ #define P4SEG_TLB_DATA 0xf7000000
+ #define P4SEG_REG_BASE 0xff000000
+
++#define PA_AREA5_IO 0xb4000000 /* Area 5 IO Memory */
++#define PA_AREA6_IO 0xb8000000 /* Area 6 IO Memory */
++
+ #endif /* __ASM_CPU_SH4_ADDRSPACE_H */
+
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cpu-sh4/cache.h linux-2.6.17/include/asm-sh/cpu-sh4/cache.h
+--- linux-2.6.17-vanilla/include/asm-sh/cpu-sh4/cache.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cpu-sh4/cache.h 2006-07-12 16:54:26.000000000 +0000
+@@ -22,7 +22,9 @@
+ #define CCR_CACHE_ICE 0x0100 /* Instruction Cache Enable */
+ #define CCR_CACHE_ICI 0x0800 /* IC Invalidate */
+ #define CCR_CACHE_IIX 0x8000 /* IC Index Enable */
++#ifndef CONFIG_CPU_SUBTYPE_SH7780
+ #define CCR_CACHE_EMODE 0x80000000 /* EMODE Enable */
++#endif
+
+ /* Default CCR setup: 8k+16k-byte cache,P1-wb,enable */
+ #define CCR_CACHE_ENABLE (CCR_CACHE_OCE|CCR_CACHE_ICE)
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cpu-sh4/cacheflush.h linux-2.6.17/include/asm-sh/cpu-sh4/cacheflush.h
+--- linux-2.6.17-vanilla/include/asm-sh/cpu-sh4/cacheflush.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cpu-sh4/cacheflush.h 2006-07-12 16:54:26.000000000 +0000
+@@ -16,34 +16,26 @@
+ * caching; in which case they're only semi-broken),
+ * so we need them.
+ */
+-
+-/* Page is 4K, OC size is 16K, there are four lines. */
+-#define CACHE_ALIAS 0x00003000
+-
+-struct page;
+-struct mm_struct;
+-struct vm_area_struct;
+-
+-extern void flush_cache_all(void);
+-extern void flush_cache_mm(struct mm_struct *mm);
+-extern void flush_cache_range(struct vm_area_struct *vma, unsigned long start,
+- unsigned long end);
+-extern void flush_cache_page(struct vm_area_struct *vma, unsigned long addr, unsigned long pfn);
+-extern void flush_dcache_page(struct page *pg);
++void flush_cache_all(void);
++void flush_cache_mm(struct mm_struct *mm);
++void flush_cache_range(struct vm_area_struct *vma, unsigned long start,
++ unsigned long end);
++void flush_cache_page(struct vm_area_struct *vma, unsigned long addr,
++ unsigned long pfn);
++void flush_dcache_page(struct page *pg);
+
+ #define flush_dcache_mmap_lock(mapping) do { } while (0)
+ #define flush_dcache_mmap_unlock(mapping) do { } while (0)
+
+-extern void flush_icache_range(unsigned long start, unsigned long end);
+-extern void flush_cache_sigtramp(unsigned long addr);
+-extern void flush_icache_user_range(struct vm_area_struct *vma,
+- struct page *page, unsigned long addr,
+- int len);
++void flush_icache_range(unsigned long start, unsigned long end);
++void flush_cache_sigtramp(unsigned long addr);
++void flush_icache_user_range(struct vm_area_struct *vma, struct page *page,
++ unsigned long addr, int len);
+
+ #define flush_icache_page(vma,pg) do { } while (0)
+
+ /* Initialization of P3 area for copy_user_page */
+-extern void p3_cache_init(void);
++void p3_cache_init(void);
+
+ #define PG_mapped PG_arch_1
+
+@@ -61,4 +53,3 @@
+ }
+ #endif /* CONFIG_MMU */
+ #endif /* __ASM_CPU_SH4_CACHEFLUSH_H */
+-
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cpu-sh4/dma-sh7780.h linux-2.6.17/include/asm-sh/cpu-sh4/dma-sh7780.h
+--- linux-2.6.17-vanilla/include/asm-sh/cpu-sh4/dma-sh7780.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cpu-sh4/dma-sh7780.h 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,39 @@
++#ifndef __ASM_SH_CPU_SH4_DMA_SH7780_H
++#define __ASM_SH_CPU_SH4_DMA_SH7780_H
++
++#define REQ_HE 0x000000C0
++#define REQ_H 0x00000080
++#define REQ_LE 0x00000040
++#define TM_BURST 0x0000020
++#define TS_8 0x00000000
++#define TS_16 0x00000008
++#define TS_32 0x00000010
++#define TS_16BLK 0x00000018
++#define TS_32BLK 0x00100000
++
++/*
++ * The SuperH DMAC supports a number of transmit sizes, we list them here,
++ * with their respective values as they appear in the CHCR registers.
++ *
++ * Defaults to a 64-bit transfer size.
++ */
++enum {
++ XMIT_SZ_8BIT,
++ XMIT_SZ_16BIT,
++ XMIT_SZ_32BIT,
++ XMIT_SZ_128BIT,
++ XMIT_SZ_256BIT,
++};
++
++/*
++ * The DMA count is defined as the number of bytes to transfer.
++ */
++static unsigned int __attribute__ ((used)) ts_shift[] = {
++ [XMIT_SZ_8BIT] = 0,
++ [XMIT_SZ_16BIT] = 1,
++ [XMIT_SZ_32BIT] = 2,
++ [XMIT_SZ_128BIT] = 4,
++ [XMIT_SZ_256BIT] = 5,
++};
++
++#endif /* __ASM_SH_CPU_SH4_DMA_SH7780_H */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cpu-sh4/dma.h linux-2.6.17/include/asm-sh/cpu-sh4/dma.h
+--- linux-2.6.17-vanilla/include/asm-sh/cpu-sh4/dma.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cpu-sh4/dma.h 2006-07-12 16:54:26.000000000 +0000
+@@ -1,11 +1,17 @@
+ #ifndef __ASM_CPU_SH4_DMA_H
+ #define __ASM_CPU_SH4_DMA_H
+
++#define DMAOR_INIT ( 0x8000 | DMAOR_DME )
++
+ #ifdef CONFIG_CPU_SH4A
+ #define SH_DMAC_BASE 0xfc808020
++
++#define CHCR_TS_MASK 0x18
++#define CHCR_TS_SHIFT 3
++
++#include <asm/cpu/dma-sh7780.h>
+ #else
+ #define SH_DMAC_BASE 0xffa00000
+-#endif
+
+ /* Definitions for the SuperH DMAC */
+ #define TM_BURST 0x0000080
+@@ -19,8 +25,6 @@
+
+ #define DMAOR_COD 0x00000008
+
+-#define DMAOR_INIT ( 0x8000 | DMAOR_DME )
+-
+ /*
+ * The SuperH DMAC supports a number of transmit sizes, we list them here,
+ * with their respective values as they appear in the CHCR registers.
+@@ -45,5 +49,6 @@
+ [XMIT_SZ_32BIT] = 2,
+ [XMIT_SZ_256BIT] = 5,
+ };
++#endif
+
+ #endif /* __ASM_CPU_SH4_DMA_H */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cpu-sh4/sq.h linux-2.6.17/include/asm-sh/cpu-sh4/sq.h
+--- linux-2.6.17-vanilla/include/asm-sh/cpu-sh4/sq.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cpu-sh4/sq.h 2006-07-12 16:54:26.000000000 +0000
+@@ -17,7 +17,7 @@
+ * Store queues range from e0000000-e3fffffc, allowing approx. 64MB to be
+ * mapped to any physical address space. Since data is written (and aligned)
+ * to 32-byte boundaries, we need to be sure that all allocations are aligned.
+- */
++ */
+ #define SQ_SIZE 32
+ #define SQ_ALIGN_MASK (~(SQ_SIZE - 1))
+ #define SQ_ALIGN(addr) (((addr)+SQ_SIZE-1) & SQ_ALIGN_MASK)
+@@ -26,23 +26,10 @@
+ #define SQ_QACR1 (P4SEG_REG_BASE + 0x3c)
+ #define SQ_ADDRMAX (P4SEG_STORE_QUE + 0x04000000)
+
+-struct sq_mapping {
+- const char *name;
+-
+- unsigned long sq_addr;
+- unsigned long addr;
+- unsigned int size;
+-
+- struct list_head list;
+-};
+-
+ /* arch/sh/kernel/cpu/sh4/sq.c */
+-extern struct sq_mapping *sq_remap(unsigned long phys, unsigned int size, const char *name);
+-extern void sq_unmap(struct sq_mapping *map);
+-
+-extern void sq_clear(unsigned long addr, unsigned int len);
+-extern void sq_flush(void *addr);
+-extern void sq_flush_range(unsigned long start, unsigned int len);
++unsigned long sq_remap(unsigned long phys, unsigned int size,
++ const char *name, unsigned long flags);
++void sq_unmap(unsigned long vaddr);
++void sq_flush_range(unsigned long start, unsigned int len);
+
+ #endif /* __ASM_CPU_SH4_SQ_H */
+-
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cqreek/CVS/Entries linux-2.6.17/include/asm-sh/cqreek/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/cqreek/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cqreek/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,2 @@
++/cqreek.h/1.2/Fri Nov 1 17:19:28 2002//
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cqreek/CVS/Repository linux-2.6.17/include/asm-sh/cqreek/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/cqreek/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cqreek/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/cqreek
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/cqreek/CVS/Root linux-2.6.17/include/asm-sh/cqreek/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/cqreek/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/cqreek/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/dmida/CVS/Entries linux-2.6.17/include/asm-sh/dmida/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/dmida/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/dmida/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,2 @@
++/io.h/1.2/Sun May 4 19:30:13 2003/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/dmida/CVS/Repository linux-2.6.17/include/asm-sh/dmida/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/dmida/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/dmida/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/dmida
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/dmida/CVS/Root linux-2.6.17/include/asm-sh/dmida/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/dmida/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/dmida/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/dreamcast/CVS/Entries linux-2.6.17/include/asm-sh/dreamcast/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/dreamcast/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/dreamcast/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,4 @@
++/dma.h/1.2/Wed Aug 27 12:35:06 2003//
++/pci.h/1.1/Sun Aug 17 16:27:11 2003//
++/sysasic.h/1.4/Sat Aug 23 00:46:39 2003//
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/dreamcast/CVS/Repository linux-2.6.17/include/asm-sh/dreamcast/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/dreamcast/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/dreamcast/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/dreamcast
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/dreamcast/CVS/Root linux-2.6.17/include/asm-sh/dreamcast/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/dreamcast/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/dreamcast/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/ec3104/CVS/Entries linux-2.6.17/include/asm-sh/ec3104/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/ec3104/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/ec3104/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,5 @@
++/ec3104.h/1.2/Fri Nov 1 17:19:29 2002//
++/io.h/1.3/Tue Jul 29 14:27:12 2003//
++/keyboard.h/1.2/Fri Nov 1 17:19:29 2002//
++/serial.h/1.4/Mon Aug 29 21:01:19 2005//
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/ec3104/CVS/Repository linux-2.6.17/include/asm-sh/ec3104/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/ec3104/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/ec3104/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/ec3104
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/ec3104/CVS/Root linux-2.6.17/include/asm-sh/ec3104/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/ec3104/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/ec3104/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/edosk7705/CVS/Entries linux-2.6.17/include/asm-sh/edosk7705/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/edosk7705/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/edosk7705/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,2 @@
++/io.h/1.1/Mon Aug 30 12:55:33 2004/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/edosk7705/CVS/Repository linux-2.6.17/include/asm-sh/edosk7705/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/edosk7705/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/edosk7705/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/edosk7705
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/edosk7705/CVS/Root linux-2.6.17/include/asm-sh/edosk7705/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/edosk7705/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/edosk7705/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/harp/CVS/Entries linux-2.6.17/include/asm-sh/harp/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/harp/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/harp/CVS/Entries 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,3 @@
++/harp.h/1.2/Fri Nov 1 17:19:29 2002//
++/io.h/1.2/Sun May 4 19:30:14 2003/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/harp/CVS/Repository linux-2.6.17/include/asm-sh/harp/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/harp/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/harp/CVS/Repository 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/harp
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/harp/CVS/Root linux-2.6.17/include/asm-sh/harp/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/harp/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/harp/CVS/Root 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/hd64461.h linux-2.6.17/include/asm-sh/hd64461.h
+--- linux-2.6.17-vanilla/include/asm-sh/hd64461.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/hd64461.h 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,208 @@
++#ifndef __ASM_SH_HD64461
++#define __ASM_SH_HD64461
++/*
++ * $Id: hd64461.h,v 1.5 2004/03/16 00:07:51 lethal Exp $
++ * Copyright (C) 2000 YAEGASHI Takeshi
++ * Hitachi HD64461 companion chip support
++ */
++
++/* Constants for PCMCIA mappings */
++#define HD64461_PCC_WINDOW 0x01000000
++
++#define HD64461_PCC0_BASE 0xb8000000 /* area 6 */
++#define HD64461_PCC0_ATTR (HD64461_PCC0_BASE)
++#define HD64461_PCC0_COMM (HD64461_PCC0_BASE+HD64461_PCC_WINDOW)
++#define HD64461_PCC0_IO (HD64461_PCC0_BASE+2*HD64461_PCC_WINDOW)
++
++#define HD64461_PCC1_BASE 0xb4000000 /* area 5 */
++#define HD64461_PCC1_ATTR (HD64461_PCC1_BASE)
++#define HD64461_PCC1_COMM (HD64461_PCC1_BASE+HD64461_PCC_WINDOW)
++
++#define HD64461_STBCR 0x10000
++#define HD64461_STBCR_CKIO_STBY 0x2000
++#define HD64461_STBCR_SAFECKE_IST 0x1000
++#define HD64461_STBCR_SLCKE_IST 0x0800
++#define HD64461_STBCR_SAFECKE_OST 0x0400
++#define HD64461_STBCR_SLCKE_OST 0x0200
++#define HD64461_STBCR_SMIAST 0x0100
++#define HD64461_STBCR_SLCDST 0x0080
++#define HD64461_STBCR_SPC0ST 0x0040
++#define HD64461_STBCR_SPC1ST 0x0020
++#define HD64461_STBCR_SAFEST 0x0010
++#define HD64461_STBCR_STM0ST 0x0008
++#define HD64461_STBCR_STM1ST 0x0004
++#define HD64461_STBCR_SIRST 0x0002
++#define HD64461_STBCR_SURTST 0x0001
++
++#define HD64461_SYSCR 0x10002
++#define HD64461_SCPUCR 0x10004
++
++#define HD64461_LCDCBAR 0x11000
++#define HD64461_LCDCLOR 0x11002
++#define HD64461_LCDCCR 0x11004
++#define HD64461_LCDCCR_STBACK 0x0400
++#define HD64461_LCDCCR_STREQ 0x0100
++#define HD64461_LCDCCR_MOFF 0x0080
++#define HD64461_LCDCCR_REFSEL 0x0040
++#define HD64461_LCDCCR_EPON 0x0020
++#define HD64461_LCDCCR_SPON 0x0010
++
++#define HD64461_LDR1 0x11010
++#define HD64461_LDR1_DON 0x01
++#define HD64461_LDR1_DINV 0x80
++
++#define HD64461_LDR2 0x11012
++#define HD64461_LDHNCR 0x11014
++#define HD64461_LDHNSR 0x11016
++#define HD64461_LDVNTR 0x11018
++#define HD64461_LDVNDR 0x1101a
++#define HD64461_LDVSPR 0x1101c
++#define HD64461_LDR3 0x1101e
++
++#define HD64461_CPTWAR 0x11030
++#define HD64461_CPTWDR 0x11032
++#define HD64461_CPTRAR 0x11034
++#define HD64461_CPTRDR 0x11036
++
++#define HD64461_GRDOR 0x11040
++#define HD64461_GRSCR 0x11042
++#define HD64461_GRCFGR 0x11044
++#define HD64461_GRCFGR_ACCSTATUS 0x10
++#define HD64461_GRCFGR_ACCRESET 0x08
++#define HD64461_GRCFGR_ACCSTART_BITBLT 0x06
++#define HD64461_GRCFGR_ACCSTART_LINE 0x04
++#define HD64461_GRCFGR_COLORDEPTH16 0x01
++
++#define HD64461_LNSARH 0x11046
++#define HD64461_LNSARL 0x11048
++#define HD64461_LNAXLR 0x1104a
++#define HD64461_LNDGR 0x1104c
++#define HD64461_LNAXR 0x1104e
++#define HD64461_LNERTR 0x11050
++#define HD64461_LNMDR 0x11052
++#define HD64461_BBTSSARH 0x11054
++#define HD64461_BBTSSARL 0x11056
++#define HD64461_BBTDSARH 0x11058
++#define HD64461_BBTDSARL 0x1105a
++#define HD64461_BBTDWR 0x1105c
++#define HD64461_BBTDHR 0x1105e
++#define HD64461_BBTPARH 0x11060
++#define HD64461_BBTPARL 0x11062
++#define HD64461_BBTMARH 0x11064
++#define HD64461_BBTMARL 0x11066
++#define HD64461_BBTROPR 0x11068
++#define HD64461_BBTMDR 0x1106a
++
++/* PC Card Controller Registers */
++#define HD64461_PCC0ISR 0x12000 /* socket 0 interface status */
++#define HD64461_PCC0GCR 0x12002 /* socket 0 general control */
++#define HD64461_PCC0CSCR 0x12004 /* socket 0 card status change */
++#define HD64461_PCC0CSCIER 0x12006 /* socket 0 card status change interrupt enable */
++#define HD64461_PCC0SCR 0x12008 /* socket 0 software control */
++#define HD64461_PCC1ISR 0x12010 /* socket 1 interface status */
++#define HD64461_PCC1GCR 0x12012 /* socket 1 general control */
++#define HD64461_PCC1CSCR 0x12014 /* socket 1 card status change */
++#define HD64461_PCC1CSCIER 0x12016 /* socket 1 card status change interrupt enable */
++#define HD64461_PCC1SCR 0x12018 /* socket 1 software control */
++
++/* PCC Interface Status Register */
++#define HD64461_PCCISR_READY 0x80 /* card ready */
++#define HD64461_PCCISR_MWP 0x40 /* card write-protected */
++#define HD64461_PCCISR_VS2 0x20 /* voltage select pin 2 */
++#define HD64461_PCCISR_VS1 0x10 /* voltage select pin 1 */
++#define HD64461_PCCISR_CD2 0x08 /* card detect 2 */
++#define HD64461_PCCISR_CD1 0x04 /* card detect 1 */
++#define HD64461_PCCISR_BVD2 0x02 /* battery 1 */
++#define HD64461_PCCISR_BVD1 0x01 /* battery 1 */
++
++#define HD64461_PCCISR_PCD_MASK 0x0c /* card detect */
++#define HD64461_PCCISR_BVD_MASK 0x03 /* battery voltage */
++#define HD64461_PCCISR_BVD_BATGOOD 0x03 /* battery good */
++#define HD64461_PCCISR_BVD_BATWARN 0x01 /* battery low warning */
++#define HD64461_PCCISR_BVD_BATDEAD1 0x02 /* battery dead */
++#define HD64461_PCCISR_BVD_BATDEAD2 0x00 /* battery dead */
++
++/* PCC General Control Register */
++#define HD64461_PCCGCR_DRVE 0x80 /* output drive */
++#define HD64461_PCCGCR_PCCR 0x40 /* PC card reset */
++#define HD64461_PCCGCR_PCCT 0x20 /* PC card type, 1=IO&mem, 0=mem */
++#define HD64461_PCCGCR_VCC0 0x10 /* voltage control pin VCC0SEL0 */
++#define HD64461_PCCGCR_PMMOD 0x08 /* memory mode */
++#define HD64461_PCCGCR_PA25 0x04 /* pin A25 */
++#define HD64461_PCCGCR_PA24 0x02 /* pin A24 */
++#define HD64461_PCCGCR_REG 0x01 /* pin PCC0REG# */
++
++/* PCC Card Status Change Register */
++#define HD64461_PCCCSCR_SCDI 0x80 /* sw card detect intr */
++#define HD64461_PCCCSCR_SRV1 0x40 /* reserved */
++#define HD64461_PCCCSCR_IREQ 0x20 /* IREQ intr req */
++#define HD64461_PCCCSCR_SC 0x10 /* STSCHG (status change) pin */
++#define HD64461_PCCCSCR_CDC 0x08 /* CD (card detect) change */
++#define HD64461_PCCCSCR_RC 0x04 /* READY change */
++#define HD64461_PCCCSCR_BW 0x02 /* battery warning change */
++#define HD64461_PCCCSCR_BD 0x01 /* battery dead change */
++
++/* PCC Card Status Change Interrupt Enable Register */
++#define HD64461_PCCCSCIER_CRE 0x80 /* change reset enable */
++#define HD64461_PCCCSCIER_IREQE_MASK 0x60 /* IREQ enable */
++#define HD64461_PCCCSCIER_IREQE_DISABLED 0x00 /* IREQ disabled */
++#define HD64461_PCCCSCIER_IREQE_LEVEL 0x20 /* IREQ level-triggered */
++#define HD64461_PCCCSCIER_IREQE_FALLING 0x40 /* IREQ falling-edge-trig */
++#define HD64461_PCCCSCIER_IREQE_RISING 0x60 /* IREQ rising-edge-trig */
++
++#define HD64461_PCCCSCIER_SCE 0x10 /* status change enable */
++#define HD64461_PCCCSCIER_CDE 0x08 /* card detect change enable */
++#define HD64461_PCCCSCIER_RE 0x04 /* ready change enable */
++#define HD64461_PCCCSCIER_BWE 0x02 /* battery warn change enable */
++#define HD64461_PCCCSCIER_BDE 0x01 /* battery dead change enable*/
++
++/* PCC Software Control Register */
++#define HD64461_PCCSCR_VCC1 0x02 /* voltage control pin 1 */
++#define HD64461_PCCSCR_SWP 0x01 /* write protect */
++
++#define HD64461_P0OCR 0x1202a
++#define HD64461_P1OCR 0x1202c
++#define HD64461_PGCR 0x1202e
++
++#define HD64461_GPACR 0x14000
++#define HD64461_GPBCR 0x14002
++#define HD64461_GPCCR 0x14004
++#define HD64461_GPDCR 0x14006
++#define HD64461_GPADR 0x14010
++#define HD64461_GPBDR 0x14012
++#define HD64461_GPCDR 0x14014
++#define HD64461_GPDDR 0x14016
++#define HD64461_GPAICR 0x14020
++#define HD64461_GPBICR 0x14022
++#define HD64461_GPCICR 0x14024
++#define HD64461_GPDICR 0x14026
++#define HD64461_GPAISR 0x14040
++#define HD64461_GPBISR 0x14042
++#define HD64461_GPCISR 0x14044
++#define HD64461_GPDISR 0x14046
++
++#define HD64461_NIRR 0x15000
++#define HD64461_NIMR 0x15002
++
++#define HD64461_IRQBASE OFFCHIP_IRQ_BASE
++#define HD64461_IRQ_NUM 16
++
++#define HD64461_IRQ_UART (HD64461_IRQBASE+5)
++#define HD64461_IRQ_IRDA (HD64461_IRQBASE+6)
++#define HD64461_IRQ_TMU1 (HD64461_IRQBASE+9)
++#define HD64461_IRQ_TMU0 (HD64461_IRQBASE+10)
++#define HD64461_IRQ_GPIO (HD64461_IRQBASE+11)
++#define HD64461_IRQ_AFE (HD64461_IRQBASE+12)
++#define HD64461_IRQ_PCC1 (HD64461_IRQBASE+13)
++#define HD64461_IRQ_PCC0 (HD64461_IRQBASE+14)
++
++#define __IO_PREFIX hd64461
++#include <asm/io_generic.h>
++
++/* arch/sh/cchips/hd6446x/hd64461/setup.c */
++int hd64461_irq_demux(int irq);
++void hd64461_register_irq_demux(int irq,
++ int (*demux) (int irq, void *dev), void *dev);
++void hd64461_unregister_irq_demux(int irq);
++
++#endif
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/hd64465/CVS/Entries linux-2.6.17/include/asm-sh/hd64465/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/hd64465/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/hd64465/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,4 @@
++/gpio.h/1.3/Sun May 4 19:30:14 2003//
++/hd64465.h/1.3/Sun May 4 19:30:15 2003//
++/io.h/1.4/Sun Aug 3 03:05:11 2003//
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/hd64465/CVS/Repository linux-2.6.17/include/asm-sh/hd64465/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/hd64465/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/hd64465/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/hd64465
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/hd64465/CVS/Root linux-2.6.17/include/asm-sh/hd64465/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/hd64465/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/hd64465/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/hp6xx/CVS/Entries linux-2.6.17/include/asm-sh/hp6xx/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/hp6xx/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/hp6xx/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,4 @@
++/hp6xx.h/1.3/Sun Jan 29 17:46:24 2006/-ko/
++/ide.h/1.2/Sat Jun 5 17:17:34 2004/-ko/
++/io.h/1.3/Wed Jan 4 14:53:17 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/hp6xx/CVS/Repository linux-2.6.17/include/asm-sh/hp6xx/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/hp6xx/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/hp6xx/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/hp6xx
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/hp6xx/CVS/Root linux-2.6.17/include/asm-sh/hp6xx/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/hp6xx/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/hp6xx/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/hp6xx/hp6xx.h linux-2.6.17/include/asm-sh/hp6xx/hp6xx.h
+--- linux-2.6.17-vanilla/include/asm-sh/hp6xx/hp6xx.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/hp6xx/hp6xx.h 2006-07-12 16:54:26.000000000 +0000
+@@ -2,16 +2,33 @@
+ #define __ASM_SH_HP6XX_H
+
+ /*
+- * Copyright (C) 2003 Andriy Skulysh
++ * Copyright (C) 2003, 2004, 2005 Andriy Skulysh
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ *
+ */
+
+-#define HP680_TS_IRQ IRQ3_IRQ
++#define HP680_BTN_IRQ IRQ0_IRQ
++#define HP680_TS_IRQ IRQ3_IRQ
++#define HP680_HD64461_IRQ IRQ4_IRQ
+
+ #define DAC_LCD_BRIGHTNESS 0
+ #define DAC_SPEAKER_VOLUME 1
+
++#define PGDR_OPENED 0x01
++#define PGDR_MAIN_BATTERY_OUT 0x04
++#define PGDR_PLAY_BUTTON 0x08
++#define PGDR_REWIND_BUTTON 0x10
++#define PGDR_RECORD_BUTTON 0x20
++
+ #define PHDR_TS_PEN_DOWN 0x08
+
++#define PJDR_LED_BLINK 0x02
++
++#define PKDR_LED_GREEN 0x10
++
+ #define SCPDR_TS_SCAN_ENABLE 0x20
+ #define SCPDR_TS_SCAN_Y 0x02
+ #define SCPDR_TS_SCAN_X 0x01
+@@ -21,11 +38,43 @@
+
+ #define ADC_CHANNEL_TS_Y 1
+ #define ADC_CHANNEL_TS_X 2
++#define ADC_CHANNEL_BATTERY 3
++#define ADC_CHANNEL_BACKUP 4
++#define ADC_CHANNEL_CHARGE 5
+
+ #define HD64461_GPADR_SPEAKER 0x01
+ #define HD64461_GPADR_PCMCIA0 (0x02|0x08)
++
+ #define HD64461_GPBDR_LCDOFF 0x01
++#define HD64461_GPBDR_LCD_CONTRAST_MASK 0x78
+ #define HD64461_GPBDR_LED_RED 0x80
+
++#include <asm/hd64461.h>
++#include <asm/io.h>
++
++#define PJDR 0xa4000130
++#define PKDR 0xa4000132
++
++static inline void hp6xx_led_red(int on)
++{
++ u16 v16;
++ v16 = ctrl_inw(CONFIG_HD64461_IOBASE + HD64461_GPBDR - 0x10000);
++ if (on)
++ ctrl_outw(v16 & (~HD64461_GPBDR_LED_RED), CONFIG_HD64461_IOBASE + HD64461_GPBDR - 0x10000);
++ else
++ ctrl_outw(v16 | HD64461_GPBDR_LED_RED, CONFIG_HD64461_IOBASE + HD64461_GPBDR - 0x10000);
++}
++
++static inline void hp6xx_led_green(int on)
++{
++ u8 v8;
++
++ v8 = ctrl_inb(PKDR);
++ if (on)
++ ctrl_outb(v8 & (~PKDR_LED_GREEN), PKDR);
++ else
++ ctrl_outb(v8 | PKDR_LED_GREEN, PKDR);
++}
++
+
+ #endif /* __ASM_SH_HP6XX_H */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/hp6xx/io.h linux-2.6.17/include/asm-sh/hp6xx/io.h
+--- linux-2.6.17-vanilla/include/asm-sh/hp6xx/io.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/hp6xx/io.h 2006-07-12 16:54:26.000000000 +0000
+@@ -4,7 +4,7 @@
+ /*
+ * Nothing special here.. just use the generic cchip io routines.
+ */
+-#include <asm/hd64461/io.h>
++#include <asm/hd64461.h>
+
+ #endif /* __ASM_SH_HP6XX_IO_H */
+
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/hs7751rvoip/CVS/Entries linux-2.6.17/include/asm-sh/hs7751rvoip/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/hs7751rvoip/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/hs7751rvoip/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,3 @@
++/hs7751rvoip.h/1.4/Wed Jan 18 05:43:01 2006/-ko/
++/ide.h/1.1/Wed Apr 21 00:09:19 2004/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/hs7751rvoip/CVS/Repository linux-2.6.17/include/asm-sh/hs7751rvoip/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/hs7751rvoip/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/hs7751rvoip/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/hs7751rvoip
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/hs7751rvoip/CVS/Root linux-2.6.17/include/asm-sh/hs7751rvoip/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/hs7751rvoip/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/hs7751rvoip/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/hs7751rvoip/hs7751rvoip.h linux-2.6.17/include/asm-sh/hs7751rvoip/hs7751rvoip.h
+--- linux-2.6.17-vanilla/include/asm-sh/hs7751rvoip/hs7751rvoip.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/hs7751rvoip/hs7751rvoip.h 2006-07-12 16:54:26.000000000 +0000
+@@ -19,8 +19,6 @@
+ #define PA_OUTPORTR 0xa400000e /* Output Port Reguster */
+ #define PA_VERREG 0xa4000014 /* FPGA Version Register */
+
+-#define PA_AREA5_IO 0xb4000000 /* Area 5 IO Memory */
+-#define PA_AREA6_IO 0xb8000000 /* Area 6 IO Memory */
+ #define PA_IDE_OFFSET 0x1f0 /* CF IDE Offset */
+
+ #define IRLCNTR1 (PA_BCR + 0) /* Interrupt Control Register1 */
+@@ -44,4 +42,13 @@
+ #define IRQ_RINGING 4 /* Ringing IRQ */
+ #define IRQ_CODEC 5 /* CODEC IRQ */
+
++#define __IO_PREFIX hs7751rvoip
++#include <asm/io_generic.h>
++
++/* arch/sh/boards/renesas/hs7751rvoip/irq.c */
++void init_hs7751rvoip_IRQ(void);
++
++/* arch/sh/boards/renesas/hs7751rvoip/io.c */
++void *hs7751rvoip_ioremap(unsigned long, unsigned long);
++
+ #endif /* __ASM_SH_RENESAS_HS7751RVOIP */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/io.h linux-2.6.17/include/asm-sh/io.h
+--- linux-2.6.17-vanilla/include/asm-sh/io.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/io.h 2006-07-12 16:54:25.000000000 +0000
+@@ -210,6 +210,11 @@
+ *(volatile unsigned long*)addr = b;
+ }
+
++static inline void ctrl_delay(void)
++{
++ ctrl_inw(P2SEG);
++}
++
+ #define IO_SPACE_LIMIT 0xffffffff
+
+ /*
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/irq-sh73180.h linux-2.6.17/include/asm-sh/irq-sh73180.h
+--- linux-2.6.17-vanilla/include/asm-sh/irq-sh73180.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/irq-sh73180.h 2006-07-12 16:54:25.000000000 +0000
+@@ -12,14 +12,14 @@
+ #undef INTC_IPRC
+ #undef INTC_IPRD
+
+-#undef DMTE0_IRQ
+-#undef DMTE1_IRQ
+-#undef DMTE2_IRQ
+-#undef DMTE3_IRQ
+-#undef DMTE4_IRQ
+-#undef DMTE5_IRQ
+-#undef DMTE6_IRQ
+-#undef DMTE7_IRQ
++#undef DMTE0_IRQ
++#undef DMTE1_IRQ
++#undef DMTE2_IRQ
++#undef DMTE3_IRQ
++#undef DMTE4_IRQ
++#undef DMTE5_IRQ
++#undef DMTE6_IRQ
++#undef DMTE7_IRQ
+ #undef DMAE_IRQ
+ #undef DMA_IPR_ADDR
+ #undef DMA_IPR_POS
+@@ -180,7 +180,7 @@
+ #define FLSTE_IRQ 92
+ #define FLTEND_IRQ 93
+ #define FLTRQ0_IRQ 94
+-#define FLTRQ1_IRQ 95
++#define FLTRQ1_IRQ 95
+ #define FLCTL_IPR_ADDR INTC_IPRH
+ #define FLCTL_IPR_POS 1
+ #define FLCTL_PRIORITY 3
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/irq-sh7780.h linux-2.6.17/include/asm-sh/irq-sh7780.h
+--- linux-2.6.17-vanilla/include/asm-sh/irq-sh7780.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/irq-sh7780.h 2006-07-12 16:54:25.000000000 +0000
+@@ -145,11 +145,6 @@
+ #define TMU_CH5_IPR_POS 1
+ #define TMU_CH5_PRIORITY 2
+
+-#define RTC_IRQ 22
+-#define RTC_IPR_ADDR INTC_INT2PRI1
+-#define RTC_IPR_POS 0
+-#define RTC_PRIORITY TIMER_PRIORITY
+-
+ /* SCIF0 */
+ #define SCIF0_ERI_IRQ 40
+ #define SCIF0_RXI_IRQ 41
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/irq.h linux-2.6.17/include/asm-sh/irq.h
+--- linux-2.6.17-vanilla/include/asm-sh/irq.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/irq.h 2006-07-12 16:54:25.000000000 +0000
+@@ -336,6 +336,11 @@
+ extern unsigned short *irq_mask_register;
+
+ /*
++ * PINT IRQs
++ */
++void init_IRQ_pint(void);
++
++/*
+ * Function for "on chip support modules".
+ */
+ extern void make_ipr_irq(unsigned int irq, unsigned int addr,
+@@ -578,7 +583,7 @@
+ #define NR_INTC2_IRQS 64
+ #elif defined(CONFIG_CPU_SUBTYPE_SH7780)
+ #define INTC2_BASE 0xffd40000
+-#define INTC2_FIRST_IRQ 22
++#define INTC2_FIRST_IRQ 21
+ #define INTC2_INTMSK_OFFSET (0x38)
+ #define INTC2_INTMSKCLR_OFFSET (0x3c)
+ #define NR_INTC2_IRQS 60
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/kexec.h linux-2.6.17/include/asm-sh/kexec.h
+--- linux-2.6.17-vanilla/include/asm-sh/kexec.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/kexec.h 2006-07-12 16:54:25.000000000 +0000
+@@ -23,6 +23,8 @@
+ /* The native architecture */
+ #define KEXEC_ARCH KEXEC_ARCH_SH
+
++#define MAX_NOTE_BYTES 1024
++
+ #ifndef __ASSEMBLY__
+
+ extern void machine_shutdown(void);
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/kgdb.h linux-2.6.17/include/asm-sh/kgdb.h
+--- linux-2.6.17-vanilla/include/asm-sh/kgdb.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/kgdb.h 2006-07-12 16:54:25.000000000 +0000
+@@ -128,4 +128,19 @@
+ #define KGDB_ASSERT(condition, message)
+ #endif
+
++/* Taken from sh-stub.c of GDB 4.18 */
++static const char hexchars[] = "0123456789abcdef";
++
++/* Get high hex bits */
++static inline char highhex(const int x)
++{
++ return hexchars[(x >> 4) & 0xf];
++}
++
++/* Get low hex bits */
++static inline char lowhex(const int x)
++{
++ return hexchars[x & 0xf];
++}
++
+ #endif
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/landisk/CVS/Entries linux-2.6.17/include/asm-sh/landisk/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/landisk/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/landisk/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,4 @@
++/gio.h/1.1/Thu Sep 29 07:23:18 2005/-ko/
++/ide.h/1.1/Thu Sep 29 07:23:18 2005/-ko/
++/iodata_landisk.h/1.3/Wed Jan 18 05:43:01 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/landisk/CVS/Repository linux-2.6.17/include/asm-sh/landisk/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/landisk/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/landisk/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/landisk
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/landisk/CVS/Root linux-2.6.17/include/asm-sh/landisk/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/landisk/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/landisk/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/landisk/gio.h linux-2.6.17/include/asm-sh/landisk/gio.h
+--- linux-2.6.17-vanilla/include/asm-sh/landisk/gio.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/landisk/gio.h 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,45 @@
++#ifndef __ASM_SH_LANDISK_GIO_H
++#define __ASM_SH_LANDISK_GIO_H
++
++#include <linux/ioctl.h>
++
++/* version */
++#define VERSION_STR "1.00"
++
++/* Driver name */
++#define GIO_DRIVER_NAME "/dev/giodrv"
++
++/* Use 'k' as magic number */
++#define GIODRV_IOC_MAGIC 'k'
++
++#define GIODRV_IOCRESET _IO(GIODRV_IOC_MAGIC, 0)
++/*
++ * S means "Set" through a ptr,
++ * T means "Tell" directly
++ * G means "Get" (to a pointed var)
++ * Q means "Query", response is on the return value
++ * X means "eXchange": G and S atomically
++ * H means "sHift": T and Q atomically
++ */
++#define GIODRV_IOCSGIODATA1 _IOW(GIODRV_IOC_MAGIC, 1, unsigned char *)
++#define GIODRV_IOCGGIODATA1 _IOR(GIODRV_IOC_MAGIC, 2, unsigned char *)
++#define GIODRV_IOCSGIODATA2 _IOW(GIODRV_IOC_MAGIC, 3, unsigned short *)
++#define GIODRV_IOCGGIODATA2 _IOR(GIODRV_IOC_MAGIC, 4, unsigned short *)
++#define GIODRV_IOCSGIODATA4 _IOW(GIODRV_IOC_MAGIC, 5, unsigned long *)
++#define GIODRV_IOCGGIODATA4 _IOR(GIODRV_IOC_MAGIC, 6, unsigned long *)
++#define GIODRV_IOCSGIOSETADDR _IOW(GIODRV_IOC_MAGIC, 7, unsigned long *)
++#define GIODRV_IOCHARDRESET _IO(GIODRV_IOC_MAGIC, 8) /* debugging tool */
++
++#define GIODRV_IOCSGIO_LED _IOW(GIODRV_IOC_MAGIC, 9, unsigned long *)
++#define GIODRV_IOCGGIO_LED _IOR(GIODRV_IOC_MAGIC, 10, unsigned long *)
++#define GIODRV_IOCSGIO_BUZZER _IOW(GIODRV_IOC_MAGIC, 11, unsigned long *)
++#define GIODRV_IOCGGIO_LANDISK _IOR(GIODRV_IOC_MAGIC, 14, unsigned long *)
++#define GIODRV_IOCGGIO_BTN _IOR(GIODRV_IOC_MAGIC, 22, unsigned long *)
++#define GIODRV_IOCSGIO_BTNPID _IOW(GIODRV_IOC_MAGIC, 23, unsigned long *)
++#define GIODRV_IOCGGIO_BTNPID _IOR(GIODRV_IOC_MAGIC, 24, unsigned long *)
++
++#define GIODRV_IOC_MAXNR 8
++#define GIO_READ 0x00000000
++#define GIO_WRITE 0x00000001
++
++#endif /* __ASM_SH_LANDISK_GIO_H */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/landisk/ide.h linux-2.6.17/include/asm-sh/landisk/ide.h
+--- linux-2.6.17-vanilla/include/asm-sh/landisk/ide.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/landisk/ide.h 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,14 @@
++/*
++ * modifed by kogiidena
++ * 2005.03.03
++ */
++
++#ifndef __ASM_SH_LANDISK_IDE_H
++#define __ASM_SH_LANDISK_IDE_H
++
++/* Nothing to see here.. */
++#include <asm/landisk/iodata_landisk.h>
++#define IRQ_CFCARD IRQ_FATA /* CF Card IRQ */
++#define IRQ_PCMCIA IRQ_ATA /* PCMCIA IRQ */
++
++#endif /* __ASM_SH_LANDISK_IDE_H */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/landisk/iodata_landisk.h linux-2.6.17/include/asm-sh/landisk/iodata_landisk.h
+--- linux-2.6.17-vanilla/include/asm-sh/landisk/iodata_landisk.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/landisk/iodata_landisk.h 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,79 @@
++#ifndef __ASM_SH_IODATA_LANDISK_H
++#define __ASM_SH_IODATA_LANDISK_H
++
++/*
++ * linux/include/asm-sh/landisk/iodata_landisk.h
++ *
++ * Copyright (C) 2000 Atom Create Engineering Co., Ltd.
++ *
++ * IO-DATA LANDISK support
++ */
++
++/* Box specific addresses. */
++
++#define PA_USB 0xa4000000 /* USB Controller M66590 */
++
++#define PA_ATARST 0xb0000000 /* ATA/FATA Access Control Register */
++#define PA_LED 0xb0000001 /* LED Control Register */
++#define PA_STATUS 0xb0000002 /* Switch Status Register */
++#define PA_SHUTDOWN 0xb0000003 /* Shutdown Control Register */
++#define PA_PCIPME 0xb0000004 /* PCI PME Status Register */
++#define PA_IMASK 0xb0000005 /* Interrupt Mask Register */
++/* 2003.10.31 I-O DATA NSD NWG add. for shutdown port clear */
++#define PA_PWRINT_CLR 0xb0000006 /* Shutdown Interrupt clear Register */
++
++#define PA_LCD_CLRDSP 0x00 /* LCD Clear Display Offset */
++#define PA_LCD_RTNHOME 0x00 /* LCD Return Home Offset */
++#define PA_LCD_ENTMODE 0x00 /* LCD Entry Mode Offset */
++#define PA_LCD_DSPCTL 0x00 /* LCD Display ON/OFF Control Offset */
++#define PA_LCD_FUNC 0x00 /* LCD Function Set Offset */
++#define PA_LCD_CGRAM 0x00 /* LCD Set CGRAM Address Offset */
++#define PA_LCD_DDRAM 0x00 /* LCD Set DDRAM Address Offset */
++#define PA_LCD_RDFLAG 0x01 /* LCD Read Busy Flag Offset */
++#define PA_LCD_WTDATA 0x02 /* LCD Write Datat to RAM Offset */
++#define PA_LCD_RDDATA 0x03 /* LCD Read Data from RAM Offset */
++#define PA_PIDE_OFFSET 0x40 /* CF IDE Offset */
++#define PA_SIDE_OFFSET 0x40 /* HDD IDE Offset */
++
++#define IRQ_PCIINTA 5 /* PCI INTA IRQ */
++#define IRQ_PCIINTB 6 /* PCI INTB IRQ */
++#define IRQ_PCIINDC 7 /* PCI INTC IRQ */
++#define IRQ_PCIINTD 8 /* PCI INTD IRQ */
++#define IRQ_ATA 9 /* ATA IRQ */
++#define IRQ_FATA 10 /* FATA IRQ */
++#define IRQ_POWER 11 /* Power Switch IRQ */
++#define IRQ_BUTTON 12 /* USL-5P Button IRQ */
++#define IRQ_FAULT 13 /* USL-5P Fault IRQ */
++
++#define SHUTDOWN_BTN_MAJOR 99 /* Shutdown button device major no. */
++
++#define SHUTDOWN_LOOP_CNT 5 /* Shutdown button Detection loop */
++#define SHUTDOWN_DELAY 200 /* Shutdown button delay value(ms) */
++
++
++/* added by kogiidena */
++/*
++ * landisk_ledparam
++ *
++ * led ------10 -6543210 -6543210 -6543210
++ * |000000..|0.......|0.......|U.......|
++ * | HARD |fastblik| blink | on |
++ *
++ * led0: power U:update flag
++ * led1: error
++ * led2: usb1
++ * led3: usb2
++ * led4: usb3
++ * led5: usb4
++ * led6: usb5
++ *
++ */
++extern int landisk_ledparam; /* from setup.c */
++extern int landisk_buzzerparam; /* from setup.c */
++extern int landisk_arch; /* from setup.c */
++
++#define __IO_PREFIX landisk
++#include <asm/io_generic.h>
++
++#endif /* __ASM_SH_IODATA_LANDISK_H */
++
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/mc146818rtc.h linux-2.6.17/include/asm-sh/mc146818rtc.h
+--- linux-2.6.17-vanilla/include/asm-sh/mc146818rtc.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/mc146818rtc.h 2006-07-12 16:54:25.000000000 +0000
+@@ -24,7 +24,7 @@
+ #define CMOS_WRITE(val,addr) __CMOS_WRITE(val,addr,b)
+
+ #elif defined(CONFIG_SH_SECUREEDGE5410)
+-#include <asm/snapgear/io.h>
++#include <asm/snapgear.h>
+
+ #define RTC_PORT(n) SECUREEDGE_IOPORT_ADDR
+ #define CMOS_READ(addr) secureedge5410_cmos_read(addr)
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/mmu.h linux-2.6.17/include/asm-sh/mmu.h
+--- linux-2.6.17-vanilla/include/asm-sh/mmu.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/mmu.h 2006-07-12 16:54:25.000000000 +0000
+@@ -25,5 +25,60 @@
+ typedef unsigned long mm_context_t;
+
+ #endif /* CONFIG_MMU */
+-#endif /* __MMH_H */
++
++/*
++ * Privileged Space Mapping Buffer (PMB) definitions
++ */
++#define PMB_PASCR 0xff000070
++#define PMB_IRMCR 0xff000078
++
++#define PMB_ADDR 0xf6100000
++#define PMB_DATA 0xf7100000
++#define PMB_ENTRY_MAX 16
++#define PMB_E_MASK 0x0000000f
++#define PMB_E_SHIFT 8
++
++#define PMB_SZ_16M 0x00000000
++#define PMB_SZ_64M 0x00000010
++#define PMB_SZ_128M 0x00000080
++#define PMB_SZ_512M 0x00000090
++#define PMB_SZ_MASK PMB_SZ_512M
++#define PMB_C 0x00000008
++#define PMB_WT 0x00000001
++#define PMB_UB 0x00000200
++#define PMB_V 0x00000100
++
++#define PMB_NO_ENTRY (-1)
++
++struct pmb_entry;
++
++struct pmb_entry {
++ unsigned long vpn;
++ unsigned long ppn;
++ unsigned long flags;
++
++ /*
++ * 0 .. NR_PMB_ENTRIES for specific entry selection, or
++ * PMB_NO_ENTRY to search for a free one
++ */
++ int entry;
++
++ struct pmb_entry *next;
++ /* Adjacent entry link for contiguous multi-entry mappings */
++ struct pmb_entry *link;
++};
++
++/* arch/sh/mm/pmb.c */
++int __set_pmb_entry(unsigned long vpn, unsigned long ppn,
++ unsigned long flags, int *entry);
++int set_pmb_entry(struct pmb_entry *pmbe);
++void clear_pmb_entry(struct pmb_entry *pmbe);
++struct pmb_entry *pmb_alloc(unsigned long vpn, unsigned long ppn,
++ unsigned long flags);
++void pmb_free(struct pmb_entry *pmbe);
++long pmb_remap(unsigned long virt, unsigned long phys,
++ unsigned long size, unsigned long flags);
++void pmb_unmap(unsigned long addr);
++
++#endif /* __MMU_H */
+
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/mmu_context.h linux-2.6.17/include/asm-sh/mmu_context.h
+--- linux-2.6.17-vanilla/include/asm-sh/mmu_context.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/mmu_context.h 2006-07-12 16:54:25.000000000 +0000
+@@ -174,9 +174,7 @@
+ {
+ /* Enable MMU */
+ ctrl_outl(MMU_CONTROL_INIT, MMUCR);
+-
+- /* The manual suggests doing some nops after turning on the MMU */
+- __asm__ __volatile__ ("nop;nop;nop;nop;nop;nop;nop;nop\n\t");
++ ctrl_barrier();
+
+ if (mmu_context_cache == NO_CONTEXT)
+ mmu_context_cache = MMU_CONTEXT_FIRST_VERSION;
+@@ -191,7 +189,8 @@
+ cr = ctrl_inl(MMUCR);
+ cr &= ~MMU_CONTROL_INIT;
+ ctrl_outl(cr, MMUCR);
+- __asm__ __volatile__ ("nop;nop;nop;nop;nop;nop;nop;nop\n\t");
++
++ ctrl_barrier();
+ }
+ #else
+ /*
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/mpc1211/CVS/Entries linux-2.6.17/include/asm-sh/mpc1211/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/mpc1211/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/mpc1211/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,8 @@
++/dma.h/1.1/Fri May 16 17:19:08 2003/-ko/
++/io.h/1.3/Mon Aug 4 01:51:58 2003/-ko/
++/keyboard.h/1.2/Wed Mar 2 13:03:01 2005/-ko/
++/m1543c.h/1.1/Fri May 16 17:19:08 2003/-ko/
++/mc146818rtc.h/1.1/Fri May 16 17:19:08 2003/-ko/
++/mpc1211.h/1.1/Fri May 16 17:19:08 2003/-ko/
++/pci.h/1.1/Fri May 16 17:19:08 2003/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/mpc1211/CVS/Repository linux-2.6.17/include/asm-sh/mpc1211/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/mpc1211/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/mpc1211/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/mpc1211
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/mpc1211/CVS/Root linux-2.6.17/include/asm-sh/mpc1211/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/mpc1211/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/mpc1211/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/namei.h linux-2.6.17/include/asm-sh/namei.h
+--- linux-2.6.17-vanilla/include/asm-sh/namei.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/namei.h 2006-07-12 16:54:25.000000000 +0000
+@@ -1,4 +1,4 @@
+-/* $Id: namei.h,v 1.3 2000/07/04 06:24:49 gniibe Exp $
++/* $Id: namei.h,v 1.2 2000/04/14 19:14:01 mjd Exp $
+ * linux/include/asm-sh/namei.h
+ *
+ * Included from linux/fs/namei.c
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/overdrive/CVS/Entries linux-2.6.17/include/asm-sh/overdrive/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/overdrive/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/overdrive/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,5 @@
++/fpga.h/1.2/Fri Nov 1 17:19:31 2002//
++/gt64111.h/1.2/Fri Nov 1 17:19:31 2002//
++/io.h/1.3/Tue Jul 29 14:27:12 2003//
++/overdrive.h/1.2/Fri Nov 1 17:19:31 2002//
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/overdrive/CVS/Repository linux-2.6.17/include/asm-sh/overdrive/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/overdrive/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/overdrive/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/overdrive
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/overdrive/CVS/Root linux-2.6.17/include/asm-sh/overdrive/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/overdrive/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/overdrive/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/page.h linux-2.6.17/include/asm-sh/page.h
+--- linux-2.6.17-vanilla/include/asm-sh/page.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/page.h 2006-07-12 16:54:25.000000000 +0000
+@@ -31,7 +31,6 @@
+ #define HPAGE_SIZE (1UL << HPAGE_SHIFT)
+ #define HPAGE_MASK (~(HPAGE_SIZE-1))
+ #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT-PAGE_SHIFT)
+-#define ARCH_HAS_SETCLEAR_HUGE_PTE
+ #endif
+
+ #ifdef __KERNEL__
+@@ -43,38 +42,30 @@
+ extern void clear_page_slow(void *to);
+ extern void copy_page_slow(void *to, void *from);
+
+-#if defined(CONFIG_SH7705_CACHE_32KB) && defined(CONFIG_MMU)
++#if defined(CONFIG_MMU) && (defined(CONFIG_CPU_SH4) || \
++ defined(CONFIG_SH7705_CACHE_32KB))
+ struct page;
+ extern void clear_user_page(void *to, unsigned long address, struct page *pg);
+ extern void copy_user_page(void *to, void *from, unsigned long address, struct page *pg);
+ extern void __clear_user_page(void *to, void *orig_to);
+ extern void __copy_user_page(void *to, void *from, void *orig_to);
+-#elif defined(CONFIG_CPU_SH2) || defined(CONFIG_CPU_SH3) || !defined(CONFIG_MMU)
++#elif defined(CONFIG_CPU_SH3) || !defined(CONFIG_MMU)
+ #define clear_user_page(page, vaddr, pg) clear_page(page)
+ #define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
+-#elif defined(CONFIG_CPU_SH4)
+-struct page;
+-extern void clear_user_page(void *to, unsigned long address, struct page *pg);
+-extern void copy_user_page(void *to, void *from, unsigned long address, struct page *pg);
+-extern void __clear_user_page(void *to, void *orig_to);
+-extern void __copy_user_page(void *to, void *from, void *orig_to);
+ #endif
+
+ /*
+ * These are used to make use of C type-checking..
+ */
+ typedef struct { unsigned long pte; } pte_t;
+-typedef struct { unsigned long pmd; } pmd_t;
+ typedef struct { unsigned long pgd; } pgd_t;
+ typedef struct { unsigned long pgprot; } pgprot_t;
+
+ #define pte_val(x) ((x).pte)
+-#define pmd_val(x) ((x).pmd)
+ #define pgd_val(x) ((x).pgd)
+ #define pgprot_val(x) ((x).pgprot)
+
+ #define __pte(x) ((pte_t) { (x) } )
+-#define __pmd(x) ((pmd_t) { (x) } )
+ #define __pgd(x) ((pgd_t) { (x) } )
+ #define __pgprot(x) ((pgprot_t) { (x) } )
+
+@@ -105,7 +96,7 @@
+
+ /* PFN start number, because of __MEMORY_START */
+ #define PFN_START (__MEMORY_START >> PAGE_SHIFT)
+-#define ARCH_PFN_OFFSET (FPN_START)
++#define ARCH_PFN_OFFSET (PFN_START)
+ #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
+ #define pfn_valid(pfn) (((pfn) - PFN_START) < max_mapnr)
+ #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/pci.h linux-2.6.17/include/asm-sh/pci.h
+--- linux-2.6.17-vanilla/include/asm-sh/pci.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/pci.h 2006-07-12 16:54:25.000000000 +0000
+@@ -32,6 +32,34 @@
+ #define PCIBIOS_MIN_IO board_pci_channels->io_resource->start
+ #define PCIBIOS_MIN_MEM board_pci_channels->mem_resource->start
+
++/*
++ * I/O routine helpers
++ */
++#ifdef CONFIG_CPU_SUBTYPE_SH7780
++#define PCI_IO_AREA 0xFE400000
++#define PCI_IO_SIZE 0x00400000
++#else
++#define PCI_IO_AREA 0xFE240000
++#define PCI_IO_SIZE 0X00040000
++#endif
++
++#define PCI_MEM_SIZE 0x01000000
++
++#define SH4_PCIIOBR_MASK 0xFFFC0000
++#define pci_ioaddr(addr) (PCI_IO_AREA + (addr & ~SH4_PCIIOBR_MASK))
++
++#if defined(CONFIG_PCI)
++#define is_pci_ioaddr(port) \
++ (((port) >= PCIBIOS_MIN_IO) && \
++ ((port) < (PCIBIOS_MIN_IO + PCI_IO_SIZE)))
++#define is_pci_memaddr(port) \
++ (((port) >= PCIBIOS_MIN_MEM) && \
++ ((port) < (PCIBIOS_MIN_MEM + PCI_MEM_SIZE)))
++#else
++#define is_pci_ioaddr(port) (0)
++#define is_pci_memaddr(port) (0)
++#endif
++
+ struct pci_dev;
+
+ extern void pcibios_set_master(struct pci_dev *dev);
+@@ -87,15 +115,6 @@
+ */
+ #define pci_dac_dma_supported(pci_dev, mask) (0)
+
+-/* These macros should be used after a pci_map_sg call has been done
+- * to get bus addresses of each of the SG entries and their lengths.
+- * You should only work with the number of sg entries pci_map_sg
+- * returns, or alternatively stop on the first sg_dma_len(sg) which
+- * is 0.
+- */
+-#define sg_dma_address(sg) (virt_to_bus((sg)->dma_address))
+-#define sg_dma_len(sg) ((sg)->length)
+-
+ #ifdef CONFIG_PCI
+ static inline void pci_dma_burst_advice(struct pci_dev *pdev,
+ enum pci_dma_burst_strategy *strat,
+@@ -107,11 +126,12 @@
+ #endif
+
+ /* Board-specific fixup routines. */
+-extern void pcibios_fixup(void);
+-extern void pcibios_fixup_irqs(void);
++void pcibios_fixup(void);
++int pcibios_init_platform(void);
++int pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin);
+
+ #ifdef CONFIG_PCI_AUTO
+-extern int pciauto_assign_resources(int busno, struct pci_channel *hose);
++int pciauto_assign_resources(int busno, struct pci_channel *hose);
+ #endif
+
+ static inline void pcibios_add_platform_entries(struct pci_dev *dev)
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/pgalloc.h linux-2.6.17/include/asm-sh/pgalloc.h
+--- linux-2.6.17-vanilla/include/asm-sh/pgalloc.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/pgalloc.h 2006-07-12 16:54:25.000000000 +0000
+@@ -1,15 +1,6 @@
+ #ifndef __ASM_SH_PGALLOC_H
+ #define __ASM_SH_PGALLOC_H
+
+-#include <linux/threads.h>
+-#include <linux/slab.h>
+-#include <linux/mm.h>
+-
+-#define pgd_quicklist ((unsigned long *)0)
+-#define pmd_quicklist ((unsigned long *)0)
+-#define pte_quicklist ((unsigned long *)0)
+-#define pgtable_cache_size 0L
+-
+ #define pmd_populate_kernel(mm, pmd, pte) \
+ set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(pte)))
+
+@@ -24,38 +15,24 @@
+ */
+ static inline pgd_t *pgd_alloc(struct mm_struct *mm)
+ {
+- unsigned int pgd_size = (USER_PTRS_PER_PGD * sizeof(pgd_t));
+- pgd_t *pgd = (pgd_t *)kmalloc(pgd_size, GFP_KERNEL);
+-
+- if (pgd)
+- memset(pgd, 0, pgd_size);
+-
+- return pgd;
++ return (pgd_t *)__get_free_page(GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO);
+ }
+
+ static inline void pgd_free(pgd_t *pgd)
+ {
+- kfree(pgd);
++ free_page((unsigned long)pgd);
+ }
+
+ static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
+ unsigned long address)
+ {
+- pte_t *pte;
+-
+- pte = (pte_t *) __get_free_page(GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO);
+-
+- return pte;
++ return (pte_t *)__get_free_page(GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO);
+ }
+
+ static inline struct page *pte_alloc_one(struct mm_struct *mm,
+ unsigned long address)
+ {
+- struct page *pte;
+-
+- pte = alloc_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, 0);
+-
+- return pte;
++ return alloc_page(GFP_KERNEL | __GFP_REPEAT | __GFP_ZERO);
+ }
+
+ static inline void pte_free_kernel(pte_t *pte)
+@@ -75,14 +52,8 @@
+ * inside the pgd, so has no extra memory associated with it.
+ */
+
+-#define pmd_alloc_one(mm, addr) ({ BUG(); ((pmd_t *)2); })
+ #define pmd_free(x) do { } while (0)
+ #define __pmd_free_tlb(tlb,x) do { } while (0)
+-#define pgd_populate(mm, pmd, pte) BUG()
+ #define check_pgt_cache() do { } while (0)
+
+-#ifdef CONFIG_CPU_SH4
+-#define PG_mapped PG_arch_1
+-#endif
+-
+ #endif /* __ASM_SH_PGALLOC_H */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/pgtable.h linux-2.6.17/include/asm-sh/pgtable.h
+--- linux-2.6.17-vanilla/include/asm-sh/pgtable.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/pgtable.h 2006-07-12 16:54:25.000000000 +0000
+@@ -1,43 +1,43 @@
+-#ifndef __ASM_SH_PGTABLE_H
+-#define __ASM_SH_PGTABLE_H
+-
+-#include <asm-generic/4level-fixup.h>
+-
+ /*
++ * This file contains the functions and defines necessary to modify and
++ * use the SuperH page table tree.
++ *
+ * Copyright (C) 1999 Niibe Yutaka
+- * Copyright (C) 2002, 2003, 2004 Paul Mundt
++ * Copyright (C) 2002 - 2005 Paul Mundt
++ *
++ * This file is subject to the terms and conditions of the GNU General
++ * Public License. See the file "COPYING" in the main directory of this
++ * archive for more details.
+ */
++#ifndef __ASM_SH_PGTABLE_H
++#define __ASM_SH_PGTABLE_H
+
+ #include <linux/config.h>
+-#include <asm/pgtable-2level.h>
++#include <asm-generic/pgtable-nopmd.h>
++#include <asm/page.h>
++
++#define PTRS_PER_PGD 1024
+
+-/*
+- * This file contains the functions and defines necessary to modify and use
+- * the SuperH page table tree.
+- */
+ #ifndef __ASSEMBLY__
+-#include <asm/processor.h>
+ #include <asm/addrspace.h>
+ #include <asm/fixmap.h>
+-#include <linux/threads.h>
+
+ extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
+ extern void paging_init(void);
+
+ /*
+- * Basically we have the same two-level (which is the logical three level
+- * Linux page table layout folded) page tables as the i386.
+- */
+-
+-/*
+ * ZERO_PAGE is a global shared page that is always zero: used
+ * for zero-mapped memory areas etc..
+ */
+-extern unsigned long empty_zero_page[1024];
++extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];
+ #define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
+
+ #endif /* !__ASSEMBLY__ */
+
++/* traditional two-level paging structure */
++#define PGDIR_SHIFT 22
++#define PTRS_PER_PMD 1
++#define PTRS_PER_PTE 1024
+ #define PMD_SIZE (1UL << PMD_SHIFT)
+ #define PMD_MASK (~(PMD_SIZE-1))
+ #define PGDIR_SIZE (1UL << PGDIR_SHIFT)
+@@ -48,7 +48,6 @@
+
+ #define PTE_PHYS_MASK 0x1ffff000
+
+-#ifndef __ASSEMBLY__
+ /*
+ * First 1MB map is used by fixed purpose.
+ * Currently only 4-enty (16kB) is used (see arch/sh/mm/cache.c)
+@@ -56,20 +55,41 @@
+ #define VMALLOC_START (P3SEG+0x00100000)
+ #define VMALLOC_END (FIXADDR_START-2*PAGE_SIZE)
+
+-#define _PAGE_WT 0x001 /* WT-bit on SH-4, 0 on SH-3 */
+-#define _PAGE_HW_SHARED 0x002 /* SH-bit : page is shared among processes */
+-#define _PAGE_DIRTY 0x004 /* D-bit : page changed */
+-#define _PAGE_CACHABLE 0x008 /* C-bit : cachable */
+-#define _PAGE_SZ0 0x010 /* SZ0-bit : Size of page */
+-#define _PAGE_RW 0x020 /* PR0-bit : write access allowed */
+-#define _PAGE_USER 0x040 /* PR1-bit : user space access allowed */
+-#define _PAGE_SZ1 0x080 /* SZ1-bit : Size of page (on SH-4) */
+-#define _PAGE_PRESENT 0x100 /* V-bit : page is valid */
+-#define _PAGE_PROTNONE 0x200 /* software: if not present */
+-#define _PAGE_ACCESSED 0x400 /* software: page referenced */
+-#define _PAGE_U0_SHARED 0x800 /* software: page is shared in user space */
+-
+-#define _PAGE_FILE _PAGE_WT /* software: pagecache or swap? */
++/*
++ * Linux PTEL encoding.
++ *
++ * Hardware and software bit definitions for the PTEL value:
++ *
++ * - Bits 0 and 7 are reserved on SH-3 (_PAGE_WT and _PAGE_SZ1 on SH-4).
++ *
++ * - Bit 1 is the SH-bit, but is unused on SH-3 due to an MMU bug (the
++ * hardware PTEL value can't have the SH-bit set when MMUCR.IX is set,
++ * which is the default in cpu-sh3/mmu_context.h:MMU_CONTROL_INIT).
++ *
++ * In order to keep this relatively clean, do not use these for defining
++ * SH-3 specific flags until all of the other unused bits have been
++ * exhausted.
++ *
++ * - Bit 9 is reserved by everyone and used by _PAGE_PROTNONE.
++ *
++ * - Bits 10 and 11 are low bits of the PPN that are reserved on >= 4K pages.
++ * Bit 10 is used for _PAGE_ACCESSED, bit 11 remains unused.
++ *
++ * - Bits 31, 30, and 29 remain unused by everyone and can be used for future
++ * software flags, although care must be taken to update _PAGE_CLEAR_FLAGS.
++ */
++#define _PAGE_WT 0x001 /* WT-bit on SH-4, 0 on SH-3 */
++#define _PAGE_HW_SHARED 0x002 /* SH-bit : shared among processes */
++#define _PAGE_DIRTY 0x004 /* D-bit : page changed */
++#define _PAGE_CACHABLE 0x008 /* C-bit : cachable */
++#define _PAGE_SZ0 0x010 /* SZ0-bit : Size of page */
++#define _PAGE_RW 0x020 /* PR0-bit : write access allowed */
++#define _PAGE_USER 0x040 /* PR1-bit : user space access allowed */
++#define _PAGE_SZ1 0x080 /* SZ1-bit : Size of page (on SH-4) */
++#define _PAGE_PRESENT 0x100 /* V-bit : page is valid */
++#define _PAGE_PROTNONE 0x200 /* software: if not present */
++#define _PAGE_ACCESSED 0x400 /* software: page referenced */
++#define _PAGE_FILE _PAGE_WT /* software: pagecache or swap? */
+
+ /* software: moves to PTEA.TC (Timing Control) */
+ #define _PAGE_PCC_AREA5 0x00000000 /* use BSC registers for area5 */
+@@ -84,23 +104,17 @@
+ #define _PAGE_PCC_ATR8 0x60000000 /* Attribute Memory space, 8 bit bus */
+ #define _PAGE_PCC_ATR16 0x60000001 /* Attribute Memory space, 6 bit bus */
+
+-
+-/* Mask which drop software flags
+- * We also drop WT bit since it is used for _PAGE_FILE
+- * bit in this implementation.
+- */
+-#define _PAGE_CLEAR_FLAGS (_PAGE_WT | _PAGE_PROTNONE | _PAGE_ACCESSED | _PAGE_U0_SHARED)
+-
+-#if defined(CONFIG_CPU_SH3)
+-/*
+- * MMU on SH-3 has bug on SH-bit: We can't use it if MMUCR.IX=1.
+- * Work around: Just drop SH-bit.
+- */
+-#define _PAGE_FLAGS_HARDWARE_MASK (0x1fffffff & ~(_PAGE_CLEAR_FLAGS | _PAGE_HW_SHARED))
++/* Mask which drops unused bits from the PTEL value */
++#ifdef CONFIG_CPU_SH3
++#define _PAGE_CLEAR_FLAGS (_PAGE_PROTNONE | _PAGE_ACCESSED| \
++ _PAGE_FILE | _PAGE_SZ1 | \
++ _PAGE_HW_SHARED)
+ #else
+-#define _PAGE_FLAGS_HARDWARE_MASK (0x1fffffff & ~(_PAGE_CLEAR_FLAGS))
++#define _PAGE_CLEAR_FLAGS (_PAGE_PROTNONE | _PAGE_ACCESSED | _PAGE_FILE)
+ #endif
+
++#define _PAGE_FLAGS_HARDWARE_MASK (0x1fffffff & ~(_PAGE_CLEAR_FLAGS))
++
+ /* Hardware flags: SZ0=1 (4k-byte) */
+ #define _PAGE_FLAGS_HARD _PAGE_SZ0
+
+@@ -110,15 +124,15 @@
+ #define _PAGE_SZHUGE (_PAGE_SZ0 | _PAGE_SZ1)
+ #endif
+
+-#define _PAGE_SHARED _PAGE_U0_SHARED
+-
+ #define _PAGE_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY)
+ #define _KERNPG_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
+-#define _PAGE_CHG_MASK (PTE_MASK | _PAGE_ACCESSED | _PAGE_CACHABLE | _PAGE_DIRTY | _PAGE_SHARED)
++#define _PAGE_CHG_MASK (PTE_MASK | _PAGE_ACCESSED | _PAGE_CACHABLE | _PAGE_DIRTY)
++
++#ifndef __ASSEMBLY__
+
+ #ifdef CONFIG_MMU
+ #define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_CACHABLE |_PAGE_ACCESSED | _PAGE_FLAGS_HARD)
+-#define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_CACHABLE |_PAGE_ACCESSED | _PAGE_SHARED | _PAGE_FLAGS_HARD)
++#define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_CACHABLE |_PAGE_ACCESSED | _PAGE_FLAGS_HARD)
+ #define PAGE_COPY __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_CACHABLE | _PAGE_ACCESSED | _PAGE_FLAGS_HARD)
+ #define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_CACHABLE | _PAGE_ACCESSED | _PAGE_FLAGS_HARD)
+ #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_CACHABLE | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_HW_SHARED | _PAGE_FLAGS_HARD)
+@@ -138,12 +152,13 @@
+ #define PAGE_KERNEL_PCC __pgprot(0)
+ #endif
+
++#endif /* __ASSEMBLY__ */
++
+ /*
+ * As i386 and MIPS, SuperH can't do page protection for execute, and
+ * considers that the same as a read. Also, write permissions imply
+- * read permissions. This is the closest we can get..
++ * read permissions. This is the closest we can get..
+ */
+-
+ #define __P000 PAGE_NONE
+ #define __P001 PAGE_READONLY
+ #define __P010 PAGE_COPY
+@@ -162,6 +177,26 @@
+ #define __S110 PAGE_SHARED
+ #define __S111 PAGE_SHARED
+
++#ifndef __ASSEMBLY__
++
++/*
++ * Certain architectures need to do special things when PTEs
++ * within a page table are directly modified. Thus, the following
++ * hook is made available.
++ */
++#define set_pte(pteptr, pteval) (*(pteptr) = pteval)
++#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval)
++
++/*
++ * (pmds are folded into pgds so this doesn't get actually called,
++ * but the define is needed for a generic inline function.)
++ */
++#define set_pmd(pmdptr, pmdval) (*(pmdptr) = pmdval)
++
++#define pte_pfn(x) ((unsigned long)(((x).pte >> PAGE_SHIFT)))
++#define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
++#define pfn_pmd(pfn, prot) __pmd(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
++
+ #define pte_none(x) (!pte_val(x))
+ #define pte_present(x) (pte_val(x) & (_PAGE_PRESENT | _PAGE_PROTNONE))
+ #define pte_clear(mm,addr,xp) do { set_pte_at(mm, addr, xp, __pte(0)); } while (0)
+@@ -172,7 +207,7 @@
+ #define pmd_bad(x) ((pmd_val(x) & (~PAGE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE)
+
+ #define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT))
+-#define pte_page(x) phys_to_page(pte_val(x)&PTE_PHYS_MASK)
++#define pte_page(x) phys_to_page(pte_val(x)&PTE_PHYS_MASK)
+
+ /*
+ * The following only work if pte_present() is true.
+@@ -249,6 +284,11 @@
+ #define pte_unmap(pte) do { } while (0)
+ #define pte_unmap_nested(pte) do { } while (0)
+
++#define pte_ERROR(e) \
++ printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, pte_val(e))
++#define pgd_ERROR(e) \
++ printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e))
++
+ struct vm_area_struct;
+ extern void update_mmu_cache(struct vm_area_struct * vma,
+ unsigned long address, pte_t pte);
+@@ -273,8 +313,6 @@
+
+ typedef pte_t *pte_addr_t;
+
+-#endif /* !__ASSEMBLY__ */
+-
+ #define kern_addr_valid(addr) (1)
+
+ #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \
+@@ -302,5 +340,7 @@
+
+ #include <asm-generic/pgtable.h>
+
++#endif /* !__ASSEMBLY__ */
++
+ #endif /* __ASM_SH_PAGE_H */
+
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/pm.h linux-2.6.17/include/asm-sh/pm.h
+--- linux-2.6.17-vanilla/include/asm-sh/pm.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/pm.h 2006-07-12 16:54:25.000000000 +0000
+@@ -0,0 +1,17 @@
++/*
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ *
++ * Copyright 2006 (c) Andriy Skulysh <askulysh@gmail.com>
++ *
++ */
++#ifndef __ASM_SH_PM_H
++#define __ASM_SH_PM_H
++
++extern u8 wakeup_start;
++extern u8 wakeup_end;
++
++void pm_enter(void);
++
++#endif
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/processor.h linux-2.6.17/include/asm-sh/processor.h
+--- linux-2.6.17-vanilla/include/asm-sh/processor.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/processor.h 2006-07-12 16:54:26.000000000 +0000
+@@ -148,6 +148,10 @@
+ union sh_fpu_union fpu;
+ };
+
++typedef struct {
++ unsigned long seg;
++} mm_segment_t;
++
+ /* Count of active tasks with UBC settings */
+ extern int ubc_usercnt;
+
+@@ -265,5 +269,18 @@
+ #define cpu_sleep() __asm__ __volatile__ ("sleep" : : : "memory")
+ #define cpu_relax() do { } while (0)
+
++#if defined(CONFIG_CPU_SH2A) || defined(CONFIG_CPU_SH3) || \
++ defined(CONFIG_CPU_SH4)
++#define PREFETCH_STRIDE L1_CACHE_BYTES
++#define ARCH_HAS_PREFETCH
++#define ARCH_HAS_PREFETCHW
++static inline void prefetch(void *x)
++{
++ __asm__ __volatile__ ("pref @%0\n\t" : : "r" (x) : "memory");
++}
++
++#define prefetchw(x) prefetch(x)
++#endif
++
+ #endif /* __KERNEL__ */
+ #endif /* __ASM_SH_PROCESSOR_H */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/r7780rp/CVS/Entries linux-2.6.17/include/asm-sh/r7780rp/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/r7780rp/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/r7780rp/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,3 @@
++/ide.h/1.1/Sat Jan 7 19:55:57 2006/-ko/
++/r7780rp.h/1.3/Thu Jul 6 12:38:31 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/r7780rp/CVS/Repository linux-2.6.17/include/asm-sh/r7780rp/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/r7780rp/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/r7780rp/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/r7780rp
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/r7780rp/CVS/Root linux-2.6.17/include/asm-sh/r7780rp/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/r7780rp/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/r7780rp/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/r7780rp/ide.h linux-2.6.17/include/asm-sh/r7780rp/ide.h
+--- linux-2.6.17-vanilla/include/asm-sh/r7780rp/ide.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/r7780rp/ide.h 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,8 @@
++#ifndef __ASM_SH_R7780RP_IDE_H
++#define __ASM_SH_R7780RP_IDE_H
++
++/* Nothing to see here.. */
++#include <asm/mach/r7780rp.h>
++
++#endif /* __ASM_SH_R7780RP_IDE_H */
++
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/r7780rp/r7780rp.h linux-2.6.17/include/asm-sh/r7780rp/r7780rp.h
+--- linux-2.6.17-vanilla/include/asm-sh/r7780rp/r7780rp.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/r7780rp/r7780rp.h 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,177 @@
++#ifndef __ASM_SH_RENESAS_R7780RP_H
++#define __ASM_SH_RENESAS_R7780RP_H
++
++/*
++ * linux/include/asm-sh/r7780rp.h
++ *
++ * Copyright (C) 2000 Atom Create Engineering Co., Ltd.
++ *
++ * Renesas Solutions Highlander R7780RP support
++ */
++
++/* Box specific addresses. */
++#if defined(CONFIG_SH_R7780MP)
++#define PA_BCR 0xa4000000 /* FPGA */
++#define PA_IRLMSK (PA_BCR+0x0000) /* Interrupt Mask control */
++#define PA_IRLMON (PA_BCR+0x0002) /* Interrupt Status control */
++#define PA_IRLPRI1 (PA_BCR+0x0004) /* Interrupt Priorty 1 */
++#define PA_IRLPRI2 (PA_BCR+0x0006) /* Interrupt Priorty 2 */
++#define PA_IRLPRI3 (PA_BCR+0x0008) /* Interrupt Priorty 3 */
++#define PA_IRLPRI4 (PA_BCR+0x000a) /* Interrupt Priorty 4 */
++#define PA_RSTCTL (PA_BCR+0x000c) /* Reset Control */
++#define PA_PCIBD (PA_BCR+0x000e) /* PCI Board detect control */
++#define PA_PCICD (PA_BCR+0x0010) /* PCI Conector detect control */
++#define PA_EXTGIO (PA_BCR+0x0016) /* Extension GPIO Control */
++#define PA_IVDRMON (PA_BCR+0x0018) /* iVDR Moniter control */
++#define PA_IVDRCTL (PA_BCR+0x001a) /* iVDR control */
++#define PA_OBLED (PA_BCR+0x001c) /* On Board LED control */
++#define PA_OBSW (PA_BCR+0x001e) /* On Board Switch control */
++#define PA_AUDIOSEL (PA_BCR+0x0020) /* Sound Interface Select control */
++#define PA_EXTPLR (PA_BCR+0x001e) /* Extention Pin Polarity control */
++#define PA_TPCTL (PA_BCR+0x0100) /* Touch Panel Access control */
++#define PA_TPDCKCTL (PA_BCR+0x0102) /* Touch Panel Access data control */
++#define PA_TPCTLCLR (PA_BCR+0x0104) /* Touch Panel Access control */
++#define PA_TPXPOS (PA_BCR+0x0106) /* Touch Panel X position control */
++#define PA_TPYPOS (PA_BCR+0x0108) /* Touch Panel Y position control */
++#define PA_DBSW (PA_BCR+0x0200) /* Debug Board Switch control */
++#define PA_CFCTL (PA_BCR+0x0300) /* CF Timing control */
++#define PA_CFPOW (PA_BCR+0x0302) /* CF Power control */
++#define PA_CFCDINTCLR (PA_BCR+0x0304) /* CF Insert Interrupt clear */
++#define PA_SCSMR0 (PA_BCR+0x0400) /* SCIF0 Serial mode control */
++#define PA_SCBRR0 (PA_BCR+0x0404) /* SCIF0 Bit rate control */
++#define PA_SCSCR0 (PA_BCR+0x0408) /* SCIF0 Serial control */
++#define PA_SCFTDR0 (PA_BCR+0x040c) /* SCIF0 Send FIFO control */
++#define PA_SCFSR0 (PA_BCR+0x0410) /* SCIF0 Serial status control */
++#define PA_SCFRDR0 (PA_BCR+0x0414) /* SCIF0 Receive FIFO control */
++#define PA_SCFCR0 (PA_BCR+0x0418) /* SCIF0 FIFO control */
++#define PA_SCTFDR0 (PA_BCR+0x041c) /* SCIF0 Send FIFO data control */
++#define PA_SCRFDR0 (PA_BCR+0x0420) /* SCIF0 Receive FIFO data control */
++#define PA_SCSPTR0 (PA_BCR+0x0424) /* SCIF0 Serial Port control */
++#define PA_SCLSR0 (PA_BCR+0x0428) /* SCIF0 Line Status control */
++#define PA_SCRER0 (PA_BCR+0x042c) /* SCIF0 Serial Error control */
++#define PA_SCSMR1 (PA_BCR+0x0500) /* SCIF1 Serial mode control */
++#define PA_SCBRR1 (PA_BCR+0x0504) /* SCIF1 Bit rate control */
++#define PA_SCSCR1 (PA_BCR+0x0508) /* SCIF1 Serial control */
++#define PA_SCFTDR1 (PA_BCR+0x050c) /* SCIF1 Send FIFO control */
++#define PA_SCFSR1 (PA_BCR+0x0510) /* SCIF1 Serial status control */
++#define PA_SCFRDR1 (PA_BCR+0x0514) /* SCIF1 Receive FIFO control */
++#define PA_SCFCR1 (PA_BCR+0x0518) /* SCIF1 FIFO control */
++#define PA_SCTFDR1 (PA_BCR+0x051c) /* SCIF1 Send FIFO data control */
++#define PA_SCRFDR1 (PA_BCR+0x0520) /* SCIF1 Receive FIFO data control */
++#define PA_SCSPTR1 (PA_BCR+0x0524) /* SCIF1 Serial Port control */
++#define PA_SCLSR1 (PA_BCR+0x0528) /* SCIF1 Line Status control */
++#define PA_SCRER1 (PA_BCR+0x052c) /* SCIF1 Serial Error control */
++#define PA_ICCR (PA_BCR+0x0600) /* Serial control */
++#define PA_SAR (PA_BCR+0x0602) /* Serial Slave control */
++#define PA_MDR (PA_BCR+0x0604) /* Serial Mode control */
++#define PA_ADR1 (PA_BCR+0x0606) /* Serial Address1 control */
++#define PA_DAR1 (PA_BCR+0x0646) /* Serial Data1 control */
++#define PA_VERREG (PA_BCR+0x0700) /* FPGA Version Register */
++#define PA_POFF (PA_BCR+0x0800) /* System Power Off control */
++#define PA_PMR (PA_BCR+0x0900) /* */
++
++#define PA_AX88796L 0xa4100400 /* AX88796L Area */
++#define PA_SC1602BSLB 0xa6000000 /* SC1602BSLB Area */
++#define PA_AREA5_IO 0xb4000000 /* Area 5 IO Memory */
++#define PA_AREA6_IO 0xb8000000 /* Area 6 IO Memory */
++#define PA_IDE_OFFSET 0x1f0 /* CF IDE Offset */
++#define AX88796L_IO_BASE 0x1000 /* AX88796L IO Base Address */
++
++#define IRLCNTR1 (PA_BCR + 0) /* Interrupt Control Register1 */
++
++#define IRQ_PCISLOT1 65 /* PCI Slot #1 IRQ */
++#define IRQ_PCISLOT2 66 /* PCI Slot #2 IRQ */
++#define IRQ_PCISLOT3 67 /* PCI Slot #3 IRQ */
++#define IRQ_PCISLOT4 68 /* PCI Slot #4 IRQ */
++#define IRQ_CFCARD 1 /* CF Card IRQ */
++// #define IRQ_CFINST 0 /* CF Card Insert IRQ */
++#define IRQ_TP 2 /* Touch Panel IRQ */
++#define IRQ_SCI1 3 /* SCI1 IRQ */
++#define IRQ_SCI0 4 /* SCI0 IRQ */
++#define IRQ_2SERIAL 5 /* Serial IRQ */
++#define IRQ_RTC 6 /* RTC A / B IRQ */
++#define IRQ_EXTENTION6 7 /* EXT6n IRQ */
++#define IRQ_EXTENTION5 8 /* EXT5n IRQ */
++#define IRQ_EXTENTION4 9 /* EXT4n IRQ */
++#define IRQ_EXTENTION2 10 /* EXT2n IRQ */
++#define IRQ_EXTENTION1 11 /* EXT1n IRQ */
++#define IRQ_ONETH 13 /* On board Ethernet IRQ */
++#define IRQ_PSW 14 /* Push Switch IRQ */
++
++#else /* R7780RP */
++
++#define PA_BCR 0xa5000000 /* FPGA */
++#define PA_IRLMSK (PA_BCR+0x0000) /* Interrupt Mask control */
++#define PA_IRLMON (PA_BCR+0x0002) /* Interrupt Status control */
++#define PA_SDPOW (PA_BCR+0x0004) /* SD Power control */
++#define PA_RSTCTL (PA_BCR+0x0006) /* Device Reset control */
++#define PA_PCIBD (PA_BCR+0x0008) /* PCI Board detect control */
++#define PA_PCICD (PA_BCR+0x000a) /* PCI Conector detect control */
++#define PA_ZIGIO1 (PA_BCR+0x000c) /* Zigbee IO control 1 */
++#define PA_ZIGIO2 (PA_BCR+0x000e) /* Zigbee IO control 2 */
++#define PA_ZIGIO3 (PA_BCR+0x0010) /* Zigbee IO control 3 */
++#define PA_ZIGIO4 (PA_BCR+0x0012) /* Zigbee IO control 4 */
++#define PA_IVDRMON (PA_BCR+0x0014) /* iVDR Moniter control */
++#define PA_IVDRCTL (PA_BCR+0x0016) /* iVDR control */
++#define PA_OBLED (PA_BCR+0x0018) /* On Board LED control */
++#define PA_OBSW (PA_BCR+0x001a) /* On Board Switch control */
++#define PA_AUDIOSEL (PA_BCR+0x001c) /* Sound Interface Select control */
++#define PA_EXTPLR (PA_BCR+0x001e) /* Extention Pin Polarity control */
++#define PA_TPCTL (PA_BCR+0x0100) /* Touch Panel Access control */
++#define PA_TPDCKCTL (PA_BCR+0x0102) /* Touch Panel Access data control */
++#define PA_TPCTLCLR (PA_BCR+0x0104) /* Touch Panel Access control */
++#define PA_TPXPOS (PA_BCR+0x0106) /* Touch Panel X position control */
++#define PA_TPYPOS (PA_BCR+0x0108) /* Touch Panel Y position control */
++#define PA_DBDET (PA_BCR+0x0200) /* Debug Board detect control */
++#define PA_DBDISPCTL (PA_BCR+0x0202) /* Debug Board Dot timing control */
++#define PA_DBSW (PA_BCR+0x0204) /* Debug Board Switch control */
++#define PA_CFCTL (PA_BCR+0x0300) /* CF Timing control */
++#define PA_CFPOW (PA_BCR+0x0302) /* CF Power control */
++#define PA_CFCDINTCLR (PA_BCR+0x0304) /* CF Insert Interrupt clear */
++#define PA_SCSMR (PA_BCR+0x0400) /* SCIF Serial mode control */
++#define PA_SCBRR (PA_BCR+0x0402) /* SCIF Bit rate control */
++#define PA_SCSCR (PA_BCR+0x0404) /* SCIF Serial control */
++#define PA_SCFDTR (PA_BCR+0x0406) /* SCIF Send FIFO control */
++#define PA_SCFSR (PA_BCR+0x0408) /* SCIF Serial status control */
++#define PA_SCFRDR (PA_BCR+0x040a) /* SCIF Receive FIFO control */
++#define PA_SCFCR (PA_BCR+0x040c) /* SCIF FIFO control */
++#define PA_SCFDR (PA_BCR+0x040e) /* SCIF FIFO data control */
++#define PA_SCLSR (PA_BCR+0x0412) /* SCIF Line Status control */
++#define PA_ICCR (PA_BCR+0x0500) /* Serial control */
++#define PA_SAR (PA_BCR+0x0502) /* Serial Slave control */
++#define PA_MDR (PA_BCR+0x0504) /* Serial Mode control */
++#define PA_ADR1 (PA_BCR+0x0506) /* Serial Address1 control */
++#define PA_DAR1 (PA_BCR+0x0546) /* Serial Data1 control */
++#define PA_VERREG (PA_BCR+0x0600) /* FPGA Version Register */
++
++#define PA_AX88796L 0xa5800400 /* AX88796L Area */
++#define PA_SC1602BSLB 0xa6000000 /* SC1602BSLB Area */
++#define PA_AREA5_IO 0xb4000000 /* Area 5 IO Memory */
++#define PA_AREA6_IO 0xb8000000 /* Area 6 IO Memory */
++#define PA_IDE_OFFSET 0x1f0 /* CF IDE Offset */
++#define AX88796L_IO_BASE 0x1000 /* AX88796L IO Base Address */
++
++#define IRLCNTR1 (PA_BCR + 0) /* Interrupt Control Register1 */
++
++#define IRQ_PCISLOT1 0 /* PCI Slot #1 IRQ */
++#define IRQ_PCISLOT2 1 /* PCI Slot #2 IRQ */
++#define IRQ_PCISLOT3 2 /* PCI Slot #3 IRQ */
++#define IRQ_PCISLOT4 3 /* PCI Slot #4 IRQ */
++#define IRQ_CFCARD 4 /* CF Card IRQ */
++#define IRQ_CFINST 5 /* CF Card Insert IRQ */
++#define IRQ_M66596 6 /* M66596 IRQ */
++#define IRQ_SDCARD 7 /* SD Card IRQ */
++#define IRQ_TUCHPANEL 8 /* Touch Panel IRQ */
++#define IRQ_SCI 9 /* SCI IRQ */
++#define IRQ_2SERIAL 10 /* Serial IRQ */
++#define IRQ_EXTENTION 11 /* EXTn IRQ */
++#define IRQ_ONETH 12 /* On board Ethernet IRQ */
++#define IRQ_PSW 13 /* Push Switch IRQ */
++#define IRQ_ZIGBEE 14 /* Ziggbee IO IRQ */
++
++#endif /* CONFIG_SH_R7780MP */
++
++#define __IO_PREFIX r7780rp
++#include <asm/io_generic.h>
++
++#endif /* __ASM_SH_RENESAS_R7780RP */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/rtc.h linux-2.6.17/include/asm-sh/rtc.h
+--- linux-2.6.17-vanilla/include/asm-sh/rtc.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/rtc.h 2006-07-12 16:54:26.000000000 +0000
+@@ -8,8 +8,8 @@
+ extern void sh_rtc_gettimeofday(struct timespec *ts);
+ extern int sh_rtc_settimeofday(const time_t secs);
+ extern void (*board_time_init)(void);
+-extern void (*rtc_get_time)(struct timespec *);
+-extern int (*rtc_set_time)(const time_t);
++extern void (*rtc_sh_get_time)(struct timespec *);
++extern int (*rtc_sh_set_time)(const time_t);
+
+ /* RCR1 Bits */
+ #define RCR1_CF 0x80 /* Carry Flag */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/rts7751r2d/CVS/Entries linux-2.6.17/include/asm-sh/rts7751r2d/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/rts7751r2d/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/rts7751r2d/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,4 @@
++/ide.h/1.1/Wed Apr 21 00:09:19 2004/-ko/
++/rts7751r2d.h/1.3/Wed Jan 18 05:43:02 2006/-ko/
++/voyagergx_reg.h/1.2/Sun Aug 15 16:59:32 2004/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/rts7751r2d/CVS/Repository linux-2.6.17/include/asm-sh/rts7751r2d/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/rts7751r2d/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/rts7751r2d/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/rts7751r2d
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/rts7751r2d/CVS/Root linux-2.6.17/include/asm-sh/rts7751r2d/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/rts7751r2d/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/rts7751r2d/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/rts7751r2d/rts7751r2d.h linux-2.6.17/include/asm-sh/rts7751r2d/rts7751r2d.h
+--- linux-2.6.17-vanilla/include/asm-sh/rts7751r2d/rts7751r2d.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/rts7751r2d/rts7751r2d.h 2006-07-12 16:54:26.000000000 +0000
+@@ -41,8 +41,6 @@
+
+ #define PA_AX88796L 0xaa000400 /* AX88796L Area */
+ #define PA_VOYAGER 0xab000000 /* VOYAGER GX Area */
+-#define PA_AREA5_IO 0xb4000000 /* Area 5 IO Memory */
+-#define PA_AREA6_IO 0xb8000000 /* Area 6 IO Memory */
+ #define PA_IDE_OFFSET 0x1f0 /* CF IDE Offset */
+ #define AX88796L_IO_BASE 0x1000 /* AX88796L IO Base Address */
+
+@@ -70,4 +68,7 @@
+ #define IRQ_PCISLOT2 10 /* PCI Slot #2 IRQ */
+ #define IRQ_EXTENTION 11 /* EXTn IRQ */
+
++#define __IO_PREFIX rts7751r2d
++#include <asm/io_generic.h>
++
+ #endif /* __ASM_SH_RENESAS_RTS7751R2D */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/saturn/CVS/Entries linux-2.6.17/include/asm-sh/saturn/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/saturn/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/saturn/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,3 @@
++/io.h/1.3/Tue Jul 29 14:27:12 2003/-ko/
++/smpc.h/1.2/Sun May 4 19:30:16 2003/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/saturn/CVS/Repository linux-2.6.17/include/asm-sh/saturn/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/saturn/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/saturn/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/saturn
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/saturn/CVS/Root linux-2.6.17/include/asm-sh/saturn/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/saturn/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/saturn/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/scatterlist.h linux-2.6.17/include/asm-sh/scatterlist.h
+--- linux-2.6.17-vanilla/include/asm-sh/scatterlist.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/scatterlist.h 2006-07-12 16:54:26.000000000 +0000
+@@ -10,4 +10,13 @@
+
+ #define ISA_DMA_THRESHOLD (0x1fffffff)
+
++/* These macros should be used after a pci_map_sg call has been done
++ * to get bus addresses of each of the SG entries and their lengths.
++ * You should only work with the number of sg entries pci_map_sg
++ * returns, or alternatively stop on the first sg_dma_len(sg) which
++ * is 0.
++ */
++#define sg_dma_address(sg) ((sg)->dma_address)
++#define sg_dma_len(sg) ((sg)->length)
++
+ #endif /* !(__ASM_SH_SCATTERLIST_H) */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/se.h linux-2.6.17/include/asm-sh/se.h
+--- linux-2.6.17-vanilla/include/asm-sh/se.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/se.h 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,80 @@
++#ifndef __ASM_SH_HITACHI_SE_H
++#define __ASM_SH_HITACHI_SE_H
++
++/*
++ * linux/include/asm-sh/hitachi_se.h
++ *
++ * Copyright (C) 2000 Kazumoto Kojima
++ *
++ * Hitachi SolutionEngine support
++ */
++
++/* Box specific addresses. */
++
++#define PA_ROM 0x00000000 /* EPROM */
++#define PA_ROM_SIZE 0x00400000 /* EPROM size 4M byte */
++#define PA_FROM 0x01000000 /* EPROM */
++#define PA_FROM_SIZE 0x00400000 /* EPROM size 4M byte */
++#define PA_EXT1 0x04000000
++#define PA_EXT1_SIZE 0x04000000
++#define PA_EXT2 0x08000000
++#define PA_EXT2_SIZE 0x04000000
++#define PA_SDRAM 0x0c000000
++#define PA_SDRAM_SIZE 0x04000000
++
++#define PA_EXT4 0x12000000
++#define PA_EXT4_SIZE 0x02000000
++#define PA_EXT5 0x14000000
++#define PA_EXT5_SIZE 0x04000000
++#define PA_PCIC 0x18000000 /* MR-SHPC-01 PCMCIA */
++
++#define PA_83902 0xb0000000 /* DP83902A */
++#define PA_83902_IF 0xb0040000 /* DP83902A remote io port */
++#define PA_83902_RST 0xb0080000 /* DP83902A reset port */
++
++#define PA_SUPERIO 0xb0400000 /* SMC37C935A super io chip */
++#define PA_DIPSW0 0xb0800000 /* Dip switch 5,6 */
++#define PA_DIPSW1 0xb0800002 /* Dip switch 7,8 */
++#define PA_LED 0xb0c00000 /* LED */
++#if defined(CONFIG_CPU_SUBTYPE_SH7705)
++#define PA_BCR 0xb0e00000
++#else
++#define PA_BCR 0xb1400000 /* FPGA */
++#endif
++
++#define PA_MRSHPC 0xb83fffe0 /* MR-SHPC-01 PCMCIA controller */
++#define PA_MRSHPC_MW1 0xb8400000 /* MR-SHPC-01 memory window base */
++#define PA_MRSHPC_MW2 0xb8500000 /* MR-SHPC-01 attribute window base */
++#define PA_MRSHPC_IO 0xb8600000 /* MR-SHPC-01 I/O window base */
++#define MRSHPC_OPTION (PA_MRSHPC + 6)
++#define MRSHPC_CSR (PA_MRSHPC + 8)
++#define MRSHPC_ISR (PA_MRSHPC + 10)
++#define MRSHPC_ICR (PA_MRSHPC + 12)
++#define MRSHPC_CPWCR (PA_MRSHPC + 14)
++#define MRSHPC_MW0CR1 (PA_MRSHPC + 16)
++#define MRSHPC_MW1CR1 (PA_MRSHPC + 18)
++#define MRSHPC_IOWCR1 (PA_MRSHPC + 20)
++#define MRSHPC_MW0CR2 (PA_MRSHPC + 22)
++#define MRSHPC_MW1CR2 (PA_MRSHPC + 24)
++#define MRSHPC_IOWCR2 (PA_MRSHPC + 26)
++#define MRSHPC_CDCR (PA_MRSHPC + 28)
++#define MRSHPC_PCIC_INFO (PA_MRSHPC + 30)
++
++#define BCR_ILCRA (PA_BCR + 0)
++#define BCR_ILCRB (PA_BCR + 2)
++#define BCR_ILCRC (PA_BCR + 4)
++#define BCR_ILCRD (PA_BCR + 6)
++#define BCR_ILCRE (PA_BCR + 8)
++#define BCR_ILCRF (PA_BCR + 10)
++#define BCR_ILCRG (PA_BCR + 12)
++
++#if defined(CONFIG_CPU_SUBTYPE_SH7705)
++#define IRQ_STNIC 12
++#else
++#define IRQ_STNIC 10
++#endif
++
++#define __IO_PREFIX se
++#include <asm/io_generic.h>
++
++#endif /* __ASM_SH_HITACHI_SE_H */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/se7300.h linux-2.6.17/include/asm-sh/se7300.h
+--- linux-2.6.17-vanilla/include/asm-sh/se7300.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/se7300.h 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,64 @@
++#ifndef __ASM_SH_HITACHI_SE7300_H
++#define __ASM_SH_HITACHI_SE7300_H
++
++/*
++ * linux/include/asm-sh/se/se7300.h
++ *
++ * Copyright (C) 2003 Takashi Kusuda <kusuda-takashi@hitachi-ul.co.jp>
++ *
++ * SH-Mobile SolutionEngine 7300 support
++ */
++
++/* Box specific addresses. */
++
++/* Area 0 */
++#define PA_ROM 0x00000000 /* EPROM */
++#define PA_ROM_SIZE 0x00400000 /* EPROM size 4M byte(Actually 2MB) */
++#define PA_FROM 0x00400000 /* Flash ROM */
++#define PA_FROM_SIZE 0x00400000 /* Flash size 4M byte */
++#define PA_SRAM 0x00800000 /* SRAM */
++#define PA_FROM_SIZE 0x00400000 /* SRAM size 4M byte */
++/* Area 1 */
++#define PA_EXT1 0x04000000
++#define PA_EXT1_SIZE 0x04000000
++/* Area 2 */
++#define PA_EXT2 0x08000000
++#define PA_EXT2_SIZE 0x04000000
++/* Area 3 */
++#define PA_SDRAM 0x0c000000
++#define PA_SDRAM_SIZE 0x04000000
++/* Area 4 */
++#define PA_PCIC 0x10000000 /* MR-SHPC-01 PCMCIA */
++#define PA_MRSHPC 0xb03fffe0 /* MR-SHPC-01 PCMCIA controller */
++#define PA_MRSHPC_MW1 0xb0400000 /* MR-SHPC-01 memory window base */
++#define PA_MRSHPC_MW2 0xb0500000 /* MR-SHPC-01 attribute window base */
++#define PA_MRSHPC_IO 0xb0600000 /* MR-SHPC-01 I/O window base */
++#define MRSHPC_OPTION (PA_MRSHPC + 6)
++#define MRSHPC_CSR (PA_MRSHPC + 8)
++#define MRSHPC_ISR (PA_MRSHPC + 10)
++#define MRSHPC_ICR (PA_MRSHPC + 12)
++#define MRSHPC_CPWCR (PA_MRSHPC + 14)
++#define MRSHPC_MW0CR1 (PA_MRSHPC + 16)
++#define MRSHPC_MW1CR1 (PA_MRSHPC + 18)
++#define MRSHPC_IOWCR1 (PA_MRSHPC + 20)
++#define MRSHPC_MW0CR2 (PA_MRSHPC + 22)
++#define MRSHPC_MW1CR2 (PA_MRSHPC + 24)
++#define MRSHPC_IOWCR2 (PA_MRSHPC + 26)
++#define MRSHPC_CDCR (PA_MRSHPC + 28)
++#define MRSHPC_PCIC_INFO (PA_MRSHPC + 30)
++#define PA_LED 0xb0800000 /* LED */
++#define PA_DIPSW 0xb0900000 /* Dip switch 31 */
++#define PA_EPLD_MODESET 0xb0a00000 /* FPGA Mode set register */
++#define PA_EPLD_ST1 0xb0a80000 /* FPGA Interrupt status register1 */
++#define PA_EPLD_ST2 0xb0ac0000 /* FPGA Interrupt status register2 */
++/* Area 5 */
++#define PA_EXT5 0x14000000
++#define PA_EXT5_SIZE 0x04000000
++/* Area 6 */
++#define PA_LCD1 0xb8000000
++#define PA_LCD2 0xb8800000
++
++#define __IO_PREFIX sh7300se
++#include <asm/io_generic.h>
++
++#endif /* __ASM_SH_HITACHI_SE7300_H */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/se73180.h linux-2.6.17/include/asm-sh/se73180.h
+--- linux-2.6.17-vanilla/include/asm-sh/se73180.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/se73180.h 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,65 @@
++#ifndef __ASM_SH_HITACHI_SE73180_H
++#define __ASM_SH_HITACHI_SE73180_H
++
++/*
++ * include/asm-sh/se/se73180.h
++ *
++ * Copyright (C) 2003 Takashi Kusuda <kusuda-takashi@hitachi-ul.co.jp>
++ *
++ * SH-Mobile SolutionEngine 73180 support
++ */
++
++/* Box specific addresses. */
++
++/* Area 0 */
++#define PA_ROM 0x00000000 /* EPROM */
++#define PA_ROM_SIZE 0x00400000 /* EPROM size 4M byte(Actually 2MB) */
++#define PA_FROM 0x00400000 /* Flash ROM */
++#define PA_FROM_SIZE 0x00400000 /* Flash size 4M byte */
++#define PA_SRAM 0x00800000 /* SRAM */
++#define PA_FROM_SIZE 0x00400000 /* SRAM size 4M byte */
++/* Area 1 */
++#define PA_EXT1 0x04000000
++#define PA_EXT1_SIZE 0x04000000
++/* Area 2 */
++#define PA_EXT2 0x08000000
++#define PA_EXT2_SIZE 0x04000000
++/* Area 3 */
++#define PA_SDRAM 0x0c000000
++#define PA_SDRAM_SIZE 0x04000000
++/* Area 4 */
++#define PA_PCIC 0x10000000 /* MR-SHPC-01 PCMCIA */
++#define PA_MRSHPC 0xb03fffe0 /* MR-SHPC-01 PCMCIA controller */
++#define PA_MRSHPC_MW1 0xb0400000 /* MR-SHPC-01 memory window base */
++#define PA_MRSHPC_MW2 0xb0500000 /* MR-SHPC-01 attribute window base */
++#define PA_MRSHPC_IO 0xb0600000 /* MR-SHPC-01 I/O window base */
++#define MRSHPC_OPTION (PA_MRSHPC + 6)
++#define MRSHPC_CSR (PA_MRSHPC + 8)
++#define MRSHPC_ISR (PA_MRSHPC + 10)
++#define MRSHPC_ICR (PA_MRSHPC + 12)
++#define MRSHPC_CPWCR (PA_MRSHPC + 14)
++#define MRSHPC_MW0CR1 (PA_MRSHPC + 16)
++#define MRSHPC_MW1CR1 (PA_MRSHPC + 18)
++#define MRSHPC_IOWCR1 (PA_MRSHPC + 20)
++#define MRSHPC_MW0CR2 (PA_MRSHPC + 22)
++#define MRSHPC_MW1CR2 (PA_MRSHPC + 24)
++#define MRSHPC_IOWCR2 (PA_MRSHPC + 26)
++#define MRSHPC_CDCR (PA_MRSHPC + 28)
++#define MRSHPC_PCIC_INFO (PA_MRSHPC + 30)
++#define PA_LED 0xb0C00000 /* LED */
++#define LED_SHIFT 0
++#define PA_DIPSW 0xb0900000 /* Dip switch 31 */
++#define PA_EPLD_MODESET 0xb0a00000 /* FPGA Mode set register */
++#define PA_EPLD_ST1 0xb0a80000 /* FPGA Interrupt status register1 */
++#define PA_EPLD_ST2 0xb0ac0000 /* FPGA Interrupt status register2 */
++/* Area 5 */
++#define PA_EXT5 0x14000000
++#define PA_EXT5_SIZE 0x04000000
++/* Area 6 */
++#define PA_LCD1 0xb8000000
++#define PA_LCD2 0xb8800000
++
++#define __IO_PREFIX sh73180se
++#include <asm/io_generic.h>
++
++#endif /* __ASM_SH_HITACHI_SE73180_H */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/se7751.h linux-2.6.17/include/asm-sh/se7751.h
+--- linux-2.6.17-vanilla/include/asm-sh/se7751.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/se7751.h 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,71 @@
++#ifndef __ASM_SH_HITACHI_7751SE_H
++#define __ASM_SH_HITACHI_7751SE_H
++
++/*
++ * linux/include/asm-sh/hitachi_7751se.h
++ *
++ * Copyright (C) 2000 Kazumoto Kojima
++ *
++ * Hitachi SolutionEngine support
++
++ * Modified for 7751 Solution Engine by
++ * Ian da Silva and Jeremy Siegel, 2001.
++ */
++
++/* Box specific addresses. */
++
++#define PA_ROM 0x00000000 /* EPROM */
++#define PA_ROM_SIZE 0x00400000 /* EPROM size 4M byte */
++#define PA_FROM 0x01000000 /* EPROM */
++#define PA_FROM_SIZE 0x00400000 /* EPROM size 4M byte */
++#define PA_EXT1 0x04000000
++#define PA_EXT1_SIZE 0x04000000
++#define PA_EXT2 0x08000000
++#define PA_EXT2_SIZE 0x04000000
++#define PA_SDRAM 0x0c000000
++#define PA_SDRAM_SIZE 0x04000000
++
++#define PA_EXT4 0x12000000
++#define PA_EXT4_SIZE 0x02000000
++#define PA_EXT5 0x14000000
++#define PA_EXT5_SIZE 0x04000000
++#define PA_PCIC 0x18000000 /* MR-SHPC-01 PCMCIA */
++
++#define PA_DIPSW0 0xb9000000 /* Dip switch 5,6 */
++#define PA_DIPSW1 0xb9000002 /* Dip switch 7,8 */
++#define PA_LED 0xba000000 /* LED */
++#define PA_BCR 0xbb000000 /* FPGA on the MS7751SE01 */
++
++#define PA_MRSHPC 0xb83fffe0 /* MR-SHPC-01 PCMCIA controler */
++#define PA_MRSHPC_MW1 0xb8400000 /* MR-SHPC-01 memory window base */
++#define PA_MRSHPC_MW2 0xb8500000 /* MR-SHPC-01 attribute window base */
++#define PA_MRSHPC_IO 0xb8600000 /* MR-SHPC-01 I/O window base */
++#define MRSHPC_MODE (PA_MRSHPC + 4)
++#define MRSHPC_OPTION (PA_MRSHPC + 6)
++#define MRSHPC_CSR (PA_MRSHPC + 8)
++#define MRSHPC_ISR (PA_MRSHPC + 10)
++#define MRSHPC_ICR (PA_MRSHPC + 12)
++#define MRSHPC_CPWCR (PA_MRSHPC + 14)
++#define MRSHPC_MW0CR1 (PA_MRSHPC + 16)
++#define MRSHPC_MW1CR1 (PA_MRSHPC + 18)
++#define MRSHPC_IOWCR1 (PA_MRSHPC + 20)
++#define MRSHPC_MW0CR2 (PA_MRSHPC + 22)
++#define MRSHPC_MW1CR2 (PA_MRSHPC + 24)
++#define MRSHPC_IOWCR2 (PA_MRSHPC + 26)
++#define MRSHPC_CDCR (PA_MRSHPC + 28)
++#define MRSHPC_PCIC_INFO (PA_MRSHPC + 30)
++
++#define BCR_ILCRA (PA_BCR + 0)
++#define BCR_ILCRB (PA_BCR + 2)
++#define BCR_ILCRC (PA_BCR + 4)
++#define BCR_ILCRD (PA_BCR + 6)
++#define BCR_ILCRE (PA_BCR + 8)
++#define BCR_ILCRF (PA_BCR + 10)
++#define BCR_ILCRG (PA_BCR + 12)
++
++#define IRQ_79C973 13
++
++#define __IO_PREFIX sh7751se
++#include <asm/io_generic.h>
++
++#endif /* __ASM_SH_HITACHI_7751SE_H */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/sfp-machine.h linux-2.6.17/include/asm-sh/sfp-machine.h
+--- linux-2.6.17-vanilla/include/asm-sh/sfp-machine.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/sfp-machine.h 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,86 @@
++/* Machine-dependent software floating-point definitions.
++ SuperH kernel version.
++ Copyright (C) 1997,1998,1999 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++ Contributed by Richard Henderson (rth@cygnus.com),
++ Jakub Jelinek (jj@ultra.linux.cz),
++ David S. Miller (davem@redhat.com) and
++ Peter Maydell (pmaydell@chiark.greenend.org.uk).
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Library General Public License as
++ published by the Free Software Foundation; either version 2 of the
++ License, or (at your option) any later version.
++
++ The GNU C Library 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
++ Library General Public License for more details.
++
++ You should have received a copy of the GNU Library General Public
++ License along with the GNU C Library; see the file COPYING.LIB. If
++ not, write to the Free Software Foundation, Inc.,
++ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
++
++#ifndef _SFP_MACHINE_H
++#define _SFP_MACHINE_H
++
++#include <linux/config.h>
++
++#define _FP_W_TYPE_SIZE 32
++#define _FP_W_TYPE unsigned long
++#define _FP_WS_TYPE signed long
++#define _FP_I_TYPE long
++
++#define _FP_MUL_MEAT_S(R,X,Y) \
++ _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
++#define _FP_MUL_MEAT_D(R,X,Y) \
++ _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
++#define _FP_MUL_MEAT_Q(R,X,Y) \
++ _FP_MUL_MEAT_4_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm)
++
++#define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_udiv(S,R,X,Y)
++#define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_2_udiv(D,R,X,Y)
++#define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_4_udiv(Q,R,X,Y)
++
++#define _FP_NANFRAC_S ((_FP_QNANBIT_S << 1) - 1)
++#define _FP_NANFRAC_D ((_FP_QNANBIT_D << 1) - 1), -1
++#define _FP_NANFRAC_Q ((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
++#define _FP_NANSIGN_S 0
++#define _FP_NANSIGN_D 0
++#define _FP_NANSIGN_Q 0
++
++#define _FP_KEEPNANFRACP 1
++
++/*
++ * If one NaN is signaling and the other is not,
++ * we choose that one, otherwise we choose X.
++ */
++#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP) \
++ do { \
++ if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs) \
++ && !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs)) \
++ { \
++ R##_s = Y##_s; \
++ _FP_FRAC_COPY_##wc(R,Y); \
++ } \
++ else \
++ { \
++ R##_s = X##_s; \
++ _FP_FRAC_COPY_##wc(R,X); \
++ } \
++ R##_c = FP_CLS_NAN; \
++ } while (0)
++
++//#define FP_ROUNDMODE FPSCR_RM
++#define FP_DENORM_ZERO 1/*FPSCR_DN*/
++
++/* Exception flags. */
++#define FP_EX_INVALID (1<<4)
++#define FP_EX_DIVZERO (1<<3)
++#define FP_EX_OVERFLOW (1<<2)
++#define FP_EX_UNDERFLOW (1<<1)
++#define FP_EX_INEXACT (1<<0)
++
++#endif
++
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/sh03/CVS/Entries linux-2.6.17/include/asm-sh/sh03/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/sh03/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/sh03/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,4 @@
++/ide.h/1.1/Fri Dec 3 01:43:33 2004/-ko/
++/io.h/1.2/Wed Jan 4 18:27:49 2006/-ko/
++/sh03.h/1.2/Sat Aug 13 14:34:12 2005/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/sh03/CVS/Repository linux-2.6.17/include/asm-sh/sh03/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/sh03/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/sh03/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/sh03
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/sh03/CVS/Root linux-2.6.17/include/asm-sh/sh03/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/sh03/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/sh03/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/sh03/io.h linux-2.6.17/include/asm-sh/sh03/io.h
+--- linux-2.6.17-vanilla/include/asm-sh/sh03/io.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/sh03/io.h 2006-07-12 16:54:26.000000000 +0000
+@@ -33,14 +33,6 @@
+ #define IRL3_IPR_POS 0
+ #define IRL3_PRIORITY 4
+
+-
+-extern unsigned long sh03_isa_port2addr(unsigned long offset);
+-
+-extern void setup_sh03(void);
+-extern void init_sh03_IRQ(void);
+-extern void heartbeat_sh03(void);
+-
+-extern void sh03_rtc_gettimeofday(struct timeval *tv);
+-extern int sh03_rtc_settimeofday(const struct timeval *tv);
++void heartbeat_sh03(void);
+
+ #endif /* _ASM_SH_IO_SH03_H */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/sh2000/CVS/Entries linux-2.6.17/include/asm-sh/sh2000/CVS/Entries
+--- linux-2.6.17-vanilla/include/asm-sh/sh2000/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/sh2000/CVS/Entries 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,2 @@
++/sh2000.h/1.2/Fri Nov 1 17:19:31 2002//
++D
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/sh2000/CVS/Repository linux-2.6.17/include/asm-sh/sh2000/CVS/Repository
+--- linux-2.6.17-vanilla/include/asm-sh/sh2000/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/sh2000/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/asm-sh/sh2000
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/sh2000/CVS/Root linux-2.6.17/include/asm-sh/sh2000/CVS/Root
+--- linux-2.6.17-vanilla/include/asm-sh/sh2000/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/sh2000/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/smc37c93x.h linux-2.6.17/include/asm-sh/smc37c93x.h
+--- linux-2.6.17-vanilla/include/asm-sh/smc37c93x.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/smc37c93x.h 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,190 @@
++#ifndef __ASM_SH_SMC37C93X_H
++#define __ASM_SH_SMC37C93X_H
++
++/*
++ * linux/include/asm-sh/smc37c93x.h
++ *
++ * Copyright (C) 2000 Kazumoto Kojima
++ *
++ * SMSC 37C93x Super IO Chip support
++ */
++
++/* Default base I/O address */
++#define FDC_PRIMARY_BASE 0x3f0
++#define IDE1_PRIMARY_BASE 0x1f0
++#define IDE1_SECONDARY_BASE 0x170
++#define PARPORT_PRIMARY_BASE 0x378
++#define COM1_PRIMARY_BASE 0x2f8
++#define COM2_PRIMARY_BASE 0x3f8
++#define RTC_PRIMARY_BASE 0x070
++#define KBC_PRIMARY_BASE 0x060
++#define AUXIO_PRIMARY_BASE 0x000 /* XXX */
++
++/* Logical device number */
++#define LDN_FDC 0
++#define LDN_IDE1 1
++#define LDN_IDE2 2
++#define LDN_PARPORT 3
++#define LDN_COM1 4
++#define LDN_COM2 5
++#define LDN_RTC 6
++#define LDN_KBC 7
++#define LDN_AUXIO 8
++
++/* Configuration port and key */
++#define CONFIG_PORT 0x3f0
++#define INDEX_PORT CONFIG_PORT
++#define DATA_PORT 0x3f1
++#define CONFIG_ENTER 0x55
++#define CONFIG_EXIT 0xaa
++
++/* Configuration index */
++#define CURRENT_LDN_INDEX 0x07
++#define POWER_CONTROL_INDEX 0x22
++#define ACTIVATE_INDEX 0x30
++#define IO_BASE_HI_INDEX 0x60
++#define IO_BASE_LO_INDEX 0x61
++#define IRQ_SELECT_INDEX 0x70
++#define DMA_SELECT_INDEX 0x74
++
++#define GPIO46_INDEX 0xc6
++#define GPIO47_INDEX 0xc7
++
++/* UART stuff. Only for debugging. */
++/* UART Register */
++
++#define UART_RBR 0x0 /* Receiver Buffer Register (Read Only) */
++#define UART_THR 0x0 /* Transmitter Holding Register (Write Only) */
++#define UART_IER 0x2 /* Interrupt Enable Register */
++#define UART_IIR 0x4 /* Interrupt Ident Register (Read Only) */
++#define UART_FCR 0x4 /* FIFO Control Register (Write Only) */
++#define UART_LCR 0x6 /* Line Control Register */
++#define UART_MCR 0x8 /* MODEM Control Register */
++#define UART_LSR 0xa /* Line Status Register */
++#define UART_MSR 0xc /* MODEM Status Register */
++#define UART_SCR 0xe /* Scratch Register */
++#define UART_DLL 0x0 /* Divisor Latch (LS) */
++#define UART_DLM 0x2 /* Divisor Latch (MS) */
++
++#ifndef __ASSEMBLY__
++typedef struct uart_reg {
++ volatile __u16 rbr;
++ volatile __u16 ier;
++ volatile __u16 iir;
++ volatile __u16 lcr;
++ volatile __u16 mcr;
++ volatile __u16 lsr;
++ volatile __u16 msr;
++ volatile __u16 scr;
++} uart_reg;
++#endif /* ! __ASSEMBLY__ */
++
++/* Alias for Write Only Register */
++
++#define thr rbr
++#define tcr iir
++
++/* Alias for Divisor Latch Register */
++
++#define dll rbr
++#define dlm ier
++#define fcr iir
++
++/* Interrupt Enable Register */
++
++#define IER_ERDAI 0x0100 /* Enable Received Data Available Interrupt */
++#define IER_ETHREI 0x0200 /* Enable Transmitter Holding Register Empty Interrupt */
++#define IER_ELSI 0x0400 /* Enable Receiver Line Status Interrupt */
++#define IER_EMSI 0x0800 /* Enable MODEM Status Interrupt */
++
++/* Interrupt Ident Register */
++
++#define IIR_IP 0x0100 /* "0" if Interrupt Pending */
++#define IIR_IIB0 0x0200 /* Interrupt ID Bit 0 */
++#define IIR_IIB1 0x0400 /* Interrupt ID Bit 1 */
++#define IIR_IIB2 0x0800 /* Interrupt ID Bit 2 */
++#define IIR_FIFO 0xc000 /* FIFOs enabled */
++
++/* FIFO Control Register */
++
++#define FCR_FEN 0x0100 /* FIFO enable */
++#define FCR_RFRES 0x0200 /* Receiver FIFO reset */
++#define FCR_TFRES 0x0400 /* Transmitter FIFO reset */
++#define FCR_DMA 0x0800 /* DMA mode select */
++#define FCR_RTL 0x4000 /* Receiver triger (LSB) */
++#define FCR_RTM 0x8000 /* Receiver triger (MSB) */
++
++/* Line Control Register */
++
++#define LCR_WLS0 0x0100 /* Word Length Select Bit 0 */
++#define LCR_WLS1 0x0200 /* Word Length Select Bit 1 */
++#define LCR_STB 0x0400 /* Number of Stop Bits */
++#define LCR_PEN 0x0800 /* Parity Enable */
++#define LCR_EPS 0x1000 /* Even Parity Select */
++#define LCR_SP 0x2000 /* Stick Parity */
++#define LCR_SB 0x4000 /* Set Break */
++#define LCR_DLAB 0x8000 /* Divisor Latch Access Bit */
++
++/* MODEM Control Register */
++
++#define MCR_DTR 0x0100 /* Data Terminal Ready */
++#define MCR_RTS 0x0200 /* Request to Send */
++#define MCR_OUT1 0x0400 /* Out 1 */
++#define MCR_IRQEN 0x0800 /* IRQ Enable */
++#define MCR_LOOP 0x1000 /* Loop */
++
++/* Line Status Register */
++
++#define LSR_DR 0x0100 /* Data Ready */
++#define LSR_OE 0x0200 /* Overrun Error */
++#define LSR_PE 0x0400 /* Parity Error */
++#define LSR_FE 0x0800 /* Framing Error */
++#define LSR_BI 0x1000 /* Break Interrupt */
++#define LSR_THRE 0x2000 /* Transmitter Holding Register Empty */
++#define LSR_TEMT 0x4000 /* Transmitter Empty */
++#define LSR_FIFOE 0x8000 /* Receiver FIFO error */
++
++/* MODEM Status Register */
++
++#define MSR_DCTS 0x0100 /* Delta Clear to Send */
++#define MSR_DDSR 0x0200 /* Delta Data Set Ready */
++#define MSR_TERI 0x0400 /* Trailing Edge Ring Indicator */
++#define MSR_DDCD 0x0800 /* Delta Data Carrier Detect */
++#define MSR_CTS 0x1000 /* Clear to Send */
++#define MSR_DSR 0x2000 /* Data Set Ready */
++#define MSR_RI 0x4000 /* Ring Indicator */
++#define MSR_DCD 0x8000 /* Data Carrier Detect */
++
++/* Baud Rate Divisor */
++
++#define UART_CLK (1843200) /* 1.8432 MHz */
++#define UART_BAUD(x) (UART_CLK / (16 * (x)))
++
++/* RTC register definition */
++#define RTC_SECONDS 0
++#define RTC_SECONDS_ALARM 1
++#define RTC_MINUTES 2
++#define RTC_MINUTES_ALARM 3
++#define RTC_HOURS 4
++#define RTC_HOURS_ALARM 5
++#define RTC_DAY_OF_WEEK 6
++#define RTC_DAY_OF_MONTH 7
++#define RTC_MONTH 8
++#define RTC_YEAR 9
++#define RTC_FREQ_SELECT 10
++# define RTC_UIP 0x80
++# define RTC_DIV_CTL 0x70
++/* This RTC can work under 32.768KHz clock only. */
++# define RTC_OSC_ENABLE 0x20
++# define RTC_OSC_DISABLE 0x00
++#define RTC_CONTROL 11
++# define RTC_SET 0x80
++# define RTC_PIE 0x40
++# define RTC_AIE 0x20
++# define RTC_UIE 0x10
++# define RTC_SQWE 0x08
++# define RTC_DM_BINARY 0x04
++# define RTC_24H 0x02
++# define RTC_DST_EN 0x01
++
++#endif /* __ASM_SH_SMC37C93X_H */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/smp.h linux-2.6.17/include/asm-sh/smp.h
+--- linux-2.6.17-vanilla/include/asm-sh/smp.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/smp.h 2006-07-12 16:54:26.000000000 +0000
+@@ -20,11 +20,6 @@
+ #include <asm/atomic.h>
+ #include <asm/current.h>
+
+-extern cpumask_t cpu_online_map;
+-extern cpumask_t cpu_possible_map;
+-
+-#define cpu_online(cpu) cpu_isset(cpu, cpu_online_map)
+-
+ #define raw_smp_processor_id() (current_thread_info()->cpu)
+
+ /* I've no idea what the real meaning of this is */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/snapgear.h linux-2.6.17/include/asm-sh/snapgear.h
+--- linux-2.6.17-vanilla/include/asm-sh/snapgear.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/snapgear.h 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,79 @@
++/*
++ * include/asm-sh/snapgear/io.h
++ *
++ * Modified version of io_se.h for the snapgear-specific functions.
++ *
++ * May be copied or modified under the terms of the GNU General Public
++ * License. See linux/COPYING for more information.
++ *
++ * IO functions for a SnapGear
++ */
++
++#ifndef _ASM_SH_IO_SNAPGEAR_H
++#define _ASM_SH_IO_SNAPGEAR_H
++
++#if defined(CONFIG_CPU_SH4)
++/*
++ * The external interrupt lines, these take up ints 0 - 15 inclusive
++ * depending on the priority for the interrupt. In fact the priority
++ * is the interrupt :-)
++ */
++
++#define IRL0_IRQ 2
++#define IRL0_IPR_ADDR INTC_IPRD
++#define IRL0_IPR_POS 3
++#define IRL0_PRIORITY 13
++
++#define IRL1_IRQ 5
++#define IRL1_IPR_ADDR INTC_IPRD
++#define IRL1_IPR_POS 2
++#define IRL1_PRIORITY 10
++
++#define IRL2_IRQ 8
++#define IRL2_IPR_ADDR INTC_IPRD
++#define IRL2_IPR_POS 1
++#define IRL2_PRIORITY 7
++
++#define IRL3_IRQ 11
++#define IRL3_IPR_ADDR INTC_IPRD
++#define IRL3_IPR_POS 0
++#define IRL3_PRIORITY 4
++#endif
++
++#define __IO_PREFIX snapgear
++#include <asm/io_generic.h>
++
++#ifdef CONFIG_SH_SECUREEDGE5410
++/*
++ * We need to remember what was written to the ioport as some bits
++ * are shared with other functions and you cannot read back what was
++ * written :-|
++ *
++ * Bit Read Write
++ * -----------------------------------------------
++ * D0 DCD on ttySC1 power
++ * D1 Reset Switch heatbeat
++ * D2 ttySC0 CTS (7100) LAN
++ * D3 - WAN
++ * D4 ttySC0 DCD (7100) CONSOLE
++ * D5 - ONLINE
++ * D6 - VPN
++ * D7 - DTR on ttySC1
++ * D8 - ttySC0 RTS (7100)
++ * D9 - ttySC0 DTR (7100)
++ * D10 - RTC SCLK
++ * D11 RTC DATA RTC DATA
++ * D12 - RTS RESET
++ */
++
++#define SECUREEDGE_IOPORT_ADDR ((volatile short *) 0xb0000000)
++extern unsigned short secureedge5410_ioport;
++
++#define SECUREEDGE_WRITE_IOPORT(val, mask) (*SECUREEDGE_IOPORT_ADDR = \
++ (secureedge5410_ioport = \
++ ((secureedge5410_ioport & ~(mask)) | ((val) & (mask)))))
++#define SECUREEDGE_READ_IOPORT() \
++ ((*SECUREEDGE_IOPORT_ADDR&0x0817) | (secureedge5410_ioport&~0x0817))
++#endif
++
++#endif /* _ASM_SH_IO_SNAPGEAR_H */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/system.h linux-2.6.17/include/asm-sh/system.h
+--- linux-2.6.17-vanilla/include/asm-sh/system.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/system.h 2006-07-12 16:54:26.000000000 +0000
+@@ -7,6 +7,7 @@
+ */
+
+ #include <linux/config.h>
++#include <asm/types.h>
+
+ /*
+ * switch_to() should switch tasks to task nr n, first
+@@ -67,13 +68,20 @@
+ {
+ }
+
+-#define nop() __asm__ __volatile__ ("nop")
+-
+-
+-#define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
++#ifdef CONFIG_CPU_SH4A
++#define __icbi() \
++{ \
++ unsigned long __addr; \
++ __addr = 0xa8000000; \
++ __asm__ __volatile__( \
++ "icbi %0\n\t" \
++ : /* no output */ \
++ : "m" (__m(__addr))); \
++}
++#endif
+
+ static __inline__ unsigned long tas(volatile int *m)
+-{ /* #define tas(ptr) (xchg((ptr),1)) */
++{
+ unsigned long retval;
+
+ __asm__ __volatile__ ("tas.b @%1\n\t"
+@@ -82,12 +90,33 @@
+ return retval;
+ }
+
+-extern void __xchg_called_with_bad_pointer(void);
+-
+-#define mb() __asm__ __volatile__ ("": : :"memory")
+-#define rmb() mb()
+-#define wmb() __asm__ __volatile__ ("": : :"memory")
++/*
++ * A brief note on ctrl_barrier(), the control register write barrier.
++ *
++ * Legacy SH cores typically require a sequence of 8 nops after
++ * modification of a control register in order for the changes to take
++ * effect. On newer cores (like the sh4a and sh5) this is accomplished
++ * with icbi.
++ *
++ * Also note that on sh4a in the icbi case we can forego a synco for the
++ * write barrier, as it's not necessary for control registers.
++ *
++ * Historically we have only done this type of barrier for the MMUCR, but
++ * it's also necessary for the CCR, so we make it generic here instead.
++ */
++#ifdef CONFIG_CPU_SH4A
++#define mb() __asm__ __volatile__ ("synco": : :"memory")
++#define rmb() mb()
++#define wmb() __asm__ __volatile__ ("synco": : :"memory")
++#define ctrl_barrier() __icbi()
+ #define read_barrier_depends() do { } while(0)
++#else
++#define mb() __asm__ __volatile__ ("": : :"memory")
++#define rmb() mb()
++#define wmb() __asm__ __volatile__ ("": : :"memory")
++#define ctrl_barrier() __asm__ __volatile__ ("nop;nop;nop;nop;nop;nop;nop;nop")
++#define read_barrier_depends() do { } while(0)
++#endif
+
+ #ifdef CONFIG_SMP
+ #define smp_mb() mb()
+@@ -105,7 +134,8 @@
+ #define set_wmb(var, value) do { var = value; wmb(); } while (0)
+
+ /* Interrupt Control */
+-static __inline__ void local_irq_enable(void)
++#ifdef CONFIG_CPU_HAS_SR_RB
++static inline void local_irq_enable(void)
+ {
+ unsigned long __dummy0, __dummy1;
+
+@@ -118,6 +148,20 @@
+ : "1" (~0x000000f0)
+ : "memory");
+ }
++#else
++static inline void local_irq_enable(void)
++{
++ unsigned long __dummy0, __dummy1;
++
++ __asm__ __volatile__ (
++ "stc sr, %0\n\t"
++ "and %1, %0\n\t"
++ "ldc %0, sr\n\t"
++ : "=&r" (__dummy0), "=r" (__dummy1)
++ : "1" (~0x000000f0)
++ : "memory");
++}
++#endif
+
+ static __inline__ void local_irq_disable(void)
+ {
+@@ -130,6 +174,31 @@
+ : "memory");
+ }
+
++static __inline__ void set_bl_bit(void)
++{
++ unsigned long __dummy0, __dummy1;
++
++ __asm__ __volatile__ ("stc sr, %0\n\t"
++ "or %2, %0\n\t"
++ "and %3, %0\n\t"
++ "ldc %0, sr"
++ : "=&r" (__dummy0), "=r" (__dummy1)
++ : "r" (0x10000000), "r" (0xffffff0f)
++ : "memory");
++}
++
++static __inline__ void clear_bl_bit(void)
++{
++ unsigned long __dummy0, __dummy1;
++
++ __asm__ __volatile__ ("stc sr, %0\n\t"
++ "and %2, %0\n\t"
++ "ldc %0, sr"
++ : "=&r" (__dummy0), "=r" (__dummy1)
++ : "1" (~0x10000000)
++ : "memory");
++}
++
+ #define local_save_flags(x) \
+ __asm__("stc sr, %0; and #0xf0, %0" : "=&z" (x) :/**/: "memory" )
+
+@@ -174,17 +243,17 @@
+ }
+ }
+ #else
+-#define local_irq_restore(x) do { \
++#define local_irq_restore(x) do { \
+ if ((x & 0x000000f0) != 0x000000f0) \
+- local_irq_enable(); \
++ local_irq_enable(); \
+ } while (0)
+ #endif
+
+-#define really_restore_flags(x) do { \
++#define really_restore_flags(x) do { \
+ if ((x & 0x000000f0) != 0x000000f0) \
+- local_irq_enable(); \
++ local_irq_enable(); \
+ else \
+- local_irq_disable(); \
++ local_irq_disable(); \
+ } while (0)
+
+ /*
+@@ -212,8 +281,8 @@
+ #define back_to_P1() \
+ do { \
+ unsigned long __dummy; \
++ ctrl_barrier(); \
+ __asm__ __volatile__( \
+- "nop;nop;nop;nop;nop;nop;nop\n\t" \
+ "mov.l 1f, %0\n\t" \
+ "jmp @%0\n\t" \
+ " nop\n\t" \
+@@ -226,7 +295,7 @@
+ /* For spinlocks etc */
+ #define local_irq_save(x) x = local_irq_save()
+
+-static __inline__ unsigned long xchg_u32(volatile int * m, unsigned long val)
++static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val)
+ {
+ unsigned long flags, retval;
+
+@@ -237,7 +306,7 @@
+ return retval;
+ }
+
+-static __inline__ unsigned long xchg_u8(volatile unsigned char * m, unsigned long val)
++static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val)
+ {
+ unsigned long flags, retval;
+
+@@ -248,20 +317,70 @@
+ return retval;
+ }
+
+-static __inline__ unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
++extern void __xchg_called_with_bad_pointer(void);
++
++#define __xchg(ptr, x, size) \
++({ \
++ unsigned long __xchg__res; \
++ volatile void *__xchg_ptr = (ptr); \
++ switch (size) { \
++ case 4: \
++ __xchg__res = xchg_u32(__xchg_ptr, x); \
++ break; \
++ case 1: \
++ __xchg__res = xchg_u8(__xchg_ptr, x); \
++ break; \
++ default: \
++ __xchg_called_with_bad_pointer(); \
++ __xchg__res = x; \
++ break; \
++ } \
++ \
++ __xchg__res; \
++})
++
++#define xchg(ptr,x) \
++ ((__typeof__(*(ptr)))__xchg((ptr),(unsigned long)(x), sizeof(*(ptr))))
++
++static inline unsigned long __cmpxchg_u32(volatile int * m, unsigned long old,
++ unsigned long new)
++{
++ __u32 retval;
++ unsigned long flags;
++
++ local_irq_save(flags);
++ retval = *m;
++ if (retval == old)
++ *m = new;
++ local_irq_restore(flags); /* implies memory barrier */
++ return retval;
++}
++
++/* This function doesn't exist, so you'll get a linker error
++ * if something tries to do an invalid cmpxchg(). */
++extern void __cmpxchg_called_with_bad_pointer(void);
++
++#define __HAVE_ARCH_CMPXCHG 1
++
++static inline unsigned long __cmpxchg(volatile void * ptr, unsigned long old,
++ unsigned long new, int size)
+ {
+ switch (size) {
+ case 4:
+- return xchg_u32(ptr, x);
+- break;
+- case 1:
+- return xchg_u8(ptr, x);
+- break;
++ return __cmpxchg_u32(ptr, old, new);
+ }
+- __xchg_called_with_bad_pointer();
+- return x;
++ __cmpxchg_called_with_bad_pointer();
++ return old;
+ }
+
++#define cmpxchg(ptr,o,n) \
++ ({ \
++ __typeof__(*(ptr)) _o_ = (o); \
++ __typeof__(*(ptr)) _n_ = (n); \
++ (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_, \
++ (unsigned long)_n_, sizeof(*(ptr))); \
++ })
++
+ /* XXX
+ * disable hlt during certain critical i/o operations
+ */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/systemh7751.h linux-2.6.17/include/asm-sh/systemh7751.h
+--- linux-2.6.17-vanilla/include/asm-sh/systemh7751.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/systemh7751.h 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,71 @@
++#ifndef __ASM_SH_SYSTEMH_7751SYSTEMH_H
++#define __ASM_SH_SYSTEMH_7751SYSTEMH_H
++
++/*
++ * linux/include/asm-sh/systemh/7751systemh.h
++ *
++ * Copyright (C) 2000 Kazumoto Kojima
++ *
++ * Hitachi SystemH support
++
++ * Modified for 7751 SystemH by
++ * Jonathan Short, 2002.
++ */
++
++/* Box specific addresses. */
++
++#define PA_ROM 0x00000000 /* EPROM */
++#define PA_ROM_SIZE 0x00400000 /* EPROM size 4M byte */
++#define PA_FROM 0x01000000 /* EPROM */
++#define PA_FROM_SIZE 0x00400000 /* EPROM size 4M byte */
++#define PA_EXT1 0x04000000
++#define PA_EXT1_SIZE 0x04000000
++#define PA_EXT2 0x08000000
++#define PA_EXT2_SIZE 0x04000000
++#define PA_SDRAM 0x0c000000
++#define PA_SDRAM_SIZE 0x04000000
++
++#define PA_EXT4 0x12000000
++#define PA_EXT4_SIZE 0x02000000
++#define PA_EXT5 0x14000000
++#define PA_EXT5_SIZE 0x04000000
++#define PA_PCIC 0x18000000 /* MR-SHPC-01 PCMCIA */
++
++#define PA_DIPSW0 0xb9000000 /* Dip switch 5,6 */
++#define PA_DIPSW1 0xb9000002 /* Dip switch 7,8 */
++#define PA_LED 0xba000000 /* LED */
++#define PA_BCR 0xbb000000 /* FPGA on the MS7751SE01 */
++
++#define PA_MRSHPC 0xb83fffe0 /* MR-SHPC-01 PCMCIA controler */
++#define PA_MRSHPC_MW1 0xb8400000 /* MR-SHPC-01 memory window base */
++#define PA_MRSHPC_MW2 0xb8500000 /* MR-SHPC-01 attribute window base */
++#define PA_MRSHPC_IO 0xb8600000 /* MR-SHPC-01 I/O window base */
++#define MRSHPC_MODE (PA_MRSHPC + 4)
++#define MRSHPC_OPTION (PA_MRSHPC + 6)
++#define MRSHPC_CSR (PA_MRSHPC + 8)
++#define MRSHPC_ISR (PA_MRSHPC + 10)
++#define MRSHPC_ICR (PA_MRSHPC + 12)
++#define MRSHPC_CPWCR (PA_MRSHPC + 14)
++#define MRSHPC_MW0CR1 (PA_MRSHPC + 16)
++#define MRSHPC_MW1CR1 (PA_MRSHPC + 18)
++#define MRSHPC_IOWCR1 (PA_MRSHPC + 20)
++#define MRSHPC_MW0CR2 (PA_MRSHPC + 22)
++#define MRSHPC_MW1CR2 (PA_MRSHPC + 24)
++#define MRSHPC_IOWCR2 (PA_MRSHPC + 26)
++#define MRSHPC_CDCR (PA_MRSHPC + 28)
++#define MRSHPC_PCIC_INFO (PA_MRSHPC + 30)
++
++#define BCR_ILCRA (PA_BCR + 0)
++#define BCR_ILCRB (PA_BCR + 2)
++#define BCR_ILCRC (PA_BCR + 4)
++#define BCR_ILCRD (PA_BCR + 6)
++#define BCR_ILCRE (PA_BCR + 8)
++#define BCR_ILCRF (PA_BCR + 10)
++#define BCR_ILCRG (PA_BCR + 12)
++
++#define IRQ_79C973 13
++
++#define __IO_PREFIX sh7751systemh
++#include <asm/io_generic.h>
++
++#endif /* __ASM_SH_SYSTEMH_7751SYSTEMH_H */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/thread_info.h linux-2.6.17/include/asm-sh/thread_info.h
+--- linux-2.6.17-vanilla/include/asm-sh/thread_info.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/thread_info.h 2006-07-12 16:54:26.000000000 +0000
+@@ -20,7 +20,8 @@
+ struct exec_domain *exec_domain; /* execution domain */
+ unsigned long flags; /* low level flags */
+ __u32 cpu;
+- int preempt_count; /* 0 => preemptable, <0 => BUG */
++ int preempt_count; /* 0 => preemptable, <0 => BUG */
++ mm_segment_t addr_limit; /* thread address space */
+ struct restart_block restart_block;
+ __u8 supervisor_stack[0];
+ };
+@@ -40,6 +41,7 @@
+ .flags = 0, \
+ .cpu = 0, \
+ .preempt_count = 1, \
++ .addr_limit = KERNEL_DS, \
+ .restart_block = { \
+ .fn = do_no_restart_syscall, \
+ }, \
+@@ -48,16 +50,29 @@
+ #define init_thread_info (init_thread_union.thread_info)
+ #define init_stack (init_thread_union.stack)
+
++#define THREAD_SIZE (2*PAGE_SIZE)
++
+ /* how to get the thread information struct from C */
+ static inline struct thread_info *current_thread_info(void)
+ {
+ struct thread_info *ti;
++#ifdef CONFIG_CPU_HAS_SR_RB
+ __asm__("stc r7_bank, %0" : "=r" (ti));
++#else
++ unsigned long __dummy;
++
++ __asm__ __volatile__ (
++ "mov r15, %0\n\t"
++ "and %1, %0\n\t"
++ : "=&r" (ti), "=r" (__dummy)
++ : "1" (~(THREAD_SIZE - 1))
++ : "memory");
++#endif
++
+ return ti;
+ }
+
+ /* thread information allocation */
+-#define THREAD_SIZE (2*PAGE_SIZE)
+ #define alloc_thread_info(ti) ((struct thread_info *) __get_free_pages(GFP_KERNEL,1))
+ #define free_thread_info(ti) free_pages((unsigned long) (ti), 1)
+
+@@ -65,7 +80,7 @@
+
+ /* how to get the thread information struct from ASM */
+ #define GET_THREAD_INFO(reg) \
+- stc r7_bank, reg
++ stc r7_bank, reg
+
+ #endif
+
+@@ -82,7 +97,6 @@
+ #define TIF_USEDFPU 16 /* FPU was used by this task this quantum (SMP) */
+ #define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling TIF_NEED_RESCHED */
+ #define TIF_MEMDIE 18
+-#define TIF_USERSPACE 31 /* true if FS sets userspace */
+
+ #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
+ #define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
+@@ -90,7 +104,6 @@
+ #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
+ #define _TIF_USEDFPU (1<<TIF_USEDFPU)
+ #define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
+-#define _TIF_USERSPACE (1<<TIF_USERSPACE)
+
+ #define _TIF_WORK_MASK 0x000000FE /* work to do on interrupt/exception return */
+ #define _TIF_ALLWORK_MASK 0x000000FF /* work to do on any return to u-space */
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/timer.h linux-2.6.17/include/asm-sh/timer.h
+--- linux-2.6.17-vanilla/include/asm-sh/timer.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/timer.h 2006-07-12 16:54:26.000000000 +0000
+@@ -6,6 +6,8 @@
+
+ struct sys_timer_ops {
+ int (*init)(void);
++ int (*start)(void);
++ int (*stop)(void);
+ unsigned long (*get_offset)(void);
+ unsigned long (*get_frequency)(void);
+ };
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/timex.h linux-2.6.17/include/asm-sh/timex.h
+--- linux-2.6.17-vanilla/include/asm-sh/timex.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/timex.h 2006-07-12 16:54:26.000000000 +0000
+@@ -6,7 +6,7 @@
+ #ifndef __ASM_SH_TIMEX_H
+ #define __ASM_SH_TIMEX_H
+
+-#define CLOCK_TICK_RATE (CONFIG_SH_PCLK_FREQ / 4) /* Underlying HZ */
++#define CLOCK_TICK_RATE (HZ * 100000UL)
+
+ typedef unsigned long long cycles_t;
+
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/titan.h linux-2.6.17/include/asm-sh/titan.h
+--- linux-2.6.17-vanilla/include/asm-sh/titan.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/asm-sh/titan.h 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1,43 @@
++/*
++ * Platform defintions for Titan
++ */
++
++#ifndef _ASM_SH_TITAN_TITAN_H
++#define _ASM_SH_TITAN_TITAN_H
++
++#define __IO_PREFIX titan
++#include <asm/io_generic.h>
++
++/* IRQ assignments */
++#define TITAN_IRQ_WAN 2 /* eth0 (WAN) */
++#define TITAN_IRQ_LAN 5 /* eth1 (LAN) */
++#define TITAN_IRQ_MPCIA 8 /* mPCI A */
++#define TITAN_IRQ_MPCIB 11 /* mPCI B */
++#define TITAN_IRQ_USB 11 /* USB */
++
++/*
++ * The external interrupt lines, these take up ints 0 - 15 inclusive
++ * depending on the priority for the interrupt. In fact the priority
++ * is the interrupt :-)
++ */
++#define IRL0_IRQ 0
++#define IRL0_IPR_ADDR INTC_IPRD
++#define IRL0_IPR_POS 3
++#define IRL0_PRIORITY 8
++
++#define IRL1_IRQ 1
++#define IRL1_IPR_ADDR INTC_IPRD
++#define IRL1_IPR_POS 2
++#define IRL1_PRIORITY 8
++
++#define IRL2_IRQ 2
++#define IRL2_IPR_ADDR INTC_IPRD
++#define IRL2_IPR_POS 1
++#define IRL2_PRIORITY 8
++
++#define IRL3_IRQ 3
++#define IRL3_IPR_ADDR INTC_IPRD
++#define IRL3_IPR_POS 0
++#define IRL3_PRIORITY 8
++
++#endif
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/uaccess.h linux-2.6.17/include/asm-sh/uaccess.h
+--- linux-2.6.17-vanilla/include/asm-sh/uaccess.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/uaccess.h 2006-07-12 16:54:26.000000000 +0000
+@@ -1,5 +1,4 @@
+-/* $Id: uaccess.h,v 1.11 2003/10/13 07:21:20 lethal Exp $
+- *
++/*
+ * User space memory access functions
+ *
+ * Copyright (C) 1999, 2002 Niibe Yutaka
+@@ -16,21 +15,9 @@
+ #include <linux/errno.h>
+ #include <linux/sched.h>
+
+-/*
+- * NOTE: Macro/functions in this file depends on threads_info.h implementation.
+- * Assumes:
+- * TI_FLAGS == 8
+- * TIF_USERSPACE == 31
+- * USER_ADDR_LIMIT == 0x80000000
+- */
+-
+ #define VERIFY_READ 0
+ #define VERIFY_WRITE 1
+
+-typedef struct {
+- unsigned int is_user_space;
+-} mm_segment_t;
+-
+ /*
+ * The fs value determines whether argument validity checking should be
+ * performed or not. If get_fs() == USER_DS, checking is performed, with
+@@ -40,12 +27,14 @@
+ */
+
+ #define MAKE_MM_SEG(s) ((mm_segment_t) { (s) })
+-#define segment_eq(a,b) ((a).is_user_space == (b).is_user_space)
+
+-#define USER_ADDR_LIMIT 0x80000000
++#define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFFUL)
++#define USER_DS MAKE_MM_SEG(PAGE_OFFSET)
+
+-#define KERNEL_DS MAKE_MM_SEG(0)
+-#define USER_DS MAKE_MM_SEG(1)
++#define segment_eq(a,b) ((a).seg == (b).seg)
++
++#define __addr_ok(addr) \
++ ((unsigned long)(addr) < (current_thread_info()->addr_limit.seg))
+
+ #define get_ds() (KERNEL_DS)
+
+@@ -76,31 +65,8 @@
+ return ((addr >= memory_start) && ((addr + size) < memory_end));
+ }
+ #else /* CONFIG_MMU */
+-static inline mm_segment_t get_fs(void)
+-{
+- return MAKE_MM_SEG(test_thread_flag(TIF_USERSPACE));
+-}
+-
+-static inline void set_fs(mm_segment_t s)
+-{
+- unsigned long ti, flag;
+- __asm__ __volatile__(
+- "stc r7_bank, %0\n\t"
+- "mov.l @(8,%0), %1\n\t"
+- "shal %1\n\t"
+- "cmp/pl %2\n\t"
+- "rotcr %1\n\t"
+- "mov.l %1, @(8,%0)"
+- : "=&r" (ti), "=&r" (flag)
+- : "r" (s.is_user_space)
+- : "t");
+-/****
+- if (s.is_user_space)
+- set_thread_flag(TIF_USERSPACE);
+- else
+- clear_thread_flag(TIF_USERSPACE);
+-****/
+-}
++#define get_fs() (current_thread_info()->addr_limit)
++#define set_fs(x) (current_thread_info()->addr_limit = (x))
+
+ /*
+ * __access_ok: Check if address with size is OK or not.
+@@ -108,7 +74,7 @@
+ * We do three checks:
+ * (1) is it user space?
+ * (2) addr + size --> carry?
+- * (3) addr + size >= 0x80000000 (USER_ADDR_LIMIT)
++ * (3) addr + size >= 0x80000000 (PAGE_OFFSET)
+ *
+ * (1) (2) (3) | RESULT
+ * 0 0 0 | ok
+@@ -541,7 +507,7 @@
+ "3:\n\t"
+ "mov.l 4f, %1\n\t"
+ "jmp @%1\n\t"
+- " mov %5, %0\n"
++ " mov #0, %0\n"
+ ".balign 4\n"
+ "4: .long 2b\n"
+ ".previous\n"
+@@ -550,26 +516,20 @@
+ " .long 1b,3b\n"
+ ".previous"
+ : "=z" (res), "=&r" (__dummy)
+- : "0" (0), "r" (__s), "r" (__n), "i" (-EFAULT)
++ : "0" (0), "r" (__s), "r" (__n)
+ : "t");
+ return res;
+ }
+
+ static __inline__ long strnlen_user(const char __user *s, long n)
+ {
+- if (!access_ok(VERIFY_READ, s, n))
++ if (!__addr_ok(s))
+ return 0;
+ else
+ return __strnlen_user(s, n);
+ }
+
+-static __inline__ long strlen_user(const char __user *s)
+-{
+- if (!access_ok(VERIFY_READ, s, 0))
+- return 0;
+- else
+- return __strnlen_user(s, ~0UL >> 1);
+-}
++#define strlen_user(str) strnlen_user(str, ~0UL >> 1)
+
+ /*
+ * The exception table consists of pairs of addresses: the first is the
+diff -ruN linux-2.6.17-vanilla/include/asm-sh/unistd.h linux-2.6.17/include/asm-sh/unistd.h
+--- linux-2.6.17-vanilla/include/asm-sh/unistd.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/asm-sh/unistd.h 2006-07-12 16:54:26.000000000 +0000
+@@ -300,9 +300,31 @@
+ #define __NR_inotify_init 290
+ #define __NR_inotify_add_watch 291
+ #define __NR_inotify_rm_watch 292
++#define __NR_migrate_pages 293
++#define __NR_openat 294
++#define __NR_mkdirat 295
++#define __NR_mknodat 296
++#define __NR_fchownat 297
++#define __NR_futimesat 298
++#define __NR_fstatat64 299
++#define __NR_unlinkat 300
++#define __NR_renameat 301
++#define __NR_linkat 302
++#define __NR_symlinkat 303
++#define __NR_readlinkat 304
++#define __NR_fchmodat 305
++#define __NR_faccessat 305
++#define __NR_pselect6 307
++#define __NR_ppoll 308
++#define __NR_unshare 309
++#define __NR_set_robust_list 310
++#define __NR_get_robust_list 311
++#define __NR_splice 312
++#define __NR_sync_file_range 313
++#define __NR_tee 314
++#define __NR_vmsplice 315
+
+-
+-#define NR_syscalls 293
++#define NR_syscalls 316
+
+ /* user-visible error numbers are in the range -1 - -124: see <asm-sh/errno.h> */
+
+diff -ruN linux-2.6.17-vanilla/include/linux/CVS/Entries linux-2.6.17/include/linux/CVS/Entries
+--- linux-2.6.17-vanilla/include/linux/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/linux/CVS/Entries 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1,3 @@
++/superhyway.h/1.2/Thu Mar 17 07:43:07 2005/-ko/
++/i2c-id.h/1.11/Wed Jul 5 14:51:55 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/include/linux/CVS/Repository linux-2.6.17/include/linux/CVS/Repository
+--- linux-2.6.17-vanilla/include/linux/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/linux/CVS/Repository 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/linux
+diff -ruN linux-2.6.17-vanilla/include/linux/CVS/Root linux-2.6.17/include/linux/CVS/Root
+--- linux-2.6.17-vanilla/include/linux/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/linux/CVS/Root 2006-07-12 16:54:26.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/linux/i2c-id.h linux-2.6.17/include/linux/i2c-id.h
+--- linux-2.6.17-vanilla/include/linux/i2c-id.h 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/include/linux/i2c-id.h 2006-07-12 16:54:27.000000000 +0000
+@@ -245,6 +245,7 @@
+ #define I2C_HW_SMBUS_OV518 0x04000f /* OV518(+) USB 1.1 webcam ICs */
+ #define I2C_HW_SMBUS_OV519 0x040010 /* OV519 USB 1.1 webcam IC */
+ #define I2C_HW_SMBUS_OVFX2 0x040011 /* Cypress/OmniVision FX2 webcam */
++#define I2C_HW_SMBUS_VOYAGER 0x040012
+
+ /* --- ISA pseudo-adapter */
+ #define I2C_HW_ISA 0x050000
+diff -ruN linux-2.6.17-vanilla/include/video/CVS/Entries linux-2.6.17/include/video/CVS/Entries
+--- linux-2.6.17-vanilla/include/video/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/video/CVS/Entries 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1,2 @@
++/voyager.h/1.1/Wed Apr 21 00:09:20 2004/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/include/video/CVS/Repository linux-2.6.17/include/video/CVS/Repository
+--- linux-2.6.17-vanilla/include/video/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/video/CVS/Repository 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1 @@
++linux/include/video
+diff -ruN linux-2.6.17-vanilla/include/video/CVS/Root linux-2.6.17/include/video/CVS/Root
+--- linux-2.6.17-vanilla/include/video/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/video/CVS/Root 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/include/video/voyager.h linux-2.6.17/include/video/voyager.h
+--- linux-2.6.17-vanilla/include/video/voyager.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/include/video/voyager.h 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1,39 @@
++#define VOY_REG_TOP 0xb3e00000 //voyager register
++#define VOY_VRAM_TOP0 0xb0400000 //PANEL PLANE
++#define VOY_VRAM_TOP1 0xb04a0000 //VIDEO PLANE 0
++#define VOY_VRAM_TOP2 0xb0540000 //VIDEO PLANE 1
++#define VOY_VRAM_TOP3 0xb05e0000 //VIDEO ALPHA PLANE
++#define VOY_VRAM_TOP4 0xb0680000 //ALPHA PLANE
++#define VOY_VRAM_TOP5 0xb0720000 //PANEL CURSOR PLANE
++#define VOY_VRAM_TOP6 0xb0730000 //CRT PLANE
++#define VOY_VRAM_TOP7 0xb07d0000 //CRT CURSOR PLANE
++
++#define XRES 640
++#define YRES 480
++#define BPP 16
++
++#define CSR_XRES 64
++#define CSR_YRES 64
++#define CSR_BPP 2
++
++#define MAX_PIXEL_MEM_SIZE ((XRES * YRES * BPP) / 8)
++#define LINE_LENGTH ((XRES * BPP) / 8)
++#define MAX_FRAMEBUFFER_MEM_SIZE (MAX_PIXEL_MEM_SIZE)
++#define MAX_HWC_MEM_SIZE ((CSR_XRES * CSR_YRES * CSR_BPP) / 8)
++#define ALLOCATED_FB_MEM_SIZE \
++ (PAGE_ALIGN(MAX_FRAMEBUFFER_MEM_SIZE + PAGE_SIZE))
++
++#define VOYAGER_IOCTL_DEBUG_ADD 0x00
++#define VOYAGER_IOCTL_DEBUG_GET 0x01
++#define VOYAGER_IOCTL_DEBUG_PUT 0x02
++#define VOYAGER_IOCTL_ENABLE 0x10
++#define VOYAGER_IOCTL_ENABLE_CK 0x11
++#define VOYAGER_IOCTL_ENABLE_CP 0x12
++#define VOYAGER_IOCTL_ENABLE_AL 0x13
++#define VOYAGER_IOCTL_SCALE 0x20
++#define VOYAGER_IOCTL_CHKEY 0x30
++#define VOYAGER_IOCTL_COLOR_1 0x40
++#define VOYAGER_IOCTL_COLOR_2 0x41
++#define VOYAGER_IOCTL_TYPE 0x50
++#define VOYAGER_IOCTL_SELECT 0x51
++#define VOYAGER_IOCTL_ALPHA 0x60
+diff -ruN linux-2.6.17-vanilla/lib/CVS/Entries linux-2.6.17/lib/CVS/Entries
+--- linux-2.6.17-vanilla/lib/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/lib/CVS/Entries 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1,3 @@
++/Kconfig.debug/1.4/Wed Jul 5 14:51:56 2006/-ko/
++/bitmap.c/1.5/Wed Jul 5 14:51:56 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/lib/CVS/Repository linux-2.6.17/lib/CVS/Repository
+--- linux-2.6.17-vanilla/lib/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/lib/CVS/Repository 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1 @@
++linux/lib
+diff -ruN linux-2.6.17-vanilla/lib/CVS/Root linux-2.6.17/lib/CVS/Root
+--- linux-2.6.17-vanilla/lib/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/lib/CVS/Root 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/lib/Kconfig.debug linux-2.6.17/lib/Kconfig.debug
+--- linux-2.6.17-vanilla/lib/Kconfig.debug 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/lib/Kconfig.debug 2006-07-12 16:54:27.000000000 +0000
+@@ -178,7 +178,7 @@
+
+ config FRAME_POINTER
+ bool "Compile the kernel with frame pointers"
+- depends on DEBUG_KERNEL && (X86 || CRIS || M68K || M68KNOMMU || FRV || UML)
++ depends on DEBUG_KERNEL && (X86 || CRIS || M68K || M68KNOMMU || FRV || UML || SUPERH)
+ default y if DEBUG_INFO && UML
+ help
+ If you say Y here the resulting kernel image will be slightly larger
+diff -ruN linux-2.6.17-vanilla/lib/bitmap.c linux-2.6.17/lib/bitmap.c
+--- linux-2.6.17-vanilla/lib/bitmap.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/lib/bitmap.c 2006-07-12 16:54:27.000000000 +0000
+@@ -525,7 +525,7 @@
+ ord = 0;
+ while (i < pos) {
+ i = find_next_bit(buf, bits, i + 1);
+- ord++;
++ ord++;
+ }
+ BUG_ON(i != pos);
+
+@@ -748,6 +748,11 @@
+ * a power (@order) of two, aligned to that power of two, which
+ * makes the search algorithm much faster.
+ *
++ * Find a region of free (zero) bits in a @bitmap of @bits bits and
++ * allocate them (set them to one). Only consider regions of length
++ * a power (@order) of two, aligned to that power of two, which
++ * makes the search algorithm much faster.
++ *
+ * Return the bit offset in bitmap of the allocated region,
+ * or -errno on failure.
+ */
+diff -ruN linux-2.6.17-vanilla/mm/CVS/Entries linux-2.6.17/mm/CVS/Entries
+--- linux-2.6.17-vanilla/mm/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/mm/CVS/Entries 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1,2 @@
++/memory.c/1.66/Wed Jul 5 14:51:57 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/mm/CVS/Repository linux-2.6.17/mm/CVS/Repository
+--- linux-2.6.17-vanilla/mm/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/mm/CVS/Repository 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1 @@
++linux/mm
+diff -ruN linux-2.6.17-vanilla/mm/CVS/Root linux-2.6.17/mm/CVS/Root
+--- linux-2.6.17-vanilla/mm/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/mm/CVS/Root 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/mm/memory.c linux-2.6.17/mm/memory.c
+--- linux-2.6.17-vanilla/mm/memory.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/mm/memory.c 2006-07-12 16:54:27.000000000 +0000
+@@ -1455,7 +1455,9 @@
+ int reuse = can_share_swap_page(old_page);
+ unlock_page(old_page);
+ if (reuse) {
++#ifdef CONFIG_ARM
+ flush_cache_page(vma, address, pte_pfn(orig_pte));
++#endif
+ entry = pte_mkyoung(orig_pte);
+ entry = maybe_mkwrite(pte_mkdirty(entry), vma);
+ ptep_set_access_flags(vma, address, page_table, entry, 1);
+diff -ruN linux-2.6.17-vanilla/net/CVS/Entries linux-2.6.17/net/CVS/Entries
+--- linux-2.6.17-vanilla/net/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/net/CVS/Entries 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1 @@
++D/ipv4////
+diff -ruN linux-2.6.17-vanilla/net/CVS/Repository linux-2.6.17/net/CVS/Repository
+--- linux-2.6.17-vanilla/net/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/net/CVS/Repository 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1 @@
++linux/net
+diff -ruN linux-2.6.17-vanilla/net/CVS/Root linux-2.6.17/net/CVS/Root
+--- linux-2.6.17-vanilla/net/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/net/CVS/Root 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/net/ipv4/CVS/Entries linux-2.6.17/net/ipv4/CVS/Entries
+--- linux-2.6.17-vanilla/net/ipv4/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/net/ipv4/CVS/Entries 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1,2 @@
++/ipconfig.c/1.12/Wed Jul 5 14:51:59 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/net/ipv4/CVS/Repository linux-2.6.17/net/ipv4/CVS/Repository
+--- linux-2.6.17-vanilla/net/ipv4/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/net/ipv4/CVS/Repository 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1 @@
++linux/net/ipv4
+diff -ruN linux-2.6.17-vanilla/net/ipv4/CVS/Root linux-2.6.17/net/ipv4/CVS/Root
+--- linux-2.6.17-vanilla/net/ipv4/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/net/ipv4/CVS/Root 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/net/ipv4/ipconfig.c linux-2.6.17/net/ipv4/ipconfig.c
+--- linux-2.6.17-vanilla/net/ipv4/ipconfig.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/net/ipv4/ipconfig.c 2006-07-12 16:54:27.000000000 +0000
+@@ -113,7 +113,7 @@
+ */
+ int ic_set_manually __initdata = 0; /* IPconfig parameters set manually */
+
+-static int ic_enable __initdata = 0; /* IP config enabled? */
++static int ic_enable __initdata = 1; /* IP config enabled? */
+
+ /* Protocol choice */
+ int ic_proto_enabled __initdata = 0
+diff -ruN linux-2.6.17-vanilla/scripts/CVS/Entries linux-2.6.17/scripts/CVS/Entries
+--- linux-2.6.17-vanilla/scripts/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/scripts/CVS/Entries 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1,3 @@
++/treelink.sh/1.3/Sun Jan 4 18:30:15 2004//
++/treeunlink.sh/1.3/Sun Jan 4 18:30:15 2004//
++D
+diff -ruN linux-2.6.17-vanilla/scripts/CVS/Repository linux-2.6.17/scripts/CVS/Repository
+--- linux-2.6.17-vanilla/scripts/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/scripts/CVS/Repository 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1 @@
++linux/scripts
+diff -ruN linux-2.6.17-vanilla/scripts/CVS/Root linux-2.6.17/scripts/CVS/Root
+--- linux-2.6.17-vanilla/scripts/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/scripts/CVS/Root 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/scripts/treelink.sh linux-2.6.17/scripts/treelink.sh
+--- linux-2.6.17-vanilla/scripts/treelink.sh 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/scripts/treelink.sh 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1,49 @@
++#!/bin/sh
++#
++# treelink.sh - Tree Linking Script
++#
++# Copyright (C) 2001, 2004 Paul Mundt <lethal@linux-sh.org>
++#
++# Modified by M. R. Brown <mrbrown@0xd6.org>
++#
++# A simple shell script for linking a drop in tree into a stock
++# kernel tree. Usable for drop in trees such as the linux-mips
++# and linuxconsole trees.
++#
++# Released under the terms of the GNU GPL v2
++#
++[ "$#" -ne "2" ] && echo "Usage: $0 <drop in tree> <kernel tree>" && exit 1
++
++ODIR=${PWD}
++cd $1 || exit 1
++LDIR=${PWD}
++echo -n "Building file list ... "
++LIST=`find * \( -type d -name CVS -prune \) -o \
++ \( -type d -name {arch} -prune \) -o \
++ \( -type d -name .arch-ids -prune \) -o \
++ \( -type d -name SCCS -prune \) -o \
++ \( -type d -name BitKeeper -prune \) -o -type f -print`
++echo -e "done."
++cd ${ODIR}
++
++cd $2 || exit 1
++
++# Make this a seperate step so that the user can cancel the operation
++echo -n "Saving originals ..... "
++for file in $LIST; do
++ if [ -e $file -a ! -h $file ]; then
++ DIR=`dirname $file`
++ ofile=`basename $file`
++ [ ! -d ${DIR}/.orig ] && mkdir -p ${DIR}/.orig
++ cp $file ${DIR}/.orig/$ofile
++ fi
++done
++echo -e "done."
++
++echo -n "Linking files ........ "
++for file in $LIST; do
++ DIR=`dirname $file`
++ [ ! -d $DIR ] && mkdir -p $DIR
++ ln -sf $LDIR/$file $file
++done
++echo -e "done."
+diff -ruN linux-2.6.17-vanilla/scripts/treeunlink.sh linux-2.6.17/scripts/treeunlink.sh
+--- linux-2.6.17-vanilla/scripts/treeunlink.sh 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/scripts/treeunlink.sh 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1,37 @@
++#!/bin/sh
++#
++# treeunlink.sh - Tree Unlinking Script
++#
++# Copyright (c) 2001 M. R. Brown <mrbrown@0xd6.org>
++#
++# Modified by Paul Mundt <lethal@linux-sh.org>
++#
++# This script attempts to restore a previously tree-linked tree.
++# It's the anti-thesis of (and based on) treelink.sh by Paul Mundt.
++#
++# Released under the terms of the GNU GPL v2
++
++[ "$#" -ne "1" ] && echo "Usage: $0 <kernel tree>" && exit 1
++
++cd $1 || exit 1
++echo -n "Building file list ... "
++LIST=`find * \( -type d -name CVS -prune \) -o \
++ \( -type d -name {arch} -prune \) -o \
++ \( -type d -name .arch-ids -prune \) -o \
++ \( -type d -name SCCS -prune \) -o \
++ \( -type d -name BitKeeper -prune \) -o -type l -print`
++echo -e "done."
++
++[ -z "$LIST" ] && echo "No linked files to unlink." && exit 1
++
++echo -n "Restoring originals .. "
++for file in $LIST; do
++ DIR=`dirname $file`
++ ofile=`basename $file`
++ rm -f $file
++ if [ -d ${DIR}/.orig -a -e ${DIR}/.orig/$ofile ]; then
++ mv ${DIR}/.orig/$ofile $file
++ [ -z "`ls ${DIR}/.orig`" ] && rmdir ${DIR}/.orig
++ fi
++done
++echo -e "done."
+diff -ruN linux-2.6.17-vanilla/sound/CVS/Entries linux-2.6.17/sound/CVS/Entries
+--- linux-2.6.17-vanilla/sound/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/sound/CVS/Entries 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1,4 @@
++/Kconfig/1.1/Sun Jun 4 12:13:04 2006//
++/Makefile/1.1/Sun Jun 4 12:13:04 2006//
++D/oss////
++D/sh////
+diff -ruN linux-2.6.17-vanilla/sound/CVS/Repository linux-2.6.17/sound/CVS/Repository
+--- linux-2.6.17-vanilla/sound/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/sound/CVS/Repository 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1 @@
++linux/sound
+diff -ruN linux-2.6.17-vanilla/sound/CVS/Root linux-2.6.17/sound/CVS/Root
+--- linux-2.6.17-vanilla/sound/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/sound/CVS/Root 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/sound/Kconfig linux-2.6.17/sound/Kconfig
+--- linux-2.6.17-vanilla/sound/Kconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/sound/Kconfig 2006-07-12 16:54:27.000000000 +0000
+@@ -62,6 +62,8 @@
+
+ source "sound/mips/Kconfig"
+
++source "sound/sh/Kconfig"
++
+ # the following will depenend on the order of config.
+ # here assuming USB is defined before ALSA
+ source "sound/usb/Kconfig"
+diff -ruN linux-2.6.17-vanilla/sound/Makefile linux-2.6.17/sound/Makefile
+--- linux-2.6.17-vanilla/sound/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/sound/Makefile 2006-07-12 16:54:27.000000000 +0000
+@@ -4,7 +4,7 @@
+ obj-$(CONFIG_SOUND) += soundcore.o
+ obj-$(CONFIG_SOUND_PRIME) += oss/
+ obj-$(CONFIG_DMASOUND) += oss/
+-obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ synth/ usb/ sparc/ parisc/ pcmcia/ mips/
++obj-$(CONFIG_SND) += core/ i2c/ drivers/ isa/ pci/ ppc/ arm/ synth/ usb/ sparc/ parisc/ pcmcia/ mips/ sh/
+
+ ifeq ($(CONFIG_SND),y)
+ obj-y += last.o
+diff -ruN linux-2.6.17-vanilla/sound/oss/CVS/Entries linux-2.6.17/sound/oss/CVS/Entries
+--- linux-2.6.17-vanilla/sound/oss/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/sound/oss/CVS/Entries 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1,7 @@
++/Makefile/1.7/Mon Aug 29 21:01:20 2005/-ko/
++/voyagergx_8051.c/1.2/Sat Jun 26 15:29:38 2004/-ko/
++/voyagergx_sound.c/1.4/Fri Dec 23 08:25:06 2005/-ko/
++/voyagergx_sound.h/1.1/Wed Apr 21 00:09:21 2004/-ko/
++/Kconfig/1.11/Wed Jul 5 14:52:00 2006/-ko/
++/sh_dac_audio.c/1.7/Wed Jul 5 14:52:00 2006/-ko/
++D
+diff -ruN linux-2.6.17-vanilla/sound/oss/CVS/Repository linux-2.6.17/sound/oss/CVS/Repository
+--- linux-2.6.17-vanilla/sound/oss/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/sound/oss/CVS/Repository 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1 @@
++linux/sound/oss
+diff -ruN linux-2.6.17-vanilla/sound/oss/CVS/Root linux-2.6.17/sound/oss/CVS/Root
+--- linux-2.6.17-vanilla/sound/oss/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/sound/oss/CVS/Root 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/sound/oss/Kconfig linux-2.6.17/sound/oss/Kconfig
+--- linux-2.6.17-vanilla/sound/oss/Kconfig 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/sound/oss/Kconfig 2006-07-12 16:54:27.000000000 +0000
+@@ -833,6 +833,12 @@
+ tristate "XpressAudio Sound Blaster emulation"
+ depends on SOUND_SB
+
++config SOUND_VOYAGERGX
++ tristate "VoyagerGX/SH4 AC97 support"
++ depends on SOUND_PRIME!=n && SOUND && SH_RTS7751R2D
++ help
++ Say Y or M if you have a VoyagerGX sound audio.
++
+ config SOUND_SH_DAC_AUDIO
+ tristate "SuperH DAC audio support"
+ depends on SOUND_PRIME && CPU_SH3
+diff -ruN linux-2.6.17-vanilla/sound/oss/Makefile linux-2.6.17/sound/oss/Makefile
+--- linux-2.6.17-vanilla/sound/oss/Makefile 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/sound/oss/Makefile 2006-07-12 16:54:27.000000000 +0000
+@@ -82,6 +82,7 @@
+
+ obj-$(CONFIG_SOUND_AD1980) += ac97_plugin_ad1980.o ac97_codec.o
+ obj-$(CONFIG_SOUND_WM97XX) += ac97_plugin_wm97xx.o
++obj-$(CONFIG_SOUND_VOYAGERGX) += voyagergx_sound.o voyagergx_8051.o ac97_codec.o
+
+ ifeq ($(CONFIG_MIDI_EMU10K1),y)
+ obj-$(CONFIG_SOUND_EMU10K1) += sound.o
+diff -ruN linux-2.6.17-vanilla/sound/oss/sh_dac_audio.c linux-2.6.17/sound/oss/sh_dac_audio.c
+--- linux-2.6.17-vanilla/sound/oss/sh_dac_audio.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/sound/oss/sh_dac_audio.c 2006-07-12 16:54:27.000000000 +0000
+@@ -1,3 +1,14 @@
++/*
++ * sound/oss/sh_dac_audio.c
++ *
++ * SH DAC based sound :(
++ *
++ * Copyright (C) 2004,2005 Andriy Skulysh
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ */
+ #include <linux/config.h>
+ #include <linux/module.h>
+ #include <linux/init.h>
+@@ -7,18 +18,17 @@
+ #include <linux/fs.h>
+ #include <linux/sound.h>
+ #include <linux/soundcard.h>
++#include <linux/interrupt.h>
+ #include <asm/io.h>
+ #include <asm/uaccess.h>
+ #include <asm/irq.h>
+ #include <asm/delay.h>
+-#include <linux/interrupt.h>
+-
++#include <asm/clock.h>
+ #include <asm/cpu/dac.h>
+-
+-#ifdef MACH_HP600
++#include <asm/cpu/timer.h>
++#include <asm/machvec.h>
+ #include <asm/hp6xx/hp6xx.h>
+-#include <asm/hd64461/hd64461.h>
+-#endif
++#include <asm/hd64461.h>
+
+ #define MODNAME "sh_dac_audio"
+
+@@ -27,11 +37,6 @@
+ #define TMU1_TCR_INIT 0x0020 /* Clock/4, rising edge; interrupt on */
+ #define TMU1_TSTR_INIT 0x02 /* Bit to turn on TMU1 */
+
+-#define TMU_TSTR 0xfffffe92
+-#define TMU1_TCOR 0xfffffea0
+-#define TMU1_TCNT 0xfffffea4
+-#define TMU1_TCR 0xfffffea8
+-
+ #define BUFFER_SIZE 48000
+
+ static int rate;
+@@ -72,34 +77,37 @@
+
+ static void dac_audio_start(void)
+ {
+-#ifdef MACH_HP600
+- u16 v;
+- v = inw(HD64461_GPADR);
+- v &= ~HD64461_GPADR_SPEAKER;
+- outw(v, HD64461_GPADR);
+-#endif
++ if (mach_is_hp6xx()) {
++ u16 v = inw(HD64461_GPADR);
++ v &= ~HD64461_GPADR_SPEAKER;
++ outw(v, HD64461_GPADR);
++ }
++
+ sh_dac_enable(CONFIG_SOUND_SH_DAC_AUDIO_CHANNEL);
+ ctrl_outw(TMU1_TCR_INIT, TMU1_TCR);
+ }
+ static void dac_audio_stop(void)
+ {
+-#ifdef MACH_HP600
+- u16 v;
+-#endif
+ dac_audio_stop_timer();
+-#ifdef MACH_HP600
+- v = inw(HD64461_GPADR);
+- v |= HD64461_GPADR_SPEAKER;
+- outw(v, HD64461_GPADR);
+-#endif
++
++ if (mach_is_hp6xx()) {
++ u16 v = inw(HD64461_GPADR);
++ v |= HD64461_GPADR_SPEAKER;
++ outw(v, HD64461_GPADR);
++ }
++
++ sh_dac_output(0, CONFIG_SOUND_SH_DAC_AUDIO_CHANNEL);
+ sh_dac_disable(CONFIG_SOUND_SH_DAC_AUDIO_CHANNEL);
+ }
+
+ static void dac_audio_set_rate(void)
+ {
+ unsigned long interval;
++ struct clk *clk;
+
+- interval = (current_cpu_data.module_clock / 4) / rate;
++ clk = clk_get("module_clk");
++ interval = (clk_get_rate(clk) / 4) / rate;
++ clk_put(clk);
+ ctrl_outl(interval, TMU1_TCOR);
+ ctrl_outl(interval, TMU1_TCNT);
+ }
+diff -ruN linux-2.6.17-vanilla/sound/oss/voyagergx_8051.c linux-2.6.17/sound/oss/voyagergx_8051.c
+--- linux-2.6.17-vanilla/sound/oss/voyagergx_8051.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/sound/oss/voyagergx_8051.c 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1,204 @@
++#include <linux/module.h>
++#include <linux/delay.h>
++#include <asm/rts7751r2d/voyagergx_reg.h>
++#include "voyagergx_sound.h"
++
++#define DELAY_8051 300000
++
++
++static unsigned char code_8051[] = {
++ 0x02,0x01,0x00,0x02,0x07,0x73,0x90,0x08,0xae,0xe0,0xfa,0xa3,0xe0,0x8a,0x82,0xf5,
++ 0x83,0xe0,0x60,0x13,0x90,0x08,0xa2,0xe4,0xf0,0xa3,0x74,0x30,0xf0,0x78,0x19,0x76,
++ 0x01,0x78,0x1e,0x76,0x01,0x80,0x04,0x78,0x19,0x76,0x00,0x90,0x3f,0xf2,0x74,0x01,
++ 0xf0,0xa3,0xe4,0xf0,0x22,0xff,0xff,0xff,0xff,0xff,0xff,0x02,0x06,0x83,0xff,0xff,
++ 0xff,0xff,0xff,0x02,0x04,0xe3,0x90,0x3f,0xf2,0xe4,0xf0,0xa3,0xf0,0x90,0x3f,0xf0,
++ 0xe0,0x70,0x02,0xa3,0xe0,0x70,0x06,0x12,0x08,0x8d,0x02,0x00,0xd4,0x90,0x3f,0xf0,
++ 0xc3,0xe0,0x94,0x01,0x70,0x04,0xa3,0xe0,0x94,0x00,0x70,0x06,0x12,0x00,0xd9,0x02,
++ 0x00,0xd4,0x90,0x3f,0xf0,0xc3,0xe0,0x94,0x02,0x70,0x04,0xa3,0xe0,0x94,0x00,0x70,
++ 0x05,0x12,0x07,0xf3,0x80,0x4e,0x90,0x3f,0xf0,0xc3,0xe0,0x94,0x03,0x70,0x04,0xa3,
++ 0xe0,0x94,0x00,0x70,0x05,0x12,0x08,0x1a,0x80,0x3a,0x90,0x3f,0xf0,0xc3,0xe0,0x94,
++ 0x04,0x70,0x04,0xa3,0xe0,0x94,0x00,0x70,0x05,0x12,0x08,0x41,0x80,0x26,0x90,0x3f,
++ 0xf0,0xc3,0xe0,0x94,0x05,0x70,0x04,0xa3,0xe0,0x94,0x00,0x70,0x05,0x12,0x08,0x7c,
++ 0x80,0x12,0x90,0x3f,0xf0,0xc3,0xe0,0x94,0x07,0x70,0x04,0xa3,0xe0,0x94,0x00,0x70,
++ 0x03,0x12,0x00,0x06,0x78,0x1b,0x76,0x00,0x22,0x90,0x3f,0xf4,0x7a,0x04,0x78,0x08,
++ 0xe0,0xf6,0xa3,0x08,0xda,0xfa,0x90,0x91,0x04,0x7a,0x04,0x78,0x08,0xe6,0xf0,0xa3,
++ 0x08,0xda,0xfa,0x12,0x06,0xd6,0x90,0x3f,0xf2,0x74,0x01,0xf0,0xa3,0xe4,0xf0,0x22,
++ 0x75,0x81,0x2b,0x75,0x0c,0xc0,0x75,0x0d,0x08,0x75,0x0e,0xff,0x75,0x0f,0x2f,0xc2,
++ 0xd3,0xc2,0xd4,0x12,0x03,0x4a,0x12,0x03,0xb6,0x12,0x03,0x2c,0x12,0x03,0x0e,0x12,
++ 0x02,0xac,0x12,0x07,0xcb,0x12,0x01,0x2a,0x01,0x00,0x90,0x08,0xc1,0x85,0x82,0x0a,
++ 0x85,0x83,0x0b,0x74,0x98,0xf5,0x82,0xf5,0x08,0x74,0x02,0xf5,0x83,0xf5,0x09,0x7a,
++ 0x14,0xe4,0x93,0xa3,0x85,0x82,0x08,0x85,0x83,0x09,0x85,0x0a,0x82,0x85,0x0b,0x83,
++ 0xf0,0xa3,0x85,0x83,0x0b,0x85,0x82,0x0a,0x85,0x09,0x83,0x85,0x08,0x82,0xda,0xe1,
++ 0x90,0x08,0xd5,0xe4,0xf0,0xa3,0xf0,0x90,0x08,0xd7,0xe4,0xf0,0xa3,0xf0,0x90,0x08,
++ 0xd9,0xe4,0xf0,0xa3,0xf0,0x90,0x08,0xdb,0xe4,0xf0,0xa3,0xf0,0x78,0x18,0x76,0x00,
++ 0x78,0x1f,0x76,0x00,0x90,0x91,0x80,0x74,0x03,0xf0,0x90,0x08,0xc1,0x7a,0x04,0x78,
++ 0x08,0xe0,0xf6,0xa3,0x08,0xda,0xfa,0x90,0x91,0x00,0x7a,0x04,0x78,0x08,0xe6,0xf0,
++ 0xa3,0x08,0xda,0xfa,0x90,0x08,0xc5,0x7a,0x04,0x78,0x08,0xe0,0xf6,0xa3,0x08,0xda,
++ 0xfa,0x90,0x91,0x04,0x7a,0x04,0x78,0x08,0xe6,0xf0,0xa3,0x08,0xda,0xfa,0x90,0x08,
++ 0xc9,0x7a,0x04,0x78,0x08,0xe0,0xf6,0xa3,0x08,0xda,0xfa,0x90,0x91,0x08,0x7a,0x04,
++ 0x78,0x08,0xe6,0xf0,0xa3,0x08,0xda,0xfa,0x90,0x08,0xcd,0x7a,0x04,0x78,0x08,0xe0,
++ 0xf6,0xa3,0x08,0xda,0xfa,0x90,0x91,0x0c,0x7a,0x04,0x78,0x08,0xe6,0xf0,0xa3,0x08,
++ 0xda,0xfa,0x90,0x08,0xd1,0x7a,0x04,0x78,0x08,0xe0,0xf6,0xa3,0x08,0xda,0xfa,0x90,
++ 0x91,0x10,0x7a,0x04,0x78,0x08,0xe6,0xf0,0xa3,0x08,0xda,0xfa,0x90,0x91,0x40,0xe4,
++ 0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x91,0x44,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,
++ 0xa3,0xf0,0x90,0x91,0x48,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x43,0xa0,0x01,
++ 0x90,0x08,0xdd,0xe4,0xf0,0xa3,0xf0,0x12,0x06,0x2f,0x90,0x08,0xdd,0x74,0xc8,0xf0,
++ 0xa3,0xe4,0xf0,0x12,0x05,0xd0,0x90,0x91,0x80,0x74,0x01,0xf0,0x90,0x08,0xdd,0x74,
++ 0xff,0xf0,0xa3,0xe4,0xf0,0x12,0x06,0x2f,0x90,0x08,0xdd,0x74,0x64,0xf0,0xa3,0xe4,
++ 0xf0,0x12,0x05,0xd0,0x12,0x07,0xa1,0x90,0x08,0xdd,0x74,0xff,0xf0,0xa3,0xe4,0xf0,
++ 0x12,0x06,0x2f,0x12,0x07,0xa1,0x12,0x07,0x28,0x12,0x07,0x28,0x78,0x1b,0xe6,0x60,
++ 0x03,0x12,0x00,0x46,0x78,0x1e,0xe6,0x60,0x07,0x78,0x1e,0x76,0x00,0x12,0x08,0x9b,
++ 0x80,0xea,0x90,0x91,0x80,0xe4,0xf0,0x22,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
++ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x74,0x14,0x70,0x04,
++ 0x74,0x00,0x60,0x1e,0x90,0x08,0x68,0xa8,0x83,0xa9,0x82,0x90,0x08,0xa2,0xaa,0x83,
++ 0xab,0x82,0x90,0x08,0xb6,0xac,0x83,0xad,0x82,0xc3,0xed,0x9b,0x70,0x28,0xec,0x9a,
++ 0x70,0x24,0x74,0x0a,0x70,0x04,0x74,0x00,0x60,0x1b,0x90,0x08,0xc0,0xac,0x83,0xad,
++ 0x82,0x90,0x08,0xb6,0xc3,0xed,0x95,0x82,0x70,0x05,0xec,0x95,0x83,0x60,0x06,0xe4,
++ 0xf0,0xa3,0x02,0x02,0xe4,0x22,0x88,0x83,0x89,0x82,0xe4,0x93,0xa3,0xa8,0x83,0xa9,
++ 0x82,0x8a,0x83,0x8b,0x82,0xf0,0xa3,0xaa,0x83,0xab,0x82,0x02,0x02,0xc9,0x74,0x00,
++ 0x60,0x0d,0x90,0x00,0x00,0x79,0x00,0xfa,0xe4,0x93,0xf7,0xa3,0x09,0xda,0xf9,0x74,
++ 0x13,0x60,0x08,0x78,0x18,0xfa,0xe4,0xf6,0x08,0xda,0xfc,0x22,0x74,0x00,0x60,0x0d,
++ 0x90,0x00,0x00,0x79,0x00,0xfa,0xe4,0x93,0xf7,0xa3,0x09,0xda,0xf9,0x74,0x00,0x60,
++ 0x08,0x78,0x00,0xfa,0xe4,0xf6,0x08,0xda,0xfc,0x22,0x74,0x00,0x60,0x35,0xfb,0x90,
++ 0x00,0x00,0x74,0x00,0x75,0xf0,0x08,0x84,0x24,0x20,0xf8,0x7a,0x08,0xe5,0xf0,0x60,
++ 0x07,0xe6,0x03,0x1a,0xd5,0xf0,0xfb,0xf6,0xeb,0x60,0x0d,0x1b,0xe4,0x93,0xa3,0xa2,
++ 0xe0,0xe6,0x13,0xf6,0xda,0xf2,0x80,0x05,0xe6,0x03,0xda,0xfd,0xf6,0x08,0x7a,0x08,
++ 0xeb,0x70,0xe5,0x74,0x00,0x60,0x2e,0xfb,0x74,0x00,0x75,0xf0,0x08,0x84,0x24,0x20,
++ 0xf8,0x7a,0x08,0xe5,0xf0,0x60,0x07,0xe6,0x03,0x1a,0xd5,0xf0,0xfb,0xf6,0xeb,0x60,
++ 0x09,0x1b,0xc3,0xe6,0x13,0xf6,0xda,0xf6,0x80,0x05,0xe6,0x03,0xda,0xfd,0xf6,0x08,
++ 0x7a,0x08,0xeb,0x70,0xe9,0x22,0x74,0x00,0x60,0x0d,0x90,0x00,0x00,0x79,0x00,0xfa,
++ 0xe4,0x93,0xf7,0xa3,0x09,0xda,0xf9,0x74,0x00,0x60,0x08,0x78,0x00,0xfa,0xe4,0xf6,
++ 0x08,0xda,0xfc,0x22,0x90,0x08,0xdd,0xe4,0xf0,0xa3,0xf0,0x90,0x08,0xdd,0xc3,0xe0,
++ 0x94,0x40,0xa3,0xe0,0x94,0x00,0x30,0xd2,0x04,0xb2,0xe7,0xd2,0xe0,0x20,0xe7,0x03,
++ 0x02,0x04,0xdf,0x90,0x08,0xdd,0xe0,0xf5,0x08,0xa3,0xe0,0xf5,0x09,0x7a,0x0c,0xe5,
++ 0x08,0xc3,0x33,0xf5,0x08,0xe5,0x09,0x33,0xf5,0x09,0xda,0xf3,0xe5,0x09,0x33,0xe4,
++ 0x50,0x01,0x14,0xf5,0x0a,0xf5,0x0b,0xe5,0x08,0x44,0x00,0xf5,0x08,0xe5,0x09,0x44,
++ 0x00,0xf5,0x09,0xe5,0x0a,0x44,0x08,0xf5,0x0a,0xe5,0x0b,0x44,0x00,0xf5,0x0b,0x90,
++ 0x08,0xe1,0xe5,0x08,0xf0,0xa3,0xe5,0x09,0xf0,0x90,0x08,0xe1,0xe0,0xf5,0x08,0xa3,
++ 0xe0,0xf5,0x09,0x33,0xe4,0x50,0x01,0x14,0xf5,0x0a,0xf5,0x0b,0x90,0x91,0x04,0x7a,
++ 0x04,0x78,0x08,0xe6,0xf0,0xa3,0x08,0xda,0xfa,0x90,0x08,0xdf,0xe4,0xf0,0xa3,0xf0,
++ 0x90,0x08,0xdf,0xc3,0xe0,0x94,0x80,0xa3,0xe0,0x94,0x38,0x30,0xd2,0x04,0xb2,0xe7,
++ 0xd2,0xe0,0x30,0xe7,0x5b,0x90,0x91,0x40,0xe0,0x54,0x00,0xf5,0x08,0xa3,0xe0,0x54,
++ 0xa0,0xf5,0x09,0xa3,0xe0,0x54,0x00,0xf5,0x0a,0xa3,0xe0,0x54,0x00,0xf5,0x0b,0x78,
++ 0x08,0xc3,0xe6,0x94,0x00,0x70,0x10,0x08,0xe6,0x94,0xa0,0x70,0x0a,0x08,0xe6,0x94,
++ 0x00,0x70,0x04,0x08,0xe6,0x94,0x00,0x70,0x19,0x90,0x91,0x48,0x7a,0x04,0x78,0x08,
++ 0xe0,0xf6,0xa3,0x08,0xda,0xfa,0x90,0x08,0xe1,0xe5,0x08,0xf0,0xa3,0xe5,0x09,0xf0,
++ 0x80,0x0e,0x90,0x08,0xdf,0xe0,0x24,0x01,0xf0,0xa3,0xe0,0x34,0x00,0xf0,0x80,0x90,
++ 0x90,0x08,0xdd,0xe0,0x24,0x01,0xf0,0xa3,0xe0,0x34,0x00,0xf0,0x02,0x03,0xdb,0x12,
++ 0x06,0xd6,0x22,0xc0,0xe0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0xc0,0x08,0xc0,0x09,0xc0,
++ 0x0a,0xc0,0x0b,0xc2,0xd3,0xd2,0xd4,0xc2,0xaf,0x53,0xa8,0xfe,0x53,0xe8,0xf9,0x78,
++ 0x19,0xe6,0x70,0x03,0x02,0x05,0xac,0x90,0x08,0xbe,0xc3,0xe0,0x94,0x01,0x70,0x04,
++ 0xa3,0xe0,0x94,0x00,0x60,0x03,0x02,0x05,0xac,0x78,0x1f,0xe6,0x70,0x37,0x90,0x08,
++ 0xa4,0xe0,0xfa,0xa3,0xe0,0x8a,0x82,0xf5,0x83,0xe0,0xf5,0x08,0xa3,0xe0,0xf5,0x09,
++ 0x33,0xe4,0x50,0x01,0x14,0xf5,0x0a,0xf5,0x0b,0x90,0x91,0x10,0x7a,0x04,0x78,0x08,
++ 0xe6,0xf0,0xa3,0x08,0xda,0xfa,0x90,0x91,0x0c,0x7a,0x04,0x78,0x08,0xe6,0xf0,0xa3,
++ 0x08,0xda,0xfa,0x80,0x54,0x90,0x08,0xa4,0xe0,0xfa,0xa3,0xe0,0x8a,0x82,0xf5,0x83,
++ 0xe0,0xf5,0x08,0xa3,0xe0,0xf5,0x09,0x33,0xe4,0x50,0x01,0x14,0xf5,0x0a,0xf5,0x0b,
++ 0x90,0x91,0x0c,0x7a,0x04,0x78,0x08,0xe6,0xf0,0xa3,0x08,0xda,0xfa,0x90,0x08,0xa4,
++ 0xe0,0x24,0x02,0xfa,0xa3,0xe0,0x34,0x00,0xf5,0x83,0x8a,0x82,0xe0,0xf5,0x08,0xa3,
++ 0xe0,0xf5,0x09,0x33,0xe4,0x50,0x01,0x14,0xf5,0x0a,0xf5,0x0b,0x90,0x91,0x10,0x7a,
++ 0x04,0x78,0x08,0xe6,0xf0,0xa3,0x08,0xda,0xfa,0x12,0x08,0x9b,0x90,0x91,0x81,0xe0,
++ 0x90,0x00,0x39,0xf0,0x43,0xe8,0x06,0x43,0xf8,0x04,0x43,0xa8,0x01,0xd2,0xaf,0xd0,
++ 0x0b,0xd0,0x0a,0xd0,0x09,0xd0,0x08,0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xe0,0x32,
++ 0x90,0x08,0xdf,0xe4,0xf0,0xa3,0xf0,0x90,0x08,0xdf,0xc3,0xe0,0x94,0xe8,0xa3,0xe0,
++ 0x94,0x03,0x30,0xd2,0x04,0xb2,0xe7,0xd2,0xe0,0x30,0xe7,0x42,0x90,0x08,0xe1,0xe4,
++ 0xf0,0xa3,0xf0,0x90,0x08,0xdd,0xe0,0xf5,0x08,0xa3,0xe0,0xf5,0x09,0x90,0x08,0xe1,
++ 0xc3,0xe0,0x95,0x08,0xa3,0xe0,0x95,0x09,0x30,0xd2,0x04,0xb2,0xe7,0xd2,0xe0,0x30,
++ 0xe7,0x0e,0x90,0x08,0xe1,0xe0,0x24,0x01,0xf0,0xa3,0xe0,0x34,0x00,0xf0,0x80,0xd3,
++ 0x90,0x08,0xdf,0xe0,0x24,0x01,0xf0,0xa3,0xe0,0x34,0x00,0xf0,0x80,0xa9,0x22,0x90,
++ 0x08,0xe1,0xe4,0xf0,0xa3,0x74,0x30,0xf0,0x90,0x08,0xdf,0xe4,0xf0,0xa3,0xf0,0x90,
++ 0x08,0xdf,0xc3,0xe0,0x94,0x00,0xa3,0xe0,0x94,0x06,0x30,0xd2,0x04,0xb2,0xe7,0xd2,
++ 0xe0,0x30,0xe7,0x2e,0x90,0x08,0xdd,0xe0,0x90,0x08,0xe1,0xc0,0xe0,0xe0,0xfa,0xa3,
++ 0xe0,0x8a,0x82,0xf5,0x83,0xd0,0xe0,0xf0,0x90,0x08,0xe1,0xe0,0x24,0x01,0xf0,0xa3,
++ 0xe0,0x34,0x00,0xf0,0x90,0x08,0xdf,0xe0,0x24,0x01,0xf0,0xa3,0xe0,0x34,0x00,0xf0,
++ 0x80,0xbd,0x22,0xc0,0xe0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0xc0,0x08,0xc0,0x09,0xc0,
++ 0x0a,0xc0,0x0b,0xc2,0xd3,0xd2,0xd4,0xc2,0xaf,0x53,0xa8,0xfe,0x53,0xe8,0xf9,0x78,
++ 0x1b,0x76,0x01,0x90,0x90,0x0c,0x7a,0x04,0x78,0x08,0xe0,0xf6,0xa3,0x08,0xda,0xfa,
++ 0x90,0x00,0x35,0x7a,0x04,0x78,0x08,0xe6,0xf0,0xa3,0x08,0xda,0xfa,0x43,0xe8,0x06,
++ 0x43,0xa8,0x01,0xd2,0xaf,0xd0,0x0b,0xd0,0x0a,0xd0,0x09,0xd0,0x08,0xd0,0xd0,0xd0,
++ 0x83,0xd0,0x82,0xd0,0xe0,0x32,0x90,0x00,0x3e,0xe4,0xf0,0xa3,0xf0,0x90,0x00,0x3e,
++ 0xc3,0xe0,0x94,0x80,0xa3,0xe0,0x94,0x38,0x30,0xd2,0x04,0xb2,0xe7,0xd2,0xe0,0x30,
++ 0xe7,0x35,0x90,0x91,0x40,0xe0,0x54,0x00,0xf5,0x08,0xa3,0xe0,0x54,0x60,0xf5,0x09,
++ 0xa3,0xe0,0x54,0x00,0xf5,0x0a,0xa3,0xe0,0x54,0x00,0xf5,0x0b,0x78,0x08,0x7a,0x04,
++ 0xe6,0x70,0x03,0x08,0xda,0xfa,0x70,0x01,0x22,0x90,0x00,0x3e,0xe0,0x24,0x01,0xf0,
++ 0xa3,0xe0,0x34,0x00,0xf0,0x80,0xb6,0x22,0x90,0x3f,0xf0,0x74,0x0f,0xf0,0xa3,0xe4,
++ 0xf0,0x90,0x3f,0xf4,0xe4,0xf0,0xa3,0x74,0x60,0xf0,0xa3,0x74,0x0a,0xf0,0xa3,0xe4,
++ 0xf0,0x90,0x3f,0xf8,0xe4,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0x12,0x00,0x46,0x90,
++ 0x3f,0xf8,0xe0,0x54,0xf0,0xf5,0x08,0x7a,0x03,0x78,0x08,0xa3,0x08,0xe0,0x54,0x00,
++ 0xf6,0xda,0xf8,0x78,0x08,0x7a,0x04,0xe6,0x70,0x03,0x08,0xda,0xfa,0x60,0x01,0x22,
++ 0x80,0xb6,0x22,0xc0,0xe0,0xc0,0x82,0xc0,0x83,0xc0,0xd0,0xc2,0xd3,0xd2,0xd4,0xc2,
++ 0xaf,0x53,0xa8,0xfe,0x53,0xe8,0xf9,0x90,0x08,0xbe,0x74,0x01,0xf0,0xa3,0xe4,0xf0,
++ 0x43,0xe8,0x06,0x43,0xa8,0x01,0xd2,0xaf,0xd0,0xd0,0xd0,0x83,0xd0,0x82,0xd0,0xe0,
++ 0x32,0x90,0x91,0x40,0xe0,0x54,0x00,0xf5,0x08,0xa3,0xe0,0x54,0x80,0xf5,0x09,0xa3,
++ 0xe0,0x54,0x00,0xf5,0x0a,0xa3,0xe0,0x54,0x00,0xf5,0x0b,0x78,0x08,0x7a,0x04,0xe6,
++ 0x70,0x03,0x08,0xda,0xfa,0x60,0x01,0x22,0x80,0xd7,0x22,0x90,0x08,0xbe,0xe4,0xf0,
++ 0xa3,0xf0,0x90,0x08,0xb8,0xe4,0xf0,0xa3,0xf0,0x90,0x08,0xb6,0xe4,0xf0,0xa3,0xf0,
++ 0x78,0x1e,0x76,0x00,0x75,0xa8,0x81,0x75,0xb8,0x01,0x75,0xe8,0x06,0x75,0xf8,0x04,
++ 0xd2,0xaf,0x22,0x90,0x91,0x44,0x7a,0x04,0x78,0x08,0xe0,0xf6,0xa3,0x08,0xda,0xfa,
++ 0x90,0x3f,0xf4,0x7a,0x04,0x78,0x08,0xe6,0xf0,0xa3,0x08,0xda,0xfa,0x12,0x06,0xd6,
++ 0x90,0x3f,0xf2,0x74,0x01,0xf0,0xa3,0xe4,0xf0,0x22,0x90,0x3f,0xf4,0x7a,0x04,0x78,
++ 0x08,0xe0,0xf6,0xa3,0x08,0xda,0xfa,0x90,0x91,0x08,0x7a,0x04,0x78,0x08,0xe6,0xf0,
++ 0xa3,0x08,0xda,0xfa,0x12,0x06,0xd6,0x90,0x3f,0xf2,0x74,0x01,0xf0,0xa3,0xe4,0xf0,
++ 0x22,0x90,0x91,0x48,0x7a,0x04,0x78,0x08,0xe0,0xf6,0xa3,0x08,0xda,0xfa,0x90,0x3f,
++ 0xf4,0x7a,0x04,0x78,0x08,0xe6,0xf0,0xa3,0x08,0xda,0xfa,0x12,0x06,0xd6,0x90,0x3f,
++ 0xf2,0x74,0x01,0xf0,0xa3,0xe4,0xf0,0x22,0x00,0x30,0x00,0x36,0x41,0x91,0x45,0x91,
++ 0xf4,0x3f,0xf6,0x3f,0xf4,0x3f,0xf5,0x3f,0xf6,0x3f,0xf7,0x3f,0x90,0x3f,0xf4,0x78,
++ 0x1f,0xe0,0xf6,0x90,0x3f,0xf2,0x74,0x01,0xf0,0xa3,0xe4,0xf0,0x22,0x78,0x1e,0x76,
++ 0x01,0x90,0x3f,0xf2,0x74,0x01,0xf0,0xa3,0xe4,0xf0,0x22,0x53,0xa0,0xfe,0x43,0xa0,
++ 0x01,0x22,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
++};
++
++
++void init_8051(void)
++{
++ int i,j;
++
++ *(volatile unsigned long *)(VOYAGER_8051_RESET) = 0x0000;
++ *(volatile unsigned long *)(VOYAGER_8051_SELECT) = 0x0011;
++ //8051 program write
++ for(i=0;i<sizeof(code_8051);i++) {
++ *(volatile unsigned char *)(VOYAGER_8051_BASE+i) = code_8051[i];
++ }
++ *(volatile unsigned long *)(VOYAGER_8051_RESET) = 0x0001;
++ for(i=0;i<DELAY_8051;i++) {
++ for(j=0;j<200;j++);
++ }
++}
++
++
++int command_8051(int com,int *data,int *data2)
++{
++ int ret,i,j;
++
++ j = 0;
++ do {
++ *(volatile unsigned short *)(VOYAGER_8051_COMMAND) = com;
++ *(volatile unsigned short *)(VOYAGER_8051_STATUS) = 0;
++ *(volatile unsigned long *)(VOYAGER_8051_DATA) = *data;
++ *(volatile unsigned long *)(VOYAGER_8051_DATA+4) = *data2;
++ *(volatile unsigned long *)(VOYAGER_8051_CPU_INT) = 0xff;
++ for(i=0;i<DELAY_8051;i++) {
++ ret = *(volatile unsigned short *)(VOYAGER_8051_STATUS);
++ if(ret != 0) {
++ break;
++ }
++ }
++ j++;
++ if(j > 100) {
++ *data = 0;
++ *data2 = 0;
++ printk("8051 command process error\n");
++ return(-1);
++ }
++ } while(ret == 0);
++ *data = *(volatile unsigned long *)(VOYAGER_8051_DATA);
++ *data2 = *(volatile unsigned long *)(VOYAGER_8051_DATA+4);
++
++ return(ret);
++}
++
++EXPORT_SYMBOL(init_8051);
++EXPORT_SYMBOL(command_8051);
++
+diff -ruN linux-2.6.17-vanilla/sound/oss/voyagergx_sound.c linux-2.6.17/sound/oss/voyagergx_sound.c
+--- linux-2.6.17-vanilla/sound/oss/voyagergx_sound.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/sound/oss/voyagergx_sound.c 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1,1122 @@
++/*
++ * linux/drivers/sound/voyagergx_sound.c -- voyager sound driver
++ *
++ * Copyright (C) 2003 Renesas Technology Sales Co.,Ltd.
++ * Copyright (C) 2003 Atom Create Engineering Co.,Ltd.
++ * Anthor : Atom Create Engineering Co.,Ltd.
++ * Kenichi Sakuma
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file COPYING in the main directory of this archive for
++ * more details.
++ *
++ * 1.00
++ * - initial version (ks)
++ * 1.01
++ * - Kernel 2.6 correspondence
++ */
++#include <linux/version.h>
++#include <linux/module.h>
++#include <linux/string.h>
++#include <linux/ioport.h>
++#include <linux/sched.h>
++#include <linux/delay.h>
++#include <linux/sound.h>
++#include <linux/slab.h>
++#include <linux/soundcard.h>
++#include <linux/init.h>
++#include <linux/poll.h>
++#include <linux/pci.h>
++#include <linux/bitops.h>
++#include <linux/proc_fs.h>
++#include <linux/spinlock.h>
++#include <linux/smp_lock.h>
++#include <linux/ac97_codec.h>
++#include <linux/interrupt.h>
++#include <asm/io.h>
++#include <asm/uaccess.h>
++#include <asm/hardirq.h>
++#include <asm/rts7751r2d/voyagergx_reg.h>
++#include <asm/irq.h>
++#include "voyagergx_sound.h"
++
++static DEFINE_SPINLOCK(voyagergx_sound_lock);
++
++/* --------------------------------------------------------------------- */
++#undef OSS_DOCUMENTED_MIXER_SEMANTICS
++
++#define VOYAGERGX_MODULE_NAME "Voyagergx audio"
++#define PFX VOYAGERGX_MODULE_NAME
++
++#define err(format, arg...) printk(KERN_ERR PFX ": " format "\n" , ## arg)
++#define info(format, arg...) printk(KERN_INFO PFX ": " format "\n" , ## arg)
++//#define info(format, arg...) printk(": " format "\n" , ## arg)
++//#define warn(format, arg...) printk(KERN_WARNING PFX ": " format "\n" , ## arg)
++
++// buffer size
++#define VOYAGER_SOUND_SIZE 0x100000
++// data buffer 1 - vram upper
++#define VOYAGER_SOUND_BUF1 0xb0200000
++// data buffer 2 - vram upper
++#define VOYAGER_SOUND_BUF2 VOYAGER_SOUND_BUF1+VOYAGER_SOUND_SIZE
++//WAIT TIME OUT
++//#define WAIT_TIMEOUT ((VOYAGER_SOUND_SIZE / 48000) * HZ + 10)
++#define WAIT_TIMEOUT 1100
++
++DECLARE_WAIT_QUEUE_HEAD(int_wq);
++
++/* Boot options */
++static int vra = 0; // 0 = no VRA, 1 = use VRA if codec supports it
++MODULE_PARM(vra, "i");
++MODULE_PARM_DESC(vra, "if 1 use VRA if codec supports it");
++
++struct voyager_setting {
++ int ch;
++ int fmt;
++ int rate;
++} setting;
++
++int init_8051(void);
++int command_8051(int com,int *data,int *data2);
++
++// DMA used channel - set DMA used channel(fixed at 0)
++static int sh7751_dmasound_play_irq = 0;
++// buffer 1 used flag - transfersize is set when used
++static int buff_flg1 = 0;
++// buffer 2 used flag - transfersize is set when used
++static int buff_flg2 = 0;
++// buffer judgement flag - which buffer is used by DMA
++static int proc_flg = 0;
++// first judgement flag - data transfer is first time?
++static int first_flg = 0;
++// last judgement flag - data transfer is last?
++static int last_flg = 0;
++// interrupt flag - 0 cleard if interrupt occured
++static int wari_flg;
++// break flag - to cancel or done of sound play
++static int break_flg;
++// play cancel flag - performance problem or end of play
++static int abnml_flg;
++// number of write buffer - which buffer will be used
++static int next_write;
++// remained buffer size
++static int next_size;
++// DMA transfer size
++static int dma_req[2];
++// DMA address table - address per channel
++static int dma_tbl[] = {
++ 0xffa00000, 0xffa00010, 0xffa00020, 0xffa00030,
++ 0xffa00040, 0xffa00050, 0xffa00060, 0xffa00070
++};
++
++/* --------------------------------------------------------------------- */
++// DMA start
++// enable selected dma channel
++void dma2_start(int irq)
++{
++int base;
++
++ base = dma_tbl[irq];
++ *(volatile unsigned long *)(base + 0xc) |= 0x00000001;
++}
++
++
++// DMA stop
++// disable selected dma channel
++void dma2_stop(int irq)
++{
++int base;
++
++ base = dma_tbl[irq];
++ *(volatile unsigned long *)(base + 0xc) &= 0xfffffffc;
++}
++
++
++// prepare DMA transfer
++// set transfer src address and transfer size
++void dma2_queue_buffer(int irq,int src, int cnt)
++{
++int base;
++
++ base = dma_tbl[irq];
++ *(volatile unsigned long *)(base + 0x0) = src & 0x1fffffff;
++ // change transfer unit for mono or stereo
++ if(setting.ch == 1) {
++ // 4 byte for stereo
++ *(volatile unsigned long *)(base + 0x8) = cnt;
++ }
++ else {
++ // 2 byte for mono
++ *(volatile unsigned long *)(base + 0x8) = cnt * 2;
++ }
++}
++
++
++// DMA registration
++// register DMA interrupt
++int request_dma2(int irq,char *str,irqreturn_t (*callback)(int, void *, struct pt_regs *))
++{
++int ret;
++
++ make_ipr_irq(DMTE0_IRQ+irq, DMA_IPR_ADDR, DMA_IPR_POS,DMA_PRIORITY);
++ ret = request_irq(DMTE0_IRQ+irq,callback,SA_INTERRUPT,str,0);
++ return(ret);
++}
++
++
++// preparation for DMA use
++// set transfer dst address and transfer unit, transfer condition, etc
++void dma2_set_device(int irq)
++{
++int base;
++
++ //DMA initialize
++ base = dma_tbl[irq];
++ *(volatile unsigned long *)(base + 0x0) = 0;
++ *(volatile unsigned long *)(base + 0x4) = VOYAGER_8051_FIFO & 0x1fffffff;
++ *(volatile unsigned long *)(base + 0x8) = 0;
++ // change transfer unit for mono or stereo
++ if(setting.ch == 1) {
++ // 4 byte for stereo
++ *(volatile unsigned long *)(base + 0xc) = 0xb1034;
++ }
++ else {
++ // 2 byte for mono
++ *(volatile unsigned long *)(base + 0xc) = 0xb1024;
++ }
++ *(volatile unsigned long *)(base + 0x40) = 0x01;
++}
++
++/* --------------------------------------------------------------------- */
++
++
++// cancel sound play(done)
++//
++static void voy_break(void)
++{
++int data,data2;
++
++ // cancel for 8051
++ data = 0x00;
++ command_8051(0x07,&data,&data2);
++ // stop DMA
++ dma2_stop(sh7751_dmasound_play_irq);
++ break_flg = 1;
++}
++/* --------------------------------------------------------------------- */
++// ISR for DMA
++// called after DMA transfer is done
++// next request is issued here in the case of sequential transfer
++static irqreturn_t do_irq(int irq, void *dev_id, struct pt_regs *regs)
++{
++ spin_lock_irq(&voyagergx_sound_lock);
++
++ // stop DMA
++ dma2_stop(sh7751_dmasound_play_irq);
++ // clear interrupt flag
++ wari_flg = 0;
++ // play of buffer 1 is done?
++ if((proc_flg == 1)&&(buff_flg1 == 1)) {
++ // buffer 1 is free
++ buff_flg1 = 0;
++ // buffer 2 is being played
++ proc_flg = 2;
++ // next data is ready?
++ if(buff_flg2 == 1) {
++ // request DMA
++ dma2_queue_buffer(sh7751_dmasound_play_irq,VOYAGER_SOUND_BUF2,dma_req[1]);
++ dma2_start(sh7751_dmasound_play_irq);
++ }
++ else {
++ // set stop flag if no data
++ abnml_flg = 1;
++ }
++ }
++ // play of buffer 2 is done?
++ else if((proc_flg == 2)&&(buff_flg2 == 1)) {
++ // buffer 2 is free
++ buff_flg2 = 0;
++ // buffer 1 is being played
++ proc_flg = 1;
++ // next data is ready?
++ if(buff_flg1 == 1) {
++ // request DMA
++ dma2_queue_buffer(sh7751_dmasound_play_irq,VOYAGER_SOUND_BUF1,dma_req[0]);
++ dma2_start(sh7751_dmasound_play_irq);
++ }
++ else {
++ // set stop flag if no data
++ abnml_flg = 1;
++ }
++ }
++ // play remained data(last data or small one)
++ else {
++ //last transfer is done
++ last_flg = 0;
++ }
++ //wake up sleeping write routine
++ wake_up_interruptible(&int_wq);
++ spin_unlock_irq(&voyagergx_sound_lock);
++
++ return IRQ_HANDLED;
++}
++
++/* --------------------------------------------------------------------- */
++// 32 bit memory read
++static inline u32 voyager_readl(u32 addr)
++{
++ return *(volatile unsigned long *)(addr);
++}
++
++// 32 bit memory write
++static inline void voyager_writel(u32 val,u32 addr)
++{
++ *(volatile unsigned long *)(addr) = val;
++}
++
++/* --------------------------------------------------------------------- */
++
++struct voyagergx_state {
++ /* soundcore stuff */
++ int dev_audio;
++
++ struct ac97_codec codec;
++ unsigned codec_base_caps; // AC'97 reg 00h, "Reset Register"
++ unsigned codec_ext_caps; // AC'97 reg 28h, "Extended Audio ID"
++ int no_vra; // do not use VRA
++
++ spinlock_t lock;
++ struct semaphore open_sem;
++ mode_t open_mode;
++
++} voyagergx_state;
++
++
++/* --------------------------------------------------------------------- */
++// read codec
++static u16 rdcodec(struct ac97_codec *codec, u8 addr)
++{
++ u32 cmd,ret;
++ u16 data;
++
++
++ // set register address for reading
++ cmd = (u32) (addr & AC97C_INDEX_MASK) << 12;
++ cmd |= AC97C_READ; // read command
++ command_8051(1,&cmd,&ret);
++ mdelay(1);
++ // read register
++ command_8051(4,&cmd,&ret);
++ mdelay(1);
++ // convert it as it was shifted
++ data = (cmd >> 4) & 0xffff;
++ return data;
++}
++
++
++// write codec
++static void wrcodec(struct ac97_codec *codec, u8 addr, u16 data)
++{
++ u32 cmd,ret;
++ int i;
++
++ // reset?
++ if(addr == 0) {
++ // try again if failed
++ for(i=0;i<10;i++) {
++ // set write data
++ cmd = (u32) data << AC97C_WD_BIT; // OR in the data word
++ command_8051(3,&cmd,&ret);
++ // set write address
++ cmd = (u32) (addr & AC97C_INDEX_MASK) << 12;
++ cmd &= ~AC97C_READ; // write command
++ command_8051(1,&cmd,&ret);
++ // check whether reset succeed
++ ret = rdcodec(codec,0);
++ if((ret & 0x8000) == 0) {
++ break;
++ }
++ }
++ }
++ // instead of reset
++ else {
++ // set write data
++ cmd = (u32) data << AC97C_WD_BIT; // OR in the data word
++ command_8051(3,&cmd,&ret);
++ // set write address
++ cmd = (u32) (addr & AC97C_INDEX_MASK) << 12;
++ cmd &= ~AC97C_READ; // write command
++ command_8051(1,&cmd,&ret);
++ mdelay(1);
++ // read variables of volume for preservation
++ rdcodec(codec,2);
++ rdcodec(codec,24);
++ rdcodec(codec,22);
++ rdcodec(codec,0x2c);
++ }
++}
++
++/* --------------------------------------------------------------------- */
++
++static loff_t voyagergx_llseek(struct file *file, loff_t offset, int origin)
++{
++ return -ESPIPE;
++}
++
++
++static int voyagergx_open_mixdev(struct inode *inode, struct file *file)
++{
++ file->private_data = &voyagergx_state;
++ return 0;
++}
++
++static int voyagergx_release_mixdev(struct inode *inode, struct file *file)
++{
++ return 0;
++}
++
++static int mixdev_ioctl(struct ac97_codec *codec, unsigned int cmd,
++ unsigned long arg)
++{
++ return codec->mixer_ioctl(codec, cmd, arg);
++}
++
++static int voyagergx_ioctl_mixdev(struct inode *inode, struct file *file,
++ unsigned int cmd, unsigned long arg)
++{
++ struct voyagergx_state *s = (struct voyagergx_state *)file->private_data;
++ struct ac97_codec *codec = &s->codec;
++
++ return mixdev_ioctl(codec, cmd, arg);
++}
++
++static /*const */ struct file_operations voyagergx_mixer_fops = {
++ owner:THIS_MODULE,
++ llseek:voyagergx_llseek,
++ ioctl:voyagergx_ioctl_mixdev,
++ open:voyagergx_open_mixdev,
++ release:voyagergx_release_mixdev,
++};
++
++/* --------------------------------------------------------------------- */
++// read routine
++// record(sampling) should be used originally
++// do nothing without record(sampling) now
++static ssize_t voyagergx_read(struct file *file, char *buffer,
++ size_t count, loff_t *ppos)
++{
++ if (ppos != &file->f_pos)
++ return -ESPIPE;
++ if (!access_ok(VERIFY_WRITE, buffer, count))
++ return -EFAULT;
++ return 0;
++}
++
++// write routine
++// used for sound play
++// sound play is being done by 8051 and data itsself is transfered by DMA
++// the preparation for the above is done here
++static ssize_t voyagergx_write(struct file *file, const char *buffer,
++ size_t count, loff_t * ppos)
++{
++int i,data,data2,data_size;
++int ret;
++
++
++ if (ppos != &file->f_pos)
++ return -ESPIPE;
++ if (!access_ok(VERIFY_READ, buffer, count))
++ return -EFAULT;
++ // exit if break flag is set
++ if(break_flg) {
++ return count;
++ }
++ // wait until buffers are not free
++ if((buff_flg1 == 1)&&(buff_flg2 == 1)) {
++ wari_flg = 1;
++ i = 0;
++ while(wari_flg) {
++ // sound play already done?
++ if(abnml_flg) {
++ break;
++ }
++ // sleep until buffer is not full
++ ret = interruptible_sleep_on_timeout(&int_wq,WAIT_TIMEOUT);
++ if(ret == 0) {
++ break;
++ }
++ // check Ctrl-C
++ if (signal_pending(current)) {
++ voy_break();
++ return -ERESTARTSYS;
++ }
++ i++;
++ if(i > 10000000) {
++ printk("DMA endcheck-1 error\n");
++ voy_break();
++ return -EFAULT;
++ }
++ }
++ }
++ data_size = count;
++ // multiple transfer
++ if(data_size >= next_size) {
++ // until play data is larger than buffer
++ while(data_size >= next_size) {
++ // buffer 1 is free
++ if((next_write == 1)&&(buff_flg1 == 0)) {
++ // copy data to VRAM
++ copy_from_user((long *)(VOYAGER_SOUND_BUF1+VOYAGER_SOUND_SIZE-next_size),
++ (long *)buffer,next_size);
++ // buffer1 used
++ buff_flg1 = 1;
++ next_write = 2;
++ // update pointer
++ buffer += next_size;
++ // decrease remained play data
++ data_size -= next_size;
++ // set remained buffer size
++ next_size = VOYAGER_SOUND_SIZE;
++ // kick DMA again when data is not enough
++ if(abnml_flg == 1) {
++ dma2_queue_buffer(sh7751_dmasound_play_irq,
++ VOYAGER_SOUND_BUF1,dma_req[0]);
++ dma2_start(sh7751_dmasound_play_irq);
++ abnml_flg = 0;
++ }
++ }
++ // buffer 2 is free
++ else if((next_write == 2)&&(buff_flg2 == 0)) {
++ // copy data to VRAM
++ copy_from_user((long *)(VOYAGER_SOUND_BUF2+VOYAGER_SOUND_SIZE-next_size),
++ (long *)buffer,next_size);
++ //buffer 2 used
++ buff_flg2 = 1;
++ next_write = 1;
++ // update pointer
++ buffer += next_size;
++ // decrease remained play data
++ data_size -= next_size;
++ // set remained buffer size
++ next_size = VOYAGER_SOUND_SIZE;
++ // kick DMA again when data is not enough
++ if(abnml_flg == 1) {
++ dma2_queue_buffer(sh7751_dmasound_play_irq,
++ VOYAGER_SOUND_BUF2,dma_req[1]);
++ dma2_start(sh7751_dmasound_play_irq);
++ abnml_flg = 0;
++ }
++ }
++ // first time?
++ if(first_flg == 0) {
++ //buffer 1 is full?(buffer 1 is used at first)
++ if(buff_flg1 == 1) {
++ // request DMA
++ dma2_queue_buffer(sh7751_dmasound_play_irq,
++ VOYAGER_SOUND_BUF1,
++ VOYAGER_SOUND_SIZE/4);
++ // start play on 8051
++ data = 0x01;
++ command_8051(0x07,&data,&data2);
++ // start DMA transfer
++ dma2_start(sh7751_dmasound_play_irq);
++ // set first flag
++ first_flg = 1;
++ }
++ }
++ // wait until 2 buffer are full
++ if((buff_flg1 == 1)&&(buff_flg2 == 1)) {
++ wari_flg = 1;
++ i = 0;
++ while(wari_flg) {
++ // sound play already done?
++ if(abnml_flg) {
++ break;
++ }
++ // sleep until buffer is not full
++ ret = interruptible_sleep_on_timeout(&int_wq,WAIT_TIMEOUT);
++ if(ret == 0) {
++ break;
++ }
++ // check Ctrl-C
++ if (signal_pending(current)) {
++ voy_break();
++ return -ERESTARTSYS;
++ }
++ i++;
++ if(i > 10000000) {
++ printk("DMA endcheck-2 error\n");
++ voy_break();
++ return -EFAULT;
++ }
++ }
++ }
++ }
++ }
++ // play data size is less than remained buffer size
++ if((data_size != 0)&&(data_size < next_size)) {
++ // buffer 1 is free
++ if((next_write == 1)&&(buff_flg1 == 0)) {
++ // copy data to VRAM
++ copy_from_user((long *)(VOYAGER_SOUND_BUF1+VOYAGER_SOUND_SIZE-next_size),
++ (void *)buffer,data_size);
++ // reset buffer remain size
++ next_size -= data_size;
++ // buffer is full?
++ if(next_size == 0) {
++ //buffer1 used
++ buff_flg1 = 1;
++ next_write = 2;
++ // reset buffer remain size
++ next_size = VOYAGER_SOUND_SIZE;
++ // kick DMA again when data is not enough
++ if(abnml_flg == 1) {
++ dma2_queue_buffer(sh7751_dmasound_play_irq,
++ VOYAGER_SOUND_BUF1,dma_req[0]);
++ dma2_start(sh7751_dmasound_play_irq);
++ abnml_flg = 0;
++ }
++ }
++ }
++ //buffer 2 is free
++ else if((next_write == 2)&&(buff_flg2 == 0)) {
++ // copy data to VRAM
++ copy_from_user((long *)(VOYAGER_SOUND_BUF2+VOYAGER_SOUND_SIZE-next_size),
++ (void *)buffer,data_size);
++ // reset buffer remained size
++ next_size -= data_size;
++ // buffer is full?
++ if(next_size == 0) {
++ //buffer2 used
++ buff_flg2 = 1;
++ next_write = 1;
++ // reset buffer remained size
++ next_size = VOYAGER_SOUND_SIZE;
++ // kick DMA again when data is not enough
++ if(abnml_flg == 1) {
++ dma2_queue_buffer(sh7751_dmasound_play_irq,
++ VOYAGER_SOUND_BUF2,dma_req[1]);
++ dma2_start(sh7751_dmasound_play_irq);
++ abnml_flg = 0;
++ }
++ }
++ }
++ }
++ // is it first time?
++ if(first_flg == 0) {
++ // buffer 1 is full(buffer1 is used first at first time)
++ if(buff_flg1 == 1) {
++ // DMA request
++ dma2_queue_buffer(sh7751_dmasound_play_irq,
++ VOYAGER_SOUND_BUF1,
++ VOYAGER_SOUND_SIZE/4);
++ // start play on 8051
++ data = 0x01;
++ command_8051(0x07,&data,&data2);
++ dma2_start(sh7751_dmasound_play_irq);
++ // set first flag
++ first_flg = 1;
++ }
++ }
++ return(count);
++}
++
++// polling - not used
++static unsigned int voyagergx_poll(struct file *file,
++ struct poll_table_struct *wait)
++{
++ return 0;
++}
++
++// mmap - not used
++static int voyagergx_mmap(struct file *file, struct vm_area_struct *vma)
++{
++ return 0;
++}
++
++// I/O control
++// operation for change data type and volume
++static int voyagergx_ioctl(struct inode *inode, struct file *file,
++ unsigned int cmd, unsigned long arg)
++{
++ struct voyagergx_state *s = (struct voyagergx_state *)file->private_data;
++ int data,data2,rate;
++
++
++ switch (cmd) {
++//Sound Stop control
++ case -1:
++ voy_break();
++ return 0;
++ case OSS_GETVERSION:
++ return put_user(SOUND_VERSION, (int *) arg);
++
++ case SNDCTL_DSP_SYNC:
++ return 0;
++
++ case SNDCTL_DSP_SETDUPLEX:
++ return 0;
++
++ case SNDCTL_DSP_GETCAPS:
++ return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME |
++ DSP_CAP_TRIGGER | DSP_CAP_MMAP, (int *)arg);
++
++ case SNDCTL_DSP_RESET:
++ return 0;
++
++ case SNDCTL_DSP_SPEED: // set sampling rate
++ if((*(int *)arg <= 0xbb80)&&(*(int *)arg >= 0x1b80)) {
++ setting.rate = *(int *)arg;
++ }
++ if(setting.ch == 0) {
++ rate = setting.rate / 2;
++ }
++ else {
++ rate = setting.rate;
++ }
++ return setting.rate;
++
++ case SNDCTL_DSP_STEREO: //set # of play channel(stereo or mono)
++ setting.ch = *(int *)arg;
++ // set # of channel for 8051
++ data = setting.ch;
++ command_8051(0x05,&data,&data2);
++ dma2_set_device(sh7751_dmasound_play_irq);
++ return(setting.ch);
++
++ case SNDCTL_DSP_CHANNELS:
++ return 0;
++
++ case SNDCTL_DSP_GETFMTS: // set play data format(8bit or 16bit)
++ if(setting.fmt == 16) {
++ arg = (unsigned long)AFMT_S16_LE;
++ }
++ else {
++ arg = (unsigned long)AFMT_U8;
++ }
++ return 0;
++
++ case SNDCTL_DSP_SETFMT: // set play data format(8bit or 16bit)
++ if(*(int *)arg == AFMT_S16_LE) {
++ setting.fmt = 16;
++ }
++ else {
++ setting.fmt = 8;
++ }
++ return 0;
++
++ case SNDCTL_DSP_POST:
++ return 0;
++
++ case SNDCTL_DSP_GETTRIGGER:
++ return 0;
++
++ case SNDCTL_DSP_SETTRIGGER:
++ return 0;
++
++ case SNDCTL_DSP_GETOSPACE:
++ return 0;
++
++ case SNDCTL_DSP_GETISPACE:
++ return 0;
++
++ case SNDCTL_DSP_NONBLOCK:
++ return 0;
++
++ case SNDCTL_DSP_GETODELAY:
++ return 0;
++
++ case SNDCTL_DSP_GETIPTR:
++ return 0;
++
++ case SNDCTL_DSP_GETOPTR:
++ return 0;
++
++ case SNDCTL_DSP_GETBLKSIZE:
++ return 0;
++
++ case SNDCTL_DSP_SETFRAGMENT:
++ return 0;
++
++ case SNDCTL_DSP_SUBDIVIDE:
++ return 0;
++
++ case SOUND_PCM_READ_RATE:
++ return 0;
++
++ case SOUND_PCM_READ_CHANNELS:
++ return 0;
++
++ case SOUND_PCM_READ_BITS:
++ return 0;
++
++ case SOUND_PCM_WRITE_FILTER:
++ case SNDCTL_DSP_SETSYNCRO:
++ case SOUND_PCM_READ_FILTER:
++ return -EINVAL;
++ }
++
++ return mixdev_ioctl(&s->codec, cmd, arg);
++}
++
++// open
++// flag initialization
++// stop 8051 to play(it will be started by first write)
++static int voyagergx_open(struct inode *inode, struct file *file)
++{
++struct voyagergx_state *s = &voyagergx_state;
++int data,data2;
++
++ file->private_data = s;
++
++ s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
++ //head transferflag clear
++ first_flg = 0;
++ //last transfer flag clear
++ last_flg = 0;
++ //buffer flag clear
++ buff_flg1 = buff_flg2 = 0;
++ // buffer 1 is first
++ proc_flg = 1;
++ // reset buffer remained size
++ next_size = VOYAGER_SOUND_SIZE;
++ // initialize DMA transfer size
++ dma_req[0] = VOYAGER_SOUND_SIZE/4;
++ dma_req[1] = VOYAGER_SOUND_SIZE/4;
++ // clear break flag
++ break_flg = 0;
++ // clear cancel play flag
++ abnml_flg = 0;
++ // initialize # of write buffer
++ next_write = 1;
++ // start play on 8051
++ data = 0x00;
++ command_8051(0x07,&data,&data2);
++
++ return 0;
++}
++
++// release(close)
++// play again if data remains in buffer
++// stop DMA
++// stop 8051
++static int voyagergx_release(struct inode *inode, struct file *file)
++{
++int data,data2,i;
++int ret;
++
++ // stop if break flag is set
++ if(break_flg) {
++ return 0;
++ }
++ // wait until buffer is not full
++ if((buff_flg1 == 1)&&(buff_flg2 == 1)) {
++ wari_flg = 1;
++ i = 0;
++ while(wari_flg) {
++ // sound play already done?
++ if(abnml_flg) {
++ break;
++ }
++ // sleep until buffer is not full
++ ret = interruptible_sleep_on_timeout(&int_wq,WAIT_TIMEOUT);
++ if(ret == 0) {
++ break;
++ }
++ // check Ctrl-C
++ if (signal_pending(current)) {
++ voy_break();
++ return -ERESTARTSYS;
++ }
++ i++;
++ if(i > 10000000) {
++ printk("DMA endcheck-3 error\n");
++ voy_break();
++ return -EFAULT;
++ }
++ }
++ }
++ // exit if size is less than 4
++ if((VOYAGER_SOUND_SIZE - next_size) < 4) {
++ voy_break();
++ return 0;
++ }
++ // buffer is not full?
++ if(next_size != 0) {
++
++ // first time?
++ if(first_flg == 0) {
++ // no data
++ if(next_size == VOYAGER_SOUND_SIZE) {
++ // exit
++ voy_break();
++ return 0;
++ }
++ // buffer 1 used?
++ if(proc_flg == 1) {
++ dma2_queue_buffer(sh7751_dmasound_play_irq,
++ VOYAGER_SOUND_BUF1,
++ (VOYAGER_SOUND_SIZE-next_size)/4);
++ // set last judgement flag
++ last_flg = 1;
++ }
++ // start play on 8051
++ data = 0x01;
++ command_8051(0x07,&data,&data2);
++ dma2_start(sh7751_dmasound_play_irq);
++ }
++ // sound play in case that data is less than a buffer
++ else {
++ if(proc_flg == 2) {
++ dma_req[0] = (VOYAGER_SOUND_SIZE-next_size)/4;
++ buff_flg1 = 1;
++ // set last judgement flag
++ last_flg = 1;
++ // kick dma again if data is not enough
++ if(abnml_flg == 1) {
++ dma2_queue_buffer(sh7751_dmasound_play_irq,
++ VOYAGER_SOUND_BUF1,dma_req[0]);
++ dma2_start(sh7751_dmasound_play_irq);
++ abnml_flg = 0;
++ }
++ }
++ else {
++ // DMA request
++ dma_req[1] = (VOYAGER_SOUND_SIZE-next_size)/4;
++ buff_flg2 = 1;
++ // set last judgement flag
++ last_flg = 1;
++ // kick dma again if data is not enough
++ if(abnml_flg == 1) {
++ dma2_queue_buffer(sh7751_dmasound_play_irq,
++ VOYAGER_SOUND_BUF2,dma_req[1]);
++ dma2_start(sh7751_dmasound_play_irq);
++ abnml_flg = 0;
++ }
++ }
++ }
++ }
++ // wait for all sound play(transfer)
++ while(1) {
++ if(abnml_flg) {
++ break;
++ }
++ // exit if last judgement flag is 0
++ if(last_flg == 0) {
++ break;
++ }
++ wari_flg = 1;
++ i = 0;
++ while(wari_flg) {
++ // sound play already done?
++ if(abnml_flg) {
++ break;
++ }
++ // exit if last judgement flag is 0
++ if(last_flg == 0) {
++ break;
++ }
++ // sleep until buffer is not full
++ ret = interruptible_sleep_on_timeout(&int_wq,WAIT_TIMEOUT);
++ if(ret == 0) {
++ voy_break();
++ return -EFAULT;
++ }
++ // check Ctrl-C
++ if (signal_pending(current)) {
++ voy_break();
++ return -ERESTARTSYS;
++ }
++ i++;
++ if(i > 10000000) {
++ printk("DMA endcheck-last error\n");
++ voy_break();
++ return -EFAULT;
++ }
++ }
++ }
++ // end
++ voy_break();
++
++ return 0;
++}
++
++static /*const */ struct file_operations voyagergx_audio_fops = {
++ owner: THIS_MODULE,
++ llseek: voyagergx_llseek,
++ read: voyagergx_read,
++ write: voyagergx_write,
++ poll: voyagergx_poll,
++ ioctl: voyagergx_ioctl,
++ mmap: voyagergx_mmap,
++ open: voyagergx_open,
++ release: voyagergx_release,
++};
++
++
++/* --------------------------------------------------------------------- */
++MODULE_AUTHOR("Atom Create Engineering Co.,Ltd.");
++MODULE_DESCRIPTION("DSP audio and mixer driver for Silicon Motion VoyagerGX audio device");
++
++/* --------------------------------------------------------------------- */
++
++// probe
++// driver initialization
++// codec initialization
++// check ac97 chip#
++static int __devinit voyagergx_probe(void)
++{
++struct voyagergx_state *s = &voyagergx_state;
++int val;
++
++ memset(s, 0, sizeof(struct voyagergx_state));
++
++ init_MUTEX(&s->open_sem);
++ s->codec.private_data = s;
++ s->codec.id = 0;
++ s->codec.codec_read = rdcodec;
++ s->codec.codec_write = wrcodec;
++ s->codec.codec_wait = NULL;
++
++ /* register devices */
++
++ if ((s->dev_audio = register_sound_dsp(&voyagergx_audio_fops, -1)) < 0)
++ goto err_dev1;
++ if ((s->codec.dev_mixer =
++ register_sound_mixer(&voyagergx_mixer_fops, -1)) < 0)
++ goto err_dev2;
++
++
++ /* codec init */
++ if (!ac97_probe_codec(&s->codec))
++ goto err_dev3;
++
++ s->codec_base_caps = rdcodec(&s->codec, AC97_RESET);
++ s->codec_ext_caps = rdcodec(&s->codec, AC97_EXTENDED_ID);
++ info("AC'97 Base/Extended ID = %04x/%04x",
++ s->codec_base_caps, s->codec_ext_caps);
++
++ s->codec.supported_mixers |= SOUND_MASK_ALTPCM;
++ val = 0x4343;
++ mixdev_ioctl(&s->codec, SOUND_MIXER_WRITE_ALTPCM,
++ (unsigned long) &val);
++
++ if (!(s->codec_ext_caps & AC97_EXTID_VRA)) {
++ // codec does not support VRA
++ s->no_vra = 1;
++ } else if (!vra) {
++ // Boot option says disable VRA
++ u16 ac97_extstat = rdcodec(&s->codec, AC97_EXTENDED_STATUS);
++ wrcodec(&s->codec, AC97_EXTENDED_STATUS,
++ ac97_extstat & ~AC97_EXTSTAT_VRA);
++ s->no_vra = 1;
++ }
++ if (s->no_vra)
++ info("no VRA, interpolating and decimating");
++
++ // set 48k for sampling rate
++ setting.rate = 48000;
++ wrcodec(&s->codec, 0x2a, 1);
++ wrcodec(&s->codec, 0x2c, setting.rate);
++ //volume set
++ wrcodec(&s->codec, 2, 0);
++ wrcodec(&s->codec, 24, 0);
++ wrcodec(&s->codec, 22, 0);
++
++ return 0;
++
++ err_dev3:
++ unregister_sound_mixer(s->codec.dev_mixer);
++ err_dev2:
++ unregister_sound_dsp(s->dev_audio);
++ err_dev1:
++ return -1;
++}
++
++// remove procedure
++static void __devinit voyagergx_remove(void)
++{
++ struct voyagergx_state *s = &voyagergx_state;
++
++ if (!s)
++ return;
++ unregister_sound_dsp(s->dev_audio);
++ unregister_sound_mixer(s->codec.dev_mixer);
++}
++
++// initilization
++static int __init init_voyagergx(void)
++{
++unsigned long value;
++int err;
++
++ info("sakuma@ace-jp.com, built " __TIME__ " on " __DATE__);
++
++ // set GPIO for ac97 & 8051
++ value = *(volatile unsigned long *)(GPIO_MUX_LOW);
++ value |= GPIO_MUX_LOW_AC97 | GPIO_MUX_LOW_8051;
++ *(volatile unsigned long *)(GPIO_MUX_LOW) = value;
++
++ // stop DMA
++ dma2_stop(sh7751_dmasound_play_irq);
++
++ //DMA interrupt request
++ err = request_dma2(sh7751_dmasound_play_irq, "voyager DMA",do_irq);
++ if (err) {
++ return 0;
++ }
++
++ // enalbe ac97 interrupt
++ value = *(volatile unsigned long *)(VOYAGER_INT_MASK);
++ value |= VOYAGER_INT_MASK_AC;
++ *(volatile unsigned long *)(VOYAGER_INT_MASK) = value;
++
++ // power on ac97
++ value = *(volatile unsigned long *)(POWER_MODE0_GATE);
++ value |= POWER_MODE0_GATE_AC;
++ *(volatile unsigned long *)(POWER_MODE0_GATE) = value;
++
++ // power on ac97
++ value = *(volatile unsigned long *)(POWER_MODE1_GATE);
++ value |= POWER_MODE1_GATE_AC;
++ *(volatile unsigned long *)(POWER_MODE1_GATE) = value;
++
++ // enable ac97
++ value = *(volatile unsigned long *)(AC97_CONTROL_STATUS);
++ value |= 0x0000000F;
++ *(volatile unsigned long *)(AC97_CONTROL_STATUS) = value;
++ // wait for a while
++ mdelay(2);
++ // exit reset
++ value &= 0xFFFFFFF9;
++ *(volatile unsigned long *)(AC97_CONTROL_STATUS) = value;
++
++ // tag initialization(enable stot1-4)
++ value = *(volatile unsigned long *)(AC97_TX_SLOT0);
++ value |= 0x0000F800;
++ *(volatile unsigned long *)(AC97_TX_SLOT0) = value;
++
++ // mono 16bit 48k
++ setting.ch = 0;
++ setting.fmt = 16;
++ setting.rate = 48000;
++
++ // DMA initialization
++ dma2_set_device(sh7751_dmasound_play_irq);
++
++ // 8051 initialization
++ init_8051();
++
++ return voyagergx_probe();
++}
++
++// unload
++static void __exit cleanup_voyagergx(void)
++{
++ info("unloading");
++ voyagergx_remove();
++}
++
++module_init(init_voyagergx);
++module_exit(cleanup_voyagergx);
++MODULE_LICENSE("GPL");
+diff -ruN linux-2.6.17-vanilla/sound/oss/voyagergx_sound.h linux-2.6.17/sound/oss/voyagergx_sound.h
+--- linux-2.6.17-vanilla/sound/oss/voyagergx_sound.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/sound/oss/voyagergx_sound.h 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1,4 @@
++#define VOYAGER_8051_COMMAND (VOYAGER_BASE + 0x000c3ff0)
++#define VOYAGER_8051_STATUS (VOYAGER_BASE + 0x000c3ff2)
++#define VOYAGER_8051_DATA (VOYAGER_BASE + 0x000c3ff4)
++#define VOYAGER_8051_FIFO (VOYAGER_BASE + 0x000c3600)
+diff -ruN linux-2.6.17-vanilla/sound/sh/CVS/Entries linux-2.6.17/sound/sh/CVS/Entries
+--- linux-2.6.17-vanilla/sound/sh/CVS/Entries 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/sound/sh/CVS/Entries 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1,5 @@
++/Kconfig/1.2/Mon Jun 5 15:29:08 2006//
++/Makefile/1.1/Sun Jun 4 12:13:05 2006//
++/aica.c/1.5/Wed Jul 12 16:52:06 2006//
++/aica.h/1.4/Wed Jul 12 16:52:06 2006//
++D
+diff -ruN linux-2.6.17-vanilla/sound/sh/CVS/Repository linux-2.6.17/sound/sh/CVS/Repository
+--- linux-2.6.17-vanilla/sound/sh/CVS/Repository 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/sound/sh/CVS/Repository 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1 @@
++linux/sound/sh
+diff -ruN linux-2.6.17-vanilla/sound/sh/CVS/Root linux-2.6.17/sound/sh/CVS/Root
+--- linux-2.6.17-vanilla/sound/sh/CVS/Root 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/sound/sh/CVS/Root 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1 @@
++:pserver:anonymous@linuxsh.cvs.sourceforge.net:/cvsroot/linuxsh
+diff -ruN linux-2.6.17-vanilla/sound/sh/Kconfig linux-2.6.17/sound/sh/Kconfig
+--- linux-2.6.17-vanilla/sound/sh/Kconfig 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/sound/sh/Kconfig 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1,15 @@
++menu "SuperH devices"
++ depends on SND!=n && SUPERH
++
++config SND_AICA
++ tristate "Yamaha AICA sound for SEGA Dreamcast"
++ depends on SND
++ depends on SH_DREAMCAST
++ select SND_PCM
++ help
++ Say Y here to include support for sound on your SEGA Dreamcast
++
++ To compile this driver as a module, choose M here: the module
++ will be called snd-aica.
++
++endmenu
+diff -ruN linux-2.6.17-vanilla/sound/sh/Makefile linux-2.6.17/sound/sh/Makefile
+--- linux-2.6.17-vanilla/sound/sh/Makefile 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/sound/sh/Makefile 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1,4 @@
++
++snd-aica-objs := aica.o
++obj-$(CONFIG_SND_AICA) += snd-aica.o
++
+diff -ruN linux-2.6.17-vanilla/sound/sh/aica.c linux-2.6.17/sound/sh/aica.c
+--- linux-2.6.17-vanilla/sound/sh/aica.c 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/sound/sh/aica.c 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1,711 @@
++/*
++* This code is licenced under
++* the General Public Licence
++* version 2
++*
++* Copyright Adrian McMenamin 2005, 2006
++* <adrian@mcmen.demon.co.uk>
++* See also http://newgolddream.dyndns.info/cgi-bin/cvsweb
++*
++*
++* This program is free software; you can redistribute it and/or modify
++* it under the terms of version 2 of the GNU General Public License as published by
++* the Free Software Foundation.
++*
++* This program is distributed in the hope that it will be useful,
++* but WITHOUT ANY WARRANTY; without even the implied warranty of
++* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++* GNU General Public License for more details.
++*
++* You should have received a copy of the GNU General Public License
++* along with this program; if not, write to the Free Software
++* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++*
++*/
++
++#include <linux/init.h>
++#include <linux/jiffies.h>
++#include <linux/slab.h>
++#include <linux/time.h>
++#include <linux/wait.h>
++#include <linux/moduleparam.h>
++#include <linux/platform_device.h>
++#include <linux/firmware.h>
++#include <linux/timer.h>
++#include <linux/delay.h>
++#include <linux/workqueue.h>
++#include <sound/driver.h>
++#include <sound/core.h>
++#include <sound/control.h>
++#include <sound/pcm.h>
++#include <sound/initval.h>
++#include <sound/info.h>
++#include <asm/io.h>
++#include <asm/dma.h>
++#include "aica.h"
++
++MODULE_AUTHOR("Adrian McMenamin <adrian@mcmen.demon.co.uk>");
++MODULE_DESCRIPTION("Dreamcast AICA sound (pcm) driver");
++MODULE_LICENSE("GPL");
++MODULE_SUPPORTED_DEVICE("{{Yamaha/SEGA, AICA}}");
++
++/* Command values */
++#define AICA_CMD_KICK 0x80000000
++#define AICA_CMD_NONE 0
++#define AICA_CMD_START 1
++#define AICA_CMD_STOP 2
++#define AICA_CMD_VOL 3
++
++/* Sound modes */
++#define SM_8BIT 1
++#define SM_16BIT 0
++#define SM_ADPCM 2
++
++/* Buffer and period size */
++#define AICA_BUFFER_SIZE 0x8000
++#define AICA_PERIOD_SIZE 0x800
++#define AICA_PERIOD_NUMBER 16
++
++#define AICA_CHANNEL0_OFFSET 0x11000
++#define AICA_CHANNEL1_OFFSET 0x21000
++#define CHANNEL_OFFSET 0x10000
++
++#define AICA_DMA_CHANNEL 0
++#define AICA_DMA_MODE 5
++
++#define SND_AICA_DRIVER "AICA"
++
++struct aica_channel {
++ uint32_t cmd; /* Command ID */
++ uint32_t pos; /* Sample position */
++ uint32_t length; /* Sample length */
++ uint32_t freq; /* Frequency */
++ uint32_t vol; /* Volume 0-255 */
++ uint32_t pan; /* Pan 0-255 */
++ uint32_t sfmt; /* Sound format */
++ uint32_t flags; /* Bit flags */
++};
++
++struct snd_card_aica {
++ struct snd_card *card;
++ struct aica_channel *channel;
++ snd_pcm_substream_t *substream;
++ int clicks;
++ int current_period;
++ struct timer_list timer;
++ int master_volume;
++ int dma_started;
++};
++
++/* module parameters */
++#define CARD_NAME "AICA"
++static int index = -1;
++static char *id;
++static int enable = 1;
++module_param(index, int, 0444);
++MODULE_PARM_DESC(index, "Index value for " CARD_NAME " soundcard.");
++module_param(id, charp, 0444);
++MODULE_PARM_DESC(id, "ID string for " CARD_NAME " soundcard.");
++module_param(enable, bool, 0644);
++MODULE_PARM_DESC(enable, "Enable " CARD_NAME " soundcard.");
++
++/* Use workqueue */
++static struct work_struct spu_dma_work;
++static struct workqueue_struct *aica_queue;
++
++/* Simple platform device */
++static struct platform_device *pd;
++static struct resource aica_memory_space[2] = {
++ {
++ .name = "AICA ARM CONTROL",
++ .start = ARM_RESET_REGISTER,
++ .flags = IORESOURCE_MEM,
++ .end = ARM_RESET_REGISTER + 3,
++ },
++ {
++ .name = "AICA Sound RAM",
++ .start = AICA_MEMORY_BASE,
++ .flags = IORESOURCE_MEM,
++ .end = AICA_MEMORY_BASE + AICA_MEMORY_SIZE - 1,
++ },
++};
++
++/* SPU specific functions */
++/* spu_write_wait - wait for G2-SH FIFO to clear */
++static inline void spu_write_wait(void)
++{
++ int time_count;
++ time_count = 0;
++ while (1) {
++ if (!(readl(G2_FIFO) & 0x11))
++ break;
++ /* To ensure hardware failure doesn't wedge kernel */
++ time_count++;
++ if (time_count > 0x10000)
++ break;
++ }
++}
++
++/* spu_memset - write to memory in SPU address space */
++static void spu_memset(uint32_t toi, uint32_t what, int length)
++{
++ int i;
++ snd_assert(length % 4 == 0, return);
++ spu_write_wait();
++ for (i = 0; i < length; i++) {
++ writel(what, toi + AICA_MEMORY_BASE);
++ toi++;
++ if (i && !(i % 8))
++ spu_write_wait();
++ }
++}
++
++/* spu_memload - write to SPU address space */
++static void spu_memload(uint32_t toi, void __iomem * from, int length)
++{
++ uint32_t __iomem *froml = from;
++ uint32_t __iomem *to = (uint32_t __iomem *) (AICA_MEMORY_BASE + toi);
++ int i, val;
++ if (length % 4)
++ length = (length / 4) + 1;
++ else
++ length = length / 4;
++ spu_write_wait();
++ for (i = 0; i < length; i++) {
++ val = *froml;
++ writel(val, to);
++ froml++;
++ to++;
++ if (i && !(i % 8))
++ spu_write_wait();
++ }
++}
++
++/* spu_disable - set spu registers to stop sound output */
++static void spu_disable(void)
++{
++ int i;
++ uint32_t regval;
++ spu_write_wait();
++ regval = readl(ARM_RESET_REGISTER);
++ regval |= 1;
++ spu_write_wait();
++ writel(regval, ARM_RESET_REGISTER);
++ for (i = 0; i < 64; i++) {
++ spu_write_wait();
++ regval = readl(AICA_REGISTER_BASE + (i * 0x80));
++ regval = (regval & ~0x4000) | 0x8000;
++ spu_write_wait();
++ writel(regval, AICA_REGISTER_BASE + (i * 0x80));
++ }
++}
++
++/* spu_enable - set spu registers to enable sound output */
++static void spu_enable(void)
++{
++ uint32_t regval = readl(ARM_RESET_REGISTER);
++ regval &= ~1;
++ spu_write_wait();
++ writel(regval, ARM_RESET_REGISTER);
++}
++
++/*
++ * Halt the sound processor, clear the memory,
++ * load some default ARM7 code, and then restart ARM7
++*/
++static void spu_reset(void)
++{
++ spu_disable();
++ spu_memset(0, 0, 0x200000 / 4);
++ /* Put ARM7 in endless loop */
++ ctrl_outl(0xea000002, AICA_MEMORY_BASE);
++ spu_enable();
++}
++
++/* aica_chn_start - write to spu to start playback */
++static void aica_chn_start(void)
++{
++ spu_write_wait();
++ writel(AICA_CMD_KICK | AICA_CMD_START, (uint32_t *) AICA_CONTROL_POINT);
++}
++
++/* aica_chn_halt - write to spu to halt playback */
++static void aica_chn_halt(void)
++{
++ spu_write_wait();
++ writel(AICA_CMD_KICK | AICA_CMD_STOP, (uint32_t *) AICA_CONTROL_POINT);
++}
++
++/* ALSA code below */
++static struct snd_pcm_hardware snd_pcm_aica_playback_hw = {
++ .info = (SNDRV_PCM_INFO_NONINTERLEAVED),
++ .formats =
++ (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE |
++ SNDRV_PCM_FMTBIT_IMA_ADPCM),
++ .rates = SNDRV_PCM_RATE_8000_48000,
++ .rate_min = 8000,
++ .rate_max = 48000,
++ .channels_min = 1,
++ .channels_max = 2,
++ .buffer_bytes_max = AICA_BUFFER_SIZE,
++ .period_bytes_min = AICA_PERIOD_SIZE,
++ .period_bytes_max = AICA_PERIOD_SIZE,
++ .periods_min = AICA_PERIOD_NUMBER,
++ .periods_max = AICA_PERIOD_NUMBER,
++};
++
++static int aica_dma_transfer(int channels, int buffer_size,
++ struct snd_pcm_substream *substream)
++{
++ int q, err, period_offset;
++ struct snd_card_aica *dreamcastcard;
++ struct snd_pcm_runtime *runtime;
++ err = 0;
++ dreamcastcard = substream->pcm->private_data;
++ period_offset = dreamcastcard->clicks;
++ period_offset %= (AICA_PERIOD_NUMBER / channels);
++ runtime = substream->runtime;
++ for (q = 0; q < channels; q++) {
++ err = dma_xfer(AICA_DMA_CHANNEL,
++ (unsigned long)(runtime->dma_area +
++ (AICA_BUFFER_SIZE * q) /
++ channels +
++ AICA_PERIOD_SIZE *
++ period_offset),
++ AICA_CHANNEL0_OFFSET + q * CHANNEL_OFFSET +
++ AICA_PERIOD_SIZE * period_offset,
++ buffer_size / channels, AICA_DMA_MODE);
++ if (unlikely(err < 0))
++ break;
++ dma_wait_for_completion(AICA_DMA_CHANNEL);
++ }
++ return err;
++}
++
++static void startup_aica(struct snd_card_aica *dreamcastcard)
++{
++ spu_memload(AICA_CHANNEL0_CONTROL_OFFSET,
++ (uint8_t *) dreamcastcard->channel,
++ sizeof(struct aica_channel));
++ aica_chn_start();
++}
++
++
++static void execute_spu_dma(void *sstream)
++{
++ int buffer_size;
++ struct snd_pcm_substream *substream;
++ struct snd_pcm_runtime *runtime;
++ struct snd_card_aica *dreamcastcard;
++ substream = sstream;
++ dreamcastcard = substream->pcm->private_data;
++ runtime = substream->runtime;
++ if (unlikely(dreamcastcard->dma_started == 0))
++ {
++ buffer_size = frames_to_bytes(runtime, runtime->buffer_size);
++ if (runtime->channels > 1)
++ dreamcastcard->channel->flags |= 0x01;
++ aica_dma_transfer(runtime->channels, buffer_size, substream);
++ startup_aica(dreamcastcard);
++ dreamcastcard->clicks =
++ buffer_size / (AICA_PERIOD_SIZE * runtime->channels);
++ dreamcastcard->dma_started = 1;
++ }
++ else
++ {
++ aica_dma_transfer(runtime->channels,
++ AICA_PERIOD_SIZE * runtime->channels, substream);
++ snd_pcm_period_elapsed(dreamcastcard->substream);
++ dreamcastcard->clicks++;
++ dreamcastcard->clicks %= AICA_PERIOD_NUMBER;
++ mod_timer(&dreamcastcard->timer, jiffies+1);
++ }
++
++}
++
++static void aica_period_elapsed(unsigned long timer_var)
++{
++ /*timer fuction - so cannot sleep */
++ int play_period;
++ struct snd_pcm_runtime *runtime;
++ struct snd_pcm_substream *substream;
++ struct snd_card_aica *dreamcastcard;
++ substream = (struct snd_pcm_substream *)timer_var;
++ runtime = substream->runtime;
++ dreamcastcard = substream->pcm->private_data;
++ /* Have we played out an additional period? */
++ play_period =
++ frames_to_bytes(runtime,
++ readl
++ (AICA_CONTROL_CHANNEL_SAMPLE_NUMBER)) /
++ AICA_PERIOD_SIZE;
++ if (play_period == dreamcastcard->current_period) {
++ /* reschedule the timer */
++ mod_timer(&dreamcastcard->timer, jiffies+1);
++ return;
++ }
++ if (runtime->channels > 1)
++ dreamcastcard->current_period = play_period;
++ queue_work(aica_queue, &spu_dma_work);
++}
++
++static int snd_aicapcm_pcm_open(struct snd_pcm_substream
++ *substream)
++{
++ struct snd_pcm_runtime *runtime;
++ struct aica_channel *channel;
++ struct snd_card_aica *dreamcastcard;
++ if (!enable)
++ return -ENOENT;
++ dreamcastcard = substream->pcm->private_data;
++ channel = kmalloc(sizeof(struct aica_channel), GFP_KERNEL);
++ if (!channel)
++ return -ENOMEM;
++ /* set defaults for channel */
++ channel->sfmt = SM_8BIT;
++ channel->cmd = AICA_CMD_START;
++ channel->vol = dreamcastcard->master_volume;
++ channel->pan = 0x80;
++ channel->pos = 0;
++ channel->flags = 0; /* default to mono */
++ dreamcastcard->channel = channel;
++ runtime = substream->runtime;
++ runtime->hw = snd_pcm_aica_playback_hw;
++ spu_enable();
++ dreamcastcard->clicks = 0;
++ dreamcastcard->current_period = 0;
++ dreamcastcard->dma_started = 0;
++ return 0;
++}
++
++static int snd_aicapcm_pcm_close(struct snd_pcm_substream
++ *substream)
++{
++ struct snd_card_aica *dreamcastcard = substream->pcm->private_data;
++ del_timer(&dreamcastcard->timer);
++ kfree(dreamcastcard->channel);
++ spu_disable();
++ return 0;
++}
++
++static int snd_aicapcm_pcm_hw_free(struct snd_pcm_substream
++ *substream)
++{
++ /* Free the DMA buffer */
++ return snd_pcm_lib_free_pages(substream);
++}
++
++static int snd_aicapcm_pcm_hw_params(struct snd_pcm_substream
++ *substream, struct snd_pcm_hw_params
++ *hw_params)
++{
++ /* Allocate a DMA buffer using ALSA built-ins */
++ return
++ snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
++}
++
++static int snd_aicapcm_pcm_prepare(struct snd_pcm_substream
++ *substream)
++{
++ struct snd_card_aica *dreamcastcard = substream->pcm->private_data;
++ if ((substream->runtime)->format == SNDRV_PCM_FORMAT_S16_LE)
++ dreamcastcard->channel->sfmt = SM_16BIT;
++ dreamcastcard->channel->freq = substream->runtime->rate;
++ dreamcastcard->substream = substream;
++ return 0;
++}
++
++
++
++static void spu_begin_dma(struct snd_pcm_substream *substream)
++{
++ /* Must be atomic */
++ struct snd_card_aica *dreamcastcard;
++ struct snd_pcm_runtime *runtime;
++ runtime = substream->runtime;
++ dreamcastcard = substream->pcm->private_data;
++ /* Use queue to do the heavy lifting */
++ INIT_WORK(&spu_dma_work, execute_spu_dma, substream);
++ queue_work(aica_queue, &spu_dma_work);
++ init_timer(&(dreamcastcard->timer));
++ dreamcastcard->timer.data = (unsigned long)substream;
++ dreamcastcard->timer.function = aica_period_elapsed;
++ dreamcastcard->timer.expires = jiffies + 4;
++ add_timer(&(dreamcastcard->timer));
++}
++
++static int snd_aicapcm_pcm_trigger(struct snd_pcm_substream
++ *substream, int cmd)
++{
++ struct snd_card_aica *dreamcastcard;
++ switch (cmd) {
++ case SNDRV_PCM_TRIGGER_START:
++ spu_begin_dma(substream);
++ break;
++ case SNDRV_PCM_TRIGGER_STOP:
++ dreamcastcard = substream->pcm->private_data;
++ if (dreamcastcard->timer.data)
++ del_timer(&dreamcastcard->timer);
++ aica_chn_halt();
++ break;
++ default:
++ return -EINVAL;
++ }
++ return 0;
++}
++
++static unsigned long snd_aicapcm_pcm_pointer(struct snd_pcm_substream
++ *substream)
++{
++ return readl(AICA_CONTROL_CHANNEL_SAMPLE_NUMBER);
++}
++
++static struct snd_pcm_ops snd_aicapcm_playback_ops = {
++ .open = snd_aicapcm_pcm_open,
++ .close = snd_aicapcm_pcm_close,
++ .ioctl = snd_pcm_lib_ioctl,
++ .hw_params = snd_aicapcm_pcm_hw_params,
++ .hw_free = snd_aicapcm_pcm_hw_free,
++ .prepare = snd_aicapcm_pcm_prepare,
++ .trigger = snd_aicapcm_pcm_trigger,
++ .pointer = snd_aicapcm_pcm_pointer,
++};
++
++/* TO DO: set up to handle more than one pcm instance */
++static int __init snd_aicapcmchip(struct snd_card_aica
++ *dreamcastcard, int pcm_index)
++{
++ struct snd_pcm *pcm;
++ int err;
++ /* AICA has no capture ability */
++ err =
++ snd_pcm_new(dreamcastcard->card, "AICA PCM", pcm_index, 1, 0, &pcm);
++ if (unlikely(err < 0))
++ return err;
++ pcm->private_data = dreamcastcard;
++ strcpy(pcm->name, "AICA PCM");
++ snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
++ &snd_aicapcm_playback_ops);
++ /* Allocate the DMA buffers */
++ err =
++ snd_pcm_lib_preallocate_pages_for_all(pcm,
++ SNDRV_DMA_TYPE_CONTINUOUS,
++ snd_dma_continuous_data
++ (GFP_KERNEL),
++ AICA_BUFFER_SIZE,
++ AICA_BUFFER_SIZE);
++ return err;
++}
++
++/* Mixer controls */
++static int aica_pcmswitch_info(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_info *uinfo)
++{
++ uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
++ uinfo->count = 1;
++ uinfo->value.integer.min = 0;
++ uinfo->value.integer.max = 1;
++ return 0;
++}
++
++static int aica_pcmswitch_get(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ ucontrol->value.integer.value[0] = 1; /* TO DO: Fix me */
++ return 0;
++}
++
++static int aica_pcmswitch_put(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ if (ucontrol->value.integer.value[0] == 1)
++ return 0; /* TO DO: Fix me */
++ else
++ aica_chn_halt();
++ return 0;
++}
++
++static int aica_pcmvolume_info(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_info *uinfo)
++{
++ uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
++ uinfo->count = 1;
++ uinfo->value.integer.min = 0;
++ uinfo->value.integer.max = 0xFF;
++ return 0;
++}
++
++static int aica_pcmvolume_get(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct snd_card_aica *dreamcastcard;
++ dreamcastcard = kcontrol->private_data;
++ if (unlikely(!dreamcastcard->channel))
++ return -ETXTBSY; /* we've not yet been set up */
++ ucontrol->value.integer.value[0] = dreamcastcard->channel->vol;
++ return 0;
++}
++
++static int aica_pcmvolume_put(struct snd_kcontrol *kcontrol,
++ struct snd_ctl_elem_value *ucontrol)
++{
++ struct snd_card_aica *dreamcastcard;
++ dreamcastcard = kcontrol->private_data;
++ if (unlikely(!dreamcastcard->channel))
++ return -ETXTBSY;
++ if (unlikely(dreamcastcard->channel->vol ==
++ ucontrol->value.integer.value[0]))
++ return 0;
++ dreamcastcard->channel->vol = ucontrol->value.integer.value[0];
++ dreamcastcard->master_volume = ucontrol->value.integer.value[0];
++ spu_memload(AICA_CHANNEL0_CONTROL_OFFSET,
++ (uint8_t *) dreamcastcard->channel,
++ sizeof(struct aica_channel));
++
++ return 1;
++}
++
++static struct snd_kcontrol_new snd_aica_pcmswitch_control __devinitdata = {
++ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
++ .name = "PCM Playback Switch",
++ .index = 0,
++ .info = aica_pcmswitch_info,
++ .get = aica_pcmswitch_get,
++ .put = aica_pcmswitch_put
++};
++
++static struct snd_kcontrol_new snd_aica_pcmvolume_control __devinitdata = {
++ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
++ .name = "PCM Playback Volume",
++ .index = 0,
++ .info = aica_pcmvolume_info,
++ .get = aica_pcmvolume_get,
++ .put = aica_pcmvolume_put
++};
++
++static int load_aica_firmware(void)
++{
++ int err;
++ const struct firmware *fw_entry;
++ err = 0;
++ spu_reset();
++ err = request_firmware(&fw_entry, "aica_firmware.bin", &pd->dev);
++ if (unlikely(err))
++ return err;
++ /* write firware into memory */
++ spu_disable();
++ spu_memload(0, fw_entry->data, fw_entry->size);
++ spu_enable();
++ release_firmware(fw_entry);
++ return err;
++}
++
++static int __devinit add_aicamixer_controls(struct snd_card_aica
++ *dreamcastcard)
++{
++ int err;
++ err = snd_ctl_add
++ (dreamcastcard->card,
++ snd_ctl_new1(&snd_aica_pcmvolume_control, dreamcastcard));
++ if (unlikely(err < 0))
++ return err;
++ err = snd_ctl_add
++ (dreamcastcard->card,
++ snd_ctl_new1(&snd_aica_pcmswitch_control, dreamcastcard));
++ if (unlikely(err < 0))
++ return err;
++ return 0;
++}
++
++static int snd_aica_remove(struct platform_device *devptr)
++{
++ snd_card_free(platform_get_drvdata(devptr));
++ platform_set_drvdata(devptr, NULL);
++ return 0;
++}
++
++static int __init snd_aica_probe(struct platform_device *devptr)
++{
++ int err;
++ struct snd_card_aica *dreamcastcard;
++
++ dreamcastcard = kmalloc(sizeof(struct snd_card_aica), GFP_KERNEL);
++ if (unlikely(!dreamcastcard))
++ return -ENOMEM;
++ dreamcastcard->card =
++ snd_card_new(index, SND_AICA_DRIVER, THIS_MODULE, 0);
++ if (unlikely(!dreamcastcard->card)) {
++ kfree(dreamcastcard);
++ return -ENODEV;
++ }
++ strcpy(dreamcastcard->card->driver, "snd_aica");
++ strcpy(dreamcastcard->card->shortname, SND_AICA_DRIVER);
++ strcpy(dreamcastcard->card->longname,
++ "Yamaha AICA Super Intelligent Sound Processor for SEGA Dreamcast");
++ /* Load the PCM 'chip' */
++ err = snd_aicapcmchip(dreamcastcard, 0);
++ if (unlikely(err < 0))
++ goto freedreamcast;
++ snd_card_set_dev(dreamcastcard->card, &devptr->dev);
++ dreamcastcard->channel = NULL;
++ /* Add basic controls */
++ err = add_aicamixer_controls(dreamcastcard);
++ if (unlikely(err < 0))
++ goto freedreamcast;
++ /* Register the card with ALSA subsystem */
++ err = snd_card_register(dreamcastcard->card);
++ if (unlikely(err < 0))
++ goto freedreamcast;
++ platform_set_drvdata(devptr, dreamcastcard->card);
++ aica_queue = create_workqueue("aica");
++ if (unlikely(!aica_queue))
++ goto freedreamcast;
++ snd_printk
++ ("ALSA Driver for Yamaha AICA Super Intelligent Sound Processor\n");
++ return 0;
++ freedreamcast:
++ snd_card_free(dreamcastcard->card);
++ kfree(dreamcastcard);
++ return err;
++}
++
++static struct platform_driver snd_aica_driver = {
++ .probe = snd_aica_probe,
++ .remove = snd_aica_remove,
++ .driver = {
++ .name = SND_AICA_DRIVER
++ },
++};
++
++static int __init aica_init(void) {
++ int err;
++ err = platform_driver_register(&snd_aica_driver);
++ if (unlikely(err < 0)) return err;
++ pd = platform_device_register_simple(SND_AICA_DRIVER, -1,
++ aica_memory_space, 2);
++ if (unlikely(IS_ERR(pd))) {
++ platform_driver_unregister(&snd_aica_driver);
++ return PTR_ERR(pd);
++ }
++ err = load_aica_firmware();
++ if (unlikely(err < 0)) {
++ platform_driver_unregister(&snd_aica_driver);
++ platform_device_unregister(pd);
++ return err;
++ }
++ return 0;
++}
++
++static void __exit aica_exit(void)
++{
++ /* Flush and destroy the aica kernel thread */
++ destroy_workqueue(aica_queue);
++ platform_device_unregister(pd);
++ platform_driver_unregister(&snd_aica_driver);
++ /* Kill any sound still playing and reset ARM7 to safe state */
++ spu_reset();
++}
++
++module_init(aica_init);
++module_exit(aica_exit);
++
+diff -ruN linux-2.6.17-vanilla/sound/sh/aica.h linux-2.6.17/sound/sh/aica.h
+--- linux-2.6.17-vanilla/sound/sh/aica.h 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.17/sound/sh/aica.h 2006-07-12 16:54:27.000000000 +0000
+@@ -0,0 +1,44 @@
++/*
++* This code is licenced under
++* the General Public Licence
++* version 2
++*
++* Copyright Adrian McMenamin 2006
++* <adrian@mcmen.demon.co.uk>
++* See also http://newgolddream.dyndns.info/cgi-bin/cvsweb
++*
++*
++* This program is free software; you can redistribute it and/or modify
++* it under the terms of version 2 of the GNU General Public License as published by
++* the Free Software Foundation.
++*
++* This program is distributed in the hope that it will be useful,
++* but WITHOUT ANY WARRANTY; without even the implied warranty of
++* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++* GNU General Public License for more details.
++*
++* You should have received a copy of the GNU General Public License
++* along with this program; if not, write to the Free Software
++* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++*
++*/
++
++#ifndef _ASM_DREAMCAST_AICA
++#define _ASM_DREAMCAST_AICA
++
++#ifdef MACH_DREAMCAST
++/* SPU memory and register constants etc */
++#define G2_FIFO 0xa05f688c
++#define AICA_MEMORY_BASE 0xA0800000
++#define ARM_RESET_REGISTER 0xA0702C00
++#define AICA_REGISTER_BASE 0xA0700000
++
++/* AICA channels stuff */
++#define AICA_CONTROL_POINT 0xA0810000
++#define AICA_CONTROL_CHANNEL_SAMPLE_NUMBER 0xA0810008
++#define AICA_MEMORY_SIZE 0x200000
++#define AICA_CHANNEL0_CONTROL_OFFSET 0x10004
++#endif
++
++#endif
++
+--- linux-2.6.17-vanilla/scripts/mod/sumversion.c 2006-06-18 04:49:35.000000000 +0300
++++ linux-2.6.17/scripts/mod/sumversion.c 2009-12-21 14:43:12.396274319 +0200
+@@ -36,6 +36,8 @@
+ #define MD4_BLOCK_WORDS 16
+ #define MD4_HASH_WORDS 4
+
++#define PATH_MAX 4096 /* # chars in a path name including nul */
++
+ struct md4_ctx {
+ uint32_t hash[MD4_HASH_WORDS];
+ uint32_t block[MD4_BLOCK_WORDS];
diff --git a/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/alsa_hp6xx_2.6.17.patch b/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/alsa_hp6xx_2.6.17.patch
new file mode 100644
index 0000000..bca97bc
--- /dev/null
+++ b/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/alsa_hp6xx_2.6.17.patch
@@ -0,0 +1,636 @@
+diff -up linux-2.6.17/sound/sh/Kconfig linux-2.6.17.alsa/sound/sh/Kconfig
+--- linux-2.6.17/sound/sh/Kconfig 2009-04-05 12:58:14.000000000 -0300
++++ linux-2.6.17.alsa/sound/sh/Kconfig 2009-04-05 11:41:34.000000000 -0300
+@@ -12,4 +12,13 @@ config SND_AICA
+ To compile this driver as a module, choose M here: the module
+ will be called snd-aica.
+
++config SND_SH_DAC_AUDIO
++ tristate "SuperH DAC audio support"
++ depends on SND
++ depends on CPU_SH3
++ select SND_PCM
++ help
++ Alsa Sound driver for the HP Jornada 680/690 and
++ HP Palmtop 620lx/660lx.
++
+ endmenu
+diff -up linux-2.6.17/sound/sh/Makefile linux-2.6.17.alsa/sound/sh/Makefile
+--- linux-2.6.17/sound/sh/Makefile 2009-04-05 12:58:14.000000000 -0300
++++ linux-2.6.17.alsa/sound/sh/Makefile 2009-04-05 11:41:34.000000000 -0300
+@@ -1,4 +1,4 @@
+
+ snd-aica-objs := aica.o
+ obj-$(CONFIG_SND_AICA) += snd-aica.o
+-
++obj-$(CONFIG_SND_SH_DAC_AUDIO) += snd_sh_dac_audio.o
+diff -up linux-2.6.17/sound/sh/snd_sh_dac_audio.c linux-2.6.17.alsa/sound/sh/snd_sh_dac_audio.c
+--- linux-2.6.17/sound/sh/snd_sh_dac_audio.c 2009-04-05 13:00:51.000000000 -0300
++++ linux-2.6.17.alsa/sound/sh/snd_sh_dac_audio.c 2009-04-05 12:24:23.000000000 -0300
+@@ -0,0 +1,606 @@
++/*
++ * snd_sh_dac_audio.c - SuperH DAC audio driver for ALSA
++ *
++ * Copyright (c) 2007 by Rafael Ignacio Zurita <rizurita@yahoo.com>
++ *
++ *
++ * Based completely on sh_dac_audio.c (Copyright (C) 2004,2005 by Andriy
++ * Skulysh) and "Writing an ALSA driver" (Copyright (c) 2002-2005 by Takashi
++ * Iwai <tiwai@suse.de>).
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
++ *
++ */
++
++#include <linux/interrupt.h>
++#include <linux/platform_device.h>
++#include <sound/driver.h>
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/initval.h>
++#include <asm/io.h>
++#include <asm/clock.h>
++#include <asm/cpu-sh3/dac.h>
++#include <asm/hp6xx/hp6xx.h>
++#include <asm/irq.h>
++#include <asm/hd64461.h>
++
++MODULE_AUTHOR("Rafael Ignacio Zurita <rizurita@yahoo.com>");
++MODULE_DESCRIPTION("SuperH DAC audio driver");
++MODULE_LICENSE("GPL");
++MODULE_SUPPORTED_DEVICE("{{SuperH DAC audio support}}");
++
++/* Module Parameters */
++static int index = SNDRV_DEFAULT_IDX1;
++static char *id = SNDRV_DEFAULT_STR1;
++module_param(index, int, 0444);
++MODULE_PARM_DESC(index, "Index value for SuperH DAC audio.");
++module_param(id, charp, 0444);
++MODULE_PARM_DESC(id, "ID string for SuperH DAC audio.");
++
++/* Simple platform device */
++static struct platform_device *pd;
++
++#define SND_SH_DAC_DRIVER "SH_DAC"
++#define BUFFER_SIZE 64000
++#define SH_DAC_AUDIO_CHANNEL 1
++
++#define HD64461_TMU_TIMR_TMU0 0x01
++#define HD64461_TMU_TIDR (CONFIG_HD64461_IOBASE + 0x600e)
++#define HD64461_TMU_TIRR_TMU0 0x01
++#define HD64461_TMU_TIRR (CONFIG_HD64461_IOBASE + 0x600c)
++#define HD64461_TMU_TCVR0 (CONFIG_HD64461_IOBASE + 0x6002)
++#define PKDR_SPEAKER 0x20
++#define PKDR 0xa4000132
++#define HD64461_GPADR_SPEAKER 0x01
++#define HD64461_TMU_TCR0 (CONFIG_HD64461_IOBASE + 0x600a)
++#define HD64461_TMU_TCR_STRT 0x01 /* Start Counting */
++
++
++/* main struct */
++struct snd_sh_dac {
++ struct snd_card *card;
++ struct snd_pcm_substream *substream;
++ int irq;
++
++ int rate;
++ int empty;
++ char *data_buffer, *buffer_begin, *buffer_end;
++ int processed; /* bytes proccesed, to compare with period_size */
++ int buffer_size;
++};
++
++
++/*
++ * Hardware functions (timer, DAC, speaker)
++ * Note: The driver uses a hd64461 timer
++ */
++
++static void dac_audio_start_timer(void)
++{
++ u16 tmu_tcr;
++
++ /*printk("dac_audio_start_timer\n"); */
++ /* Start HD64461 timer 0 countdown */
++ tmu_tcr = inb(HD64461_TMU_TCR0);
++ tmu_tcr |= HD64461_TMU_TCR_STRT;
++ outb(tmu_tcr, HD64461_TMU_TCR0);
++}
++
++static void dac_audio_stop_timer(void)
++{
++ u16 tmu_tcr;
++
++ /*printk("dac_audio_stop_timer\n"); */
++ /* Stop HD64461 timer 0 countdown */
++ tmu_tcr = inb(HD64461_TMU_TCR0);
++ tmu_tcr &= ~HD64461_TMU_TCR_STRT;
++ outb(tmu_tcr, HD64461_TMU_TCR0);
++}
++
++static void dac_audio_reset(struct snd_sh_dac *chip)
++{
++ /*printk("dac_audio_reset\n"); */
++ dac_audio_stop_timer();
++
++ chip->buffer_begin = chip->buffer_end = chip->data_buffer;
++ chip->processed = 0;
++ chip->empty = 1;
++}
++
++static void dac_audio_sync(struct snd_sh_dac *chip)
++{
++ /*printk("dac_audio_sync\n"); */
++ while (!chip->empty)
++ schedule();
++}
++
++static void dac_audio_start(void)
++{
++ u16 v;
++ u8 v8;
++
++ /*printk("dac_audio_start\n"); */
++ if (mach_is_hp6xx()) {
++ /* HP Jornada 680/690 speaker on */
++ v = inw(HD64461_GPADR);
++ v &= ~HD64461_GPADR_SPEAKER;
++ outw(v, HD64461_GPADR);
++
++ /* HP Palmtop 620lx/660lx speaker on */
++ v8 = inb(PKDR);
++ v8 &= ~PKDR_SPEAKER;
++ outb(v8, PKDR);
++ }
++
++ sh_dac_enable(SH_DAC_AUDIO_CHANNEL);
++}
++
++static void dac_audio_stop(void)
++{
++ u16 v;
++ u8 v8;
++
++ /*printk("dac_audio_stop\n"); */
++ dac_audio_stop_timer();
++
++ if (mach_is_hp6xx()) {
++ /* HP Jornada 680/690 speaker off */
++ v = inw(HD64461_GPADR);
++ v |= HD64461_GPADR_SPEAKER;
++ outw(v, HD64461_GPADR);
++
++ /* HP Palmtop 620lx/660lx speaker off */
++ v8 = inb(PKDR);
++ v8 |= PKDR_SPEAKER;
++ outb(v8, PKDR);
++ }
++
++ sh_dac_output(0, SH_DAC_AUDIO_CHANNEL);
++ sh_dac_disable(SH_DAC_AUDIO_CHANNEL);
++}
++
++static void dac_audio_set_rate(int rate)
++{
++ unsigned long interval;
++ struct clk *clk;
++
++ /*printk("dac_audio_set_rate\n"); */
++ /*
++ * Constant is autoloaded once zero is reached
++ * We need 8K interrupts per second
++ */
++ /* clk = clk_get(NULL, "module_clk"); */
++ clk = clk_get("module_clk");
++ interval = (clk_get_rate(clk) / 16) / rate;
++ ctrl_outl(interval, HD64461_TMU_TCVR0);
++}
++
++/* end of the hardware functions */
++
++
++/* PCM INTERFACE */
++
++static struct snd_pcm_hardware snd_sh_dac_pcm_hw = {
++ .info = (SNDRV_PCM_INFO_MMAP |
++ SNDRV_PCM_INFO_MMAP_VALID |
++ SNDRV_PCM_INFO_INTERLEAVED |
++ SNDRV_PCM_INFO_HALF_DUPLEX),
++ .formats = SNDRV_PCM_FMTBIT_U8,
++ .rates = SNDRV_PCM_RATE_8000,
++ .rate_min = 8000,
++ .rate_max = 8000,
++ .channels_min = 1,
++ .channels_max = 1,
++ .buffer_bytes_max = (48*1024),
++ .period_bytes_min = 1,
++ .period_bytes_max = (48*1024),
++ .periods_min = 1,
++ .periods_max = 1024,
++};
++
++static int snd_sh_dac_pcm_open(struct snd_pcm_substream *substream)
++{
++ struct snd_sh_dac *chip = snd_pcm_substream_chip(substream);
++ struct snd_pcm_runtime *runtime = substream->runtime;
++
++ /*printk("snd_sh_dac_pcm_open\n"); */
++ runtime->hw = snd_sh_dac_pcm_hw;
++
++ chip->substream = substream;
++ chip->buffer_begin = chip->buffer_end = chip->data_buffer;
++ chip->processed = 0;
++ chip->empty = 1;
++
++ dac_audio_start();
++
++ return 0;
++}
++
++static int snd_sh_dac_pcm_close(struct snd_pcm_substream *substream)
++{
++ struct snd_sh_dac *chip = snd_pcm_substream_chip(substream);
++
++ /*printk("snd_sh_dac_pcm_close\n"); */
++ dac_audio_sync(chip);
++ dac_audio_stop();
++
++ return 0;
++}
++
++static int snd_sh_dac_pcm_hw_params(struct snd_pcm_substream *substream,
++ struct snd_pcm_hw_params *hw_params)
++{
++ /*printk("snd_sh_dac_pcm_hw_params\n"); */
++ return
++ snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
++}
++
++static int snd_sh_dac_pcm_hw_free(struct snd_pcm_substream *substream)
++{
++ /*printk("snd_sh_dac_pcm_hw_free\n"); */
++ /* Free the buffer */
++ return snd_pcm_lib_free_pages(substream);
++}
++
++static int snd_sh_dac_pcm_prepare(struct snd_pcm_substream *substream)
++{
++ struct snd_sh_dac *chip = snd_pcm_substream_chip(substream);
++ struct snd_pcm_runtime *runtime = chip->substream->runtime;
++ /*printk("snd_sh_dac_pcm_prepare\n"); */
++ chip->buffer_size = runtime->buffer_size;
++ memset(chip->data_buffer, 0, BUFFER_SIZE);
++ return 0;
++}
++
++static int snd_sh_dac_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
++{
++ struct snd_sh_dac *chip = snd_pcm_substream_chip(substream);
++ /*printk("snd_sh_dac_pcm_trigger\n"); */
++ switch (cmd) {
++ case SNDRV_PCM_TRIGGER_START:
++ dac_audio_start_timer();
++ break;
++ case SNDRV_PCM_TRIGGER_STOP:
++ chip->buffer_begin = chip->buffer_end = chip->data_buffer;
++ chip->processed = 0;
++ chip->empty = 1;
++ dac_audio_stop_timer();
++ break;
++ default:
++ return -EINVAL;
++ }
++ return 0;
++}
++
++static int snd_sh_dac_pcm_copy(struct snd_pcm_substream *substream, int channel,
++ snd_pcm_uframes_t pos, void __user *src, snd_pcm_uframes_t count)
++{
++ /* channel is not used (interleaved data) */
++ struct snd_sh_dac *chip = snd_pcm_substream_chip(substream);
++ struct snd_pcm_runtime *runtime = substream->runtime;
++ ssize_t b_count = frames_to_bytes(runtime , count);
++ ssize_t b_pos = frames_to_bytes(runtime , pos);
++
++ /*printk("snd_sh_dac_pcm_copy\n"); */
++ if (count < 0)
++ return -EINVAL;
++
++ if (!count) {
++ dac_audio_sync(chip);
++ return 0;
++ }
++
++ memcpy_toio(chip->data_buffer + b_pos, src, b_count);
++ chip->buffer_end = chip->data_buffer + b_pos + b_count;
++
++ if (chip->empty) {
++ chip->empty = 0;
++ dac_audio_start_timer();
++ }
++
++ return 0;
++}
++
++static int snd_sh_dac_pcm_silence(struct snd_pcm_substream *substream,
++ int channel, snd_pcm_uframes_t pos,
++ snd_pcm_uframes_t count)
++{
++ /* channel is not used (interleaved data) */
++ struct snd_sh_dac *chip = snd_pcm_substream_chip(substream);
++ struct snd_pcm_runtime *runtime = substream->runtime;
++ ssize_t b_count = frames_to_bytes(runtime , count);
++ ssize_t b_pos = frames_to_bytes(runtime , pos);
++
++ /*printk("snd_sh_dac_pcm_silence\n"); */
++ if (count < 0)
++ return -EINVAL;
++
++ if (!count) {
++ dac_audio_sync(chip);
++ return 0;
++ }
++
++ memset_io(chip->data_buffer + b_pos, 0, b_count);
++ chip->buffer_end = chip->data_buffer + b_pos + b_count;
++
++ if (chip->empty) {
++ chip->empty = 0;
++ dac_audio_start_timer();
++ }
++ return 0;
++}
++
++static snd_pcm_uframes_t snd_sh_dac_pcm_pointer(struct snd_pcm_substream *substream)
++{
++ struct snd_sh_dac *chip = snd_pcm_substream_chip(substream);
++ int pointer = chip->buffer_begin - chip->data_buffer;
++
++ /*printk("snd_pcm_uframes_t \n"); */
++ return pointer;
++}
++
++/* pcm ops */
++static struct snd_pcm_ops snd_sh_dac_pcm_ops = {
++ .open = snd_sh_dac_pcm_open,
++ .close = snd_sh_dac_pcm_close,
++ .ioctl = snd_pcm_lib_ioctl,
++ .hw_params = snd_sh_dac_pcm_hw_params,
++ .hw_free = snd_sh_dac_pcm_hw_free,
++ .prepare = snd_sh_dac_pcm_prepare,
++ .trigger = snd_sh_dac_pcm_trigger,
++ .pointer = snd_sh_dac_pcm_pointer,
++ .copy = snd_sh_dac_pcm_copy,
++ .silence = snd_sh_dac_pcm_silence,
++ .mmap = snd_pcm_lib_mmap_iomem,
++};
++
++static int __devinit snd_sh_dac_pcm(struct snd_sh_dac *chip, int device)
++{
++ int err;
++ struct snd_pcm *pcm;
++ /*printk("snd_sh_dac_pcm\n"); */
++ /* device should be always 0 for us */
++ err = snd_pcm_new(chip->card, "SH_DAC PCM", device, 1, 0, &pcm);
++ if (err < 0)
++ return err;
++ pcm->private_data = chip;
++ strcpy(pcm->name, "SH_DAC PCM");
++ snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_sh_dac_pcm_ops);
++
++ /* buffer size=48K */
++ snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS,
++ snd_dma_continuous_data(GFP_KERNEL),
++ 48 * 1024,
++ 48 * 1024);
++ return 0;
++}
++/* END OF PCM INTERFACE */
++
++
++/* driver .remove -- destructor */
++static int snd_sh_dac_remove(struct platform_device *devptr)
++{
++ /*printk("snd_sh_dac_remove\n"); */
++ snd_card_free(platform_get_drvdata(devptr));
++ platform_set_drvdata(devptr, NULL);
++ return 0;
++}
++
++/* free -- it has been defined by create */
++static int snd_sh_dac_free(struct snd_sh_dac *chip)
++{
++ /*printk("snd_sh_dac_free\n"); */
++ /* release the irq */
++ free_irq(chip->irq, (void *)chip);
++
++ /* release the data */
++ kfree(chip->data_buffer);
++ kfree(chip);
++
++ return 0;
++}
++
++static int snd_sh_dac_dev_free(struct snd_device *device)
++{
++ struct snd_sh_dac *chip = device->device_data;
++ /*printk("snd_sh_dac_dev_free\n"); */
++ return snd_sh_dac_free(chip);
++}
++
++static irqreturn_t snd_sh_dac_interrupt(int irq, void *pdev, struct pt_regs *regs)
++{
++ u16 timer_status;
++ struct snd_sh_dac *chip = (struct snd_sh_dac *) pdev;
++ struct snd_pcm_runtime *runtime = chip->substream->runtime;
++ ssize_t b_ps = frames_to_bytes(runtime, runtime->period_size);
++
++/* printk("snd_sh_dac_interrupt\n"); */
++ /* HD64461_TMU0 mask interrupt */
++ timer_status = inw(HD64461_TMU_TIRR);
++ timer_status &= ~HD64461_TMU_TIRR_TMU0;
++ outw(timer_status, HD64461_TMU_TIRR);
++
++ if (!chip->empty) {
++ sh_dac_output(*chip->buffer_begin, SH_DAC_AUDIO_CHANNEL);
++ chip->buffer_begin++;
++ chip->processed++;
++
++ if (chip->processed >= b_ps) {
++ chip->processed -= b_ps;
++ snd_pcm_period_elapsed(chip->substream);
++ }
++
++ if (chip->buffer_begin == (chip->data_buffer +
++ chip->buffer_size - 1))
++ chip->buffer_begin = chip->data_buffer;
++
++ if (chip->buffer_begin == chip->buffer_end) {
++ chip->empty = 1;
++ dac_audio_stop_timer();
++ }
++
++ }
++ return IRQ_HANDLED;
++}
++
++/* create -- chip-specific constructor for the cards components */
++static int __devinit snd_sh_dac_create(struct snd_card *card,
++ struct platform_device *devptr,
++ struct snd_sh_dac **rchip)
++{
++ struct snd_sh_dac *chip;
++ int err;
++ u16 timer_status;
++ u16 hd64461_stbcr;
++
++ static struct snd_device_ops ops = {
++ .dev_free = snd_sh_dac_dev_free,
++ };
++
++ /*printk("snd_sh_dac_create\n"); */
++ *rchip = NULL;
++
++ chip = kzalloc(sizeof(*chip), GFP_KERNEL);
++ if (chip == NULL)
++ return -ENOMEM;
++
++ /* initialize the stuff */
++ chip->card = card;
++ chip->irq = -1;
++
++ /* Hardware Initialization */
++ /* get standby status of all devices */
++ hd64461_stbcr = inw(HD64461_STBCR);
++ /* remove standby mode for timer 0 */
++ hd64461_stbcr &= ~HD64461_STBCR_STM0ST;
++ outw(hd64461_stbcr, HD64461_STBCR);
++
++ dac_audio_reset(chip);
++ chip->rate = 8000;
++ dac_audio_set_rate(chip->rate);
++
++ /* set bit interrupt service request */
++ timer_status = inw(HD64461_TMU_TIRR);
++ timer_status &= ~HD64461_TMU_TIRR_TMU0;
++ outw(timer_status, HD64461_TMU_TIRR);
++
++ /* set interrupt service request mask bit */
++ timer_status = inw(HD64461_TMU_TIDR);
++ timer_status &= ~HD64461_TMU_TIMR_TMU0;
++ outw(timer_status, HD64461_TMU_TIDR);
++
++ chip->data_buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL);
++ if (chip->data_buffer == NULL)
++ return -ENOMEM;
++
++ /* if (request_irq(HD64461_IRQ_TMU0, snd_sh_dac_interrupt, IRQF_DISABLED, */
++ if (request_irq(HD64461_IRQ_TMU0, snd_sh_dac_interrupt, SA_INTERRUPT,
++ "snd_sh_dac", (void *)chip)) {
++ snd_sh_dac_free(chip);
++ printk(KERN_ERR "cannot grab irq\n");
++ return -EBUSY;
++ }
++ chip->irq = HD64461_IRQ_TMU0;
++
++ if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
++ snd_sh_dac_free(chip);
++ return err;
++ }
++ *rchip = chip;
++
++ return 0;
++}
++
++/* driver .probe -- constructor */
++static int __devinit snd_sh_dac_probe(struct platform_device *devptr)
++{
++ struct snd_sh_dac *chip;
++ struct snd_card *card;
++ int err;
++
++ card = snd_card_new(index, id, THIS_MODULE, 0);
++ if (card == NULL)
++ return -ENOMEM;
++
++ err = snd_sh_dac_create(card, devptr, &chip);
++ if (err < 0)
++ goto probe_error;
++
++ err = snd_sh_dac_pcm(chip, 0);
++ if (err < 0)
++ goto probe_error;
++
++ strcpy(card->driver, "snd_sh_dac");
++ strcpy(card->shortname, "SuperH DAC audio driver");
++ /* sprintk(card->longname, "%s at HD64461 irq %i", card->shortname, */
++ printk("%s %s at HD64461 irq %i", card->longname, card->shortname,
++ chip->irq);
++
++ err = snd_card_register(card);
++ if (err < 0)
++ goto probe_error;
++
++ snd_printk("ALSA driver for SuperH DAC audio");
++
++ platform_set_drvdata(devptr, card);
++ return 0;
++
++probe_error:
++ snd_card_free(card);
++ return err;
++}
++
++/*
++ * "driver" definition
++ */
++static struct platform_driver driver = {
++ .probe = snd_sh_dac_probe,
++ .remove = snd_sh_dac_remove,
++ .driver = {
++ .name = SND_SH_DAC_DRIVER,
++ },
++};
++
++/* clean up the module */
++static void __exit sh_dac_exit(void)
++{
++ /*printk("sh_dac_exit\n"); */
++ platform_device_unregister(pd);
++ platform_driver_unregister(&driver);
++
++ free_irq(HD64461_IRQ_TMU0, 0);
++}
++
++
++static int __init sh_dac_init(void)
++{
++ int err;
++ /*printk("sh_dac_init\n"); */
++ err = platform_driver_register(&driver);
++ if (unlikely(err < 0))
++ return err;
++
++ pd = platform_device_register_simple(SND_SH_DAC_DRIVER, -1, NULL, 0);
++ if (unlikely(IS_ERR(pd))) {
++ platform_driver_unregister(&driver);
++ return PTR_ERR(pd);
++ }
++
++ return 0;
++}
++
++module_init(sh_dac_init);
++module_exit(sh_dac_exit);
diff --git a/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/defconfig_jlime b/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/defconfig_jlime
new file mode 100644
index 0000000..0db41d8
--- /dev/null
+++ b/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/defconfig_jlime
@@ -0,0 +1,1187 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.17
+# Sat Oct 21 22:36:16 2006
+#
+CONFIG_SUPERH=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+
+#
+# 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_POSIX_MQUEUE=y
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
+CONFIG_SYSCTL=y
+# CONFIG_AUDIT is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_RELAY=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_UID16=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_EMBEDDED=y
+CONFIG_KALLSYMS=y
+# 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_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=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF 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_SH_SOLUTION_ENGINE is not set
+# CONFIG_SH_7751_SOLUTION_ENGINE is not set
+# CONFIG_SH_7300_SOLUTION_ENGINE is not set
+# CONFIG_SH_73180_SOLUTION_ENGINE is not set
+# CONFIG_SH_7751_SYSTEMH is not set
+# CONFIG_SH_STB1_HARP is not set
+# CONFIG_SH_STB1_OVERDRIVE is not set
+CONFIG_SH_HP6XX=y
+# CONFIG_SH_CQREEK is not set
+# CONFIG_SH_DMIDA is not set
+# CONFIG_SH_EC3104 is not set
+# CONFIG_SH_SATURN is not set
+# CONFIG_SH_DREAMCAST is not set
+# CONFIG_SH_CAT68701 is not set
+# CONFIG_SH_BIGSUR is not set
+# CONFIG_SH_SH2000 is not set
+# CONFIG_SH_ADX is not set
+# CONFIG_SH_MPC1211 is not set
+# CONFIG_SH_SH03 is not set
+# CONFIG_SH_SECUREEDGE5410 is not set
+# CONFIG_SH_HS7751RVOIP is not set
+# CONFIG_SH_RTS7751R2D is not set
+# CONFIG_SH_R7780RP is not set
+# CONFIG_SH_EDOSK7705 is not set
+# CONFIG_SH_SH4202_MICRODEV is not set
+# CONFIG_SH_LANDISK is not set
+# CONFIG_SH_TITAN is not set
+# CONFIG_SH_UNKNOWN is not set
+
+#
+# Processor selection
+#
+CONFIG_CPU_SH3=y
+
+#
+# SH-2 Processor Support
+#
+# CONFIG_CPU_SUBTYPE_SH7604 is not set
+
+#
+# SH-3 Processor Support
+#
+# CONFIG_CPU_SUBTYPE_SH7300 is not set
+# CONFIG_CPU_SUBTYPE_SH7705 is not set
+# CONFIG_CPU_SUBTYPE_SH7707 is not set
+# CONFIG_CPU_SUBTYPE_SH7708 is not set
+CONFIG_CPU_SUBTYPE_SH7709=y
+
+#
+# SH-4 Processor Support
+#
+# CONFIG_CPU_SUBTYPE_SH7750 is not set
+# CONFIG_CPU_SUBTYPE_SH7091 is not set
+# CONFIG_CPU_SUBTYPE_SH7750R is not set
+# CONFIG_CPU_SUBTYPE_SH7750S is not set
+# CONFIG_CPU_SUBTYPE_SH7751 is not set
+# CONFIG_CPU_SUBTYPE_SH7751R is not set
+# CONFIG_CPU_SUBTYPE_SH7760 is not set
+# CONFIG_CPU_SUBTYPE_SH4_202 is not set
+
+#
+# ST40 Processor Support
+#
+# CONFIG_CPU_SUBTYPE_ST40STB1 is not set
+# CONFIG_CPU_SUBTYPE_ST40GX1 is not set
+
+#
+# SH-4A Processor Support
+#
+# CONFIG_CPU_SUBTYPE_SH73180 is not set
+# CONFIG_CPU_SUBTYPE_SH7770 is not set
+# CONFIG_CPU_SUBTYPE_SH7780 is not set
+
+#
+# Memory management options
+#
+CONFIG_MMU=y
+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=4
+
+#
+# Cache configuration
+#
+# CONFIG_SH_DIRECT_MAPPED is not set
+# CONFIG_SH_WRITETHROUGH is not set
+# CONFIG_SH_OCRAM is not set
+CONFIG_MEMORY_START=0x0d000000
+CONFIG_MEMORY_SIZE=0x00400000
+
+#
+# Processor features
+#
+CONFIG_CPU_LITTLE_ENDIAN=y
+CONFIG_SH_RTC=y
+CONFIG_SH_FPU_EMU=y
+# CONFIG_SH_DSP is not set
+CONFIG_SH_ADC=y
+CONFIG_CPU_HAS_INTEVT=y
+CONFIG_CPU_HAS_PINT_IRQ=y
+CONFIG_CPU_HAS_SR_RB=y
+
+#
+# Timer support
+#
+CONFIG_SH_TMU=y
+CONFIG_SH_PCLK_FREQ=22110000
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ is not set
+
+#
+# DMA support
+#
+CONFIG_SH_DMA=y
+CONFIG_NR_ONCHIP_DMA_CHANNELS=4
+# CONFIG_NR_DMA_CHANNELS_BOOL is not set
+
+#
+# Companion Chips
+#
+CONFIG_HD6446X_SERIES=y
+CONFIG_HD64461=y
+# CONFIG_HD64465 is not set
+CONFIG_HD64461_IRQ=36
+CONFIG_HD64461_IOBASE=0xb0000000
+CONFIG_HD64461_ENABLER=y
+
+#
+# Kernel features
+#
+# CONFIG_KEXEC is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_SMP is not set
+
+#
+# Boot options
+#
+CONFIG_ZERO_PAGE_OFFSET=0x00001000
+CONFIG_BOOT_LINK_OFFSET=0x00800000
+# CONFIG_UBC_WAKEUP is not set
+# CONFIG_CMDLINE_BOOL is not set
+
+#
+# Bus options
+#
+CONFIG_ISA=y
+# CONFIG_PCI is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+CONFIG_PCCARD=y
+# CONFIG_PCMCIA_DEBUG is not set
+CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
+# CONFIG_PCMCIA_IOCTL is not set
+
+#
+# PC-card bridges
+#
+# CONFIG_I82365 is not set
+# CONFIG_TCIC is not set
+CONFIG_HD64461_PCMCIA=y
+CONFIG_HD64461_PCMCIA_SOCKETS=1
+CONFIG_PCMCIA_PROBE=y
+
+#
+# PCI Hotplug Support
+#
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_FLAT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options (EXPERIMENTAL)
+#
+CONFIG_PM=y
+CONFIG_PM_LEGACY=y
+# CONFIG_PM_DEBUG is not set
+CONFIG_APM=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_NETDEBUG=y
+CONFIG_PACKET=y
+CONFIG_PACKET_MMAP=y
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+CONFIG_NET_KEY=y
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+# CONFIG_IP_PNP 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_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_BIC=y
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL 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_NET_DIVERT 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=m
+
+#
+# IrDA protocols
+#
+CONFIG_IRLAN=m
+CONFIG_IRNET=m
+# CONFIG_IRCOMM is not set
+# CONFIG_IRDA_ULTRA is not set
+
+#
+# IrDA options
+#
+# CONFIG_IRDA_CACHE_LAST_LSAP is not set
+# CONFIG_IRDA_FAST_RR is not set
+# CONFIG_IRDA_DEBUG is not set
+
+#
+# Infrared-port device drivers
+#
+
+#
+# SIR device drivers
+#
+# CONFIG_IRTTY_SIR is not set
+
+#
+# Dongle support
+#
+
+#
+# Old SIR device drivers
+#
+# CONFIG_IRPORT_SIR is not set
+
+#
+# Old Serial dongle support
+#
+
+#
+# FIR device drivers
+#
+CONFIG_BT=m
+# CONFIG_BT_L2CAP is not set
+# CONFIG_BT_SCO is not set
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIUART=m
+# CONFIG_BT_HCIUART_H4 is not set
+# CONFIG_BT_HCIUART_BCSP is not set
+CONFIG_BT_HCIDTL1=m
+CONFIG_BT_HCIBT3C=m
+CONFIG_BT_HCIBLUECARD=m
+CONFIG_BT_HCIBTUART=m
+# CONFIG_BT_HCIVHCI is not set
+CONFIG_IEEE80211=y
+# CONFIG_IEEE80211_DEBUG is not set
+CONFIG_IEEE80211_CRYPT_WEP=m
+CONFIG_IEEE80211_CRYPT_CCMP=m
+CONFIG_IEEE80211_CRYPT_TKIP=m
+CONFIG_IEEE80211_SOFTMAC=m
+# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set
+CONFIG_WIRELESS_EXT=y
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+CONFIG_PNP=y
+# CONFIG_PNP_DEBUG is not set
+
+#
+# Protocols
+#
+# CONFIG_ISAPNP 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 is not set
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_BLK_DEV_INITRD is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=y
+CONFIG_IDE_MAX_HWIFS=4
+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_IDECS=y
+# CONFIG_BLK_DEV_IDECD is not set
+# CONFIG_BLK_DEV_IDETAPE is not set
+# CONFIG_BLK_DEV_IDEFLOPPY is not set
+# CONFIG_IDE_TASK_IOCTL is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_IDE_GENERIC=y
+# CONFIG_BLK_DEV_IDEPNP is not set
+CONFIG_IDE_SH=y
+# CONFIG_IDE_ARM is not set
+# 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
+
+#
+# Old CD-ROM drivers (not SCSI, not IDE)
+#
+# CONFIG_CD_NO_IDESCSI 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=y
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_NET_SB1000 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_STNIC is not set
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_NET_VENDOR_SMC is not set
+# CONFIG_SMC91X is not set
+# 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_NE2000 is not set
+# CONFIG_NET_PCI 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=y
+
+#
+# Obsolete Wireless cards support (pre-802.11)
+#
+# CONFIG_STRIP is not set
+CONFIG_ARLAN=m
+CONFIG_WAVELAN=m
+CONFIG_PCMCIA_WAVELAN=m
+CONFIG_PCMCIA_NETWAVE=m
+
+#
+# Wireless 802.11 Frequency Hopping cards support
+#
+CONFIG_PCMCIA_RAYCS=m
+
+#
+# Wireless 802.11b ISA/PCI cards support
+#
+CONFIG_HERMES=m
+CONFIG_ATMEL=m
+
+#
+# Wireless 802.11b Pcmcia/Cardbus cards support
+#
+CONFIG_PCMCIA_HERMES=m
+CONFIG_PCMCIA_SPECTRUM=m
+CONFIG_AIRO_CS=m
+CONFIG_PCMCIA_ATMEL=m
+CONFIG_PCMCIA_WL3501=m
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_FIRMWARE=y
+CONFIG_HOSTAP_FIRMWARE_NVRAM=y
+CONFIG_HOSTAP_CS=m
+CONFIG_NET_WIRELESS=y
+
+#
+# PCMCIA network device support
+#
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_3C589=m
+CONFIG_PCMCIA_3C574=m
+CONFIG_PCMCIA_FMVJ18X=m
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PCMCIA_NMCLAN=m
+CONFIG_PCMCIA_SMC91C92=m
+CONFIG_PCMCIA_XIRC2PS=m
+CONFIG_PCMCIA_AXNET=m
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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_SLIP_SMART=y
+# 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
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=240
+# CONFIG_INPUT_JOYDEV is not set
+CONFIG_INPUT_TSDEV=y
+CONFIG_INPUT_TSDEV_SCREEN_X=640
+CONFIG_INPUT_TSDEV_SCREEN_Y=240
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# 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_HP620 is not set
+CONFIG_KEYBOARD_HP680=y
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+CONFIG_TOUCHSCREEN_HP600=y
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_SH_SCI=y
+CONFIG_SERIAL_SH_SCI_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=5
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+# CONFIG_WATCHDOG is not set
+# CONFIG_RTC is not set
+# CONFIG_GEN_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+
+#
+# PCMCIA character devices
+#
+# CONFIG_SYNCLINK_CS is not set
+# CONFIG_CARDMAN_4000 is not set
+# CONFIG_CARDMAN_4040 is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+# CONFIG_TELCLOCK is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Misc devices
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+CONFIG_VIDEO_V4L2=y
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_FB=y
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_MACMODES is not set
+CONFIG_FB_FIRMWARE_EDID=y
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_EPSON1355 is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_HIT=y
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+CONFIG_FONT_PEARL_8x8=y
+# CONFIG_FONT_ACORN_8x8 is not set
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_LCD_DEVICE=y
+CONFIG_BACKLIGHT_HP680=y
+
+#
+# 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_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# SuperH devices
+#
+CONFIG_SND_SH_DAC_AUDIO=y
+
+#
+# PCMCIA devices
+#
+# CONFIG_SND_VXPOCKET is not set
+# CONFIG_SND_PDAUDIOCF is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# USB support
+#
+# CONFIG_USB_ARCH_HAS_HCD is not set
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# InfiniBand support
+#
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+
+#
+# RTC drivers
+#
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SH=y
+# CONFIG_RTC_DRV_TEST 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_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_OCFS2_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+CONFIG_AUTOFS_FS=y
+# 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 is not set
+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_KCORE=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_HUGETLBFS 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_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=m
+# CONFIG_NFS_V3 is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+CONFIG_NFSD=m
+# CONFIG_NFSD_V3 is not set
+CONFIG_NFSD_TCP=y
+CONFIG_LOCKD=m
+CONFIG_EXPORTFS=m
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=m
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT 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 is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# 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=m
+CONFIG_NLS_CODEPAGE_775=m
+CONFIG_NLS_CODEPAGE_850=m
+CONFIG_NLS_CODEPAGE_852=m
+CONFIG_NLS_CODEPAGE_855=m
+CONFIG_NLS_CODEPAGE_857=m
+CONFIG_NLS_CODEPAGE_860=m
+CONFIG_NLS_CODEPAGE_861=m
+CONFIG_NLS_CODEPAGE_862=m
+CONFIG_NLS_CODEPAGE_863=m
+CONFIG_NLS_CODEPAGE_864=m
+CONFIG_NLS_CODEPAGE_865=m
+CONFIG_NLS_CODEPAGE_866=m
+CONFIG_NLS_CODEPAGE_869=m
+CONFIG_NLS_CODEPAGE_936=m
+CONFIG_NLS_CODEPAGE_950=m
+CONFIG_NLS_CODEPAGE_932=m
+CONFIG_NLS_CODEPAGE_949=m
+CONFIG_NLS_CODEPAGE_874=m
+CONFIG_NLS_ISO8859_8=m
+CONFIG_NLS_CODEPAGE_1250=m
+CONFIG_NLS_CODEPAGE_1251=m
+CONFIG_NLS_ASCII=m
+CONFIG_NLS_ISO8859_1=m
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+CONFIG_NLS_KOI8_R=m
+CONFIG_NLS_KOI8_U=m
+CONFIG_NLS_UTF8=m
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_DEBUG_KERNEL is not set
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_DEBUG_FS is not set
+# CONFIG_SH_STANDARD_BIOS is not set
+# CONFIG_KGDB is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_NULL is not set
+CONFIG_CRYPTO_MD4=m
+CONFIG_CRYPTO_MD5=m
+CONFIG_CRYPTO_SHA1=m
+# 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_DES is not set
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+CONFIG_CRYPTO_AES=m
+# 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 is not set
+CONFIG_CRYPTO_MICHAEL_MIC=m
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_CRC_CCITT=m
+CONFIG_CRC16=m
+CONFIG_CRC32=y
+CONFIG_LIBCRC32C=m
+CONFIG_ZLIB_INFLATE=m
+CONFIG_ZLIB_DEFLATE=m
diff --git a/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/io.h-fix.patch b/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/io.h-fix.patch
new file mode 100644
index 0000000..0ae39a8
--- /dev/null
+++ b/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/io.h-fix.patch
@@ -0,0 +1,31 @@
+--- linux-2.6.17/include/asm-sh/io.h_orig 2006-09-17 22:52:10.000000000 +0000
++++ linux-2.6.17/include/asm-sh/io.h 2006-09-17 22:54:01.000000000 +0000
+@@ -138,17 +138,17 @@
+ #define readl_relaxed(a) readl(a)
+
+ /* Simple MMIO */
+-#define ioread8(a) readb(a)
+-#define ioread16(a) readw(a)
+-#define ioread16be(a) be16_to_cpu(__raw_readw((a)))
+-#define ioread32(a) readl(a)
+-#define ioread32be(a) be32_to_cpu(__raw_readl((a)))
+-
+-#define iowrite8(v,a) writeb((v),(a))
+-#define iowrite16(v,a) writew((v),(a))
+-#define iowrite16be(v,a) __raw_writew(cpu_to_be16((v)),(a))
+-#define iowrite32(v,a) writel((v),(a))
+-#define iowrite32be(v,a) __raw_writel(cpu_to_be32((v)),(a))
++#define ioread8(a) inb(a)
++#define ioread16(a) inw(a)
++#define ioread16be(a) be16_to_cpu(inw((a)))
++#define ioread32(a) inl(a)
++#define ioread32be(a) be32_to_cpu(inl((a)))
++
++#define iowrite8(v,a) outb((v),(a))
++#define iowrite16(v,a) outw((v),(a))
++#define iowrite16be(v,a) outw(cpu_to_be16((v)),(a))
++#define iowrite32(v,a) outl((v),(a))
++#define iowrite32be(v,a) outl(cpu_to_be32((v)),(a))
+
+ #define ioread8_rep(a,d,c) insb((a),(d),(c))
+ #define ioread16_rep(a,d,c) insw((a),(d),(c))
diff --git a/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/keyboard-fix-deadkeys.patch b/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/keyboard-fix-deadkeys.patch
new file mode 100644
index 0000000..7392355
--- /dev/null
+++ b/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/keyboard-fix-deadkeys.patch
@@ -0,0 +1,204 @@
+--- linux-2.6.17-linuxsh/drivers/input/keyboard/hp680_keyb.c 2006-12-06 21:56:06.000000000 +0000
++++ linux-2.6.17/drivers/input/keyboard/hp680_keyb.c 2007-01-10 21:00:34.000000000 +0000
+@@ -5,6 +5,7 @@
+ *
+ * Copyright (C) 2005 Andriy Skulysh
+ * Copyright (C) 2006 Paul Mundt
++ * Copyright (C) 2007 Kristoffer Ericson
+ *
+ * Splited from drivers/input/keyboard/hp600_keyb.c
+ *
+@@ -20,6 +21,10 @@
+ #include <asm/io.h>
+ #include "scan_keyb.h"
+
++#define PCCR 0xa4000104
++#define PDCR 0xa4000106
++#define PECR 0xa4000108
++#define PFCR 0xa400010a
+ #define PCDR 0xa4000124
+ #define PDDR 0xa4000126
+ #define PEDR 0xa4000128
+@@ -30,6 +35,24 @@
+ #define PKDR 0xa4000132
+ #define PLDR 0xa4000134
+
++/***************************************************************
++HP Jornada 680(SWEDISH version) keyboard
++[!] indicates Special Characters
++
++_______________________________________________________________________
++| ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 POWER|
++| 1 2 3 4 5 6 7 8 9 0 + ` BKPSPACE|
++|* Q W E R T Y U I O P ! ^ ENTER|
++| TAB A S D F G H J K L ! ! ' ENTER|
++| SHIFT Z X C V B N M , . - UP SHIFT|
++| CTRL WIN ALT ? =======SPACE======== ALTG DEL LEF DO RI ]
++-----------------------------------------------------------------------
++
++
++****************************************************************/
++
++
++
+ /****************************************************************
+ HP Jornada 690(Japanese version) keyboard scan matrix
+
+@@ -71,31 +94,56 @@
+ ****************************************************************/
+
+ static const unsigned char hp680_japanese_table[] = {
+- /* PTD1 */
++/*
++ /* PTD1 */
++ /* ? ? ? ? Esc ? ? ? */
+ 0x3a, 0x70, 0x29, 0x00, 0x01, 0x00, 0x00, 0x00,
++ /* F1 F2 F3 F8 F7 F6 F4 F5 */
+ 0x3b, 0x3c, 0x3d, 0x42, 0x41, 0x40, 0x3e, 0x3f,
+- /* PTD5 */
++
++ /* PTD5 */
++ /* / : Enter ? Z ? ? ? */
+ 0x35, 0x28, 0x1c, 0x00, 0x2c, 0x00, 0x00, 0x00,
++ /* X C V . , M B N */
+ 0x2d, 0x2e, 0x2f, 0x34, 0x33, 0x32, 0x30, 0x31,
+- /* PTD7 */
+- 0x50, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+- 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x38, 0x7b,
+- /* PTE0 */
++
++ /* PTD7 */
++ /* Down Right ? ? ? ? ? ? */
++ 0x50, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ /* ? ? ? Left ? ? Alt ? */
++ 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x38, 0x7b,
++
++ /* PTE0 */
++ /* ? ? ? ? Win ? ? ? */
+ 0x00, 0x00, 0x00, 0x00, 0xdb, 0x00, 0x00, 0x00,
++ /* Ctrl ? Space Del _ ? ? ? */
+ 0x1d, 0x00, 0x39, 0x53, 0x73, 0xf9, 0x00, 0x00,
+- /* PTE1 */
++
++ /* PTE1 */
++ /* ; [ ] ? A ? ? ? */
+ 0x27, 0x1b, 0x2b, 0x00, 0x1e, 0x00, 0x00, 0x00,
++ /* S D F L K J G H */
+ 0x1f, 0x20, 0x21, 0x26, 0x25, 0x24, 0x22, 0x23,
+- /* PTE3 */
+- 0x48, 0x7d, 0x36, 0x00, 0x0f, 0x00, 0x00, 0x00,
+- 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+- /* PTE6 */
++
++ /* PTE3 */
++ /* Up \ ShiftR ? Q ? ? ? */
++ 0x48, 0x7d, 0x36, 0x00, 0x0f, 0x00, 0x00, 0x00,
++ /* ? ShiftL ? ? ? ? ? ? */
++ 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++
++ /* PTE6 */
++ /* P @ BS ? Q ? ? ? */
+ 0x19, 0x1a, 0x0e, 0x00, 0x10, 0x00, 0x00, 0x00,
++ /* W E R O I U T Y */
+ 0x11, 0x12, 0x13, 0x18, 0x17, 0x16, 0x14, 0x15,
+- /* PTE7 */
+- 0x0b, 0x0c, 0x0d, 0x00, 0x02, 0x00, 0x00, 0x00,
+- 0x03, 0x04, 0x05, 0x0a, 0x09, 0x08, 0x06, 0x07,
+- /* **** */
++
++ /* PTE7 */
++ /* 0 + = ? 1 ? ? ? */
++ 0x0b, 0x0c, 0x0d, 0x00, 0x02, 0x00, 0x00, 0x00,
++ /* 2 3 4 9 8 7 5 6 */
++ 0x03, 0x04, 0x05, 0x0a, 0x09, 0x08, 0x06, 0x07,
++
++ /* **** */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+@@ -103,37 +151,72 @@
+ static int hp680_japanese_scan_kbd(unsigned char *s)
+ {
+ int i;
+- unsigned char matrix_switch[] = {
+- 0xfd, 0xff, /* PTD1 */
+- 0xdf, 0xff, /* PTD5 */
+- 0x7f, 0xff, /* PTD7 */
+- 0xff, 0xfe, /* PTE0 */
+- 0xff, 0xfd, /* PTE1 */
+- 0xff, 0xf7, /* PTE3 */
+- 0xff, 0xbf, /* PTE6 */
+- 0xff, 0x7f, /* PTE7 */
++ unsigned short ec_static,dc_static; /* = UINT16_t */
++ unsigned char matrix_switch[] = {
++ 0xfd, 0xff, /* PTD1 PD(1) */
++ 0xdf, 0xff, /* PTD5 PD(5) */
++ 0x7f, 0xff, /* PTD7 PD(7) */
++ 0xff, 0xfe, /* PTE0 PE(0) */
++ 0xff, 0xfd, /* PTE1 PE(1) */
++ 0xff, 0xf7, /* PTE3 PE(3) */
++ 0xff, 0xbf, /* PTE6 PE(6) */
++ 0xff, 0x7f, /* PTE7 PE(7) */
+ }, *t=matrix_switch;
++ /* PD(x) :
++ 1. 0xcc0c & (1~(1 << (2*(x)+1)))))
++ 2. (0xf0cf & 0xfffff) */
++ /* PE(x) :
++ 1. 0xcc0c & 0xffff
++ 2. 0xf0cf & (1~(1 << (2*(x)+1))))) */
++ unsigned short matrix_PDE[] = {
++ 0xcc04, 0xf0cf, /* PD(1) */
++ 0xc40c, 0xf0cf, /* PD(5) */
++ 0x4c0c, 0xf0cf, /* PD(7) */
++ 0xcc0c, 0xf0cd, /* PE(0) */
++ 0xcc0c, 0xf0c7, /* PE(1) */
++ 0xcc0c, 0xf04f, /* PE(3) */
++ 0xcc0c, 0xd0cf, /* PE(6) */
++ 0xcc0c, 0x70cf, /* PE(7) */
++ }
++ , *y=matrix_PDE;
++ /* Save these control reg bits */
++ dc_static = (ctrl_inw(PDCR) & (~0xcc0c));
++ ec_static = (ctrl_inw(PECR) & (~0xf0cf));
+
+ for(i=0; i<8; i++) {
+- ctrl_outb(*t++, PDDR);
++ /* disable output for all but the one we want to scan */
++ ctrl_outw((dc_static | *y++), PDCR);
++ ctrl_outw((ec_static | *y++), PECR);
++ udelay(5);
++
++ /* Get scanline row */
++ ctrl_outb(*t++, PDDR);
+ ctrl_outb(*t++, PEDR);
++ udelay(50);
++
++ /* Read data */
+ *s++=ctrl_inb(PCDR);
+ *s++=ctrl_inb(PFDR);
+ }
+-
++ /* Scan no lines */
+ ctrl_outb(0xff, PDDR);
+ ctrl_outb(0xff, PEDR);
++
++ /* Enable all scanlines */
++ ctrl_outw((dc_static | (0x5555 & 0xcc0c)),PDCR);
++ ctrl_outw((ec_static | (0x5555 & 0xf0cf)),PECR);
++ /* Ignore extra keys and events */
+
+ *s++=ctrl_inb(PGDR);
+ *s++=ctrl_inb(PHDR);
+-
++
+ return 0;
+ }
+
+ static struct scan_keyboard hp680_kbd = {
+ .scan = hp680_japanese_scan_kbd,
+ .table = hp680_japanese_table,
+- .length = 18,
++ .length = 16,
+ };
+
+ static int __init hp680_kbd_init_hw(void)
diff --git a/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/keymap-fix.patch b/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/keymap-fix.patch
new file mode 100644
index 0000000..b62d2d8
--- /dev/null
+++ b/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/keymap-fix.patch
@@ -0,0 +1,408 @@
+--- linux-2.6.17-vanilla/drivers/char/defkeymap.map 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/char/defkeymap.map 2006-07-13 16:43:20.000000000 +0000
+@@ -1,264 +1,185 @@
+-# Default kernel keymap. This uses 7 modifier combinations.
+-keymaps 0-2,4-5,8,12
+-# Change the above line into
+-# keymaps 0-2,4-6,8,12
+-# in case you want the entries
+-# altgr control keycode 83 = Boot
+-# altgr control keycode 111 = Boot
+-# below.
+-#
+-# In fact AltGr is used very little, and one more keymap can
+-# be saved by mapping AltGr to Alt (and adapting a few entries):
+-# keycode 100 = Alt
++# English keymap for Jornada 6xx devices.
+ #
++# Created by Tibor Zenis ( zenis <at> fmph.uniba.sk )
++# (Lightly) Modified by Alex Palestras ( B_Linuz <at> yahoo.com )
++# plain, shift, altgr, ctrl, shift + ctrl, alt, ctrl + alt
++
++keymaps 0-2,4-5,8,12
+ keycode 1 = Escape Escape
+- alt keycode 1 = Meta_Escape
+-keycode 2 = one exclam
+- alt keycode 2 = Meta_one
+-keycode 3 = two at at
+- control keycode 3 = nul
+- shift control keycode 3 = nul
+- alt keycode 3 = Meta_two
++ alt keycode 1 = Meta_Escape
++keycode 2 = one exclam asciitilde
++ alt keycode 2 = Meta_one
++keycode 3 = two at grave
++ alt keycode 3 = Meta_two
+ keycode 4 = three numbersign
+- control keycode 4 = Escape
+- alt keycode 4 = Meta_three
+-keycode 5 = four dollar dollar
+- control keycode 5 = Control_backslash
+- alt keycode 5 = Meta_four
++ alt keycode 4 = Meta_three
++ altgr keycode 4 = pound
++keycode 5 = four dollar
++ control keycode 5 = Control_backslash
++ alt keycode 5 = Meta_four
++ altgr keycode 5 = currency
+ keycode 6 = five percent
+- control keycode 6 = Control_bracketright
+- alt keycode 6 = Meta_five
++ control keycode 6 = Control_bracketright
++ alt keycode 6 = Meta_five
+ keycode 7 = six asciicircum
+- control keycode 7 = Control_asciicircum
+- alt keycode 7 = Meta_six
+-keycode 8 = seven ampersand braceleft
+- control keycode 8 = Control_underscore
+- alt keycode 8 = Meta_seven
+-keycode 9 = eight asterisk bracketleft
+- control keycode 9 = Delete
+- alt keycode 9 = Meta_eight
++ control keycode 7 = Control_asciicircum
++ alt keycode 7 = Meta_six
++keycode 8 = seven ampersand braceleft
++ control keycode 8 = Control_underscore
++ alt keycode 8 = KP_7
++keycode 9 = eight asterisk bracketleft
++ control keycode 9 = Delete
++ alt keycode 9 = KP_8
+ keycode 10 = nine parenleft bracketright
+- alt keycode 10 = Meta_nine
++ alt keycode 10 = KP_9
+ keycode 11 = zero parenright braceright
+- alt keycode 11 = Meta_zero
+-keycode 12 = minus underscore backslash
+- control keycode 12 = Control_underscore
+- shift control keycode 12 = Control_underscore
+- alt keycode 12 = Meta_minus
++ alt keycode 11 = KP_Divide
++keycode 12 = minus underscore backslash
++ control keycode 11 = Control_underscore
++ shift control keycode 11 = Control_underscore
++ alt keycode 11 = Meta_minus
+ keycode 13 = equal plus
+- alt keycode 13 = Meta_equal
++ alt keycode 13 = Meta_equal
+ keycode 14 = Delete Delete
+- control keycode 14 = BackSpace
+- alt keycode 14 = Meta_Delete
++ control keycode 14 = BackSpace
++ alt keycode 14 = Meta_Delete
+ keycode 15 = Tab Tab
+- alt keycode 15 = Meta_Tab
++ alt keycode 15 = Meta_Tab
+ keycode 16 = q
+ keycode 17 = w
+ keycode 18 = e
+- altgr keycode 18 = Hex_E
++ Shift keycode 18 = E
+ keycode 19 = r
+ keycode 20 = t
+ keycode 21 = y
++ alt keycode 21 = KP_4
+ keycode 22 = u
++ alt keycode 22 = KP_5
+ keycode 23 = i
+-keycode 24 = o
+-keycode 25 = p
+-keycode 26 = bracketleft braceleft
+- control keycode 26 = Escape
+- alt keycode 26 = Meta_bracketleft
+-keycode 27 = bracketright braceright asciitilde
+- control keycode 27 = Control_bracketright
+- alt keycode 27 = Meta_bracketright
++ alt keycode 23 = KP_6
++keycode 24 = o
++ alt keycode 24 = KP_Multiply
++keycode 25 = p
++ AltGr keycode 25 = braceleft
++keycode 26 = backslash bar
++ AltGr keycode 26 = braceright
+ keycode 28 = Return
+- alt keycode 28 = Meta_Control_m
++ alt keycode 28 = Meta_Control_m
+ keycode 29 = Control
++ altgr keycode 29 = Num_Lock
+ keycode 30 = a
+- altgr keycode 30 = Hex_A
+ keycode 31 = s
+ keycode 32 = d
+- altgr keycode 32 = Hex_D
+ keycode 33 = f
+- altgr keycode 33 = Hex_F
+ keycode 34 = g
+ keycode 35 = h
++ alt keycode 35 = KP_1
+ keycode 36 = j
++ alt keycode 36 = KP_2
+ keycode 37 = k
++ alt keycode 37 = KP_3
+ keycode 38 = l
+-keycode 39 = semicolon colon
+- alt keycode 39 = Meta_semicolon
+-keycode 40 = apostrophe quotedbl
+- control keycode 40 = Control_g
+- alt keycode 40 = Meta_apostrophe
+-keycode 41 = grave asciitilde
+- control keycode 41 = nul
+- alt keycode 41 = Meta_grave
++ alt keycode 38 = KP_Subtract
++keycode 39 = semicolon colon bracketleft
++ alt keycode 39 = Meta_semicolon
++keycode 40 = apostrophe quotedbl bracketright
++ control keycode 40 = Control_g
++ alt keycode 40 = Meta_apostrophe
++keycode 41 = F11
++ shift keycode 41 = F21
++ altgr keycode 41 = Console_23
++ alt keycode 41 = Console_11
++ control alt keycode 41 = Console_11
+ keycode 42 = Shift
+-keycode 43 = backslash bar
+- control keycode 43 = Control_backslash
+- alt keycode 43 = Meta_backslash
++ altgr keycode 42 = Caps_Lock
+ keycode 44 = z
+ keycode 45 = x
+ keycode 46 = c
+- altgr keycode 46 = Hex_C
+ keycode 47 = v
+ keycode 48 = b
+- altgr keycode 48 = Hex_B
+ keycode 49 = n
++ alt keycode 49 = KP_0
+ keycode 50 = m
++ alt keycode 50 = KP_Comma
+ keycode 51 = comma less
+- alt keycode 51 = Meta_comma
++ alt keycode 51 = KP_Period
+ keycode 52 = period greater
+- control keycode 52 = Compose
+- alt keycode 52 = Meta_period
+-keycode 53 = slash question
+- control keycode 53 = Delete
+- alt keycode 53 = Meta_slash
+-keycode 54 = Shift
+-keycode 55 = KP_Multiply
++ control keycode 52 = Compose
++ alt keycode 52 = KP_Add
++keycode 54 = Shift
+ keycode 56 = Alt
+ keycode 57 = space space
+- control keycode 57 = nul
+- alt keycode 57 = Meta_space
+-keycode 58 = Caps_Lock
+-keycode 59 = F1 F11 Console_13
+- control keycode 59 = F1
+- alt keycode 59 = Console_1
+- control alt keycode 59 = Console_1
+-keycode 60 = F2 F12 Console_14
+- control keycode 60 = F2
+- alt keycode 60 = Console_2
+- control alt keycode 60 = Console_2
+-keycode 61 = F3 F13 Console_15
+- control keycode 61 = F3
+- alt keycode 61 = Console_3
+- control alt keycode 61 = Console_3
+-keycode 62 = F4 F14 Console_16
+- control keycode 62 = F4
+- alt keycode 62 = Console_4
+- control alt keycode 62 = Console_4
+-keycode 63 = F5 F15 Console_17
+- control keycode 63 = F5
+- alt keycode 63 = Console_5
+- control alt keycode 63 = Console_5
+-keycode 64 = F6 F16 Console_18
+- control keycode 64 = F6
+- alt keycode 64 = Console_6
+- control alt keycode 64 = Console_6
+-keycode 65 = F7 F17 Console_19
+- control keycode 65 = F7
+- alt keycode 65 = Console_7
+- control alt keycode 65 = Console_7
+-keycode 66 = F8 F18 Console_20
+- control keycode 66 = F8
+- alt keycode 66 = Console_8
+- control alt keycode 66 = Console_8
+-keycode 67 = F9 F19 Console_21
+- control keycode 67 = F9
+- alt keycode 67 = Console_9
+- control alt keycode 67 = Console_9
+-keycode 68 = F10 F20 Console_22
+- control keycode 68 = F10
+- alt keycode 68 = Console_10
+- control alt keycode 68 = Console_10
+-keycode 69 = Num_Lock
+- shift keycode 69 = Bare_Num_Lock
+-keycode 70 = Scroll_Lock Show_Memory Show_Registers
+- control keycode 70 = Show_State
+- alt keycode 70 = Scroll_Lock
+-keycode 71 = KP_7
+- alt keycode 71 = Ascii_7
+- altgr keycode 71 = Hex_7
+-keycode 72 = KP_8
+- alt keycode 72 = Ascii_8
+- altgr keycode 72 = Hex_8
+-keycode 73 = KP_9
+- alt keycode 73 = Ascii_9
+- altgr keycode 73 = Hex_9
+-keycode 74 = KP_Subtract
+-keycode 75 = KP_4
+- alt keycode 75 = Ascii_4
+- altgr keycode 75 = Hex_4
+-keycode 76 = KP_5
+- alt keycode 76 = Ascii_5
+- altgr keycode 76 = Hex_5
+-keycode 77 = KP_6
+- alt keycode 77 = Ascii_6
+- altgr keycode 77 = Hex_6
+-keycode 78 = KP_Add
+-keycode 79 = KP_1
+- alt keycode 79 = Ascii_1
+- altgr keycode 79 = Hex_1
+-keycode 80 = KP_2
+- alt keycode 80 = Ascii_2
+- altgr keycode 80 = Hex_2
+-keycode 81 = KP_3
+- alt keycode 81 = Ascii_3
+- altgr keycode 81 = Hex_3
+-keycode 82 = KP_0
+- alt keycode 82 = Ascii_0
+- altgr keycode 82 = Hex_0
+-keycode 83 = KP_Period
+-# altgr control keycode 83 = Boot
+- control alt keycode 83 = Boot
+-keycode 84 = Last_Console
+-keycode 85 =
+-keycode 86 = less greater bar
+- alt keycode 86 = Meta_less
+-keycode 87 = F11 F11 Console_23
+- control keycode 87 = F11
+- alt keycode 87 = Console_11
+- control alt keycode 87 = Console_11
+-keycode 88 = F12 F12 Console_24
+- control keycode 88 = F12
+- alt keycode 88 = Console_12
+- control alt keycode 88 = Console_12
+-keycode 89 =
+-keycode 90 =
+-keycode 91 =
+-keycode 92 =
+-keycode 93 =
+-keycode 94 =
+-keycode 95 =
+-keycode 96 = KP_Enter
+-keycode 97 = Control
+-keycode 98 = KP_Divide
+-keycode 99 = Control_backslash
+- control keycode 99 = Control_backslash
+- alt keycode 99 = Control_backslash
+-keycode 100 = AltGr
+-keycode 101 = Break
+-keycode 102 = Find
+-keycode 103 = Up
+-keycode 104 = Prior
+- shift keycode 104 = Scroll_Backward
+-keycode 105 = Left
+- alt keycode 105 = Decr_Console
+-keycode 106 = Right
+- alt keycode 106 = Incr_Console
+-keycode 107 = Select
+-keycode 108 = Down
+-keycode 109 = Next
+- shift keycode 109 = Scroll_Forward
+-keycode 110 = Insert
+-keycode 111 = Remove
+-# altgr control keycode 111 = Boot
+- control alt keycode 111 = Boot
+-keycode 112 = Macro
+-keycode 113 = F13
+-keycode 114 = F14
+-keycode 115 = Help
+-keycode 116 = Do
+-keycode 117 = F17
+-keycode 118 = KP_MinPlus
+-keycode 119 = Pause
+-keycode 120 =
+-keycode 121 =
+-keycode 122 =
+-keycode 123 =
+-keycode 124 =
+-keycode 125 =
+-keycode 126 =
+-keycode 127 =
++ alt keycode 57 = Meta_space
++keycode 58 = F9
++ shift keycode 58 = F19
++ altgr keycode 58 = Console_21
++ alt keycode 58 = Console_9
++ control alt keycode 58 = Console_9
++keycode 59 = F1
++ altgr keycode 59 = Console_13
++ alt keycode 59 = Console_1
++ control alt keycode 59 = Console_1
++keycode 60 = F2
++ shift keycode 60 = F12
++ altgr keycode 60 = Console_14
++ alt keycode 60 = Console_2
++ control alt keycode 60 = Console_2
++keycode 61 = F3
++ shift keycode 61 = F13
++ altgr keycode 61 = Console_15
++ alt keycode 61 = Console_3
++ control alt keycode 61 = Console_3
++keycode 62 = F4
++ shift keycode 62 = F14
++ altgr keycode 62 = Console_16
++ alt keycode 62 = Console_4
++ control alt keycode 62 = Console_4
++keycode 63 = F5
++ shift keycode 63 = F15
++ altgr keycode 63 = Console_17
++ alt keycode 63 = Console_5
++ control alt keycode 63 = Console_5
++keycode 64 = F6
++ shift keycode 64 = F16
++ altgr keycode 64 = Console_18
++ alt keycode 64 = Console_6
++ control alt keycode 64 = Console_6
++keycode 65 = F7
++ shift keycode 65 = F17
++ altgr keycode 65 = Console_19
++ alt keycode 65 = Console_7
++ control alt keycode 65 = Console_7
++keycode 66 = F8
++ shift keycode 66 = F18
++ altgr keycode 66 = Console_20
++ alt keycode 66 = Console_8
++ control alt keycode 66 = Console_8
++keycode 72 = Up
++ shift keycode 72 = Scroll_Backward
++ altgr keycode 72 = Scroll_Backward
++ alt keycode 72 = Prior
++keycode 75 = Left
++ altgr keycode 75 = Decr_Console
++ alt keycode 75 = Find
++keycode 77 = Right
++ altgr keycode 77 = Incr_Console
++ alt keycode 77 = Select
++keycode 80 = Down
++ shift keycode 80 = Scroll_Forward
++ altgr keycode 80 = Scroll_Forward
++ alt keycode 80 = Next
++keycode 83 = Remove Remove Meta_Delete
++ alt keycode 83 = Meta_Delete
++keycode 112 = F10
++ shift keycode 112 = F20
++ altgr keycode 112 = Console_22
++ alt keycode 112 = Console_10
++ control alt keycode 112 = Console_10
++keycode 115 = slash question
++ control keycode 115 = Delete
++ alt keycode 115 = Meta_slash
++keycode 123 = AltGr
++keycode 219 = Insert
+ string F1 = "\033[[A"
+ string F2 = "\033[[B"
+ string F3 = "\033[[C"
diff --git a/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/rtc-2.6.17.patch b/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/rtc-2.6.17.patch
new file mode 100644
index 0000000..a744c26
--- /dev/null
+++ b/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/rtc-2.6.17.patch
@@ -0,0 +1,987 @@
+diff -ru linux-2.6.17.old/arch/sh/boards/hp6xx/pm.c linux-2.6.17/arch/sh/boards/hp6xx/pm.c
+--- linux-2.6.17.old/arch/sh/boards/hp6xx/pm.c 2009-12-21 10:27:22.776442805 +0200
++++ linux-2.6.17/arch/sh/boards/hp6xx/pm.c 2009-12-21 10:30:09.366428509 +0200
+@@ -17,6 +17,10 @@
+ #include <asm/cpu/dac.h>
+ #include <asm/pm.h>
+
++#include <asm-sh/rtc.h>
++#include <linux/time.h>
++#include <asm-sh/rtc.h>
++
+ #define STBCR 0xffffff82
+ #define STBCR2 0xffffff88
+
+@@ -68,6 +72,8 @@
+ outb(0x00, HD64461_PCC1CSCR);
+ #endif
+
++ rtc_sh_get_time(&xtime);
++
+ return 0;
+ }
+
+diff -ru linux-2.6.17.old/arch/sh/kernel/cpu/irq/ipr.c linux-2.6.17/arch/sh/kernel/cpu/irq/ipr.c
+--- linux-2.6.17.old/arch/sh/kernel/cpu/irq/ipr.c 2006-06-18 04:49:35.000000000 +0300
++++ linux-2.6.17/arch/sh/kernel/cpu/irq/ipr.c 2009-12-21 10:29:58.713508059 +0200
+@@ -125,7 +125,12 @@
+ make_ipr_irq(TIMER_IRQ, TIMER_IPR_ADDR, TIMER_IPR_POS, TIMER_PRIORITY);
+ make_ipr_irq(TIMER1_IRQ, TIMER1_IPR_ADDR, TIMER1_IPR_POS, TIMER1_PRIORITY);
+ #if defined(CONFIG_SH_RTC)
++ make_ipr_irq(20, RTC_IPR_ADDR, RTC_IPR_POS, RTC_PRIORITY);
++ printk("kernel IRQ RTC =%i\n",20);
++ make_ipr_irq(21, RTC_IPR_ADDR, RTC_IPR_POS, RTC_PRIORITY);
++ printk("kernel IRQ RTC =%i\n",21);
+ make_ipr_irq(RTC_IRQ, RTC_IPR_ADDR, RTC_IPR_POS, RTC_PRIORITY);
++ printk("kernel IRQ RTC =%i\n",RTC_IRQ);
+ #endif
+
+ #ifdef SCI_ERI_IRQ
+diff -ru linux-2.6.17.old/arch/sh/kernel/cpu/sh3/Makefile linux-2.6.17/arch/sh/kernel/cpu/sh3/Makefile
+--- linux-2.6.17.old/arch/sh/kernel/cpu/sh3/Makefile 2006-06-18 04:49:35.000000000 +0300
++++ linux-2.6.17/arch/sh/kernel/cpu/sh3/Makefile 2009-12-21 10:29:58.713508059 +0200
+@@ -4,10 +4,13 @@
+
+ obj-y := ex.o probe.o
+
++obj-$(CONFIG_CPU_SUBTYPE_SH7709) += setup-sh770x.o
++
+ clock-$(CONFIG_CPU_SH3) := clock-sh3.o
+ clock-$(CONFIG_CPU_SUBTYPE_SH7300) := clock-sh7300.o
+ clock-$(CONFIG_CPU_SUBTYPE_SH7705) := clock-sh7705.o
+-clock-$(CONFIG_CPU_SUBTYPE_SH7709) := clock-sh7709.o
++# clock-$(CONFIG_CPU_SUBTYPE_SH7709) := clock-sh7709.o
++clock-$(CONFIG_CPU_SUBTYPE_SH7709) := clock-sh7709.o
+
+ obj-y += $(clock-y)
+
+diff -ru linux-2.6.17.old/arch/sh/kernel/cpu/sh3/setup-sh770x.c linux-2.6.17/arch/sh/kernel/cpu/sh3/setup-sh770x.c
+--- linux-2.6.17.old/arch/sh/kernel/cpu/sh3/setup-sh770x.c 2009-12-21 10:32:06.699746910 +0200
++++ linux-2.6.17/arch/sh/kernel/cpu/sh3/setup-sh770x.c 2009-12-21 10:29:58.713508059 +0200
+@@ -0,0 +1,217 @@
++/*
++ * SH3 Setup code for SH7706, SH7707, SH7708, SH7709
++ *
++ * Copyright (C) 2007 Magnus Damm
++ *
++ * Based on setup-sh7709.c
++ *
++ * Copyright (C) 2006 Paul Mundt
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ */
++#include <linux/init.h>
++#include <linux/io.h>
++#include <linux/irq.h>
++#include <linux/platform_device.h>
++#include <linux/serial.h>
++#include <linux/serial_sci.h>
++
++enum {
++ UNUSED = 0,
++
++ /* interrupt sources */
++ IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5,
++ PINT07, PINT815,
++ DMAC_DEI0, DMAC_DEI1, DMAC_DEI2, DMAC_DEI3,
++ SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI,
++ SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI,
++ SCI_ERI, SCI_RXI, SCI_TXI, SCI_TEI,
++ ADC_ADI,
++ LCDC, PCC0, PCC1,
++ TMU0, TMU1, TMU2_TUNI, TMU2_TICPI,
++ RTC_ATI, RTC_PRI, RTC_CUI,
++ WDT,
++ REF_RCMI, REF_ROVI,
++
++ /* interrupt groups */
++ RTC, REF, TMU2, DMAC, SCI, SCIF2, SCIF0,
++};
++
++static struct intc_vect vectors[] __initdata = {
++ INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420),
++ INTC_VECT(TMU2_TUNI, 0x440), INTC_VECT(TMU2_TICPI, 0x460),
++ INTC_VECT(RTC_ATI, 0x480), INTC_VECT(RTC_PRI, 0x4a0),
++ INTC_VECT(RTC_CUI, 0x4c0),
++ INTC_VECT(SCI_ERI, 0x4e0), INTC_VECT(SCI_RXI, 0x500),
++ INTC_VECT(SCI_TXI, 0x520), INTC_VECT(SCI_TEI, 0x540),
++ INTC_VECT(WDT, 0x560),
++ INTC_VECT(REF_RCMI, 0x580),
++ INTC_VECT(REF_ROVI, 0x5a0),
++#if defined(CONFIG_CPU_SUBTYPE_SH7706) || \
++ defined(CONFIG_CPU_SUBTYPE_SH7707) || \
++ defined(CONFIG_CPU_SUBTYPE_SH7709)
++ INTC_VECT(IRQ4, 0x680), INTC_VECT(IRQ5, 0x6a0),
++ INTC_VECT(DMAC_DEI0, 0x800), INTC_VECT(DMAC_DEI1, 0x820),
++ INTC_VECT(DMAC_DEI2, 0x840), INTC_VECT(DMAC_DEI3, 0x860),
++ INTC_VECT(ADC_ADI, 0x980),
++ INTC_VECT(SCIF2_ERI, 0x900), INTC_VECT(SCIF2_RXI, 0x920),
++ INTC_VECT(SCIF2_BRI, 0x940), INTC_VECT(SCIF2_TXI, 0x960),
++#endif
++#if defined(CONFIG_CPU_SUBTYPE_SH7707) || \
++ defined(CONFIG_CPU_SUBTYPE_SH7709)
++ INTC_VECT(PINT07, 0x700), INTC_VECT(PINT815, 0x720),
++ INTC_VECT(SCIF0_ERI, 0x880), INTC_VECT(SCIF0_RXI, 0x8a0),
++ INTC_VECT(SCIF0_BRI, 0x8c0), INTC_VECT(SCIF0_TXI, 0x8e0),
++#endif
++#if defined(CONFIG_CPU_SUBTYPE_SH7707)
++ INTC_VECT(LCDC, 0x9a0),
++ INTC_VECT(PCC0, 0x9c0), INTC_VECT(PCC1, 0x9e0),
++#endif
++};
++
++static struct intc_group groups[] __initdata = {
++ INTC_GROUP(RTC, RTC_ATI, RTC_PRI, RTC_CUI),
++ INTC_GROUP(TMU2, TMU2_TUNI, TMU2_TICPI),
++ INTC_GROUP(REF, REF_RCMI, REF_ROVI),
++ INTC_GROUP(DMAC, DMAC_DEI0, DMAC_DEI1, DMAC_DEI2, DMAC_DEI3),
++ INTC_GROUP(SCI, SCI_ERI, SCI_RXI, SCI_TXI, SCI_TEI),
++ INTC_GROUP(SCIF0, SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI),
++ INTC_GROUP(SCIF2, SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI),
++};
++
++static struct intc_prio_reg prio_registers[] __initdata = {
++ { 0xfffffee2, 0, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } },
++ { 0xfffffee4, 0, 16, 4, /* IPRB */ { WDT, REF, SCI, 0 } },
++#if defined(CONFIG_CPU_SUBTYPE_SH7706) || \
++ defined(CONFIG_CPU_SUBTYPE_SH7707) || \
++ defined(CONFIG_CPU_SUBTYPE_SH7709)
++ { 0xa4000016, 0, 16, 4, /* IPRC */ { IRQ3, IRQ2, IRQ1, IRQ0 } },
++ { 0xa4000018, 0, 16, 4, /* IPRD */ { 0, 0, IRQ5, IRQ4 } },
++ { 0xa400001a, 0, 16, 4, /* IPRE */ { DMAC, 0, SCIF2, ADC_ADI } },
++#endif
++#if defined(CONFIG_CPU_SUBTYPE_SH7707) || \
++ defined(CONFIG_CPU_SUBTYPE_SH7709)
++ { 0xa4000018, 0, 16, 4, /* IPRD */ { PINT07, PINT815, } },
++ { 0xa400001a, 0, 16, 4, /* IPRE */ { 0, SCIF0 } },
++#endif
++#if defined(CONFIG_CPU_SUBTYPE_SH7707)
++ { 0xa400001c, 0, 16, 4, /* IPRF */ { 0, LCDC, PCC0, PCC1, } },
++#endif
++};
++
++static DECLARE_INTC_DESC(intc_desc, "sh770x", vectors, groups,
++ NULL, prio_registers, NULL);
++
++#if defined(CONFIG_CPU_SUBTYPE_SH7706) || \
++ defined(CONFIG_CPU_SUBTYPE_SH7707) || \
++ defined(CONFIG_CPU_SUBTYPE_SH7709)
++static struct intc_vect vectors_irq[] __initdata = {
++ INTC_VECT(IRQ0, 0x600), INTC_VECT(IRQ1, 0x620),
++ INTC_VECT(IRQ2, 0x640), INTC_VECT(IRQ3, 0x660),
++};
++
++static DECLARE_INTC_DESC(intc_desc_irq, "sh770x-irq", vectors_irq, NULL,
++ NULL, prio_registers, NULL);
++#endif
++
++static struct resource rtc_resources[] = {
++ [0] = {
++ .start = 0xfffffec0,
++ .end = 0xfffffec0 + 0x1e,
++ .flags = IORESOURCE_IO,
++ },
++ [1] = {
++ .start = 21,
++ .flags = IORESOURCE_IRQ,
++ },
++ [2] = {
++ .start = 22,
++ .flags = IORESOURCE_IRQ,
++ },
++ [3] = {
++ .start = 20,
++ .flags = IORESOURCE_IRQ,
++ },
++};
++
++static struct platform_device rtc_device = {
++ .name = "sh-rtc",
++ .id = -1,
++ .num_resources = ARRAY_SIZE(rtc_resources),
++ .resource = rtc_resources,
++};
++
++static struct plat_sci_port sci_platform_data[] = {
++ {
++ .mapbase = 0xfffffe80,
++ .flags = UPF_BOOT_AUTOCONF,
++ .type = PORT_SCI,
++ .irqs = { 23, 24, 25, 0 },
++ },
++#if defined(CONFIG_CPU_SUBTYPE_SH7706) || \
++ defined(CONFIG_CPU_SUBTYPE_SH7707) || \
++ defined(CONFIG_CPU_SUBTYPE_SH7709)
++ {
++ .mapbase = 0xa4000150,
++ .flags = UPF_BOOT_AUTOCONF,
++ .type = PORT_SCIF,
++ .irqs = { 56, 57, 59, 58 },
++ },
++#endif
++#if defined(CONFIG_CPU_SUBTYPE_SH7707) || \
++ defined(CONFIG_CPU_SUBTYPE_SH7709)
++ {
++ .mapbase = 0xa4000140,
++ .flags = UPF_BOOT_AUTOCONF,
++ .type = PORT_IRDA,
++ .irqs = { 52, 53, 55, 54 },
++ },
++#endif
++ {
++ .flags = 0,
++ }
++};
++
++static struct platform_device sci_device = {
++ .name = "sh-sci",
++ .id = -1,
++ .dev = {
++ .platform_data = sci_platform_data,
++ },
++};
++
++static struct platform_device *sh770x_devices[] __initdata = {
++ &sci_device,
++ &rtc_device,
++};
++
++static int __init sh770x_devices_setup(void)
++{
++ return platform_add_devices(sh770x_devices,
++ ARRAY_SIZE(sh770x_devices));
++}
++__initcall(sh770x_devices_setup);
++
++#define INTC_ICR1 0xa4000010UL
++#define INTC_ICR1_IRQLVL (1<<14)
++
++void __init plat_irq_setup_pins(int mode)
++{
++ if (mode == IRQ_MODE_IRQ) {
++#if defined(CONFIG_CPU_SUBTYPE_SH7706) || \
++ defined(CONFIG_CPU_SUBTYPE_SH7707) || \
++ defined(CONFIG_CPU_SUBTYPE_SH7709)
++ ctrl_outw(ctrl_inw(INTC_ICR1) & ~INTC_ICR1_IRQLVL, INTC_ICR1);
++/* register_intc_controller(&intc_desc_irq); */
++ return;
++#endif
++ }
++ BUG();
++}
++
++void __init plat_irq_setup(void)
++{
++/* register_intc_controller(&intc_desc); */
++}
+diff -ru linux-2.6.17.old/drivers/rtc/interface.c linux-2.6.17/drivers/rtc/interface.c
+--- linux-2.6.17.old/drivers/rtc/interface.c 2006-06-18 04:49:35.000000000 +0300
++++ linux-2.6.17/drivers/rtc/interface.c 2009-12-21 10:29:58.713508059 +0200
+@@ -145,11 +145,16 @@
+ }
+ EXPORT_SYMBOL_GPL(rtc_set_alarm);
+
+-void rtc_update_irq(struct class_device *class_dev,
++/**
++ * rtc_update_irq - report RTC periodic, alarm, and/or update irqs
++ * @rtc: the rtc device
++ * @num: how many irqs are being reported (usually one)
++ * @events: mask of RTC_IRQF with one or more of RTC_PF, RTC_AF, RTC_UF
++ * Context: in_interrupt(), irqs blocked
++ */
++void rtc_update_irq(struct rtc_device *rtc,
+ unsigned long num, unsigned long events)
+ {
+- struct rtc_device *rtc = to_rtc_device(class_dev);
+-
+ spin_lock(&rtc->irq_lock);
+ rtc->irq_data = (rtc->irq_data + (num << 8)) | events;
+ spin_unlock(&rtc->irq_lock);
+diff -ru linux-2.6.17.old/drivers/rtc/rtc-sh.c linux-2.6.17/drivers/rtc/rtc-sh.c
+--- linux-2.6.17.old/drivers/rtc/rtc-sh.c 2009-12-21 10:27:23.403110577 +0200
++++ linux-2.6.17/drivers/rtc/rtc-sh.c 2009-12-21 10:29:58.716840103 +0200
+@@ -1,7 +1,8 @@
+ /*
+ * SuperH On-Chip RTC Support
+ *
+- * Copyright (C) 2006 Paul Mundt
++ * Copyright (C) 2006, 2007 Paul Mundt
++ * Copyright (C) 2006 Jamie Lenehan
+ *
+ * Based on the old arch/sh/kernel/cpu/rtc.c by:
+ *
+@@ -21,34 +22,46 @@
+ #include <linux/seq_file.h>
+ #include <linux/interrupt.h>
+ #include <linux/spinlock.h>
+-#include <asm/io.h>
++#include <linux/io.h>
++#include <asm/rtc.h>
+
+-#ifdef CONFIG_CPU_SH3
+-#define rtc_reg_size sizeof(u16)
+-#define RTC_BIT_INVERTED 0 /* No bug on SH7708, SH7709A */
+-#elif defined(CONFIG_CPU_SH4)
+-#define rtc_reg_size sizeof(u32)
+-#define RTC_BIT_INVERTED 0x40 /* bug on SH7750, SH7750S */
+-#endif
++#define DRV_NAME "sh-rtc"
++#define DRV_VERSION "0.1.6"
+
+ #define RTC_REG(r) ((r) * rtc_reg_size)
+
+-#define R64CNT RTC_REG(0)
+-#define RSECCNT RTC_REG(1)
+-#define RMINCNT RTC_REG(2)
+-#define RHRCNT RTC_REG(3)
+-#define RWKCNT RTC_REG(4)
+-#define RDAYCNT RTC_REG(5)
+-#define RMONCNT RTC_REG(6)
+-#define RYRCNT RTC_REG(7)
+-#define RSECAR RTC_REG(8)
+-#define RMINAR RTC_REG(9)
+-#define RHRAR RTC_REG(10)
+-#define RWKAR RTC_REG(11)
+-#define RDAYAR RTC_REG(12)
+-#define RMONAR RTC_REG(13)
+-#define RCR1 RTC_REG(14)
+-#define RCR2 RTC_REG(15)
++#define R64CNT RTC_REG(0)
++
++#define RSECCNT RTC_REG(1) /* RTC sec */
++#define RMINCNT RTC_REG(2) /* RTC min */
++#define RHRCNT RTC_REG(3) /* RTC hour */
++#define RWKCNT RTC_REG(4) /* RTC week */
++#define RDAYCNT RTC_REG(5) /* RTC day */
++#define RMONCNT RTC_REG(6) /* RTC month */
++#define RYRCNT RTC_REG(7) /* RTC year */
++#define RSECAR RTC_REG(8) /* ALARM sec */
++#define RMINAR RTC_REG(9) /* ALARM min */
++#define RHRAR RTC_REG(10) /* ALARM hour */
++#define RWKAR RTC_REG(11) /* ALARM week */
++#define RDAYAR RTC_REG(12) /* ALARM day */
++#define RMONAR RTC_REG(13) /* ALARM month */
++#define RCR1 RTC_REG(14) /* Control */
++#define RCR2 RTC_REG(15) /* Control */
++
++/*
++ * Note on RYRAR and RCR3: Up until this point most of the register
++ * definitions are consistent across all of the available parts. However,
++ * the placement of the optional RYRAR and RCR3 (the RYRAR control
++ * register used to control RYRCNT/RYRAR compare) varies considerably
++ * across various parts, occasionally being mapped in to a completely
++ * unrelated address space. For proper RYRAR support a separate resource
++ * would have to be handed off, but as this is purely optional in
++ * practice, we simply opt not to support it, thereby keeping the code
++ * quite a bit more simplified.
++ */
++
++/* ALARM Bits - or with BCD encoded value */
++#define AR_ENB 0x80 /* Enable for alarm cmp */
+
+ /* RCR1 Bits */
+ #define RCR1_CF 0x80 /* Carry Flag */
+@@ -71,39 +84,82 @@
+ unsigned int alarm_irq, periodic_irq, carry_irq;
+ struct rtc_device *rtc_dev;
+ spinlock_t lock;
++ int rearm_aie;
++ unsigned long capabilities; /* See asm-sh/rtc.h for cap bits */
+ };
+
+-static irqreturn_t sh_rtc_interrupt(int irq, void *id, struct pt_regs *regs)
++static irqreturn_t sh_rtc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+ {
+- struct platform_device *pdev = id;
++ struct platform_device *pdev = to_platform_device(dev_id);
+ struct sh_rtc *rtc = platform_get_drvdata(pdev);
+ unsigned int tmp, events = 0;
+
+ spin_lock(&rtc->lock);
+
+ tmp = readb(rtc->regbase + RCR1);
++ tmp &= ~RCR1_CF;
+
+- if (tmp & RCR1_AF)
+- events |= RTC_AF | RTC_IRQF;
+-
+- tmp &= ~(RCR1_CF | RCR1_AF);
++ if (rtc->rearm_aie) {
++ if (tmp & RCR1_AF)
++ tmp &= ~RCR1_AF; /* try to clear AF again */
++ else {
++ tmp |= RCR1_AIE; /* AF has cleared, rearm IRQ */
++ rtc->rearm_aie = 0;
++ }
++ }
+
+ writeb(tmp, rtc->regbase + RCR1);
+-
+- rtc_update_irq(&rtc->rtc_dev->class_dev, 1, events);
++
++ rtc_update_irq(rtc->rtc_dev, 1, events);
+
+ spin_unlock(&rtc->lock);
+
+ return IRQ_HANDLED;
+ }
+
+-static irqreturn_t sh_rtc_periodic(int irq, void *id, struct pt_regs *regs)
++static irqreturn_t sh_rtc_alarm(int irq, void *dev_id, struct pt_regs *regs)
++{
++ struct platform_device *pdev = to_platform_device(dev_id);
++ struct sh_rtc *rtc = platform_get_drvdata(pdev);
++ unsigned int tmp, events = 0;
++
++ spin_lock(&rtc->lock);
++
++ tmp = readb(rtc->regbase + RCR1);
++
++ /*
++ * If AF is set then the alarm has triggered. If we clear AF while
++ * the alarm time still matches the RTC time then AF will
++ * immediately be set again, and if AIE is enabled then the alarm
++ * interrupt will immediately be retrigger. So we clear AIE here
++ * and use rtc->rearm_aie so that the carry interrupt will keep
++ * trying to clear AF and once it stays cleared it'll re-enable
++ * AIE.
++ */
++ if (tmp & RCR1_AF) {
++ events |= RTC_AF | RTC_IRQF;
++
++ tmp &= ~(RCR1_AF|RCR1_AIE);
++
++ writeb(tmp, rtc->regbase + RCR1);
++
++ rtc->rearm_aie = 1;
++
++ rtc_update_irq(rtc->rtc_dev, 1, events);
++ }
++
++ spin_unlock(&rtc->lock);
++ return IRQ_HANDLED;
++}
++
++static irqreturn_t sh_rtc_periodic(int irq, void *dev_id, struct pt_regs *regs)
+ {
+- struct sh_rtc *rtc = dev_get_drvdata(id);
++ struct platform_device *pdev = to_platform_device(dev_id);
++ struct sh_rtc *rtc = platform_get_drvdata(pdev);
+
+ spin_lock(&rtc->lock);
+
+- rtc_update_irq(&rtc->rtc_dev->class_dev, 1, RTC_PF | RTC_IRQF);
++ rtc_update_irq(rtc->rtc_dev, 1, RTC_PF | RTC_IRQF);
+
+ spin_unlock(&rtc->lock);
+
+@@ -139,10 +195,11 @@
+
+ tmp = readb(rtc->regbase + RCR1);
+
+- if (enable)
+- tmp |= RCR1_AIE;
+- else
++ if (!enable) {
+ tmp &= ~RCR1_AIE;
++ rtc->rearm_aie = 0;
++ } else if (rtc->rearm_aie == 0)
++ tmp |= RCR1_AIE;
+
+ writeb(tmp, rtc->regbase + RCR1);
+
+@@ -177,14 +234,14 @@
+ goto err_bad_carry;
+ }
+
+- ret = request_irq(rtc->alarm_irq, sh_rtc_interrupt, SA_INTERRUPT,
++ ret = request_irq(rtc->alarm_irq, sh_rtc_alarm, SA_INTERRUPT,
+ "sh-rtc alarm", dev);
+ if (unlikely(ret)) {
+ dev_err(dev, "request alarm IRQ failed with %d, IRQ %d\n",
+ ret, rtc->alarm_irq);
+ goto err_bad_alarm;
+ }
+-
++
+ return 0;
+
+ err_bad_alarm:
+@@ -200,6 +257,7 @@
+ struct sh_rtc *rtc = dev_get_drvdata(dev);
+
+ sh_rtc_setpie(dev, 0);
++ sh_rtc_setaie(dev, 0);
+
+ free_irq(rtc->periodic_irq, dev);
+ free_irq(rtc->carry_irq, dev);
+@@ -212,8 +270,6 @@
+ unsigned int tmp;
+
+ tmp = readb(rtc->regbase + RCR1);
+- seq_printf(seq, "alarm_IRQ\t: %s\n",
+- (tmp & RCR1_AIE) ? "yes" : "no");
+ seq_printf(seq, "carry_IRQ\t: %s\n",
+ (tmp & RCR1_CIE) ? "yes" : "no");
+
+@@ -267,16 +323,16 @@
+ tm->tm_hour = BCD2BIN(readb(rtc->regbase + RHRCNT));
+ tm->tm_wday = BCD2BIN(readb(rtc->regbase + RWKCNT));
+ tm->tm_mday = BCD2BIN(readb(rtc->regbase + RDAYCNT));
+- tm->tm_mon = BCD2BIN(readb(rtc->regbase + RMONCNT));
++ tm->tm_mon = BCD2BIN(readb(rtc->regbase + RMONCNT)) - 1;
+
+-#if defined(CONFIG_CPU_SH4)
+- yr = readw(rtc->regbase + RYRCNT);
+- yr100 = BCD2BIN(yr >> 8);
+- yr &= 0xff;
+-#else
+- yr = readb(rtc->regbase + RYRCNT);
+- yr100 = BCD2BIN((yr == 0x99) ? 0x19 : 0x20);
+-#endif
++ if (rtc->capabilities & RTC_CAP_4_DIGIT_YEAR) {
++ yr = readw(rtc->regbase + RYRCNT);
++ yr100 = BCD2BIN(yr >> 8);
++ yr &= 0xff;
++ } else {
++ yr = readb(rtc->regbase + RYRCNT);
++ yr100 = BCD2BIN((yr == 0x99) ? 0x19 : 0x20);
++ }
+
+ tm->tm_year = (yr100 * 100 + BCD2BIN(yr)) - 1900;
+
+@@ -291,14 +347,16 @@
+ tm->tm_sec--;
+ #endif
+
+- dev_dbg(&dev, "%s: tm is secs=%d, mins=%d, hours=%d, "
++ dev_dbg(dev, "%s: tm is secs=%d, mins=%d, hours=%d, "
+ "mday=%d, mon=%d, year=%d, wday=%d\n",
+ __FUNCTION__,
+ tm->tm_sec, tm->tm_min, tm->tm_hour,
+- tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
++ tm->tm_mday, tm->tm_mon + 1, tm->tm_year, tm->tm_wday);
+
+- if (rtc_valid_tm(tm) < 0)
++ if (rtc_valid_tm(tm) < 0) {
+ dev_err(dev, "invalid date\n");
++ rtc_time_to_tm(0, tm);
++ }
+
+ return 0;
+ }
+@@ -315,6 +373,7 @@
+ /* Reset pre-scaler & stop RTC */
+ tmp = readb(rtc->regbase + RCR2);
+ tmp |= RCR2_RESET;
++ tmp &= ~RCR2_START;
+ writeb(tmp, rtc->regbase + RCR2);
+
+ writeb(BIN2BCD(tm->tm_sec), rtc->regbase + RSECCNT);
+@@ -322,16 +381,16 @@
+ writeb(BIN2BCD(tm->tm_hour), rtc->regbase + RHRCNT);
+ writeb(BIN2BCD(tm->tm_wday), rtc->regbase + RWKCNT);
+ writeb(BIN2BCD(tm->tm_mday), rtc->regbase + RDAYCNT);
+- writeb(BIN2BCD(tm->tm_mon), rtc->regbase + RMONCNT);
++ writeb(BIN2BCD(tm->tm_mon + 1), rtc->regbase + RMONCNT);
+
+-#ifdef CONFIG_CPU_SH3
+- year = tm->tm_year % 100;
+- writeb(BIN2BCD(year), rtc->regbase + RYRCNT);
+-#else
+- year = (BIN2BCD((tm->tm_year + 1900) / 100) << 8) |
+- BIN2BCD(tm->tm_year % 100);
+- writew(year, rtc->regbase + RYRCNT);
+-#endif
++ if (rtc->capabilities & RTC_CAP_4_DIGIT_YEAR) {
++ year = (BIN2BCD((tm->tm_year + 1900) / 100) << 8) |
++ BIN2BCD(tm->tm_year % 100);
++ writew(year, rtc->regbase + RYRCNT);
++ } else {
++ year = tm->tm_year % 100;
++ writeb(BIN2BCD(year), rtc->regbase + RYRCNT);
++ }
+
+ /* Start RTC */
+ tmp = readb(rtc->regbase + RCR2);
+@@ -344,12 +403,140 @@
+ return 0;
+ }
+
++static inline int sh_rtc_read_alarm_value(struct sh_rtc *rtc, int reg_off)
++{
++ unsigned int byte;
++ int value = 0xff; /* return 0xff for ignored values */
++
++ byte = readb(rtc->regbase + reg_off);
++ if (byte & AR_ENB) {
++ byte &= ~AR_ENB; /* strip the enable bit */
++ value = BCD2BIN(byte);
++ }
++
++ return value;
++}
++
++static int sh_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *wkalrm)
++{
++ struct platform_device *pdev = to_platform_device(dev);
++ struct sh_rtc *rtc = platform_get_drvdata(pdev);
++ struct rtc_time* tm = &wkalrm->time;
++
++ spin_lock_irq(&rtc->lock);
++
++ tm->tm_sec = sh_rtc_read_alarm_value(rtc, RSECAR);
++ tm->tm_min = sh_rtc_read_alarm_value(rtc, RMINAR);
++ tm->tm_hour = sh_rtc_read_alarm_value(rtc, RHRAR);
++ tm->tm_wday = sh_rtc_read_alarm_value(rtc, RWKAR);
++ tm->tm_mday = sh_rtc_read_alarm_value(rtc, RDAYAR);
++ tm->tm_mon = sh_rtc_read_alarm_value(rtc, RMONAR);
++ if (tm->tm_mon > 0)
++ tm->tm_mon -= 1; /* RTC is 1-12, tm_mon is 0-11 */
++ tm->tm_year = 0xffff;
++
++ wkalrm->enabled = (readb(rtc->regbase + RCR1) & RCR1_AIE) ? 1 : 0;
++
++ spin_unlock_irq(&rtc->lock);
++
++ return 0;
++}
++
++static inline void sh_rtc_write_alarm_value(struct sh_rtc *rtc,
++ int value, int reg_off)
++{
++ /* < 0 for a value that is ignored */
++ if (value < 0)
++ writeb(0, rtc->regbase + reg_off);
++ else
++ writeb(BIN2BCD(value) | AR_ENB, rtc->regbase + reg_off);
++}
++
++static int sh_rtc_check_alarm(struct rtc_time* tm)
++{
++ /*
++ * The original rtc says anything > 0xc0 is "don't care" or "match
++ * all" - most users use 0xff but rtc-dev uses -1 for the same thing.
++ * The original rtc doesn't support years - some things use -1 and
++ * some 0xffff. We use -1 to make out tests easier.
++ */
++ if (tm->tm_year == 0xffff)
++ tm->tm_year = -1;
++ if (tm->tm_mon >= 0xff)
++ tm->tm_mon = -1;
++ if (tm->tm_mday >= 0xff)
++ tm->tm_mday = -1;
++ if (tm->tm_wday >= 0xff)
++ tm->tm_wday = -1;
++ if (tm->tm_hour >= 0xff)
++ tm->tm_hour = -1;
++ if (tm->tm_min >= 0xff)
++ tm->tm_min = -1;
++ if (tm->tm_sec >= 0xff)
++ tm->tm_sec = -1;
++
++ if (tm->tm_year > 9999 ||
++ tm->tm_mon >= 12 ||
++ tm->tm_mday == 0 || tm->tm_mday >= 32 ||
++ tm->tm_wday >= 7 ||
++ tm->tm_hour >= 24 ||
++ tm->tm_min >= 60 ||
++ tm->tm_sec >= 60)
++ return -EINVAL;
++
++ return 0;
++}
++
++static int sh_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *wkalrm)
++{
++ struct platform_device *pdev = to_platform_device(dev);
++ struct sh_rtc *rtc = platform_get_drvdata(pdev);
++ unsigned int rcr1;
++ struct rtc_time *tm = &wkalrm->time;
++ int mon, err;
++
++ err = sh_rtc_check_alarm(tm);
++ if (unlikely(err < 0))
++ return err;
++
++ spin_lock_irq(&rtc->lock);
++
++ /* disable alarm interrupt and clear the alarm flag */
++ rcr1 = readb(rtc->regbase + RCR1);
++ rcr1 &= ~(RCR1_AF|RCR1_AIE);
++ writeb(rcr1, rtc->regbase + RCR1);
++
++ rtc->rearm_aie = 0;
++
++ /* set alarm time */
++ sh_rtc_write_alarm_value(rtc, tm->tm_sec, RSECAR);
++ sh_rtc_write_alarm_value(rtc, tm->tm_min, RMINAR);
++ sh_rtc_write_alarm_value(rtc, tm->tm_hour, RHRAR);
++ sh_rtc_write_alarm_value(rtc, tm->tm_wday, RWKAR);
++ sh_rtc_write_alarm_value(rtc, tm->tm_mday, RDAYAR);
++ mon = tm->tm_mon;
++ if (mon >= 0)
++ mon += 1;
++ sh_rtc_write_alarm_value(rtc, mon, RMONAR);
++
++ if (wkalrm->enabled) {
++ rcr1 |= RCR1_AIE;
++ writeb(rcr1, rtc->regbase + RCR1);
++ }
++
++ spin_unlock_irq(&rtc->lock);
++
++ return 0;
++}
++
+ static struct rtc_class_ops sh_rtc_ops = {
+ .open = sh_rtc_open,
+ .release = sh_rtc_release,
+ .ioctl = sh_rtc_ioctl,
+ .read_time = sh_rtc_read_time,
+ .set_time = sh_rtc_set_time,
++ .read_alarm = sh_rtc_read_alarm,
++ .set_alarm = sh_rtc_set_alarm,
+ .proc = sh_rtc_proc,
+ };
+
+@@ -405,11 +592,22 @@
+
+ rtc->rtc_dev = rtc_device_register("sh", &pdev->dev,
+ &sh_rtc_ops, THIS_MODULE);
+- if (IS_ERR(rtc)) {
++ if (IS_ERR(rtc->rtc_dev)) {
+ ret = PTR_ERR(rtc->rtc_dev);
+ goto err_badmap;
+ }
+
++ rtc->capabilities = RTC_DEF_CAPABILITIES;
++ if (pdev->dev.platform_data) {
++ struct sh_rtc_platform_info *pinfo = pdev->dev.platform_data;
++
++ /*
++ * Some CPUs have special capabilities in addition to the
++ * default set. Add those in here.
++ */
++/* rtc->capabilities |= pinfo->capabilities; */
++ }
++
+ platform_set_drvdata(pdev, rtc);
+
+ return 0;
+@@ -425,7 +623,7 @@
+ static int __devexit sh_rtc_remove(struct platform_device *pdev)
+ {
+ struct sh_rtc *rtc = platform_get_drvdata(pdev);
+-
++
+ if (likely(rtc->rtc_dev))
+ rtc_device_unregister(rtc->rtc_dev);
+
+@@ -442,7 +640,7 @@
+ }
+ static struct platform_driver sh_rtc_platform_driver = {
+ .driver = {
+- .name = "sh-rtc",
++ .name = DRV_NAME,
+ .owner = THIS_MODULE,
+ },
+ .probe = sh_rtc_probe,
+@@ -463,5 +661,7 @@
+ module_exit(sh_rtc_exit);
+
+ MODULE_DESCRIPTION("SuperH on-chip RTC driver");
+-MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>");
++MODULE_VERSION(DRV_VERSION);
++MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>, Jamie Lenehan <lenehan@twibble.org>");
+ MODULE_LICENSE("GPL");
++MODULE_ALIAS("platform:" DRV_NAME);
+diff -ru linux-2.6.17.old/include/asm-sh/cpu-sh3/rtc.h linux-2.6.17/include/asm-sh/cpu-sh3/rtc.h
+--- linux-2.6.17.old/include/asm-sh/cpu-sh3/rtc.h 2006-06-18 04:49:35.000000000 +0300
++++ linux-2.6.17/include/asm-sh/cpu-sh3/rtc.h 2009-12-21 10:30:05.923092336 +0200
+@@ -20,6 +20,8 @@
+ #define RCR2 0xfffffede
+
+ #define RTC_BIT_INVERTED 0 /* No bug on SH7708, SH7709A */
++#define RTC_DEF_CAPABILITIES 0UL
++#define rtc_reg_size sizeof(u16)
+
+ #endif /* __ASM_CPU_SH3_RTC_H */
+
+diff -ru linux-2.6.17.old/include/asm-sh/hw_irq.h linux-2.6.17/include/asm-sh/hw_irq.h
+--- linux-2.6.17.old/include/asm-sh/hw_irq.h 2006-06-18 04:49:35.000000000 +0300
++++ linux-2.6.17/include/asm-sh/hw_irq.h 2009-12-21 10:29:58.716840103 +0200
+@@ -1,6 +1,111 @@
+ #ifndef __ASM_SH_HW_IRQ_H
+ #define __ASM_SH_HW_IRQ_H
+
++#include <linux/init.h>
++#include <asm/atomic.h>
++
++extern atomic_t irq_err_count;
++
++/*
++struct ipr_data {
++ unsigned char irq;
++ unsigned char ipr_idx;*/ /* Index for the IPR registered */
++/*
++ unsigned char shift; */ /* Number of bits to shift the data */
++/*
++ unsigned char priority; *//* The priority */
++/* };*/
++
++/*
++struct ipr_desc {
++ unsigned long *ipr_offsets;
++ unsigned int nr_offsets;
++ struct ipr_data *ipr_data;
++ unsigned int nr_irqs;
++ struct irq_chip chip;
++};
++
++void register_ipr_controller(struct ipr_desc *);
++*/
++
++typedef unsigned char intc_enum;
++
++struct intc_vect {
++ intc_enum enum_id;
++ unsigned short vect;
++};
++
++#define INTC_VECT(enum_id, vect) { enum_id, vect }
++#define INTC_IRQ(enum_id, irq) INTC_VECT(enum_id, irq2evt(irq))
++
++struct intc_group {
++ intc_enum enum_id;
++ intc_enum enum_ids[32];
++};
++
++#define INTC_GROUP(enum_id, ids...) { enum_id, { ids } }
++
++struct intc_mask_reg {
++ unsigned long set_reg, clr_reg, reg_width;
++ intc_enum enum_ids[32];
++#ifdef CONFIG_SMP
++ unsigned long smp;
++#endif
++};
++
++struct intc_prio_reg {
++ unsigned long set_reg, clr_reg, reg_width, field_width;
++ intc_enum enum_ids[16];
++#ifdef CONFIG_SMP
++ unsigned long smp;
++#endif
++};
++
++struct intc_sense_reg {
++ unsigned long reg, reg_width, field_width;
++ intc_enum enum_ids[16];
++};
++
++#ifdef CONFIG_SMP
++#define INTC_SMP(stride, nr) .smp = (stride) | ((nr) << 8)
++#else
++#define INTC_SMP(stride, nr)
++#endif
++
++struct intc_desc {
++ struct intc_vect *vectors;
++ unsigned int nr_vectors;
++ struct intc_group *groups;
++ unsigned int nr_groups;
++ struct intc_mask_reg *mask_regs;
++ unsigned int nr_mask_regs;
++ struct intc_prio_reg *prio_regs;
++ unsigned int nr_prio_regs;
++ struct intc_sense_reg *sense_regs;
++ unsigned int nr_sense_regs;
++ char *name;
++};
++
++#define _INTC_ARRAY(a) a, sizeof(a)/sizeof(*a)
++#define DECLARE_INTC_DESC(symbol, chipname, vectors, groups, \
++ mask_regs, prio_regs, sense_regs) \
++struct intc_desc symbol __initdata = { \
++ _INTC_ARRAY(vectors), _INTC_ARRAY(groups), \
++ _INTC_ARRAY(mask_regs), _INTC_ARRAY(prio_regs), \
++ _INTC_ARRAY(sense_regs), \
++ chipname, \
++}
++
++void __init register_intc_controller(struct intc_desc *desc);
++int intc_set_priority(unsigned int irq, unsigned int prio);
++
++void __init plat_irq_setup(void);
++
++enum { IRQ_MODE_IRQ, IRQ_MODE_IRQ7654, IRQ_MODE_IRQ3210,
++ IRQ_MODE_IRL7654_MASK, IRQ_MODE_IRL3210_MASK,
++ IRQ_MODE_IRL7654, IRQ_MODE_IRL3210 };
++void __init plat_irq_setup_pins(int mode);
++
+ static inline void hw_resend_irq(struct hw_interrupt_type *h, unsigned int i)
+ {
+ /* Nothing to do */
+diff -ru linux-2.6.17.old/include/asm-sh/rtc.h linux-2.6.17/include/asm-sh/rtc.h
+--- linux-2.6.17.old/include/asm-sh/rtc.h 2009-12-21 10:27:23.566444610 +0200
++++ linux-2.6.17/include/asm-sh/rtc.h 2009-12-21 10:29:58.716840103 +0200
+@@ -25,5 +25,7 @@
+ #define RCR2_RESET 0x02 /* Reset bit */
+ #define RCR2_START 0x01 /* Start bit */
+
++#define RTC_CAP_4_DIGIT_YEAR (1 << 0)
++
+ #endif /* __KERNEL__ */
+ #endif /* _ASM_RTC_H */
+diff -ru linux-2.6.17.old/include/linux/rtc.h linux-2.6.17/include/linux/rtc.h
+--- linux-2.6.17.old/include/linux/rtc.h 2006-06-18 04:49:35.000000000 +0300
++++ linux-2.6.17/include/linux/rtc.h 2009-12-21 10:29:58.716840103 +0200
+@@ -172,7 +172,8 @@
+ struct rtc_wkalrm *alrm);
+ extern int rtc_set_alarm(struct class_device *class_dev,
+ struct rtc_wkalrm *alrm);
+-extern void rtc_update_irq(struct class_device *class_dev,
++
++extern void rtc_update_irq(struct rtc_device *rtc,
+ unsigned long num, unsigned long events);
+
+ extern struct class_device *rtc_class_open(char *name);
+diff -ru linux-2.6.17.old/include/linux/serial_sci.h linux-2.6.17/include/linux/serial_sci.h
+--- linux-2.6.17.old/include/linux/serial_sci.h 2009-12-21 10:33:00.536412963 +0200
++++ linux-2.6.17/include/linux/serial_sci.h 2009-12-21 10:29:58.716840103 +0200
+@@ -0,0 +1,32 @@
++#ifndef __LINUX_SERIAL_SCI_H
++#define __LINUX_SERIAL_SCI_H
++
++#include <linux/serial_core.h>
++
++/*
++ * Generic header for SuperH SCI(F) (used by sh/sh64/h8300 and related parts)
++ */
++
++/* Offsets into the sci_port->irqs array */
++enum {
++ SCIx_ERI_IRQ,
++ SCIx_RXI_IRQ,
++ SCIx_TXI_IRQ,
++ SCIx_BRI_IRQ,
++ SCIx_NR_IRQS,
++};
++
++/*
++ * Platform device specific platform_data struct
++ */
++struct plat_sci_port {
++ void __iomem *membase; /* io cookie */
++ unsigned long mapbase; /* resource base */
++ unsigned int irqs[SCIx_NR_IRQS]; /* ERI, RXI, TXI, BRI */
++ unsigned int type; /* SCI / SCIF / IRDA */
++ upf_t flags; /* UPF_* flags */
++};
++
++int early_sci_setup(struct uart_port *port);
++
++#endif /* __LINUX_SERIAL_SCI_H */
diff --git a/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/unexpected-int-fix.patch b/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/unexpected-int-fix.patch
new file mode 100644
index 0000000..bf2d2a5
--- /dev/null
+++ b/recipes-kernel/linux/linux-jlime-jornada6xx-2.6.17/unexpected-int-fix.patch
@@ -0,0 +1,17 @@
+--- linux-2.6.17-vanilla/drivers/ide/ide-io.c 2006-06-18 01:49:35.000000000 +0000
++++ linux-2.6.17/drivers/ide/ide-io.c 2006-07-06 14:18:13.000000000 +0000
+@@ -1442,10 +1442,10 @@
+ ++count;
+ if (time_after(jiffies, last_msgtime + HZ)) {
+ last_msgtime = jiffies;
+- printk(KERN_ERR "%s%s: unexpected interrupt, "
+- "status=0x%02x, count=%ld\n",
+- hwif->name,
+- (hwif->next==hwgroup->hwif) ? "" : "(?)", stat, count);
++ //printk(KERN_ERR "%s%s: unexpected interrupt, "
++ // "status=0x%02x, count=%ld\n",
++ // hwif->name,
++ // (hwif->next==hwgroup->hwif) ? "" : "(?)", stat, count);
+ }
+ }
+ }
diff --git a/recipes-kernel/linux/linux-jlime-jornada6xx_2.6.17.bb b/recipes-kernel/linux/linux-jlime-jornada6xx_2.6.17.bb
new file mode 100644
index 0000000..8e68e57
--- /dev/null
+++ b/recipes-kernel/linux/linux-jlime-jornada6xx_2.6.17.bb
@@ -0,0 +1,31 @@
+DESCRIPTION = "JLime Linux kernel for SuperH based Jornada 6xx"
+SECTION = "kernel"
+LICENSE = "GPLv2"
+
+COMPATIBLE_MACHINE = "jornada6xx"
+
+SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-2.6.17.tar.bz2 \
+ file://defconfig_jlime \
+ file://LinuxSH-2.6.17.patch \
+ file://alsa_hp6xx_2.6.17.patch \
+ file://rtc-2.6.17.patch \
+ file://unexpected-int-fix.patch \
+ file://keymap-fix.patch \
+ file://io.h-fix.patch \
+ file://keyboard-fix-deadkeys.patch"
+
+S = "${WORKDIR}/linux-${PV}"
+
+inherit kernel
+
+#Lets let 3.4.x handle the compilation of this one
+KERNEL_CCSUFFIX = "-3.4.4"
+
+ARCH = "sh"
+FILES_kernel-image = "/boot/${KERNEL_IMAGETYPE}*"
+
+do_configure_prepend() {
+ install -m 0644 ${WORKDIR}/defconfig_jlime ${S}/.config
+}
+SRC_URI[md5sum] = "37ddefe96625502161f075b9d907f21e"
+SRC_URI[sha256sum] = "ab0f647d52f124958439517df9e1ae0efda90cdb851f59f522fa1749f1d87d58"
diff --git a/recipes-kernel/linux/linux-jlime-jornada7xx_2.6.37+git.bb b/recipes-kernel/linux/linux-jlime-jornada7xx_2.6.37+git.bb
new file mode 100644
index 0000000..398e9da
--- /dev/null
+++ b/recipes-kernel/linux/linux-jlime-jornada7xx_2.6.37+git.bb
@@ -0,0 +1,23 @@
+SECTION = "kernel"
+DESCRIPTION = "JLime Linux kernel for Arm based Jornada 7xx"
+LICENSE = "GPLv2"
+PR = "r0"
+
+SRCREV="7ee4a9696f324ee5b721904b24591ed7b8ab6504"
+
+COMPATIBLE_HOST = "arm.*-linux"
+COMPATIBLE_MACHINE = "jornada7xx"
+
+SRC_URI = "git://git.kernel.org/pub/scm/linux/kernel/git/kristoffer/linux-hpc.git;protocol=git;branch=v2.6.37-hpc"
+
+S = "${WORKDIR}/git"
+
+inherit kernel
+
+ARCH = "arm"
+
+FILES_kernel-image = "/boot/${KERNEL_IMAGETYPE}*"
+
+do_configure_prepend() {
+ install -m 0644 ${S}/arch/arm/configs/jornada720_defconfig ${S}/.config
+}
diff --git a/recipes-kernel/linux/linux-palm-omap1-2.6.22-omap1/palmtt/defconfig b/recipes-kernel/linux/linux-palm-omap1-2.6.22-omap1/palmtt/defconfig
new file mode 100644
index 0000000..72d52d2
--- /dev/null
+++ b/recipes-kernel/linux/linux-palm-omap1-2.6.22-omap1/palmtt/defconfig
@@ -0,0 +1,882 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.22-omap1
+# Sat Jul 14 20:09:05 2007
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=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_SYSVIPC_SYSCTL=y
+# CONFIG_POSIX_MQUEUE is not set
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 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_LOG_BUF_SHIFT=14
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+# CONFIG_BLK_DEV_INITRD is not set
+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_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_ANON_INODES=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+
+#
+# Loadable module support
+#
+# CONFIG_MODULES is not set
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+# CONFIG_IOSCHED_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_NS9XXX 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 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_DAVINCI is not set
+CONFIG_ARCH_OMAP=y
+
+#
+# TI OMAP Implementations
+#
+CONFIG_ARCH_OMAP1=y
+# CONFIG_ARCH_OMAP2 is not set
+# CONFIG_ARCH_OMAP3 is not set
+
+#
+# OMAP Feature Selections
+#
+# CONFIG_OMAP_RESET_CLOCKS is not set
+# CONFIG_OMAP_BOOT_TAG is not set
+# CONFIG_OMAP_GPIO_SWITCH is not set
+CONFIG_OMAP_MUX=y
+# CONFIG_OMAP_MUX_DEBUG is not set
+CONFIG_OMAP_MUX_WARNINGS=y
+CONFIG_OMAP_MCBSP=y
+CONFIG_OMAP_MMU_FWK=y
+CONFIG_OMAP_MBOX_FWK=y
+CONFIG_OMAP_MPU_TIMER=y
+# CONFIG_OMAP_32K_TIMER is not set
+# CONFIG_OMAP_LL_DEBUG_UART1 is not set
+CONFIG_OMAP_LL_DEBUG_UART2=y
+# CONFIG_OMAP_LL_DEBUG_UART3 is not set
+CONFIG_OMAP_SERIAL_WAKE=y
+CONFIG_OMAP_DSP=y
+# CONFIG_OMAP_DSP_MBCMD_VERBOSE is not set
+# CONFIG_OMAP_DSP_TASK_MULTIOPEN is not set
+CONFIG_OMAP_DSP_FBEXPORT=y
+
+#
+# OMAP Core Type
+#
+# CONFIG_ARCH_OMAP730 is not set
+CONFIG_ARCH_OMAP15XX=y
+# CONFIG_ARCH_OMAP16XX is not set
+
+#
+# OMAP Board Type
+#
+# CONFIG_MACH_OMAP_INNOVATOR is not set
+# CONFIG_MACH_VOICEBLUE is not set
+# CONFIG_MACH_OMAP_PALMTE is not set
+# CONFIG_MACH_OMAP_PALMZ71 is not set
+CONFIG_MACH_OMAP_PALMTT=y
+# CONFIG_MACH_SX1 is not set
+# CONFIG_MACH_AMS_DELTA is not set
+# CONFIG_MACH_OMAP_GENERIC is not set
+
+#
+# OMAP CPU Speed
+#
+CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER=y
+# CONFIG_OMAP_ARM_168MHZ is not set
+# CONFIG_OMAP_ARM_150MHZ is not set
+# CONFIG_OMAP_ARM_120MHZ is not set
+# CONFIG_OMAP_ARM_60MHZ is not set
+# CONFIG_OMAP_ARM_30MHZ is not set
+# CONFIG_MACH_OMAP_APOLLON_PLUS is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_ARM925T=y
+CONFIG_CPU_32v4T=y
+CONFIG_CPU_ABRT_EV4T=y
+CONFIG_CPU_PABRT_NOIFAR=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=y
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+# CONFIG_OUTER_CACHE is not set
+
+#
+# Bus support
+#
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+# CONFIG_TICK_ONESHOT is not set
+# CONFIG_NO_HZ is not set
+# CONFIG_HIGH_RES_TIMERS is not set
+# CONFIG_PREEMPT is not set
+CONFIG_HZ=100
+# 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_ZONE_DMA_FLAG=1
+# CONFIG_LEDS is not set
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="root=/dev/mmcblk0p2 rw init=/init"
+# CONFIG_XIP_KERNEL is not set
+# CONFIG_KEXEC is not set
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_AOUT=y
+CONFIG_BINFMT_MISC=y
+
+#
+# Power management options
+#
+# CONFIG_PM is not set
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+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_XFRM_MIGRATE is not set
+CONFIG_NET_KEY=y
+# CONFIG_NET_KEY_MIGRATE 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 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 is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# 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
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# 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_AF_RXRPC is not set
+
+#
+# Wireless
+#
+# CONFIG_CFG80211 is not set
+# CONFIG_WIRELESS_EXT is not set
+# CONFIG_MAC80211 is not set
+# CONFIG_IEEE80211 is not set
+# CONFIG_RFKILL is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_FW_LOADER is not set
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_ATA is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Network device support
+#
+# CONFIG_NETDEVICES 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
+# CONFIG_INPUT_POLLDEV is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=320
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320
+# CONFIG_INPUT_JOYDEV is not set
+CONFIG_INPUT_TSDEV=y
+CONFIG_INPUT_TSDEV_SCREEN_X=320
+CONFIG_INPUT_TSDEV_SCREEN_Y=320
+CONFIG_INPUT_EVDEV=y
+# 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_TABLET is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_ADS7846=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+# CONFIG_TOUCHSCREEN_TSC2102 is not set
+# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_NVRAM is not set
+# CONFIG_R3964 is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+CONFIG_SPI=y
+CONFIG_SPI_MASTER=y
+
+#
+# SPI Master Controller Drivers
+#
+CONFIG_SPI_BITBANG=y
+CONFIG_SPI_OMAP_UWIRE=y
+
+#
+# SPI Protocol Masters
+#
+# CONFIG_SPI_AT25 is not set
+# CONFIG_SPI_TSC2101 is not set
+# CONFIG_SPI_TSC2102 is not set
+# CONFIG_SPI_TSC2301 is not set
+# CONFIG_SPI_SPIDEV is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_LM70 is not set
+# CONFIG_SENSORS_PC87427 is not set
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_SENSORS_W83627HF is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Misc devices
+#
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_OMAP_DEBUG is not set
+CONFIG_LEDS_OMAP=y
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+# CONFIG_DVB_CORE is not set
+CONFIG_DAB=y
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_OMAP=y
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_VGASTATE is not set
+CONFIG_FB=y
+CONFIG_FIRMWARE_EDID=y
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_CFB_FILLRECT is not set
+# CONFIG_FB_CFB_COPYAREA is not set
+# CONFIG_FB_CFB_IMAGEBLIT is not set
+# CONFIG_FB_SYS_FILLRECT is not set
+# CONFIG_FB_SYS_COPYAREA is not set
+# CONFIG_FB_SYS_IMAGEBLIT is not set
+# CONFIG_FB_SYS_FOPS is not set
+CONFIG_FB_DEFERRED_IO=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_OMAP=y
+# CONFIG_FB_OMAP_LCDC_EXTERNAL is not set
+# CONFIG_FB_OMAP_BOOTLOADER_INIT is not set
+CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE=2
+# CONFIG_FB_OMAP_DMA_TUNE is not set
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_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
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=y
+# CONFIG_HID_DEBUG 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 is not set
+
+#
+# Enable Host or Gadget support to see Inventra options
+#
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+# 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
+# CONFIG_RTC_DRV_TEST is not set
+
+#
+# I2C RTC drivers
+#
+
+#
+# SPI RTC drivers
+#
+# CONFIG_RTC_DRV_RS5C348 is not set
+# CONFIG_RTC_DRV_MAX6902 is not set
+
+#
+# Platform RTC drivers
+#
+# CONFIG_RTC_DRV_CMOS is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# on-CPU RTC drivers
+#
+CONFIG_RTC_DRV_OMAP=y
+
+#
+# CBUS support
+#
+# CONFIG_CBUS 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 is not set
+# CONFIG_EXT4DEV_FS is not set
+# 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 is not set
+# CONFIG_INOTIFY is not set
+# 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_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# 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_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 is not set
+# CONFIG_NFSD 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 is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# 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
+# CONFIG_SYSV68_PARTITION is not set
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+# CONFIG_ENABLE_MUST_CHECK is not set
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_DEBUG_KERNEL is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_FRAME_POINTER=y
+# CONFIG_DEBUG_USER is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+CONFIG_CRC16=y
+# CONFIG_CRC_ITU_T is not set
+CONFIG_CRC32=y
+CONFIG_LIBCRC32C=y
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
diff --git a/recipes-kernel/linux/linux-palm-omap1-2.6.22-omap1/palmtt2/defconfig b/recipes-kernel/linux/linux-palm-omap1-2.6.22-omap1/palmtt2/defconfig
new file mode 100644
index 0000000..72d52d2
--- /dev/null
+++ b/recipes-kernel/linux/linux-palm-omap1-2.6.22-omap1/palmtt2/defconfig
@@ -0,0 +1,882 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.22-omap1
+# Sat Jul 14 20:09:05 2007
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=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_SYSVIPC_SYSCTL=y
+# CONFIG_POSIX_MQUEUE is not set
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 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_LOG_BUF_SHIFT=14
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+# CONFIG_BLK_DEV_INITRD is not set
+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_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_ANON_INODES=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+
+#
+# Loadable module support
+#
+# CONFIG_MODULES is not set
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+# CONFIG_IOSCHED_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_NS9XXX 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 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_DAVINCI is not set
+CONFIG_ARCH_OMAP=y
+
+#
+# TI OMAP Implementations
+#
+CONFIG_ARCH_OMAP1=y
+# CONFIG_ARCH_OMAP2 is not set
+# CONFIG_ARCH_OMAP3 is not set
+
+#
+# OMAP Feature Selections
+#
+# CONFIG_OMAP_RESET_CLOCKS is not set
+# CONFIG_OMAP_BOOT_TAG is not set
+# CONFIG_OMAP_GPIO_SWITCH is not set
+CONFIG_OMAP_MUX=y
+# CONFIG_OMAP_MUX_DEBUG is not set
+CONFIG_OMAP_MUX_WARNINGS=y
+CONFIG_OMAP_MCBSP=y
+CONFIG_OMAP_MMU_FWK=y
+CONFIG_OMAP_MBOX_FWK=y
+CONFIG_OMAP_MPU_TIMER=y
+# CONFIG_OMAP_32K_TIMER is not set
+# CONFIG_OMAP_LL_DEBUG_UART1 is not set
+CONFIG_OMAP_LL_DEBUG_UART2=y
+# CONFIG_OMAP_LL_DEBUG_UART3 is not set
+CONFIG_OMAP_SERIAL_WAKE=y
+CONFIG_OMAP_DSP=y
+# CONFIG_OMAP_DSP_MBCMD_VERBOSE is not set
+# CONFIG_OMAP_DSP_TASK_MULTIOPEN is not set
+CONFIG_OMAP_DSP_FBEXPORT=y
+
+#
+# OMAP Core Type
+#
+# CONFIG_ARCH_OMAP730 is not set
+CONFIG_ARCH_OMAP15XX=y
+# CONFIG_ARCH_OMAP16XX is not set
+
+#
+# OMAP Board Type
+#
+# CONFIG_MACH_OMAP_INNOVATOR is not set
+# CONFIG_MACH_VOICEBLUE is not set
+# CONFIG_MACH_OMAP_PALMTE is not set
+# CONFIG_MACH_OMAP_PALMZ71 is not set
+CONFIG_MACH_OMAP_PALMTT=y
+# CONFIG_MACH_SX1 is not set
+# CONFIG_MACH_AMS_DELTA is not set
+# CONFIG_MACH_OMAP_GENERIC is not set
+
+#
+# OMAP CPU Speed
+#
+CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER=y
+# CONFIG_OMAP_ARM_168MHZ is not set
+# CONFIG_OMAP_ARM_150MHZ is not set
+# CONFIG_OMAP_ARM_120MHZ is not set
+# CONFIG_OMAP_ARM_60MHZ is not set
+# CONFIG_OMAP_ARM_30MHZ is not set
+# CONFIG_MACH_OMAP_APOLLON_PLUS is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_ARM925T=y
+CONFIG_CPU_32v4T=y
+CONFIG_CPU_ABRT_EV4T=y
+CONFIG_CPU_PABRT_NOIFAR=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=y
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+# CONFIG_OUTER_CACHE is not set
+
+#
+# Bus support
+#
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+# CONFIG_TICK_ONESHOT is not set
+# CONFIG_NO_HZ is not set
+# CONFIG_HIGH_RES_TIMERS is not set
+# CONFIG_PREEMPT is not set
+CONFIG_HZ=100
+# 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_ZONE_DMA_FLAG=1
+# CONFIG_LEDS is not set
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="root=/dev/mmcblk0p2 rw init=/init"
+# CONFIG_XIP_KERNEL is not set
+# CONFIG_KEXEC is not set
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_AOUT=y
+CONFIG_BINFMT_MISC=y
+
+#
+# Power management options
+#
+# CONFIG_PM is not set
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+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_XFRM_MIGRATE is not set
+CONFIG_NET_KEY=y
+# CONFIG_NET_KEY_MIGRATE 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 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 is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# 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
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# 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_AF_RXRPC is not set
+
+#
+# Wireless
+#
+# CONFIG_CFG80211 is not set
+# CONFIG_WIRELESS_EXT is not set
+# CONFIG_MAC80211 is not set
+# CONFIG_IEEE80211 is not set
+# CONFIG_RFKILL is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_FW_LOADER is not set
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_ATA is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Network device support
+#
+# CONFIG_NETDEVICES 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
+# CONFIG_INPUT_POLLDEV is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=320
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320
+# CONFIG_INPUT_JOYDEV is not set
+CONFIG_INPUT_TSDEV=y
+CONFIG_INPUT_TSDEV_SCREEN_X=320
+CONFIG_INPUT_TSDEV_SCREEN_Y=320
+CONFIG_INPUT_EVDEV=y
+# 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_TABLET is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_ADS7846=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+# CONFIG_TOUCHSCREEN_TSC2102 is not set
+# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_NVRAM is not set
+# CONFIG_R3964 is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+CONFIG_SPI=y
+CONFIG_SPI_MASTER=y
+
+#
+# SPI Master Controller Drivers
+#
+CONFIG_SPI_BITBANG=y
+CONFIG_SPI_OMAP_UWIRE=y
+
+#
+# SPI Protocol Masters
+#
+# CONFIG_SPI_AT25 is not set
+# CONFIG_SPI_TSC2101 is not set
+# CONFIG_SPI_TSC2102 is not set
+# CONFIG_SPI_TSC2301 is not set
+# CONFIG_SPI_SPIDEV is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_LM70 is not set
+# CONFIG_SENSORS_PC87427 is not set
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_SENSORS_W83627HF is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Misc devices
+#
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_OMAP_DEBUG is not set
+CONFIG_LEDS_OMAP=y
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+# CONFIG_DVB_CORE is not set
+CONFIG_DAB=y
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_OMAP=y
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_VGASTATE is not set
+CONFIG_FB=y
+CONFIG_FIRMWARE_EDID=y
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_CFB_FILLRECT is not set
+# CONFIG_FB_CFB_COPYAREA is not set
+# CONFIG_FB_CFB_IMAGEBLIT is not set
+# CONFIG_FB_SYS_FILLRECT is not set
+# CONFIG_FB_SYS_COPYAREA is not set
+# CONFIG_FB_SYS_IMAGEBLIT is not set
+# CONFIG_FB_SYS_FOPS is not set
+CONFIG_FB_DEFERRED_IO=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_OMAP=y
+# CONFIG_FB_OMAP_LCDC_EXTERNAL is not set
+# CONFIG_FB_OMAP_BOOTLOADER_INIT is not set
+CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE=2
+# CONFIG_FB_OMAP_DMA_TUNE is not set
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_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
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=y
+# CONFIG_HID_DEBUG 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 is not set
+
+#
+# Enable Host or Gadget support to see Inventra options
+#
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+# 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
+# CONFIG_RTC_DRV_TEST is not set
+
+#
+# I2C RTC drivers
+#
+
+#
+# SPI RTC drivers
+#
+# CONFIG_RTC_DRV_RS5C348 is not set
+# CONFIG_RTC_DRV_MAX6902 is not set
+
+#
+# Platform RTC drivers
+#
+# CONFIG_RTC_DRV_CMOS is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# on-CPU RTC drivers
+#
+CONFIG_RTC_DRV_OMAP=y
+
+#
+# CBUS support
+#
+# CONFIG_CBUS 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 is not set
+# CONFIG_EXT4DEV_FS is not set
+# 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 is not set
+# CONFIG_INOTIFY is not set
+# 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_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# 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_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 is not set
+# CONFIG_NFSD 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 is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# 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
+# CONFIG_SYSV68_PARTITION is not set
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+# CONFIG_ENABLE_MUST_CHECK is not set
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_DEBUG_KERNEL is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_FRAME_POINTER=y
+# CONFIG_DEBUG_USER is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+CONFIG_CRC16=y
+# CONFIG_CRC_ITU_T is not set
+CONFIG_CRC32=y
+CONFIG_LIBCRC32C=y
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
diff --git a/recipes-kernel/linux/linux-palm-omap1-2.6.22-omap1/palmz71/defconfig b/recipes-kernel/linux/linux-palm-omap1-2.6.22-omap1/palmz71/defconfig
new file mode 100644
index 0000000..6901a43
--- /dev/null
+++ b/recipes-kernel/linux/linux-palm-omap1-2.6.22-omap1/palmz71/defconfig
@@ -0,0 +1,875 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.22-omap1
+# Sat Jul 14 19:19:02 2007
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_ZONE_DMA=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="-z71"
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+CONFIG_SYSVIPC_SYSCTL=y
+# CONFIG_POSIX_MQUEUE is not set
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 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_LOG_BUF_SHIFT=14
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+# CONFIG_BLK_DEV_INITRD is not set
+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_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_ANON_INODES=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+
+#
+# Loadable module support
+#
+# CONFIG_MODULES is not set
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+# CONFIG_IOSCHED_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+
+#
+# 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_IOP13XX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_NS9XXX 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 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_DAVINCI is not set
+CONFIG_ARCH_OMAP=y
+
+#
+# TI OMAP Implementations
+#
+CONFIG_ARCH_OMAP1=y
+# CONFIG_ARCH_OMAP2 is not set
+# CONFIG_ARCH_OMAP3 is not set
+
+#
+# OMAP Feature Selections
+#
+# CONFIG_OMAP_RESET_CLOCKS is not set
+# CONFIG_OMAP_BOOT_TAG is not set
+# CONFIG_OMAP_GPIO_SWITCH is not set
+CONFIG_OMAP_MUX=y
+# CONFIG_OMAP_MUX_DEBUG is not set
+CONFIG_OMAP_MUX_WARNINGS=y
+CONFIG_OMAP_MCBSP=y
+# CONFIG_OMAP_MMU_FWK is not set
+# CONFIG_OMAP_MBOX_FWK is not set
+CONFIG_OMAP_MPU_TIMER=y
+# CONFIG_OMAP_32K_TIMER is not set
+CONFIG_OMAP_LL_DEBUG_UART1=y
+# CONFIG_OMAP_LL_DEBUG_UART2 is not set
+# CONFIG_OMAP_LL_DEBUG_UART3 is not set
+CONFIG_OMAP_SERIAL_WAKE=y
+# CONFIG_OMAP_DSP is not set
+
+#
+# OMAP Core Type
+#
+# CONFIG_ARCH_OMAP730 is not set
+CONFIG_ARCH_OMAP15XX=y
+# CONFIG_ARCH_OMAP16XX is not set
+
+#
+# OMAP Board Type
+#
+# CONFIG_MACH_OMAP_INNOVATOR is not set
+# CONFIG_MACH_VOICEBLUE is not set
+# CONFIG_MACH_OMAP_PALMTE is not set
+CONFIG_MACH_OMAP_PALMZ71=y
+# CONFIG_MACH_OMAP_PALMTT is not set
+# CONFIG_MACH_SX1 is not set
+# CONFIG_MACH_AMS_DELTA is not set
+# CONFIG_MACH_OMAP_GENERIC is not set
+
+#
+# OMAP CPU Speed
+#
+CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER=y
+# CONFIG_OMAP_ARM_168MHZ is not set
+# CONFIG_OMAP_ARM_150MHZ is not set
+# CONFIG_OMAP_ARM_120MHZ is not set
+# CONFIG_OMAP_ARM_60MHZ is not set
+# CONFIG_OMAP_ARM_30MHZ is not set
+# CONFIG_MACH_OMAP_APOLLON_PLUS is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_ARM925T=y
+CONFIG_CPU_32v4T=y
+CONFIG_CPU_ABRT_EV4T=y
+CONFIG_CPU_PABRT_NOIFAR=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_OUTER_CACHE is not set
+
+#
+# Bus support
+#
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+# CONFIG_TICK_ONESHOT is not set
+# CONFIG_NO_HZ is not set
+# CONFIG_HIGH_RES_TIMERS is not set
+# CONFIG_PREEMPT is not set
+CONFIG_HZ=100
+# 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_ZONE_DMA_FLAG=1
+# CONFIG_LEDS is not set
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE=""
+# CONFIG_XIP_KERNEL is not set
+# CONFIG_KEXEC is not set
+
+#
+# CPU Frequency scaling
+#
+# CONFIG_CPU_FREQ 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
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_AOUT=y
+CONFIG_BINFMT_MISC=y
+
+#
+# Power management options
+#
+# CONFIG_PM is not set
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+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_XFRM_MIGRATE is not set
+CONFIG_NET_KEY=y
+# CONFIG_NET_KEY_MIGRATE 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 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 is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_BEET=y
+# CONFIG_INET_DIAG is not set
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# 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
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# 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_AF_RXRPC is not set
+
+#
+# Wireless
+#
+# CONFIG_CFG80211 is not set
+# CONFIG_WIRELESS_EXT is not set
+# CONFIG_MAC80211 is not set
+# CONFIG_IEEE80211 is not set
+# CONFIG_RFKILL is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_FW_LOADER is not set
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+# CONFIG_MTD is not set
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Plug and Play support
+#
+# CONFIG_PNPACPI is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_ATA is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Network device support
+#
+# CONFIG_NETDEVICES 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
+# CONFIG_INPUT_POLLDEV is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=320
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320
+# CONFIG_INPUT_JOYDEV is not set
+CONFIG_INPUT_TSDEV=y
+CONFIG_INPUT_TSDEV_SCREEN_X=320
+CONFIG_INPUT_TSDEV_SCREEN_Y=320
+# CONFIG_INPUT_EVDEV is not set
+# 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_TABLET is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_TOUCHSCREEN_ADS7846=y
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
+# CONFIG_TOUCHSCREEN_TSC2102 is not set
+# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO 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 is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=16
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_NVRAM is not set
+# CONFIG_R3964 is not set
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+CONFIG_SPI=y
+CONFIG_SPI_MASTER=y
+
+#
+# SPI Master Controller Drivers
+#
+CONFIG_SPI_BITBANG=y
+CONFIG_SPI_OMAP_UWIRE=y
+
+#
+# SPI Protocol Masters
+#
+# CONFIG_SPI_AT25 is not set
+# CONFIG_SPI_TSC2101 is not set
+# CONFIG_SPI_TSC2102 is not set
+# CONFIG_SPI_TSC2301 is not set
+# CONFIG_SPI_SPIDEV is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_LM70 is not set
+# CONFIG_SENSORS_PC87427 is not set
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_SENSORS_W83627HF is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Misc devices
+#
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_SM501 is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+# CONFIG_DVB_CORE is not set
+CONFIG_DAB=y
+
+#
+# Graphics support
+#
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_OMAP=y
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+# CONFIG_VGASTATE is not set
+CONFIG_FB=y
+CONFIG_FIRMWARE_EDID=y
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_CFB_FILLRECT is not set
+# CONFIG_FB_CFB_COPYAREA is not set
+# CONFIG_FB_CFB_IMAGEBLIT is not set
+# CONFIG_FB_SYS_FILLRECT is not set
+# CONFIG_FB_SYS_COPYAREA is not set
+# CONFIG_FB_SYS_IMAGEBLIT is not set
+# CONFIG_FB_SYS_FOPS is not set
+CONFIG_FB_DEFERRED_IO=y
+# CONFIG_FB_SVGALIB is not set
+# 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
+
+#
+# Frame buffer hardware drivers
+#
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_OMAP=y
+# CONFIG_FB_OMAP_LCDC_EXTERNAL is not set
+# CONFIG_FB_OMAP_BOOTLOADER_INIT is not set
+CONFIG_FB_OMAP_CONSISTENT_DMA_SIZE=2
+# CONFIG_FB_OMAP_DMA_TUNE is not set
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_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
+# CONFIG_LOGO is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=y
+# CONFIG_HID_DEBUG 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 is not set
+
+#
+# Enable Host or Gadget support to see Inventra options
+#
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+# CONFIG_MMC_UNSAFE_RESUME is not set
+
+#
+# MMC/SD Card Drivers
+#
+CONFIG_MMC_BLOCK=y
+
+#
+# MMC/SD Host Controller Drivers
+#
+CONFIG_MMC_OMAP=y
+
+#
+# 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
+# CONFIG_RTC_DRV_TEST is not set
+
+#
+# I2C RTC drivers
+#
+
+#
+# SPI RTC drivers
+#
+# CONFIG_RTC_DRV_RS5C348 is not set
+# CONFIG_RTC_DRV_MAX6902 is not set
+
+#
+# Platform RTC drivers
+#
+# CONFIG_RTC_DRV_CMOS is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# on-CPU RTC drivers
+#
+CONFIG_RTC_DRV_OMAP=y
+
+#
+# CBUS support
+#
+# CONFIG_CBUS 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 is not set
+# CONFIG_EXT4DEV_FS is not set
+# 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 is not set
+# CONFIG_INOTIFY is not set
+# 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_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# 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_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 is not set
+# CONFIG_NFSD 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM 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 is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_DEBUG_KERNEL is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_FRAME_POINTER=y
+# CONFIG_DEBUG_USER is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_CRC_CCITT=y
+CONFIG_CRC16=y
+# CONFIG_CRC_ITU_T is not set
+CONFIG_CRC32=y
+CONFIG_LIBCRC32C=y
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
diff --git a/recipes-kernel/linux/linux-palm-omap1_2.6.22-omap1.bb b/recipes-kernel/linux/linux-palm-omap1_2.6.22-omap1.bb
new file mode 100644
index 0000000..0c3705d
--- /dev/null
+++ b/recipes-kernel/linux/linux-palm-omap1_2.6.22-omap1.bb
@@ -0,0 +1,42 @@
+SECTION = "kernel"
+DESCRIPTION = "Linux kernel for OMAP1-based Palm devicess"
+LICENSE = "GPLv2"
+
+COMPATIBLE_MACHINE = "(palmz71|palmtt|palmtt2)"
+
+inherit kernel
+
+DEPENDS = ""
+
+SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-2.6.22.tar.bz2;name=kernel \
+ http://www.muru.com/linux/omap/patches/patch-2.6.22-omap1.bz2;apply=yes;name=patch \
+ file://defconfig"
+
+S = "${WORKDIR}/linux-2.6.22"
+
+PR = "r2"
+
+do_configure() {
+
+ if [ -f ${WORKDIR}/defconfig ]; then
+ install -m 0644 ${WORKDIR}/defconfig ${S}/.config || die "No configuration for ${MACHINE} available."
+ else
+ die "No configuration for ${MACHINE} available."
+ fi
+
+
+ if [ "${TARGET_OS}" = "linux-gnueabi" -o "${TARGET_OS}" = "linux-uclibceabi" ]; then
+ echo "CONFIG_AEABI=y" >> ${S}/.config
+ echo "CONFIG_OABI_COMPAT=y" >> ${S}/.config
+ else
+ echo "# CONFIG_AEABI is not set" >> ${S}/.config
+ echo "# CONFIG_OABI_COMPAT is not set" >> ${S}/.config
+ fi
+ yes '' | oe_runmake oldconfig
+
+}
+
+SRC_URI[kernel.md5sum] = "2e230d005c002fb3d38a3ca07c0200d0"
+SRC_URI[kernel.sha256sum] = "73c10604c53f1a6ee65ef805293d23903696f8cef864f42d7de9506f0d2ba4c7"
+SRC_URI[patch.md5sum] = "a05c1a0bc0d3a8a11aea38a069f477ec"
+SRC_URI[patch.sha256sum] = "d787151df658a8bffcab9ad681f0dd23cf17b8919a5f7e35b15a73e56efbefc2"
diff --git a/recipes-kernel/linux/linux.inc b/recipes-kernel/linux/linux.inc
new file mode 100644
index 0000000..beecf5c
--- /dev/null
+++ b/recipes-kernel/linux/linux.inc
@@ -0,0 +1,270 @@
+DESCRIPTION = "Linux Kernel"
+SECTION = "kernel"
+LICENSE = "GPLv2"
+
+inherit kernel siteinfo
+
+RPSRC = "http://www.rpsys.net/openzaurus/patches/archive"
+
+# Enable OABI compat for people stuck with obsolete userspace
+ARM_KEEP_OABI ?= "1"
+
+# Quirk for udev greater or equal 141
+UDEV_GE_141 ?= "0"
+
+# Specify the commandline for your device
+
+# Boot from mmc
+CMDLINE_at91sam9263ek = "mem=64M console=ttyS0,115200 root=/dev/mmcblk0p1 rootfstype=ext2 rootdelay=5"
+# Boot from nfs
+#CMDLINE_at91sam9263ek = "mem=64M console=ttyS0,115200 root=301 root=/dev/nfs nfsroot=172.20.3.1:/data/at91 ip=172.20.0.5:::255.255.0.0"
+
+# Set the verbosity of kernel messages during runtime
+# You can define CMDLINE_DEBUG in your local.conf or distro.conf to override this behaviour
+CMDLINE_DEBUG ?= '${@base_conditional("DISTRO_TYPE", "release", "quiet", "debug", d)}'
+
+# Kernel bootlogo is distro-specific (default is OE logo).
+# Logo resolution (qvga, vga, ...) is machine-specific.
+LOGO_SIZE ?= "."
+
+# Support for binary device tree generation
+
+FILES_kernel-devicetree = "/boot/devicetree*"
+
+KERNEL_DEVICETREE_boc01 = "${WORKDIR}/boc01.dts"
+KERNEL_DEVICETREE_calamari = "arch/${ARCH}/boot/dts/mpc8536ds.dts"
+KERNEL_DEVICETREE_canyonlands = "arch/${ARCH}/boot/dts/canyonlands.dts"
+KERNEL_DEVICETREE_kilauea = "arch/${ARCH}/boot/dts/kilauea.dts"
+KERNEL_DEVICETREE_lite5200 = "arch/${ARCH}/boot/dts/lite5200.dts"
+KERNEL_DEVICETREE_lsppchd = "arch/${ARCH}/boot/dts/kuroboxHD.dts"
+KERNEL_DEVICETREE_lsppchg = "arch/${ARCH}/boot/dts/kuroboxHG.dts"
+KERNEL_DEVICETREE_mpc8313e-rdb = "arch/${ARCH}/boot/dts/mpc8313erdb.dts"
+KERNEL_DEVICETREE_mpc8315e-rdb = "arch/${ARCH}/boot/dts/mpc8315erdb.dts"
+KERNEL_DEVICETREE_mpc8323e-rdb = "arch/${ARCH}/boot/dts/mpc832x_rdb.dts"
+KERNEL_DEVICETREE_mpc8544ds = "arch/${ARCH}/boot/dts/mpc8544ds.dts"
+KERNEL_DEVICETREE_mpc8641-hpcn = "arch/${ARCH}/boot/dts/mpc8641_hpcn.dts"
+KERNEL_DEVICETREE_p1020rdb = "arch/${ARCH}/boot/dts/p1020rdb.dts"
+KERNEL_DEVICETREE_p2020rdb = "arch/${ARCH}/boot/dts/p2020rdb.dts"
+KERNEL_DEVICETREE_p2020ds = "arch/${ARCH}/boot/dts/p2020ds.dts"
+KERNEL_DEVICETREE_sequoia = "arch/${ARCH}/boot/dts/sequoia.dts"
+KERNEL_DEVICETREE_tqm8540 = "arch/${ARCH}/boot/dts/tqm8540.dts"
+KERNEL_DEVICETREE_xilinx-ml507 = "arch/${ARCH}/boot/dts/virtex440-ml507.dts"
+
+KERNEL_DEVICETREE_FLAGS = "-R 8 -S 0x3000"
+
+CORTEXA8FIXUP ?= "yes"
+LOCALVERSION ?= ""
+
+python __anonymous () {
+
+ import bb
+
+ devicetree = bb.data.getVar('KERNEL_DEVICETREE', d, 1) or ''
+ machine = bb.data.getVar('MACHINE', d, 1)
+ if devicetree:
+ depends = bb.data.getVar("DEPENDS", d, 1)
+ bb.data.setVar("DEPENDS", "%s dtc-native" % depends, d)
+ packages = bb.data.getVar("PACKAGES", d, 1)
+ bb.data.setVar("PACKAGES", "%s kernel-devicetree" % packages, d)
+ if 'nokia900' in machine or 'om-gta0' in machine or 'eee701' in machine:
+ depends = bb.data.getVar("DEPENDS", d, 1)
+ bb.data.setVar("DEPENDS", "%s lzma-native" % depends, d)
+}
+
+do_configure_prepend() {
+
+ # Rename getline in ./scripts/unifdef.c
+ # Kernels up to 2.6.29 are currently failing to build unifdef.c,
+ # clashing with exposed getline() from <stdio.h>
+ # see https://patchwork.kernel.org/patch/11166/
+ # committed in 2.6.29 (commit d15bd1067b1fcb2b7250d22bc0c7c7fea0b759f7)
+
+ if [ -e ${S}/scripts/unifdef.c ]; then
+ sed -i -e 's/getline/parseline/g' ${S}/scripts/unifdef.c
+ fi
+
+
+ echo "" > ${S}/.config
+
+ #
+ # logo support, if you supply logo_linux_clut224.ppm in SRC_URI, then it's going to be used
+ #
+ if [ -e ${WORKDIR}/${LOGO_SIZE}/logo_linux_clut224.ppm ]; then
+ install -m 0644 ${WORKDIR}/${LOGO_SIZE}/logo_linux_clut224.ppm drivers/video/logo/logo_linux_clut224.ppm
+ echo "CONFIG_LOGO=y" >> ${S}/.config
+ echo "CONFIG_LOGO_LINUX_CLUT224=y" >> ${S}/.config
+ fi
+
+ #
+ # oabi / eabi support
+ #
+ if [ "${TARGET_OS}" = "linux-gnueabi" -o "${TARGET_OS}" = "linux-uclibceabi" ]; then
+ echo "CONFIG_AEABI=y" >> ${S}/.config
+ if [ "${ARM_KEEP_OABI}" = "1" ] ; then
+ echo "CONFIG_OABI_COMPAT=y" >> ${S}/.config
+ else
+ echo "# CONFIG_OABI_COMPAT is not set" >> ${S}/.config
+ fi
+ else
+ echo "# CONFIG_AEABI is not set" >> ${S}/.config
+ echo "# CONFIG_OABI_COMPAT is not set" >> ${S}/.config
+ fi
+
+ # When enabling thumb for userspace we also need thumb support in the kernel
+ if [ "${ARM_INSTRUCTION_SET}" = "thumb" ] ; then
+ sed -i -e /CONFIG_ARM_THUMB/d ${WORKDIR}/defconfig
+ echo "CONFIG_ARM_THUMB=y" >> ${S}/.config
+ fi
+
+ # Enable thumb2 fixup for specific issue in angstrom toolchains when used on A8 r1p[012] silicon
+ if [ "${DISTRO_NAME}" = "Angstrom" -a "${CORTEXA8FIXUP}" = "yes" ] ; then
+ sed -i -e /CONFIG_ARM_ERRATA_430973/d ${WORKDIR}/defconfig
+ echo "CONFIG_ARM_ERRATA_430973=y" >> ${S}/.config
+ fi
+
+ #
+ # endian support
+ #
+ if [ "${SITEINFO_ENDIANNESS}" = "be" ]; then
+ echo "CONFIG_CPU_BIG_ENDIAN=y" >> ${S}/.config
+ fi
+
+ echo "CONFIG_CMDLINE=\"${CMDLINE} ${CMDLINE_DEBUG}\"" >> ${S}/.config
+
+ sed -e '/CONFIG_AEABI/d' \
+ -e '/CONFIG_OABI_COMPAT=/d' \
+ -e '/CONFIG_CMDLINE=/d' \
+ -e '/CONFIG_CPU_BIG_ENDIAN/d' \
+ -e '/CONFIG_LOGO=/d' \
+ -e '/CONFIG_LOGO_LINUX_CLUT224=/d' \
+ -e '/CONFIG_LOCALVERSION/d' \
+ -e '/CONFIG_LOCALVERSION_AUTO/d' \
+ < '${WORKDIR}/defconfig' >>'${S}/.config'
+
+ echo 'CONFIG_LOCALVERSION="${LOCALVERSION}"' >>${S}/.config
+ echo '# CONFIG_LOCALVERSION_AUTO is not set' >>${S}/.config
+
+ #
+ # Udev quirks
+ #
+
+ # Newer versions of udev mandate that sysfs doesn't have deprecated entries
+ if [ "${UDEV_GE_141}" = "1" ] ; then
+ sed -e /CONFIG_SYSFS_DEPRECATED/d \
+ -e /CONFIG_SYSFS_DEPRECATED_V2/d \
+ -e /CONFIG_HOTPLUG/d \
+ -e /CONFIG_UEVENT_HELPER_PATH/d \
+ -e /CONFIG_UNIX/d \
+ -e /CONFIG_SYSFS/d \
+ -e /CONFIG_PROC_FS/d \
+ -e /CONFIG_TMPFS/d \
+ -e /CONFIG_INOTIFY_USER/d \
+ -e /CONFIG_SIGNALFD/d \
+ -e /CONFIG_TMPFS_POSIX_ACL/d \
+ -e /CONFIG_BLK_DEV_BSG/d \
+ -i '${S}/.config'
+
+ echo '# CONFIG_SYSFS_DEPRECATED is not set' >> ${S}/.config
+ echo '# CONFIG_SYSFS_DEPRECATED_V2 is not set' >> ${S}/.config
+ echo 'CONFIG_HOTPLUG=y' >> ${S}/.config
+ echo 'CONFIG_UEVENT_HELPER_PATH=""' >> ${S}/.config
+ echo 'CONFIG_UNIX=y' >> ${S}/.config
+ echo 'CONFIG_SYSFS=y' >> ${S}/.config
+ echo 'CONFIG_PROC_FS=y' >> ${S}/.config
+ echo 'CONFIG_TMPFS=y' >> ${S}/.config
+ echo 'CONFIG_INOTIFY_USER=y' >> ${S}/.config
+ echo 'CONFIG_SIGNALFD=y' >> ${S}/.config
+ echo 'CONFIG_TMPFS_POSIX_ACL=y' >> ${S}/.config
+ echo 'CONFIG_BLK_DEV_BSG=y' >> ${S}/.config
+ echo 'CONFIG_DEVTMPFS=y' >> ${S}/.config
+ echo 'CONFIG_DEVTMPFS_MOUNT=y' >> ${S}/.config
+ fi
+
+ # Newer inits like systemd need cgroup support
+ if [ "${KERNEL_ENABLE_CGROUPS}" = "1" ] ; then
+ sed -e /CONFIG_CGROUP_SCHED/d \
+ -e /CONFIG_CGROUPS/d \
+ -i '${S}/.config'
+
+ echo 'CONFIG_CGROUP_SCHED=y' >> ${S}/.config
+ echo 'CONFIG_CGROUPS=y' >> ${S}/.config
+ echo 'CONFIG_CGROUP_NS=y' >> ${S}/.config
+ echo 'CONFIG_CGROUP_FREEZER=y' >> ${S}/.config
+ echo 'CONFIG_CGROUP_DEVICE=y' >> ${S}/.config
+ echo 'CONFIG_CPUSETS=y' >> ${S}/.config
+ echo 'CONFIG_PROC_PID_CPUSET=y' >> ${S}/.config
+ echo 'CONFIG_CGROUP_CPUACCT=y' >> ${S}/.config
+ echo 'CONFIG_RESOURCE_COUNTERS=y' >> ${S}/.config
+ fi
+
+ #
+ # root-over-nfs-over-usb-eth support. Limited, but should cover some cases.
+ # Enable this by setting a proper CMDLINE_NFSROOT_USB.
+ #
+ if [ ! -z "${CMDLINE_NFSROOT_USB}" ]; then
+ oenote "Configuring the kernel for root-over-nfs-over-usb-eth with CMDLINE ${CMDLINE_NFSROOT_USB}"
+ sed -e '/CONFIG_INET/d' \
+ -e '/CONFIG_IP_PNP=/d' \
+ -e '/CONFIG_USB_GADGET=/d' \
+ -e '/CONFIG_USB_GADGET_SELECTED=/d' \
+ -e '/CONFIG_USB_ETH=/d' \
+ -e '/CONFIG_NFS_FS=/d' \
+ -e '/CONFIG_ROOT_NFS=/d' \
+ -e '/CONFIG_CMDLINE=/d' \
+ -i ${S}/.config
+ echo "CONFIG_INET=y" >> ${S}/.config
+ echo "CONFIG_IP_PNP=y" >> ${S}/.config
+ echo "CONFIG_USB_GADGET=y" >> ${S}/.config
+ echo "CONFIG_USB_GADGET_SELECTED=y" >> ${S}/.config
+ echo "CONFIG_USB_ETH=y" >> ${S}/.config
+ echo "CONFIG_NFS_FS=y" >> ${S}/.config
+ echo "CONFIG_ROOT_NFS=y" >> ${S}/.config
+ echo "CONFIG_CMDLINE=\"${CMDLINE_NFSROOT_USB} ${CMDLINE_DEBUG}\"" >> ${S}/.config
+ fi
+ yes '' | oe_runmake oldconfig
+}
+
+do_configure_append() {
+ if test -e scripts/Makefile.fwinst ; then
+ sed -i -e "s:-m0644:-m 0644:g" scripts/Makefile.fwinst
+ fi
+}
+
+do_install_append() {
+ oe_runmake headers_install INSTALL_HDR_PATH=${D}${exec_prefix}/src/linux-${KERNEL_VERSION} ARCH=$ARCH
+}
+
+PACKAGES =+ "kernel-headers"
+FILES_kernel-headers = "${exec_prefix}/src/linux*"
+
+do_devicetree_image() {
+ if test -n "${KERNEL_DEVICETREE}" ; then
+ dtc -I dts -O dtb ${KERNEL_DEVICETREE_FLAGS} -o devicetree ${KERNEL_DEVICETREE}
+ install -d ${D}/boot
+ install -m 0644 devicetree ${D}/boot/devicetree-${KERNEL_VERSION}
+ install -d ${DEPLOY_DIR_IMAGE}
+ install -m 0644 devicetree ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGE_BASE_NAME}.dtb
+ package_stagefile_shell ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGE_BASE_NAME}.dtb
+ cd ${DEPLOY_DIR_IMAGE}
+ rm -f ${KERNEL_IMAGE_SYMLINK_NAME}.dtb
+ ln -sf ${KERNEL_IMAGE_BASE_NAME}.dtb ${KERNEL_IMAGE_SYMLINK_NAME}.dtb
+ package_stagefile_shell ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGE_SYMLINK_NAME}.dtb
+ fi
+}
+
+addtask devicetree_image after do_install before do_package do_deploy
+
+do_savedefconfig() {
+ oe_runmake savedefconfig
+}
+
+addtask savedefconfig after do_configure
+
+pkg_postinst_kernel-devicetree () {
+ cd /${KERNEL_IMAGEDEST}; update-alternatives --install /${KERNEL_IMAGEDEST}/devicetree devicetree devicetree-${KERNEL_VERSION} ${KERNEL_PRIORITY} || true
+}
+
+pkg_postrm_kernel-devicetree () {
+ cd /${KERNEL_IMAGEDEST}; update-alternatives --remove devicetree devicetree-${KERNEL_VERSION} || true
+}
+
diff --git a/recipes-kernel/linux/linux_2.6.39.bb b/recipes-kernel/linux/linux_2.6.39.bb
new file mode 100644
index 0000000..6e35800
--- /dev/null
+++ b/recipes-kernel/linux/linux_2.6.39.bb
@@ -0,0 +1,35 @@
+require linux.inc
+
+# Mark archs/machines that this kernel supports
+DEFAULT_PREFERENCE = "-1"
+DEFAULT_PREFERENCE_akita = "1"
+DEFAULT_PREFERENCE_c7x0 = "1"
+DEFAULT_PREFERENCE_collie = "1"
+DEFAULT_PREFERENCE_poodle = "1"
+DEFAULT_PREFERENCE_spitz = "1"
+DEFAULT_PREFERENCE_tosa = "1"
+#DEFAULT_PREFERENCE_om-gta01 = "1"
+#DEFAULT_PREFERENCE_om-gta02 = "1"
+DEFAULT_PREFERENCE_h1940 = "1"
+
+SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-${PV}.tar.bz2;name=kernel \
+ file://defconfig "
+
+SRC_URI_append_om-gta01 = " \
+ file://openmoko.patch \
+ file://shr.patch \
+ "
+SRC_URI_append_om-gta02 = " \
+ file://openmoko.patch \
+ file://shr.patch \
+ "
+
+SRC_URI_append_akita = " file://${LOGO_SIZE}/logo_linux_clut224.ppm.bz2 "
+SRC_URI_append_c7x0 = " file://${LOGO_SIZE}/logo_linux_clut224.ppm.bz2 "
+SRC_URI_append_collie = " file://${LOGO_SIZE}/logo_linux_clut224.ppm.bz2 "
+SRC_URI_append_poodle = " file://${LOGO_SIZE}/logo_linux_clut224.ppm.bz2 "
+SRC_URI_append_tosa = " file://${LOGO_SIZE}/logo_linux_clut224.ppm.bz2 "
+SRC_URI_append_spitz = " file://${LOGO_SIZE}/logo_linux_clut224.ppm.bz2 "
+
+SRC_URI[kernel.md5sum] = "1aab7a741abe08d42e8eccf20de61e05"
+SRC_URI[kernel.sha256sum] = "584d17f2a3ee18a9501d7ff36907639e538cfdba4529978b8550c461d45c61f6"
diff --git a/recipes-kernel/linux/openezx-kernel_git.bb b/recipes-kernel/linux/openezx-kernel_git.bb
new file mode 100644
index 0000000..03467d0
--- /dev/null
+++ b/recipes-kernel/linux/openezx-kernel_git.bb
@@ -0,0 +1,47 @@
+DESCRIPTION = "OpenEZX 2.6 Linux Development Kernel for the Motorola EZX GSM phones"
+AUTHOR = "The OpenEZX Team <openezx-devel@lists.openezx.org>"
+HOMEPAGE = "http://www.openezx.org"
+SRCREV = "886b7c127040fe32b6780b11737af5ee83daf9b3"
+KV = "2.6.38-oe"
+PV = "${KV}+gitr${SRCREV}"
+PR = "r0"
+
+require linux.inc
+
+# Make sure not to use thumb[-interworking]
+ARM_INSTRUCTION_SET = "arm"
+THUMB_INTERWORKING = "no"
+
+SRC_URI = "\
+ git://git.openezx.org/openezx.git;protocol=git;branch=ezx/current \
+"
+S = "${WORKDIR}/git"
+
+##############################################################
+# The kernel image used to reside on a seperate flash partition
+# It can be flashed from userspace, so we should package it anyways
+# (flash_unlock /dev/mtdX && flash_eraseall /dev/mtdX && flashcp /boot/zImage /dev/mtdX)
+
+COMPATIBLE_HOST = "arm.*-linux"
+COMPATIBLE_MACHINE = '(a780|e680|a910|a1200|rokre2|rokre6)'
+
+# Provide a fallback kernel command line, even if parameters should be given
+# via boot_usb or gen-blob
+CMDLINE = "console=tty1 root=/dev/mmcblk0p2 rootfstype=ext2 rootdelay=3 ip=192.168.0.202:192.168.0.200:192.168.0.200:255.255.255.0"
+ARM_KEEP_OABI = "1"
+
+###############################################################
+# module configs specific to this kernel
+#
+#module_autoload_pxaficp_ir = "pxaficp_ir"
+#module_autoload_snd-pcm-oss = "snd-pcm-oss"
+
+do_configure_prepend() {
+ install -m 0644 ${S}/arch/arm/configs/ezx_defconfig ${WORKDIR}/defconfig
+}
+
+# linux.inc overrides LOCAVERSION but we like to have one
+do_compile_prepend() {
+ sed -i -e '/CONFIG_LOCALVERSION=/d' ${S}/.config
+ echo 'CONFIG_LOCALVERSION="-oe"' >>${S}/.config
+}